Forkchoice Ethereum Mainnet

Address Contract Partially Verified

Address 0x553F4cB7256D8fC038E91d36Cb63fa7C13b624AB
Balance 0 ETH
Nonce 1
Code Size 2555 bytes
Indexed Transactions 0 (1 on-chain, 0.8% indexed)
External Etherscan · Sourcify

Contract Bytecode

2555 bytes
0x608060405234801561000f575f80fd5b5060043610610115575f3560e01c806340c10f19116100ad5780639dc29fac1161007d578063a9059cbb11610063578063a9059cbb146102c4578063d505accf146102d7578063dd62ed3e146102ea575f80fd5b80639dc29fac1461029e578063a457c2d7146102b1575f80fd5b806340c10f191461023157806370a08231146102465780637ecebe001461026e57806395d89b4114610296575f80fd5b8063313ce567116100e8578063313ce5671461017f578063338c5371146101b85780633644e515146101f7578063395093511461021e575f80fd5b806306fdde0314610119578063095ea7b31461013757806318160ddd1461015a57806323b872dd1461016c575b5f80fd5b610121610322565b60405161012e9190610806565b60405180910390f35b61014a610145366004610856565b6103ad565b604051901515815260200161012e565b6005545b60405190815260200161012e565b61014a61017a36600461087e565b610445565b6101a67f000000000000000000000000000000000000000000000000000000000000000c81565b60405160ff909116815260200161012e565b6101df7f0000000000000000000000003ffb3254134c0a7a5125fee061c5243c9e1c2a9581565b6040516001600160a01b03909116815260200161012e565b61015e7f9b944027ec7787ce6b789d27d8421583af0598eb40f3581dcb6a368d4395904481565b61014a61022c366004610856565b6104df565b61024461023f366004610856565b61052f565b005b61015e6102543660046108b7565b6001600160a01b03165f9081526002602052604090205490565b61015e61027c3660046108b7565b6001600160a01b03165f9081526004602052604090205490565b6101216105f1565b6102446102ac366004610856565b6105fe565b61014a6102bf366004610856565b610694565b61014a6102d2366004610856565b6106e4565b6102446102e53660046108d0565b61073a565b61015e6102f836600461093d565b6001600160a01b039182165f90815260036020908152604080832093909416825291909152205490565b5f805461032e9061096e565b80601f016020809104026020016040519081016040528092919081815260200182805461035a9061096e565b80156103a55780601f1061037c576101008083540402835291602001916103a5565b820191905f5260205f20905b81548152906001019060200180831161038857829003601f168201915b505050505081565b604051632daf85c360e21b8152600260048201523360248201526001600160a01b0383166044820152606481018290525f9073f887310a5d1edee69c153eee83287b7b2f2c63d39063b6be170c906084015b602060405180830381865af415801561041a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043e91906109a6565b9392505050565b6040516301b8d43b60e41b8152600260048201526001600160a01b03808516602483015283166044820152606481018290525f9073f887310a5d1edee69c153eee83287b7b2f2c63d390631b8d43b090608401602060405180830381865af41580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d791906109a6565b949350505050565b604051639411ce3160e01b8152600260048201526001600160a01b0383166024820152604481018290525f9073f887310a5d1edee69c153eee83287b7b2f2c63d390639411ce31906064016103ff565b336001600160a01b037f0000000000000000000000003ffb3254134c0a7a5125fee061c5243c9e1c2a951614610577576040516282b42960e81b815260040160405180910390fd5b60405163480ff06560e01b8152600260048201526001600160a01b03831660248201526044810182905273f887310a5d1edee69c153eee83287b7b2f2c63d39063480ff065906064015b5f6040518083038186803b1580156105d7575f80fd5b505af41580156105e9573d5f803e3d5ffd5b505050505050565b6001805461032e9061096e565b336001600160a01b037f0000000000000000000000003ffb3254134c0a7a5125fee061c5243c9e1c2a951614610646576040516282b42960e81b815260040160405180910390fd5b60405163c7f6238760e01b8152600260048201526001600160a01b03831660248201526044810182905273f887310a5d1edee69c153eee83287b7b2f2c63d39063c7f62387906064016105c1565b604051633765424d60e21b8152600260048201526001600160a01b0383166024820152604481018290525f9073f887310a5d1edee69c153eee83287b7b2f2c63d39063dd950934906064016103ff565b604051635f914f9360e01b8152600260048201523360248201526001600160a01b0383166044820152606481018290525f9073f887310a5d1edee69c153eee83287b7b2f2c63d390635f914f93906084016103ff565b604051631961725960e31b8152600260048201527f9b944027ec7787ce6b789d27d8421583af0598eb40f3581dcb6a368d4395904460248201526001600160a01b038089166044830152871660648201526084810186905260a4810185905260ff841660c482015260e48101839052610104810182905273f887310a5d1edee69c153eee83287b7b2f2c63d39063cb0b92c890610124015f6040518083038186803b1580156107e7575f80fd5b505af41580156107f9573d5f803e3d5ffd5b5050505050505050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610851575f80fd5b919050565b5f8060408385031215610867575f80fd5b6108708361083b565b946020939093013593505050565b5f805f60608486031215610890575f80fd5b6108998461083b565b92506108a76020850161083b565b9150604084013590509250925092565b5f602082840312156108c7575f80fd5b61043e8261083b565b5f805f805f805f60e0888a0312156108e6575f80fd5b6108ef8861083b565b96506108fd6020890161083b565b95506040880135945060608801359350608088013560ff81168114610920575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561094e575f80fd5b6109578361083b565b91506109656020840161083b565b90509250929050565b600181811c9082168061098257607f821691505b6020821081036109a057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f602082840312156109b6575f80fd5b8151801515811461043e575f80fdfea26469706673582212204cfc3d4d74f1bfa20f8b18a64f6a363722be04509c15a9e48827797042a8637b64736f6c63430008190033

Verified Source Code Partial Match

Compiler: v0.8.25+commit.b61c2a91 EVM: cancun Optimization: Yes (800 runs)
Token.sol 584 lines
// SPDX-License-Identifier: MIT
pragma solidity =0.8.25;

// lib/tanssi-bridge-relayer/snowbridge/contracts/src/interfaces/IERC20.sol

// SPDX-FileCopyrightText: 2023 Axelar Network
// SPDX-FileCopyrightText: 2023 Snowfork <[email protected]>

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    error InvalidAccount();
    error InsufficientBalance(address sender, uint256 balance, uint256 needed);
    error InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

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

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

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

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

    /**
     * @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);
}

// lib/tanssi-bridge-relayer/snowbridge/contracts/src/interfaces/IERC20Permit.sol

// SPDX-FileCopyrightText: 2023 Axelar Network
// SPDX-FileCopyrightText: 2023 Snowfork <[email protected]>

interface IERC20Permit {
    error PermitExpired();
    error InvalidS();
    error InvalidV();
    error InvalidSignature();

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function nonces(address account) external view returns (uint256);

    function permit(address issuer, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
        external;
}

// lib/tanssi-bridge-relayer/snowbridge/contracts/src/TokenLib.sol

// SPDX-FileCopyrightText: 2023 Axelar Network
// SPDX-FileCopyrightText: 2023 Snowfork <[email protected]>

library TokenLib {
    // keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)')
    bytes32 internal constant DOMAIN_TYPE_SIGNATURE_HASH =
        bytes32(0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f);

    // keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)')
    bytes32 internal constant PERMIT_SIGNATURE_HASH =
        bytes32(0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9);

    string internal constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01";

    struct Token {
        mapping(address account => uint256) balance;
        mapping(address account => mapping(address spender => uint256)) allowance;
        mapping(address token => uint256) nonces;
        uint256 totalSupply;
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(Token storage token, address sender, address recipient, uint256 amount) external returns (bool) {
        _transfer(token, sender, recipient, amount);
        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function mint(Token storage token, address account, uint256 amount) external {
        if (account == address(0)) {
            revert IERC20.InvalidAccount();
        }

        _update(token, address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function burn(Token storage token, address account, uint256 amount) external {
        if (account == address(0)) {
            revert IERC20.InvalidAccount();
        }

        _update(token, account, address(0), amount);
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: Prefer the {increaseAllowance} and {decreaseAllowance} methods, as
     * they aren't vulnerable to the frontrunning attack described here:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * See {IERC20-approve}.
     *
     * NOTE: If `amount` 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(Token storage token, address owner, address spender, uint256 amount) external returns (bool) {
        _approve(token, owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(Token storage token, address sender, address recipient, uint256 amount)
        external
        returns (bool)
    {
        uint256 _allowance = token.allowance[sender][msg.sender];

        if (_allowance != type(uint256).max) {
            if (_allowance < amount) {
                revert IERC20.InsufficientAllowance(msg.sender, _allowance, amount);
            }
            unchecked {
                _approve(token, sender, msg.sender, _allowance - amount);
            }
        }

        _transfer(token, sender, recipient, amount);

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(Token storage token, address spender, uint256 addedValue) external returns (bool) {
        uint256 _allowance = token.allowance[msg.sender][spender];
        if (_allowance != type(uint256).max) {
            _approve(token, msg.sender, spender, _allowance + addedValue);
        }
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(Token storage token, address spender, uint256 subtractedValue) external returns (bool) {
        uint256 _allowance = token.allowance[msg.sender][spender];
        if (_allowance != type(uint256).max) {
            if (_allowance < subtractedValue) {
                revert IERC20.InsufficientAllowance(msg.sender, _allowance, subtractedValue);
            }
            unchecked {
                _approve(token, msg.sender, spender, _allowance - subtractedValue);
            }
        }
        return true;
    }

    function permit(
        Token storage token,
        bytes32 domainSeparator,
        address issuer,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        if (block.timestamp > deadline) revert IERC20Permit.PermitExpired();

        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            revert IERC20Permit.InvalidS();
        }

        if (v != 27 && v != 28) revert IERC20Permit.InvalidV();

        bytes32 digest = keccak256(
            abi.encodePacked(
                EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,
                domainSeparator,
                keccak256(abi.encode(PERMIT_SIGNATURE_HASH, issuer, spender, value, token.nonces[issuer]++, deadline))
            )
        );

        address recoveredAddress = ecrecover(digest, v, r, s);

        if (recoveredAddress != issuer) revert IERC20Permit.InvalidSignature();

        // _approve will revert if issuer is address(0x0)
        _approve(token, issuer, spender, value);
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(Token storage token, address sender, address recipient, uint256 amount) internal {
        if (sender == address(0) || recipient == address(0)) {
            revert IERC20.InvalidAccount();
        }

        _update(token, sender, recipient, amount);
    }

    /**
     * @dev Sets `amount` 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.
     */
    function _approve(Token storage token, address owner, address spender, uint256 amount) internal {
        if (owner == address(0) || spender == address(0)) {
            revert IERC20.InvalidAccount();
        }

        token.allowance[owner][spender] = amount;
        emit IERC20.Approval(owner, spender, amount);
    }

    /**
     * @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(Token storage token, address from, address to, uint256 value) internal {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            token.totalSupply += value;
        } else {
            uint256 fromBalance = token.balance[from];
            if (fromBalance < value) {
                revert IERC20.InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                token.balance[from] = fromBalance - value;
            }
        }

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

        emit IERC20.Transfer(from, to, value);
    }
}

// lib/tanssi-bridge-relayer/snowbridge/contracts/src/Token.sol

// SPDX-FileCopyrightText: 2023 Axelar Network
// SPDX-FileCopyrightText: 2023 Snowfork <[email protected]>

/**
 * @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}.
 * This supply mechanism has been added in {ERC20Permit-mint}.
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is conventional and does
 * not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to these events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract Token is IERC20, IERC20Permit {
    using TokenLib for TokenLib.Token;

    address public immutable GATEWAY;
    bytes32 public immutable DOMAIN_SEPARATOR;
    uint8 public immutable decimals;

    string public name;
    string public symbol;
    TokenLib.Token token;

    error Unauthorized();

    /**
     * @dev Sets the values for {name}, {symbol}, and {decimals}.
     */
    constructor(string memory _name, string memory _symbol, uint8 _decimals) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        GATEWAY = msg.sender;
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                TokenLib.DOMAIN_TYPE_SIGNATURE_HASH,
                keccak256(bytes(_name)),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );
    }

    modifier onlyGateway() {
        if (msg.sender != GATEWAY) {
            revert Unauthorized();
        }
        _;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply. Can only be called by the owner.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function mint(address account, uint256 amount) external onlyGateway {
        token.mint(account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from the account.
     */
    function burn(address account, uint256 amount) external onlyGateway {
        token.burn(account, amount);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) external returns (bool) {
        return token.transfer(msg.sender, recipient, amount);
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: Prefer the {increaseAllowance} and {decreaseAllowance} methods, as
     * they aren't vulnerable to the frontrunning attack described here:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) external returns (bool) {
        return token.approve(msg.sender, spender, amount);
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool) {
        return token.transferFrom(sender, recipient, amount);
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        return token.increaseAllowance(spender, addedValue);
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        return token.decreaseAllowance(spender, subtractedValue);
    }

    function permit(address issuer, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
        external
    {
        token.permit(DOMAIN_SEPARATOR, issuer, spender, value, deadline, v, r, s);
    }

    function balanceOf(address account) external view returns (uint256) {
        return token.balance[account];
    }

    function nonces(address account) external view returns (uint256) {
        return token.nonces[account];
    }

    function totalSupply() external view returns (uint256) {
        return token.totalSupply;
    }

    function allowance(address owner, address spender) external view returns (uint256) {
        return token.allowance[owner][spender];
    }
}

Read Contract

DOMAIN_SEPARATOR 0x3644e515 → bytes32
GATEWAY 0x338c5371 → address
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
name 0x06fdde03 → string
nonces 0x7ecebe00 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 8 functions

These functions modify contract state and require a wallet transaction to execute.

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
burn 0x9dc29fac
address account
uint256 amount
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
mint 0x40c10f19
address account
uint256 amount
permit 0xd505accf
address issuer
address spender
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool

Token Balances (1)

View Transfers →

Recent Transactions

This address has 1 on-chain transactions, but only 0.8% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →