S Price: $0.048336 (-3.98%)
Gas: 55 Gwei

Contract

0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38

More Info

Private Name Tags

TokenTracker

Wrapped Sonic (wS) ($0.0512)
Transaction Hash
Block
From
To
Withdraw629806732026-02-16 0:05:089 mins ago1771200308IN
Sonic Labs: wS Token
0 S0.0023856360.5
Withdraw629806092026-02-16 0:04:0610 mins ago1771200246IN
Sonic Labs: wS Token
0 S0.0032855955
Withdraw629791932026-02-15 23:35:5239 mins ago1771198552IN
Sonic Labs: wS Token
0 S0.0020153550
Withdraw629790612026-02-15 23:32:5941 mins ago1771198379IN
Sonic Labs: wS Token
0 S0.0020153950.001
Deposit629786632026-02-15 23:25:4249 mins ago1771197942IN
Sonic Labs: wS Token
55,000 S0.0049360760.5
Deposit629780702026-02-15 23:14:291 hr ago1771197269IN
Sonic Labs: wS Token
1,000 S0.001842650.0001
Approve629776522026-02-15 23:07:341 hr ago1771196854IN
Sonic Labs: wS Token
0 S0.002695655
Withdraw629774562026-02-15 23:05:081 hr ago1771196708IN
Sonic Labs: wS Token
0 S0.0023856360.5
Approve629771512026-02-15 23:00:371 hr ago1771196437IN
Sonic Labs: wS Token
0 S0.002333950.0001
Deposit629766672026-02-15 22:50:431 hr ago1771195843IN
Sonic Labs: wS Token
1,000 S0.0018426350.001
Deposit629762392026-02-15 22:42:091 hr ago1771195329IN
Sonic Labs: wS Token
1,000 S0.001842650
Deposit629748082026-02-15 22:12:122 hrs ago1771193532IN
Sonic Labs: wS Token
55,000 S0.0044874255.0011
Withdraw629744242026-02-15 22:05:102 hrs ago1771193110IN
Sonic Labs: wS Token
0 S0.0023856360.5
Withdraw629733612026-02-15 21:41:502 hrs ago1771191710IN
Sonic Labs: wS Token
0 S0.002006950.0001
Approve629722082026-02-15 21:19:572 hrs ago1771190397IN
Sonic Labs: wS Token
0 S0.002214272.095922
Approve629721362026-02-15 21:18:372 hrs ago1771190317IN
Sonic Labs: wS Token
0 S0.002333950.0001
Deposit629720962026-02-15 21:17:552 hrs ago1771190275IN
Sonic Labs: wS Token
15 S0.001754950.0001
Approve629718052026-02-15 21:11:283 hrs ago1771189888IN
Sonic Labs: wS Token
0 S0.002436150
Approve629717302026-02-15 21:09:573 hrs ago1771189797IN
Sonic Labs: wS Token
0 S0.002436150
Approve629716572026-02-15 21:08:293 hrs ago1771189709IN
Sonic Labs: wS Token
0 S0.002447450
Withdraw629715112026-02-15 21:05:063 hrs ago1771189506IN
Sonic Labs: wS Token
0 S0.0023856360.5
Approve629704552026-02-15 20:45:393 hrs ago1771188339IN
Sonic Labs: wS Token
0 S0.0014483155
Approve629704532026-02-15 20:45:353 hrs ago1771188335IN
Sonic Labs: wS Token
0 S0.0014483155
Withdraw629703682026-02-15 20:44:143 hrs ago1771188254IN
Sonic Labs: wS Token
0 S0.0022161755
Withdraw629699452026-02-15 20:38:353 hrs ago1771187915IN
Sonic Labs: wS Token
0 S0.0053335560.5
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
629812102026-02-16 0:14:3814 secs ago1771200878
Sonic Labs: wS Token
76,288.3769 S
629812102026-02-16 0:14:3814 secs ago1771200878
Sonic Labs: wS Token
76,288.3769 S
629811852026-02-16 0:14:0349 secs ago1771200843
Sonic Labs: wS Token
76,287.6796 S
629811852026-02-16 0:14:0349 secs ago1771200843
Sonic Labs: wS Token
76,287.6796 S
629811852026-02-16 0:14:0349 secs ago1771200843
Sonic Labs: wS Token
53,000.905 S
629811852026-02-16 0:14:0349 secs ago1771200843
Sonic Labs: wS Token
53,000.905 S
629811852026-02-16 0:14:0349 secs ago1771200843
Sonic Labs: wS Token
190,705.46 S
629811852026-02-16 0:14:0349 secs ago1771200843
Sonic Labs: wS Token
190,705.46 S
629811842026-02-16 0:14:0151 secs ago1771200841
Sonic Labs: wS Token
76,311.8995 S
629811842026-02-16 0:14:0151 secs ago1771200841
Sonic Labs: wS Token
76,311.8995 S
629811842026-02-16 0:14:0151 secs ago1771200841
Sonic Labs: wS Token
53,161.1034526 S
629811842026-02-16 0:14:0151 secs ago1771200841
Sonic Labs: wS Token
53,161.1034526 S
629811842026-02-16 0:14:0151 secs ago1771200841
Sonic Labs: wS Token
190,773.13 S
629811842026-02-16 0:14:0151 secs ago1771200841
Sonic Labs: wS Token
190,773.13 S
629811672026-02-16 0:13:381 min ago1771200818
Sonic Labs: wS Token
76,312.85 S
629811672026-02-16 0:13:381 min ago1771200818
Sonic Labs: wS Token
76,312.85 S
629811672026-02-16 0:13:381 min ago1771200818
Sonic Labs: wS Token
53,129.926613 S
629811672026-02-16 0:13:381 min ago1771200818
Sonic Labs: wS Token
53,129.926613 S
629811672026-02-16 0:13:381 min ago1771200818
Sonic Labs: wS Token
190,708.68 S
629811672026-02-16 0:13:381 min ago1771200818
Sonic Labs: wS Token
190,708.68 S
629811552026-02-16 0:13:251 min ago1771200805
Sonic Labs: wS Token
76,318.9204 S
629811552026-02-16 0:13:251 min ago1771200805
Sonic Labs: wS Token
76,318.9204 S
629810992026-02-16 0:12:152 mins ago1771200735
Sonic Labs: wS Token
76,274.1405 S
629810992026-02-16 0:12:152 mins ago1771200735
Sonic Labs: wS Token
76,274.1405 S
629810852026-02-16 0:11:592 mins ago1771200719
Sonic Labs: wS Token
76,274.1405 S
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WrappedSonic

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: MIT
// SonicLabs Core Contracts (last updated v1.0.0)
pragma solidity 0.8.28;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";

/// WrappedSonic represents an official ERC20 implementation
/// of the native Sonic main-net currency.
contract WrappedSonic is ERC20 {

    /// @dev Indicates a failure with the native token amount.
    error ERC20InvalidZeroDeposit();

    /// @dev Indicates a failure with the native token transfer on withdraw.
    /// @param recipient Address to receive the native transfer.
    /// @param value The amount of native tokens to be sent.
    error ERC20WithdrawFailed(address recipient, uint256 value);

    /// @dev Indicates a successful deposit for the given owner and amount.
    /// @param account Account address which receive the minted ERC20 token.
    /// @param value The amount of ERC20 tokens deposited.
    event Deposit(address indexed account, uint value);

    /// @dev Indicates a successful withdrawal for the given owner and amount.
    /// @param account Account address which receive the withdrawn native token.
    /// @param value The amount of native tokens withdrawn.
    event Withdrawal(address indexed account, uint value);

    /// @dev Create a new instance of the contract
    constructor() ERC20("Wrapped Sonic", "wS") {
    }

    fallback() external payable {
        deposit();
    }
    
    /// @dev Allow a user to deposit native tokens and mint the corresponding number of wrapped tokens.
    /// @param account The address to receive the minted wrapped tokens.
    function depositFor(address account) public payable returns (bool) {
        address sender = _msgSender();

        if (sender == address(this)) {
            revert ERC20InvalidSender(address(this));
        }
        if (account == address(this)) {
            revert ERC20InvalidReceiver(account);
        }
        if (msg.value == 0) {
            revert ERC20InvalidZeroDeposit();
        }

        _mint(account, msg.value);

        emit Deposit(account, msg.value);
        return true;
    }

    /// @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of native tokens.
    /// @param account The recipient of the native tokens.
    /// @param value The amount of wrapped tokens to be burned.
    function withdrawTo(address account, uint256 value) public returns (bool) {
        if (account == address(this)) {
            revert ERC20InvalidReceiver(account);
        }

        _burn(_msgSender(), value);

        (bool _success,) = payable(account).call{value: value}("");
        if (!_success) {
            revert ERC20WithdrawFailed(account, value);
        }

        emit Withdrawal(account, value);
        return true;
    }

    /// @dev Allow to deposit native tokens and mint the corresponding number of wrapped tokens to self account.
    function deposit() public payable {
        depositFor(_msgSender());
    }

    /// @dev Allow withdraw by burning own wrapped tokens, the corresponding amount of native tokens are released.
    /// @param value Amount to be withdrawn.
    function withdraw(uint value) public {
        withdrawTo(_msgSender(), value);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

Settings
{
  "evmVersion": "cancun",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"ERC20InvalidZeroDeposit","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

608060405234801561000f575f5ffd5b506040518060400160405280600d81526020016c5772617070656420536f6e696360981b81525060405180604001604052806002815260200161775360f01b8152508160039081610060919061010d565b50600461006d828261010d565b5050506101c7565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061009d57607f821691505b6020821081036100bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561010857805f5260205f20601f840160051c810160208510156100e65750805b601f840160051c820191505b81811015610105575f81556001016100f2565b50505b505050565b81516001600160401b0381111561012657610126610075565b61013a816101348454610089565b846100c1565b6020601f82116001811461016c575f83156101555750848201515b5f19600385901b1c1916600184901b178455610105565b5f84815260208120601f198516915b8281101561019b578785015182556020948501946001909201910161017b565b50848210156101b857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610a4c806101d45f395ff3fe6080604052600436106100c1575f3560e01c8063313ce5671161007e578063a9059cbb11610058578063a9059cbb14610202578063aa67c91914610221578063d0e30db0146100c1578063dd62ed3e14610234576100c1565b8063313ce5671461019f57806370a08231146101ba57806395d89b41146101ee576100c1565b806306fdde03146100cb578063095ea7b3146100f557806318160ddd14610124578063205c28781461014257806323b872dd146101615780632e1a7d4d14610180575b6100c9610278565b005b3480156100d6575f5ffd5b506100df610284565b6040516100ec91906108a5565b60405180910390f35b348015610100575f5ffd5b5061011461010f3660046108f5565b610314565b60405190151581526020016100ec565b34801561012f575f5ffd5b506002545b6040519081526020016100ec565b34801561014d575f5ffd5b5061011461015c3660046108f5565b61032d565b34801561016c575f5ffd5b5061011461017b36600461091d565b610440565b34801561018b575f5ffd5b506100c961019a366004610957565b610463565b3480156101aa575f5ffd5b50604051601281526020016100ec565b3480156101c5575f5ffd5b506101346101d436600461096e565b6001600160a01b03165f9081526020819052604090205490565b3480156101f9575f5ffd5b506100df610471565b34801561020d575f5ffd5b5061011461021c3660046108f5565b610480565b61011461022f36600461096e565b61048d565b34801561023f575f5ffd5b5061013461024e36600461098e565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102813361048d565b50565b606060038054610293906109bf565b80601f01602080910402602001604051908101604052809291908181526020018280546102bf906109bf565b801561030a5780601f106102e15761010080835404028352916020019161030a565b820191905f5260205f20905b8154815290600101906020018083116102ed57829003601f168201915b5050505050905090565b5f3361032181858561055b565b60019150505b92915050565b5f306001600160a01b038416036103675760405163ec442f0560e01b81526001600160a01b03841660048201526024015b60405180910390fd5b610371338361056d565b5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146103ba576040519150601f19603f3d011682016040523d82523d5f602084013e6103bf565b606091505b50509050806103f35760405163b81ba46f60e01b81526001600160a01b03851660048201526024810184905260440161035e565b836001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658460405161042e91815260200190565b60405180910390a25060019392505050565b5f3361044d8582856105a1565b61045885858561061c565b506001949350505050565b61046d338261032d565b5050565b606060048054610293906109bf565b5f3361032181858561061c565b5f333081036104b157604051634b637e8f60e11b815230600482015260240161035e565b306001600160a01b038416036104e55760405163ec442f0560e01b81526001600160a01b038416600482015260240161035e565b345f0361050557604051630b3751a960e21b815260040160405180910390fd5b61050f8334610679565b826001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3460405161054a91815260200190565b60405180910390a250600192915050565b61056883838360016106ad565b505050565b6001600160a01b03821661059657604051634b637e8f60e11b81525f600482015260240161035e565b61046d825f8361077f565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610616578181101561060857604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161035e565b61061684848484035f6106ad565b50505050565b6001600160a01b03831661064557604051634b637e8f60e11b81525f600482015260240161035e565b6001600160a01b03821661066e5760405163ec442f0560e01b81525f600482015260240161035e565b61056883838361077f565b6001600160a01b0382166106a25760405163ec442f0560e01b81525f600482015260240161035e565b61046d5f838361077f565b6001600160a01b0384166106d65760405163e602df0560e01b81525f600482015260240161035e565b6001600160a01b0383166106ff57604051634a1406b160e11b81525f600482015260240161035e565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561061657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161077191815260200190565b60405180910390a350505050565b6001600160a01b0383166107a9578060025f82825461079e91906109f7565b909155506108199050565b6001600160a01b0383165f90815260208190526040902054818110156107fb5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161035e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661083557600280548290039055610853565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161089891815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146108f0575f5ffd5b919050565b5f5f60408385031215610906575f5ffd5b61090f836108da565b946020939093013593505050565b5f5f5f6060848603121561092f575f5ffd5b610938846108da565b9250610946602085016108da565b929592945050506040919091013590565b5f60208284031215610967575f5ffd5b5035919050565b5f6020828403121561097e575f5ffd5b610987826108da565b9392505050565b5f5f6040838503121561099f575f5ffd5b6109a8836108da565b91506109b6602084016108da565b90509250929050565b600181811c908216806109d357607f821691505b6020821081036109f157634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561032757634e487b7160e01b5f52601160045260245ffdfea26469706673582212201c072b1fa9129fc93106e569c04a14cb0f0d9ba6e608b8b08d9d77756e87a14764736f6c634300081c0033

Deployed Bytecode

0x6080604052600436106100c1575f3560e01c8063313ce5671161007e578063a9059cbb11610058578063a9059cbb14610202578063aa67c91914610221578063d0e30db0146100c1578063dd62ed3e14610234576100c1565b8063313ce5671461019f57806370a08231146101ba57806395d89b41146101ee576100c1565b806306fdde03146100cb578063095ea7b3146100f557806318160ddd14610124578063205c28781461014257806323b872dd146101615780632e1a7d4d14610180575b6100c9610278565b005b3480156100d6575f5ffd5b506100df610284565b6040516100ec91906108a5565b60405180910390f35b348015610100575f5ffd5b5061011461010f3660046108f5565b610314565b60405190151581526020016100ec565b34801561012f575f5ffd5b506002545b6040519081526020016100ec565b34801561014d575f5ffd5b5061011461015c3660046108f5565b61032d565b34801561016c575f5ffd5b5061011461017b36600461091d565b610440565b34801561018b575f5ffd5b506100c961019a366004610957565b610463565b3480156101aa575f5ffd5b50604051601281526020016100ec565b3480156101c5575f5ffd5b506101346101d436600461096e565b6001600160a01b03165f9081526020819052604090205490565b3480156101f9575f5ffd5b506100df610471565b34801561020d575f5ffd5b5061011461021c3660046108f5565b610480565b61011461022f36600461096e565b61048d565b34801561023f575f5ffd5b5061013461024e36600461098e565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102813361048d565b50565b606060038054610293906109bf565b80601f01602080910402602001604051908101604052809291908181526020018280546102bf906109bf565b801561030a5780601f106102e15761010080835404028352916020019161030a565b820191905f5260205f20905b8154815290600101906020018083116102ed57829003601f168201915b5050505050905090565b5f3361032181858561055b565b60019150505b92915050565b5f306001600160a01b038416036103675760405163ec442f0560e01b81526001600160a01b03841660048201526024015b60405180910390fd5b610371338361056d565b5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146103ba576040519150601f19603f3d011682016040523d82523d5f602084013e6103bf565b606091505b50509050806103f35760405163b81ba46f60e01b81526001600160a01b03851660048201526024810184905260440161035e565b836001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658460405161042e91815260200190565b60405180910390a25060019392505050565b5f3361044d8582856105a1565b61045885858561061c565b506001949350505050565b61046d338261032d565b5050565b606060048054610293906109bf565b5f3361032181858561061c565b5f333081036104b157604051634b637e8f60e11b815230600482015260240161035e565b306001600160a01b038416036104e55760405163ec442f0560e01b81526001600160a01b038416600482015260240161035e565b345f0361050557604051630b3751a960e21b815260040160405180910390fd5b61050f8334610679565b826001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3460405161054a91815260200190565b60405180910390a250600192915050565b61056883838360016106ad565b505050565b6001600160a01b03821661059657604051634b637e8f60e11b81525f600482015260240161035e565b61046d825f8361077f565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610616578181101561060857604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161035e565b61061684848484035f6106ad565b50505050565b6001600160a01b03831661064557604051634b637e8f60e11b81525f600482015260240161035e565b6001600160a01b03821661066e5760405163ec442f0560e01b81525f600482015260240161035e565b61056883838361077f565b6001600160a01b0382166106a25760405163ec442f0560e01b81525f600482015260240161035e565b61046d5f838361077f565b6001600160a01b0384166106d65760405163e602df0560e01b81525f600482015260240161035e565b6001600160a01b0383166106ff57604051634a1406b160e11b81525f600482015260240161035e565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561061657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161077191815260200190565b60405180910390a350505050565b6001600160a01b0383166107a9578060025f82825461079e91906109f7565b909155506108199050565b6001600160a01b0383165f90815260208190526040902054818110156107fb5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161035e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661083557600280548290039055610853565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161089891815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146108f0575f5ffd5b919050565b5f5f60408385031215610906575f5ffd5b61090f836108da565b946020939093013593505050565b5f5f5f6060848603121561092f575f5ffd5b610938846108da565b9250610946602085016108da565b929592945050506040919091013590565b5f60208284031215610967575f5ffd5b5035919050565b5f6020828403121561097e575f5ffd5b610987826108da565b9392505050565b5f5f6040838503121561099f575f5ffd5b6109a8836108da565b91506109b6602084016108da565b90509250929050565b600181811c908216806109d357607f821691505b6020821081036109f157634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561032757634e487b7160e01b5f52601160045260245ffdfea26469706673582212201c072b1fa9129fc93106e569c04a14cb0f0d9ba6e608b8b08d9d77756e87a14764736f6c634300081c0033

Block Transaction Gas Used Reward
view all blocks ##produced##

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Sonic is an EVM layer-1 platform that offers developers attractive incentives and powerful infrastructure.

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.

`; } let ensZeroWidthWarningHtml = ""; if ($("#hdnIsEnsContainZeroWidthChars").val() == "true") { ensZeroWidthWarningHtml = `
${zeroWidthWarningMessage} Check the actual text at ENS.
`; } const ensOnL2NoteHtml = ensOnL2Note != "" ? `
  • ${ensOnL2Note}
  • ` : ""; const contentHtml = `
    Additional Info
    Full Name:
    ${ensNameForkIconSrc}


    Note:
    • Name tag is displayed due to forward and reverse resolution. Find out more.
    • A Domain Name is not necessarily held by a person popularly associated with the name.
    • ${ensOnL2NoteHtml}
    ${ensUnicodeWarningHtml} ${ensZeroWidthWarningHtml}
    `; $('#ensName').popover({ html: true, content: contentHtml, trigger: 'manual', placement: 'right' }); $('#ensName').click(function (event) { $("#udName").popover('hide') $("#ensName").popover('toggle'); event.stopPropagation(); }); $('#ensName').on('shown.bs.popover', async () => { //disable tooltip when hovering over ens name in the main page $("[rel='tooltipEns']").each(function () { $(this).tooltip('hide'); $(this).tooltip('disable'); }); //call ajax here to get result if (!otherENSNamesHtml) { const resolvedAddressesModel = await getEnsResolvedAddress($("#hdnAddress").val(), primaryDomainNameLabel); otherENSNamesHtml = generateEnsPopoverGrid(resolvedAddressesModel.d); if (!otherENSNamesHtml) { otherENSNamesHtml = "There are no other names resolving to this address." } } $(".popOverEnsOwnedAddressTable").html(otherENSNamesHtml); $("#divENSDisplayName").html(ensDisplayName); // append more copy button for ENS let domainName = $("#hdnEnsText").val(); const copyEnsButtonHtml = ` `; $("#spanCopyENSAddress").html(copyEnsButtonHtml); $("[data-bs-toggle='tooltip']").tooltip(); }); $('#ensName').on('hidden.bs.popover', () => { $("[rel='tooltipEns']").each(function () { $(this).tooltip('enable'); }); }); $('#ensName').on('hide.bs.popover', () => { $("[data-bs-toggle='tooltip']").tooltip('hide'); }); $(document).click(function (e) { const popoverElement = document.getElementById('popover-ens-preview'); const popoverTrigger = document.getElementById('ensName'); if (!popoverTrigger.contains(e.target) && (!popoverElement || !popoverElement.contains(e.target))) { $("#ensName").popover('hide'); } }) } async function getEnsResolvedAddress(address, currentEnsText) { try { const requestModel = { "lookupAddress": address, "primaryDomainName": currentEnsText, "provider": ensNameProvider }; const response = await $.ajax({ url: "/name-lookup-search.aspx/GetOtherDomainNameForAddress", type: "POST", contentType: "application/json", dataType: "json", data: JSON.stringify({ requestModel: requestModel }) }) return response; } catch { return ""; } } function generateEnsPopoverGrid(model) { if (!model || model.DomainNames.length == 0) { return ""; } let listOtherENSNames = ""; model.DomainNames.forEach(x => listOtherENSNames += x.Name); let moreOtherENSNames = ""; if (model.Total > 5) { moreOtherENSNames = `More ` } const result = `
    Other names resolving to this address:
    ${listOtherENSNames} ${moreOtherENSNames}
    `; return result; } function removeSpecificDomain(url, domain) { return url.replace(new RegExp(domain + '$'), ''); } // ===== UD name tag const displayUDName = ''; const primaryUDName = ''; const showUDPublicNote = 'false'; let otherUDNamesHtml = ""; function initUDNamePopOver() { //required to allow bootstrap popover to support table $.fn.popover.Constructor.Default.allowList.table = []; $.fn.popover.Constructor.Default.allowList.tr = []; $.fn.popover.Constructor.Default.allowList.td = []; $.fn.popover.Constructor.Default.allowList.th = []; $.fn.popover.Constructor.Default.allowList.div = []; $.fn.popover.Constructor.Default.allowList.tbody = []; $.fn.popover.Constructor.Default.allowList.thead = []; //allowList my inline styling for bootstrap $.fn.popover.Constructor.Default.allowList['*'].push('style') let unicodeWarningHtml = ""; if ($("#hdnIsUDContainUnicodeChars").val() == "true") { unicodeWarningHtml = `
    ${unicodeWarningMessage} Check the actual text at Unstoppable Domains.
    `; } let zeroWidthWarningHtml = ""; if ($("#hdnIsUDContainZeroWidthChars").val() == "true") { zeroWidthWarningHtml = `
    ${unicodeWarningMessage} Check the actual text at Unstoppable Domains.
    `; } const contentHtml = `
    Additional Info
    Full Name:
    Unstoppable Domains Name


    Note:
    • Name tag is displayed due to forward and reverse resolution. Find out more
    • A Domain Name is not necessarily held by a person popularly associated with the name.
    ${unicodeWarningHtml} ${zeroWidthWarningHtml}
    `; $('#udName').popover({ html: true, content: contentHtml, trigger: 'manual' }); $('#udName').click(function (event) { $("#ensName").popover('hide'); $("#udName").popover('toggle'); event.stopPropagation(); }); $('#udName').on('shown.bs.popover', async () => { //disable tooltip when hovering over SID name in the main page $("[rel='tooltipUDName']").each(function () { $(this).tooltip('hide'); $(this).tooltip('disable'); }); //call ajax here to get result if (!otherUDNamesHtml) { const resolvedAddressesModel = await getUDNamesResolvedAddress($("#hdnAddress").val(), primaryUDName); //format the ajax to otherUDNamesHtml otherUDNamesHtml = generateUDPopoverGrid(resolvedAddressesModel.d); if (!otherUDNamesHtml) { otherUDNamesHtml = "There are no other names resolving to this address." } } $(".popoverUDNamesOwnedByAddress").html(otherUDNamesHtml); $("#divDisplayUDName").html(displayUDName); if (showUDPublicNote == true) { $("#noteUD").html('The Unstoppable Domains NFT is minted on the Ethereum blockchain. View and verify its details on Etherscan.'); $("#noteUD").show(); } $("[data-bs-toggle='tooltip']").tooltip(); }); $('#udName').on('hidden.bs.popover', () => { $("[rel='tooltipUDName']").each(function () { $(this).tooltip('enable'); }); }); $('#udName').on('hide.bs.popover', () => { $("[data-bs-toggle='tooltip']").tooltip('hide'); }); // Hide Unstoppable Domains Name popover when click outside the popover popup. $(document).click(function () { $("#udName").popover('hide') }); } async function getUDNamesResolvedAddress(address, primaryUDName) { try { const requestModel = { "lookupAddress": address, "primaryDomainName": primaryUDName, "provider": "UD" }; const response = await $.ajax({ url: "/name-lookup-search.aspx/GetOtherDomainNameForAddress", type: "POST", contentType: "application/json", dataType: "json", data: JSON.stringify({ requestModel: requestModel }) }) return response; } catch { return ""; } } function generateUDPopoverGrid(model) { if (!model || model.DomainNames.length == 0) { return ""; } let listOtherUDNames = ""; model.DomainNames.forEach(x => listOtherUDNames += x.Name); let moreOtherUDNames = ""; if (model.Total > 5) { moreOtherUDNames = `More `; } const result = `
    Other names resolving to this address:
    ${listOtherUDNames} ${moreOtherUDNames}
    `; return result; } // ===== end UD name tag const tooltipForTokenHolding = '23 Token Contracts'; var adjustPosition = 0; $(document).ready(function () { switchAmountToValue(document.getElementById("headerAmountValue"), 'Value (USD)', 'Amount', true); switchAmountToValue(document.getElementById("headerIntAmountValue"), 'Value (USD)', 'Amount', true); switchMethodColumn(document.getElementById("headerMethod"), 'Method', 'Action', true); onDocumentReady(); $("[rel='tooltip']").tooltip(); $("[data-bs-toggle-second='tooltip']").tooltip({ trigger: 'hover' }); $("[rel='tooltipEns']").each(function () { $(this).tooltip({ title: $(this).attr("tooltip-title") }); }); if (hash != '') { activaTab(hash); }; onAddressDocReady(); // Note: this is causing "Copied" tooltip not showing when copy button is clicked in V3, and seems like not applicable to v3, comment out first in case there is issue //$('[data-bs-toggle="tooltip"]').click(function () { // $('[data-bs-toggle="tooltip"]').tooltip("hide"); //}); document.getElementById("copyaddressbutton").classList.remove("disabled"); if ($("#txtSearchContract").length) { initialiseKeyupOnDocReady(); } if (!!$('#ensName')[0]) { initEnsNamePopOver(); } if (!!$("#udName")[0]) { initUDNamePopOver(); } handleToggle(); if (window.matchMedia("(max-width: 767px)").matches) { // Mobile adjustPosition = 90; } else { // Others adjustPosition = 50; } if (tooltipForTokenHolding) { const dropdownMenuBalance = document.getElementById("dropdownMenuBalance"); if (dropdownMenuBalance) { const dropdownWrapper = dropdownMenuBalance.closest(".dropdown"); if (dropdownWrapper) { dropdownWrapper.setAttribute("title", tooltipForTokenHolding); new bootstrap.Tooltip(dropdownWrapper); } } } }); function displayAudit() { $('html, body').animate({ scrollTop: $("#auditReportId").offset().top - adjustPosition }); } var cThemeMode = getCookie('displaymode'); function handleToggle() { var className = document.getElementsByClassName('editor'); var classNameCount = className.length; for (var j = 0; j t.innerWidth()) { if (mb + d > tb) { t.css('padding-bottom', ((mb + d) - tb)); } } else { t.css('overflow', 'visible'); } }).on('hidden.bs.dropdown', function () { $(this).css({ 'padding-bottom': '', 'overflow': '' }); }); var btn_ERC20_sort = { count: 0, reminder_count: 2, list: [], default_list: [], ERC20_sort_start: function (count) { if (document.getElementsByClassName('list-custom-divider-ERC20')[0]) { var self = this if (count != undefined) { self.count = count } var before_el = document.getElementsByClassName('list-custom-divider-ERC20')[0] var parent_el = before_el.parentNode var element_selector = parent_el.querySelectorAll(".list-custom-ERC20"); if (self.list.length == 0) { element_selector.forEach(function (e) { self.list.push(e); self.default_list.push(e); }); } $(".list-custom-ERC20").remove() var type = self.count % self.reminder_count self.sortList(type, parent_el, before_el); self.count++ } }, sortList: function (type, parent_el, before_el) { var self = this var sorted_list = [] var icon_el = $(before_el).find('button').find('i') switch (type) { case 1: icon_el.attr("class", "fad fa-sort-up") sorted_list = self.sortUsdAsc() break; default: icon_el.attr("class", "fad fa-sort-down") sorted_list = self.sortUsdDesc() } for (var i = sorted_list.length - 1; i >= 0; i--) { before_el.insertAdjacentElement('afterend', sorted_list[i]) } }, sortUsdAsc: function () { var self = this var sort_list = self.list sort_list.sort(function (a, b) { var target_a_value = self.formatCurrencyToNumber(a.querySelector('.list-usd-value').textContent.trim() || -1); var target_b_value = self.formatCurrencyToNumber(b.querySelector('.list-usd-value').textContent.trim() || -1); if (target_a_value == -1 || target_b_value == -1) { return 1; } if (target_a_value target_b_value) { return 1; } return 0 }); return sort_list }, sortUsdDesc: function () { var self = this var sort_list = self.list sort_list.sort(function (a, b) { var target_a_value = self.formatCurrencyToNumber(a.querySelector('.list-usd-value').textContent.trim() || -1); var target_b_value = self.formatCurrencyToNumber(b.querySelector('.list-usd-value').textContent.trim() || -1); if (target_a_value target_b_value) { return -1; } return 0 }); return sort_list }, formatCurrencyToNumber: function (strCurrency) { if (typeof strCurrency == "number") return strCurrency else return Number(strCurrency.replace(/[^0-9.-]+/g, "")); }, } function hrefTokenHolding() { var location = "/tokenholdings?a=0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38" var queryString = $("input.form-control.form-control-xs.search.mb-3")[0].value if (queryString) { location += "&q=" + queryString } window.location.href = location } $(document).ready(function () { $("#btn_ERC20_sort").on("click", function (event) { event.preventDefault(); setTimeout(function () { btn_ERC20_sort.ERC20_sort_start() }, 10) }) btn_ERC20_sort.ERC20_sort_start() var mainAddress = $("#hdnAddress").val(); // user search for method filters var searchFuncTimeOut; $("#ContentPlaceHolder1_inputMethodName").on("keyup", function ($event) { if (searchFuncTimeOut) { clearTimeout(searchFuncTimeOut) } var searchTerm = $(this).val(); searchFuncTimeOut = setTimeout(function () { searchFunctions(searchTerm); }, 350); }); var isSearchFunctions = false; $("#dropdownMethod").on("click", function (e) { if (isSearchFunctions === false) { searchFunctions(''); isSearchFunctions = true; } }); const litDefaultMethodFilterHtml = ''; function searchFunctions(searchTerm) { if (searchTerm === '' || searchTerm.length > 3) { const curPath = encodeURIComponent(window.location.search); $.ajax({ type: 'Get', url: `/functionSearchHandler.ashx?ca=${mainAddress}&func=${searchTerm ?? ''}&curPath=${curPath}`, success: function (response) { $("#searchFunctionResult").html(''); if (response && response.length > 0) { for (var i = 0; i ${response[i].name} ${response[i].methodId} ` ); } $("[data-bs-toggle='tooltip']").tooltip(); } else { $("#searchFunctionResult").append( `` ); } $("#inputMethodSpinner").hide(); }, error: function (XMLHttpRequest, textStatus, errorThrown) { $("#searchFunctionResult").html(''); $("#inputMethodSpinner").hide(); } }); } else { $("#inputMethodSpinner").hide(); $("#searchFunctionResult").html(litDefaultMethodFilterHtml); } } // Resize window for analytic tab let isBusy = false; $(window).resize(function () { isBusy = true; if (isBusy) { let analyticFrame = document.getElementById('analytics_pageiframe'); if (analyticFrame && analyticFrame.contentWindow != undefined) { let navtab = analyticFrame.contentWindow.document.getElementsByClassName("nav_tabs1"); let hIframe = "0px"; if (navtab != null && navtab != undefined && navtab.length > 0) { let navH = Number(navtab[0].scrollHeight); hIframe = (Number(analyticFrame.contentWindow.document.getElementsByClassName("tab-content")[0].scrollHeight) + navH + 20) + 'px'; } else { hIframe = analyticFrame.contentWindow.document.body.scrollHeight + 'px'; } analyticFrame.style.height = hIframe } } }); // detect tooltip for token holding dropdown if ($(".addresses-tooltip-over").length > 0) { if (!isMobile()) { $(".addresses-tooltip-over").attr("data-bs-trigger", "hover"); let tooltip = bootstrap.Tooltip.getInstance(".addresses-tooltip-over"); if (tooltip !== null) { tooltip.dispose(); tooltip = new bootstrap.Tooltip($(".addresses-tooltip-over")); tooltip._config.trigger = 'hover'; tooltip.update(); } } } // Quick export transaction csv const quickExportCsvData = '[{"Txhash":"0x8e0185e4bae133c9a54018f079580cb5434c242ff5723050eea0f98474d963ea","Status":"Success","Method":"Withdraw","Blockno":"62980673","DateTime":"2026-02-16 00:05:08","Sender":"0xEeeEE0ddaff7451AE89E47e0708fa4AE43eD8fB9","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00238563"},{"Txhash":"0xacf451f34c5b3f1809d6d75f506e776994b9f20013ec8ee2dfb08b8fdde80bc4","Status":"Success","Method":"Withdraw","Blockno":"62980609","DateTime":"2026-02-16 00:04:06","Sender":"0xb1e61eE7A800BC6536e9Bd15454DAeB9b14FEA9C","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00328559"},{"Txhash":"0x864cc8a3d2521bc064bbfcc50edbd2f296862354d7cc532f522fe8bc0598302c","Status":"Success","Method":"Withdraw","Blockno":"62979193","DateTime":"2026-02-15 23:35:52","Sender":"0x46dc10F97735AaD74a79Aa7e00A684c4589EC278","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00201535"},{"Txhash":"0x11e602967f2959b4666b34d92094f8f07e171bf308f66d91a22749d0557b3d69","Status":"Success","Method":"Withdraw","Blockno":"62979061","DateTime":"2026-02-15 23:32:59","Sender":"0x358a977754b0a8be90C5260DF549B309Db5BBA58","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00201539"},{"Txhash":"0x02ec883b22dc988c9c0e013ac534af581124e17caa6ca38bbe12cc58c090fdb8","Status":"Success","Method":"Deposit","Blockno":"62978663","DateTime":"2026-02-15 23:25:42","Sender":"0x64BE79723e524E109Eaa646b4Ce248e2cDdF7Ae5","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"55,000 S","Value":"$2,658.46","TxnFee":"0.00493607"},{"Txhash":"0x95eb16fa54ebc958db9c87386f4d90fa925ce08bf02f508aba9ea9d854e5ae56","Status":"Success","Method":"Deposit","Blockno":"62978070","DateTime":"2026-02-15 23:14:29","Sender":"0x67b04F8298Eec7bCa2C9501a05D597C30C305989","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"1,000 S","Value":"$48.34","TxnFee":"0.0018426"},{"Txhash":"0x660f02af7c957d7ecd174c83a865675ac1dbdbcad95212e98dfd73b0a765b22c","Status":"Success","Method":"Approve","Blockno":"62977652","DateTime":"2026-02-15 23:07:34","Sender":"0xa14A265fa3Cb4E2c1e53967B355Eb57f85141dbe","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.0026956"},{"Txhash":"0x073f609c6bdb75c1625d4fcc27f0ed1bf92030e65327e05e15eb8af3b8b14275","Status":"Success","Method":"Withdraw","Blockno":"62977456","DateTime":"2026-02-15 23:05:08","Sender":"0xEeeEE0ddaff7451AE89E47e0708fa4AE43eD8fB9","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00238563"},{"Txhash":"0x7b0c761abe971f8a373a50fce7334414c9cfef2b4f610a1fb0b8183a3c523907","Status":"Success","Method":"Approve","Blockno":"62977151","DateTime":"2026-02-15 23:00:37","Sender":"0xABb6A886078A599d543e571D2b7Cfa3baA8f190B","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.0023339"},{"Txhash":"0x5e5d0942c0bd6a4191d43410b07d25b6c0d652d25cf66495116e7962ff4a04d3","Status":"Success","Method":"Deposit","Blockno":"62976667","DateTime":"2026-02-15 22:50:43","Sender":"0x67b04F8298Eec7bCa2C9501a05D597C30C305989","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"1,000 S","Value":"$48.34","TxnFee":"0.00184263"},{"Txhash":"0xfd1fb72501deb778b3112990222a93391588af2f3d43479efbc8d14d1e0e24b6","Status":"Success","Method":"Deposit","Blockno":"62976239","DateTime":"2026-02-15 22:42:09","Sender":"0x67b04F8298Eec7bCa2C9501a05D597C30C305989","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"1,000 S","Value":"$48.34","TxnFee":"0.0018426"},{"Txhash":"0xdbb453b9541af980c3eb6f46f977064d8b1934648e4b362665c86c116f7f3894","Status":"Success","Method":"Deposit","Blockno":"62974808","DateTime":"2026-02-15 22:12:12","Sender":"0x64BE79723e524E109Eaa646b4Ce248e2cDdF7Ae5","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"55,000 S","Value":"$2,658.46","TxnFee":"0.00448742"},{"Txhash":"0xda36854a9a04e1926ad12a4f90feb82ddd5d9eb1c922202bc147824b2d76a326","Status":"Success","Method":"Withdraw","Blockno":"62974424","DateTime":"2026-02-15 22:05:10","Sender":"0xEeeEE0ddaff7451AE89E47e0708fa4AE43eD8fB9","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00238563"},{"Txhash":"0x5f25960be7ace0794598acdd9c2fb06a8d2e6470fb83d3c74b0139c00d0ebcc0","Status":"Success","Method":"Withdraw","Blockno":"62973361","DateTime":"2026-02-15 21:41:50","Sender":"0x6dD91BdaB368282dc4Ea4f4beFc831b78a7C38C0","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.0020069"},{"Txhash":"0x031881dcbbbab539053677f48ecf6a037c6eed72a4560a71f78e8a77b538d319","Status":"Success","Method":"Approve","Blockno":"62972208","DateTime":"2026-02-15 21:19:57","Sender":"0xC0E88f859dE5c9EBDDDd7e5C4c46ab7fcECd65d7","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.0022142"},{"Txhash":"0x17ca4bbb1f899b3e0477e10834d3968c46ac1f7defa1418315393748f3be7aa4","Status":"Success","Method":"Approve","Blockno":"62972136","DateTime":"2026-02-15 21:18:37","Sender":"0x10451ea155e745C41BBa345B7817627CD8F9Ba09","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.0023339"},{"Txhash":"0x47ad8348177f0075513901fdc5dafcebde150e9c810be2d41a761585bdf4454a","Status":"Success","Method":"Deposit","Blockno":"62972096","DateTime":"2026-02-15 21:17:55","Sender":"0x10451ea155e745C41BBa345B7817627CD8F9Ba09","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"15 S","Value":"$0.73","TxnFee":"0.0017549"},{"Txhash":"0xe1404ea8658940126fc6668ddc8f94df8ac857ff32b0915e28075dd0815f3d03","Status":"Success","Method":"Approve","Blockno":"62971805","DateTime":"2026-02-15 21:11:28","Sender":"0x6BAe287Ff78f887eeEeD0E274650741df8F779c4","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.0024361"},{"Txhash":"0xd1a4afdcb344b7af215dccd474837cdda83d85fd500afb3f05f815e84ac11100","Status":"Success","Method":"Approve","Blockno":"62971730","DateTime":"2026-02-15 21:09:57","Sender":"0x66Ef68daE8c5417366311b3E3dc0b426Ba16Ca13","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.0024361"},{"Txhash":"0xbde7e7ba1435930fcd209b88c370f18894d70509dabc72a1196da5265c2b38fa","Status":"Success","Method":"Approve","Blockno":"62971657","DateTime":"2026-02-15 21:08:29","Sender":"0x8dafc11Be620d183DFf019bde98d8b96db395cF5","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.0024474"},{"Txhash":"0x2a4ea9151fec7e8d536af8a60f7732763b14a72ff5b613b19359ad80fec5878e","Status":"Success","Method":"Withdraw","Blockno":"62971511","DateTime":"2026-02-15 21:05:06","Sender":"0xEeeEE0ddaff7451AE89E47e0708fa4AE43eD8fB9","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00238563"},{"Txhash":"0x272d6fd07b4f98ca1990f35823ba63e623324680e237a62e1ae696bdc9a04a7b","Status":"Success","Method":"Approve","Blockno":"62970455","DateTime":"2026-02-15 20:45:39","Sender":"0x2BE250612790d1DF5ebfea46c2346654CD7A0Afa","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00144831"},{"Txhash":"0x969efc16acdce95db4bcb0d86c3b12243ff158551d1ef1e057e390f566dbdb15","Status":"Success","Method":"Approve","Blockno":"62970453","DateTime":"2026-02-15 20:45:35","Sender":"0x2BE250612790d1DF5ebfea46c2346654CD7A0Afa","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00144831"},{"Txhash":"0x7a04d21f9dcf35f94a812fb551ab76eadef7186262734c93a406d51a5afd4e2b","Status":"Success","Method":"Withdraw","Blockno":"62970368","DateTime":"2026-02-15 20:44:14","Sender":"0x70204BA44F7f36735A7c7156bA30C064633a7901","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00221617"},{"Txhash":"0x6cbe2b2de99346bb24aae743527b9ba6d3b17f076fac303dadb8f8727ec77ca7","Status":"Success","Method":"Withdraw","Blockno":"62969945","DateTime":"2026-02-15 20:38:35","Sender":"0x64BE79723e524E109Eaa646b4Ce248e2cDdF7Ae5","SenderLable":null,"Receiver":"0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38","ReceiverLable":"Sonic Labs: wS Token","Amount":"0 S","Value":"$0.00","TxnFee":"0.00533355"}]'; const quickExportCsvTitle = 'Transaction Hash,Status,Method,Blockno,"DateTime (UTC)",From,From_Nametag,To,To_Nametag,Amount,Value (USD),Txn Fee'; let isExportFinish = true; if ($("#btnExportQuickTableToCSV").length > 0 && quickExportCsvData) { $("#btnExportQuickTableToCSV").click(function () { if (isExportFinish == true) { isExportFinish = false; $("#btnExportQuickTableToCSV").append(''); let lstTxsObj = JSON.parse(quickExportCsvData); if (lstTxsObj.length > 0) { let csvRows = []; csvRows.push(quickExportCsvTitle.replace(/"/g, "")); for (let i = 0; i 0 && quickExportInternalTxsData) { $("#ContentPlaceHolder1_btnQuickExportInternalTxs").click(function () { if (isExportFinish == true) { isExportFinish = false; $("#ContentPlaceHolder1_btnQuickExportInternalTxs").append(''); let lstTxsObj = JSON.parse(quickExportInternalTxsData); if (lstTxsObj.length > 0) { let csvRows = []; csvRows.push(quickExportInternalTxsTitle.replace(/"/g, "")); for (let i = 0; i { if (x.startsWith("F")) { file = x.replace("F", ""); } else if (x.startsWith("L")) { line = x.replace("L", ""); } }) var editorId = "editor" + file var editorElem = $("#" + editorId); if (!editorElem.length) { return; } if (!line) { return; } var editor = ace.edit(editorId); editor.resize(true); editor.scrollToLine(line, true, true, function () { }); editor.gotoLine(line); var Range = ace.require('ace/range').Range $(document).scrollTop($("#" + editorId).offset().top - 95); //document.getElementById(editorId).scrollIntoView(); editor.session.addMarker(new Range(line - 1, 0, line - 1, 1), "myMarker", "fullLine"); //window.onbeforeunload = function () { $(document).scrollTop($("#" + editorId).offset().top); }; } setTimeout(function () { editorGoToLine(); }, 500); }); $("body,html").click(function (evt) { let elm = $(evt.target).attr("id"); let isClickedMode = elm === "darkModaBtn" || elm === "darkModaBtnIcon"; if (isClickedMode) { let isClickedSunMode = false; let clrBorder = "#112641"; if (elm === "darkModaBtn") isClickedSunMode = $(evt.target).find("#darkModaBtnIcon").hasClass("fa-moon"); if (elm === "darkModaBtnIcon") isClickedSunMode = $(evt.target).hasClass("fa-moon"); if (isClickedSunMode) { clrBorder = "#fff"; } let iframes = document.getElementById('analytics_pageiframe'); let heatcell = iframes.contentWindow.document.getElementsByClassName("ch-day").length; for (let i = 0; i