Sonic Blaze Testnet

Contract

0x1Ed1daB171dAe0092e798373370b335704C5321A

Overview

S Balance

Sonic Blaze LogoSonic Blaze LogoSonic Blaze Logo59.999999999999991592 S

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deposit135784552025-01-18 10:17:5115 hrs ago1737195471IN
0x1Ed1daB1...704C5321A
10 S0.000036141
Approve135784552025-01-18 10:17:5115 hrs ago1737195471IN
0x1Ed1daB1...704C5321A
0 S0.000049141
Deposit135777282025-01-18 10:14:0415 hrs ago1737195244IN
0x1Ed1daB1...704C5321A
10 S0.000054321

Latest 21 internal transactions

Parent Transaction Hash Block From To
135784552025-01-18 10:17:5115 hrs ago1737195471
0x1Ed1daB1...704C5321A
0 S
135784552025-01-18 10:17:5115 hrs ago1737195471
0x1Ed1daB1...704C5321A
0 S
135773102025-01-18 10:11:5715 hrs ago1737195117
0x1Ed1daB1...704C5321A
0 S
135773102025-01-18 10:11:5715 hrs ago1737195117
0x1Ed1daB1...704C5321A
0 S
135773102025-01-18 10:11:5715 hrs ago1737195117
0x1Ed1daB1...704C5321A
0 S
135761522025-01-18 10:05:4815 hrs ago1737194748
0x1Ed1daB1...704C5321A
0 S
135761522025-01-18 10:05:4815 hrs ago1737194748
0x1Ed1daB1...704C5321A
0 S
135761522025-01-18 10:05:4815 hrs ago1737194748
0x1Ed1daB1...704C5321A
9.99999999 S
135761522025-01-18 10:05:4815 hrs ago1737194748
0x1Ed1daB1...704C5321A
0 S
135719122025-01-18 9:43:1015 hrs ago1737193390
0x1Ed1daB1...704C5321A
0 S
135719122025-01-18 9:43:1015 hrs ago1737193390
0x1Ed1daB1...704C5321A
0 S
135719122025-01-18 9:43:1015 hrs ago1737193390
0x1Ed1daB1...704C5321A
9.99999999 S
135719122025-01-18 9:43:1015 hrs ago1737193390
0x1Ed1daB1...704C5321A
0 S
135717802025-01-18 9:42:2615 hrs ago1737193346
0x1Ed1daB1...704C5321A
0 S
135717802025-01-18 9:42:2615 hrs ago1737193346
0x1Ed1daB1...704C5321A
0 S
135717802025-01-18 9:42:2615 hrs ago1737193346
0x1Ed1daB1...704C5321A
9.99999999 S
135717802025-01-18 9:42:2615 hrs ago1737193346
0x1Ed1daB1...704C5321A
0 S
135716652025-01-18 9:41:5215 hrs ago1737193312
0x1Ed1daB1...704C5321A
0 S
135716652025-01-18 9:41:5215 hrs ago1737193312
0x1Ed1daB1...704C5321A
0 S
135716652025-01-18 9:41:5215 hrs ago1737193312
0x1Ed1daB1...704C5321A
9.99999999 S
135716652025-01-18 9:41:5215 hrs ago1737193312
0x1Ed1daB1...704C5321A
0 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WIP

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 2 : WIP.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.23;

import { ERC20S } from "./ERC20.sol";
/// @notice Wrapped IP implementation.
/// @author Inspired by WETH9 (https://github.com/dapphub/ds-weth/blob/master/src/weth9.sol)
contract WIP is ERC20S {
    /// @notice emitted when IP is deposited in exchange for WIP
    event Deposit(address indexed from, uint amount);
    /// @notice emitted when WIP is withdrawn in exchange for IP
    event Withdrawal(address indexed to, uint amount);
    /// @notice emitted when a transfer of IP fails
    error IPTransferFailed();
    /// @notice emitted when an invalid transfer recipient is detected
    error ERC20InvalidReceiver(address receiver);
    /// @notice emitted when an invalid transfer spender is detected
    error ERC20InvalidSpender(address spender);

    /// @notice triggered when IP is deposited in exchange for WIP
    receive() external payable {
        deposit();
    }

    /// @notice deposits IP in exchange for WIP
    /// @dev the amount of IP deposited is equal to the amount of WIP minted
    function deposit() public payable {
        _mint(msg.sender, msg.value);
        emit Deposit(msg.sender, msg.value);
    }

    /// @notice withdraws WIP in exchange for IP
    /// @dev the amount of IP minted is equal to the amount of WIP burned
    /// @param value the amount of WIP to burn and withdraw
    function withdraw(uint value) external {
        _burn(msg.sender, value);
        (bool success, ) = msg.sender.call{ value: value }("");
        if (!success) {
            revert IPTransferFailed();
        }
        emit Withdrawal(msg.sender, value);
    }

    /// @notice returns the name of the token
    function name() public view override returns (string memory) {
        return "Wrapped IP";
    }

    /// @notice returns the symbol of the token
    function symbol() public view override returns (string memory) {
        return "WIP";
    }

    /// @notice approves `spender` to spend `amount` of WIP
    function approve(address spender, uint256 amount) public override returns (bool) {
        if (spender == msg.sender) {
            revert ERC20InvalidSpender(msg.sender);
        }

        return super.approve(spender, amount);
    }

    /// @notice transfers `amount` of WIP to a recipient `to`
    function transfer(address to, uint256 amount) public override returns (bool) {
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        if (to == address(this)) {
            revert ERC20InvalidReceiver(address(this));
        }

        return super.transfer(to, amount);
    }

    /// @notice transfers `amount` of WIP from `from` to a recipient `to`
    function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        if (to == address(this)) {
            revert ERC20InvalidReceiver(address(this));
        }

        return super.transferFrom(from, to, amount);
    }

    /// @dev Sets Permit2 contract's allowance to infinity.
    function _givePermit2InfiniteAllowance() internal pure override returns (bool) {
        return true;
    }
}

File 2 of 2 : ERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple ERC20 + EIP-2612 implementation.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)
///
/// @dev Note:
/// - The ERC20 standard allows minting and transferring to and from the zero address,
///   minting and transferring zero tokens, as well as self-approvals.
///   For performance, this implementation WILL NOT revert for such actions.
///   Please add any checks with overrides if desired.
/// - The `permit` function uses the ecrecover precompile (0x1).
///
/// If you are overriding:
/// - NEVER violate the ERC20 invariant:
///   the total sum of all balances must be equal to `totalSupply()`.
/// - Check that the overridden function is actually used in the function you want to
///   change the behavior of. Much of the code has been manually inlined for performance.
abstract contract ERC20S {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The total supply has overflowed.
    error TotalSupplyOverflow();

    /// @dev The allowance has overflowed.
    error AllowanceOverflow();

    /// @dev The allowance has underflowed.
    error AllowanceUnderflow();

    /// @dev Insufficient balance.
    error InsufficientBalance();

    /// @dev Insufficient allowance.
    error InsufficientAllowance();

    /// @dev The permit is invalid.
    error InvalidPermit();

    /// @dev The permit has expired.
    error PermitExpired();

    /// @dev The allowance of Permit2 is fixed at infinity.
    error Permit2AllowanceIsFixedAtInfinity();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Emitted when `amount` tokens is transferred from `from` to `to`.
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`.
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`.
    uint256 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    /// @dev `keccak256(bytes("Approval(address,address,uint256)"))`.
    uint256 private constant _APPROVAL_EVENT_SIGNATURE =
        0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The storage slot for the total supply.
    uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;

    /// @dev The balance slot of `owner` is given by:
    /// ```
    ///     mstore(0x0c, _BALANCE_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let balanceSlot := keccak256(0x0c, 0x20)
    /// ```
    uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;

    /// @dev The allowance slot of (`owner`, `spender`) is given by:
    /// ```
    ///     mstore(0x20, spender)
    ///     mstore(0x0c, _ALLOWANCE_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let allowanceSlot := keccak256(0x0c, 0x34)
    /// ```
    uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20;

    /// @dev The nonce slot of `owner` is given by:
    /// ```
    ///     mstore(0x0c, _NONCES_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let nonceSlot := keccak256(0x0c, 0x20)
    /// ```
    uint256 private constant _NONCES_SLOT_SEED = 0x38377508;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev `(_NONCES_SLOT_SEED << 16) | 0x1901`.
    uint256 private constant _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX = 0x383775081901;

    /// @dev `keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")`.
    bytes32 private constant _DOMAIN_TYPEHASH =
        0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    /// @dev `keccak256("1")`.
    /// If you need to use a different version, override `_versionHash`.
    bytes32 private constant _DEFAULT_VERSION_HASH =
        0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;

    /// @dev `keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")`.
    bytes32 private constant _PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    /// @dev The canonical Permit2 address.
    /// For signature-based allowance granting for single transaction ERC20 `transferFrom`.
    /// To enable, override `_givePermit2InfiniteAllowance()`.
    /// [Github](https://github.com/Uniswap/permit2)
    /// [Etherscan](https://etherscan.io/address/0x000000000022D473030F116dDEE9F6B43aC78BA3)
    address internal constant _PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       ERC20 METADATA                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the name of the token.
    function name() public view virtual returns (string memory);

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

    /// @dev Returns the decimals places of the token.
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           ERC20                            */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the amount of tokens in existence.
    function totalSupply() public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_TOTAL_SUPPLY_SLOT)
        }
    }

    /// @dev Returns the amount of tokens owned by `owner`.
    function balanceOf(address owner) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`.
    function allowance(address owner, address spender)
        public
        view
        virtual
        returns (uint256 result)
    {
        if (_givePermit2InfiniteAllowance()) {
            if (spender == _PERMIT2) return type(uint256).max;
        }
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x34))
        }
    }

    /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
    ///
    /// Emits a {Approval} event.
    function approve(address spender, uint256 amount) public virtual returns (bool) {
        if (_givePermit2InfiniteAllowance()) {
            /// @solidity memory-safe-assembly
            assembly {
                // If `spender == _PERMIT2 && amount != type(uint256).max`.
                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(amount)))) {
                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.
                    revert(0x1c, 0x04)
                }
            }
        }
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and store the amount.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x34), amount)
            // Emit the {Approval} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))
        }
        return true;
    }

    /// @dev Transfer `amount` tokens from the caller to `to`.
    ///
    /// Requirements:
    /// - `from` must at least have `amount`.
    ///
    /// Emits a {Transfer} event.
    function transfer(address to, uint256 amount) public virtual returns (bool) {
        _beforeTokenTransfer(msg.sender, to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, caller())
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(msg.sender, to, amount);
        return true;
    }

    /// @dev Transfers `amount` tokens from `from` to `to`.
    ///
    /// Note: Does not update the allowance if it is the maximum uint256 value.
    ///
    /// Requirements:
    /// - `from` must at least have `amount`.
    /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`.
    ///
    /// Emits a {Transfer} event.
    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
        _beforeTokenTransfer(from, to, amount);
        // Code duplication is for zero-cost abstraction if possible.
        if (_givePermit2InfiniteAllowance()) {
            /// @solidity memory-safe-assembly
            assembly {
                let from_ := shl(96, from)
                if iszero(eq(caller(), _PERMIT2)) {
                    // Compute the allowance slot and load its value.
                    mstore(0x20, caller())
                    mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))
                    let allowanceSlot := keccak256(0x0c, 0x34)
                    let allowance_ := sload(allowanceSlot)
                    // If the allowance is not the maximum uint256 value.
                    if not(allowance_) {
                        // Revert if the amount to be transferred exceeds the allowance.
                        if gt(amount, allowance_) {
                            mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                            revert(0x1c, 0x04)
                        }
                        // Subtract and store the updated allowance.
                        sstore(allowanceSlot, sub(allowance_, amount))
                    }
                }
                // Compute the balance slot and load its value.
                mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
                let fromBalanceSlot := keccak256(0x0c, 0x20)
                let fromBalance := sload(fromBalanceSlot)
                // Revert if insufficient balance.
                if gt(amount, fromBalance) {
                    mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated balance.
                sstore(fromBalanceSlot, sub(fromBalance, amount))
                // Compute the balance slot of `to`.
                mstore(0x00, to)
                let toBalanceSlot := keccak256(0x0c, 0x20)
                // Add and store the updated balance of `to`.
                // Will not overflow because the sum of all user balances
                // cannot exceed the maximum uint256 value.
                sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
                // Emit the {Transfer} event.
                mstore(0x20, amount)
                log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                let from_ := shl(96, from)
                // Compute the allowance slot and load its value.
                mstore(0x20, caller())
                mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))
                let allowanceSlot := keccak256(0x0c, 0x34)
                let allowance_ := sload(allowanceSlot)
                // If the allowance is not the maximum uint256 value.
                if not(allowance_) {
                    // Revert if the amount to be transferred exceeds the allowance.
                    if gt(amount, allowance_) {
                        mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                        revert(0x1c, 0x04)
                    }
                    // Subtract and store the updated allowance.
                    sstore(allowanceSlot, sub(allowance_, amount))
                }
                // Compute the balance slot and load its value.
                mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
                let fromBalanceSlot := keccak256(0x0c, 0x20)
                let fromBalance := sload(fromBalanceSlot)
                // Revert if insufficient balance.
                if gt(amount, fromBalance) {
                    mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated balance.
                sstore(fromBalanceSlot, sub(fromBalance, amount))
                // Compute the balance slot of `to`.
                mstore(0x00, to)
                let toBalanceSlot := keccak256(0x0c, 0x20)
                // Add and store the updated balance of `to`.
                // Will not overflow because the sum of all user balances
                // cannot exceed the maximum uint256 value.
                sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
                // Emit the {Transfer} event.
                mstore(0x20, amount)
                log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
            }
        }
        _afterTokenTransfer(from, to, amount);
        return true;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          EIP-2612                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev For more performance, override to return the constant value
    /// of `keccak256(bytes(name()))` if `name()` will never change.
    function _constantNameHash() internal view virtual returns (bytes32 result) {}

    /// @dev If you need a different value, override this function.
    function _versionHash() internal view virtual returns (bytes32 result) {
        result = _DEFAULT_VERSION_HASH;
    }

    /// @dev For inheriting contracts to increment the nonce.
    function _incrementNonce(address owner) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x0c, _NONCES_SLOT_SEED)
            mstore(0x00, owner)
            let nonceSlot := keccak256(0x0c, 0x20)
            sstore(nonceSlot, add(1, sload(nonceSlot)))
        }
    }

    /// @dev Returns the current nonce for `owner`.
    /// This value is used to compute the signature for EIP-2612 permit.
    function nonces(address owner) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the nonce slot and load its value.
            mstore(0x0c, _NONCES_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`,
    /// authorized by a signed approval by `owner`.
    ///
    /// Emits a {Approval} event.
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        if (_givePermit2InfiniteAllowance()) {
            /// @solidity memory-safe-assembly
            assembly {
                // If `spender == _PERMIT2 && value != type(uint256).max`.
                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(value)))) {
                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.
                    revert(0x1c, 0x04)
                }
            }
        }
        bytes32 nameHash = _constantNameHash();
        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.
        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));
        bytes32 versionHash = _versionHash();
        /// @solidity memory-safe-assembly
        assembly {
            // Revert if the block timestamp is greater than `deadline`.
            if gt(timestamp(), deadline) {
                mstore(0x00, 0x1a15a3cc) // `PermitExpired()`.
                revert(0x1c, 0x04)
            }
            let m := mload(0x40) // Grab the free memory pointer.
            // Clean the upper 96 bits.
            owner := shr(96, shl(96, owner))
            spender := shr(96, shl(96, spender))
            // Compute the nonce slot and load its value.
            mstore(0x0e, _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX)
            mstore(0x00, owner)
            let nonceSlot := keccak256(0x0c, 0x20)
            let nonceValue := sload(nonceSlot)
            // Prepare the domain separator.
            mstore(m, _DOMAIN_TYPEHASH)
            mstore(add(m, 0x20), nameHash)
            mstore(add(m, 0x40), versionHash)
            mstore(add(m, 0x60), chainid())
            mstore(add(m, 0x80), address())
            mstore(0x2e, keccak256(m, 0xa0))
            // Prepare the struct hash.
            mstore(m, _PERMIT_TYPEHASH)
            mstore(add(m, 0x20), owner)
            mstore(add(m, 0x40), spender)
            mstore(add(m, 0x60), value)
            mstore(add(m, 0x80), nonceValue)
            mstore(add(m, 0xa0), deadline)
            mstore(0x4e, keccak256(m, 0xc0))
            // Prepare the ecrecover calldata.
            mstore(0x00, keccak256(0x2c, 0x42))
            mstore(0x20, and(0xff, v))
            mstore(0x40, r)
            mstore(0x60, s)
            let t := staticcall(gas(), 1, 0x00, 0x80, 0x20, 0x20)
            // If the ecrecover fails, the returndatasize will be 0x00,
            // `owner` will be checked if it equals the hash at 0x00,
            // which evaluates to false (i.e. 0), and we will revert.
            // If the ecrecover succeeds, the returndatasize will be 0x20,
            // `owner` will be compared against the returned address at 0x20.
            if iszero(eq(mload(returndatasize()), owner)) {
                mstore(0x00, 0xddafbaef) // `InvalidPermit()`.
                revert(0x1c, 0x04)
            }
            // Increment and store the updated nonce.
            sstore(nonceSlot, add(nonceValue, t)) // `t` is 1 if ecrecover succeeds.
            // Compute the allowance slot and store the value.
            // The `owner` is already at slot 0x20.
            mstore(0x40, or(shl(160, _ALLOWANCE_SLOT_SEED), spender))
            sstore(keccak256(0x2c, 0x34), value)
            // Emit the {Approval} event.
            log3(add(m, 0x60), 0x20, _APPROVAL_EVENT_SIGNATURE, owner, spender)
            mstore(0x40, m) // Restore the free memory pointer.
            mstore(0x60, 0) // Restore the zero pointer.
        }
    }

    /// @dev Returns the EIP-712 domain separator for the EIP-2612 permit.
    function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) {
        bytes32 nameHash = _constantNameHash();
        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.
        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));
        bytes32 versionHash = _versionHash();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Grab the free memory pointer.
            mstore(m, _DOMAIN_TYPEHASH)
            mstore(add(m, 0x20), nameHash)
            mstore(add(m, 0x40), versionHash)
            mstore(add(m, 0x60), chainid())
            mstore(add(m, 0x80), address())
            result := keccak256(m, 0xa0)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL MINT FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Mints `amount` tokens to `to`, increasing the total supply.
    ///
    /// Emits a {Transfer} event.
    function _mint(address to, uint256 amount) internal virtual {
        _beforeTokenTransfer(address(0), to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT)
            let totalSupplyAfter := add(totalSupplyBefore, amount)
            // Revert if the total supply overflows.
            if lt(totalSupplyAfter, totalSupplyBefore) {
                mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`.
                revert(0x1c, 0x04)
            }
            // Store the updated total supply.
            sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter)
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(address(0), to, amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL BURN FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Burns `amount` tokens from `from`, reducing the total supply.
    ///
    /// Emits a {Transfer} event.
    function _burn(address from, uint256 amount) internal virtual {
        _beforeTokenTransfer(from, address(0), amount);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, from)
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Subtract and store the updated total supply.
            sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), amount))
            // Emit the {Transfer} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0)
        }
        _afterTokenTransfer(from, address(0), amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL TRANSFER FUNCTIONS                 */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Moves `amount` of tokens from `from` to `to`.
    function _transfer(address from, address to, uint256 amount) internal virtual {
        _beforeTokenTransfer(from, to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            let from_ := shl(96, from)
            // Compute the balance slot and load its value.
            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(from, to, amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL ALLOWANCE FUNCTIONS                */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`.
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        if (_givePermit2InfiniteAllowance()) {
            if (spender == _PERMIT2) return; // Do nothing, as allowance is infinite.
        }
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and load its value.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, owner)
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowance_ := sload(allowanceSlot)
            // If the allowance is not the maximum uint256 value.
            if not(allowance_) {
                // Revert if the amount to be transferred exceeds the allowance.
                if gt(amount, allowance_) {
                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated allowance.
                sstore(allowanceSlot, sub(allowance_, amount))
            }
        }
    }

    /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`.
    ///
    /// Emits a {Approval} event.
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        if (_givePermit2InfiniteAllowance()) {
            /// @solidity memory-safe-assembly
            assembly {
                // If `spender == _PERMIT2 && amount != type(uint256).max`.
                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(amount)))) {
                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.
                    revert(0x1c, 0x04)
                }
            }
        }
        /// @solidity memory-safe-assembly
        assembly {
            let owner_ := shl(96, owner)
            // Compute the allowance slot and store the amount.
            mstore(0x20, spender)
            mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED))
            sstore(keccak256(0x0c, 0x34), amount)
            // Emit the {Approval} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c)))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     HOOKS TO OVERRIDE                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Hook that is called before any transfer of tokens.
    /// This includes minting and burning.
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /// @dev Hook that is called after any transfer of tokens.
    /// This includes minting and burning.
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          PERMIT2                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns whether to fix the Permit2 contract's allowance at infinity.
    ///
    /// This value should be kept constant after contract initialization,
    /// or else the actual allowance values may not match with the {Approval} events.
    /// For best performance, return a compile-time constant for zero-cost abstraction.
    function _givePermit2InfiniteAllowance() internal view virtual returns (bool) {
        return false;
    }
}

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

Contract ABI

[{"inputs":[],"name":"AllowanceOverflow","type":"error"},{"inputs":[],"name":"AllowanceUnderflow","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"IPTransferFailed","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidPermit","type":"error"},{"inputs":[],"name":"Permit2AllowanceIsFixedAtInfinity","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"TotalSupplyOverflow","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":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","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":"amount","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"},{"stateMutability":"payable","type":"receive"}]

6080604052348015600f57600080fd5b506114328061001f6000396000f3fe6080604052600436106100e15760003560e01c806370a082311161007f578063a9059cbb11610059578063a9059cbb146102e9578063d0e30db014610326578063d505accf14610330578063dd62ed3e14610359576100f0565b806370a08231146102445780637ecebe001461028157806395d89b41146102be576100f0565b806323b872dd116100bb57806323b872dd146101885780632e1a7d4d146101c5578063313ce567146101ee5780633644e51514610219576100f0565b806306fdde03146100f5578063095ea7b31461012057806318160ddd1461015d576100f0565b366100f0576100ee610396565b005b600080fd5b34801561010157600080fd5b5061010a6103f0565b6040516101179190610fdf565b60405180910390f35b34801561012c57600080fd5b506101476004803603810190610142919061109a565b61042d565b60405161015491906110f5565b60405180910390f35b34801561016957600080fd5b506101726104b1565b60405161017f919061111f565b60405180910390f35b34801561019457600080fd5b506101af60048036038101906101aa919061113a565b6104c3565b6040516101bc91906110f5565b60405180910390f35b3480156101d157600080fd5b506101ec60048036038101906101e7919061118d565b6105ba565b005b3480156101fa57600080fd5b506102036106b9565b60405161021091906111d6565b60405180910390f35b34801561022557600080fd5b5061022e6106c2565b60405161023b919061120a565b60405180910390f35b34801561025057600080fd5b5061026b60048036038101906102669190611225565b610741565b604051610278919061111f565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190611225565b61075c565b6040516102b5919061111f565b60405180910390f35b3480156102ca57600080fd5b506102d3610777565b6040516102e09190610fdf565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b919061109a565b6107b4565b60405161031d91906110f5565b60405180910390f35b61032e610396565b005b34801561033c57600080fd5b50610357600480360381019061035291906112aa565b6108a9565b005b34801561036557600080fd5b50610380600480360381019061037b919061134c565b610a76565b60405161038d919061111f565b60405180910390f35b6103a03334610b0f565b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516103e6919061111f565b60405180910390a2565b60606040518060400160405280600a81526020017f5772617070656420495000000000000000000000000000000000000000000000815250905090565b60003373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361049f57336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610496919061139b565b60405180910390fd5b6104a98383610ba6565b905092915050565b60006805345cdf77eb68f44c54905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105365760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161052d919061139b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105a657306040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161059d919061139b565b60405180910390fd5b6105b1848484610c36565b90509392505050565b6105c43382610de3565b60003373ffffffffffffffffffffffffffffffffffffffff16826040516105ea906113e7565b60006040518083038185875af1925050503d8060008114610627576040519150601f19603f3d011682016040523d82523d6000602084013e61062c565b606091505b5050905080610667576040517f69bfc5f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65836040516106ad919061111f565b60405180910390a25050565b60006012905090565b6000806106cd610e7a565b90506000801b81036106eb576106e16103f0565b8051906020012090505b60006106f5610e7f565b90506040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815282602082015281604082015246606082015230608082015260a08120935050505090565b60006387a211a2600c52816000526020600c20549050919050565b60006338377508600c52816000526020600c20549050919050565b60606040518060400160405280600381526020017f5749500000000000000000000000000000000000000000000000000000000000815250905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108275760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161081e919061139b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361089757306040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161088e919061139b565b60405180910390fd5b6108a18383610eaa565b905092915050565b6108b1610f3c565b156108e5578419156e22d473030f116ddee9f6b43ac78ba38760601b60601c18176108e457633f68539a6000526004601cfd5b5b60006108ef610e7a565b90506000801b810361090d576109036103f0565b8051906020012090505b6000610917610e7f565b90508542111561092f57631a15a3cc6000526004601cfd5b6040518960601b60601c99508860601b60601c985065383775081901600e52896000526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835284602084015283604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528b60208401528a60408401528960608401528060808401528860a084015260c08320604e526042602c206000528760ff1660205286604052856060526020806080600060015afa8c3d5114610a1b5763ddafbaef6000526004601cfd5b80820183558b637f5e9f2060a01b176040528a6034602c20558b8d7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608801a383604052600060605250505050505050505050505050565b6000610a80610f3c565b15610af0576e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050610b09565b5b81602052637f5e9f20600c52826000526034600c205490505b92915050565b610b1b60008383610f45565b6805345cdf77eb68f44c5481810181811015610b3f5763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c556387a211a2600c52836000526020600c2083815401815583602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505050610ba260008383610f4a565b5050565b6000610bb0610f3c565b15610be4578119156e22d473030f116ddee9f6b43ac78ba38460601b60601c1817610be357633f68539a6000526004601cfd5b5b82602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a36001905092915050565b6000610c43848484610f45565b610c4b610f3c565b15610d1c578360601b6e22d473030f116ddee9f6b43ac78ba33314610ca55733602052637f5e9f208117600c526034600c208054801915610ca25780851115610c9c576313be252b6000526004601cfd5b84810382555b50505b6387a211a28117600c526020600c20805480851115610ccc5763f4d678b86000526004601cfd5b8481038255856000526020600c2085815401815585602052600c5160601c8460601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350505050610dcd565b8360601b33602052637f5e9f208117600c526034600c208054801915610d585780851115610d52576313be252b6000526004601cfd5b84810382555b6387a211a28317600c526020600c20805480871115610d7f5763f4d678b86000526004601cfd5b8681038255876000526020600c2087815401815587602052600c5160601c8660601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050505050505b610dd8848484610f4a565b600190509392505050565b610def82600083610f45565b6387a211a2600c52816000526020600c20805480831115610e185763f4d678b86000526004601cfd5b8281038255826805345cdf77eb68f44c54036805345cdf77eb68f44c558260005260008460601b60601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206000a35050610e7682600083610f4a565b5050565b600090565b60007fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660001b905090565b6000610eb7338484610f45565b6387a211a2600c52336000526020600c20805480841115610ee05763f4d678b86000526004601cfd5b8381038255846000526020600c2084815401815584602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505050610f32338484610f4a565b6001905092915050565b60006001905090565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f89578082015181840152602081019050610f6e565b60008484015250505050565b6000601f19601f8301169050919050565b6000610fb182610f4f565b610fbb8185610f5a565b9350610fcb818560208601610f6b565b610fd481610f95565b840191505092915050565b60006020820190508181036000830152610ff98184610fa6565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061103182611006565b9050919050565b61104181611026565b811461104c57600080fd5b50565b60008135905061105e81611038565b92915050565b6000819050919050565b61107781611064565b811461108257600080fd5b50565b6000813590506110948161106e565b92915050565b600080604083850312156110b1576110b0611001565b5b60006110bf8582860161104f565b92505060206110d085828601611085565b9150509250929050565b60008115159050919050565b6110ef816110da565b82525050565b600060208201905061110a60008301846110e6565b92915050565b61111981611064565b82525050565b60006020820190506111346000830184611110565b92915050565b60008060006060848603121561115357611152611001565b5b60006111618682870161104f565b93505060206111728682870161104f565b925050604061118386828701611085565b9150509250925092565b6000602082840312156111a3576111a2611001565b5b60006111b184828501611085565b91505092915050565b600060ff82169050919050565b6111d0816111ba565b82525050565b60006020820190506111eb60008301846111c7565b92915050565b6000819050919050565b611204816111f1565b82525050565b600060208201905061121f60008301846111fb565b92915050565b60006020828403121561123b5761123a611001565b5b60006112498482850161104f565b91505092915050565b61125b816111ba565b811461126657600080fd5b50565b60008135905061127881611252565b92915050565b611287816111f1565b811461129257600080fd5b50565b6000813590506112a48161127e565b92915050565b600080600080600080600060e0888a0312156112c9576112c8611001565b5b60006112d78a828b0161104f565b97505060206112e88a828b0161104f565b96505060406112f98a828b01611085565b955050606061130a8a828b01611085565b945050608061131b8a828b01611269565b93505060a061132c8a828b01611295565b92505060c061133d8a828b01611295565b91505092959891949750929550565b6000806040838503121561136357611362611001565b5b60006113718582860161104f565b92505060206113828582860161104f565b9150509250929050565b61139581611026565b82525050565b60006020820190506113b0600083018461138c565b92915050565b600081905092915050565b50565b60006113d16000836113b6565b91506113dc826113c1565b600082019050919050565b60006113f2826113c4565b915081905091905056fea2646970667358221220a8d81246ebc70d08abbc1d7fb40166f14e933bdcd103940be526137e4fab0cee64736f6c634300081a0033

Deployed Bytecode

0x6080604052600436106100e15760003560e01c806370a082311161007f578063a9059cbb11610059578063a9059cbb146102e9578063d0e30db014610326578063d505accf14610330578063dd62ed3e14610359576100f0565b806370a08231146102445780637ecebe001461028157806395d89b41146102be576100f0565b806323b872dd116100bb57806323b872dd146101885780632e1a7d4d146101c5578063313ce567146101ee5780633644e51514610219576100f0565b806306fdde03146100f5578063095ea7b31461012057806318160ddd1461015d576100f0565b366100f0576100ee610396565b005b600080fd5b34801561010157600080fd5b5061010a6103f0565b6040516101179190610fdf565b60405180910390f35b34801561012c57600080fd5b506101476004803603810190610142919061109a565b61042d565b60405161015491906110f5565b60405180910390f35b34801561016957600080fd5b506101726104b1565b60405161017f919061111f565b60405180910390f35b34801561019457600080fd5b506101af60048036038101906101aa919061113a565b6104c3565b6040516101bc91906110f5565b60405180910390f35b3480156101d157600080fd5b506101ec60048036038101906101e7919061118d565b6105ba565b005b3480156101fa57600080fd5b506102036106b9565b60405161021091906111d6565b60405180910390f35b34801561022557600080fd5b5061022e6106c2565b60405161023b919061120a565b60405180910390f35b34801561025057600080fd5b5061026b60048036038101906102669190611225565b610741565b604051610278919061111f565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190611225565b61075c565b6040516102b5919061111f565b60405180910390f35b3480156102ca57600080fd5b506102d3610777565b6040516102e09190610fdf565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b919061109a565b6107b4565b60405161031d91906110f5565b60405180910390f35b61032e610396565b005b34801561033c57600080fd5b50610357600480360381019061035291906112aa565b6108a9565b005b34801561036557600080fd5b50610380600480360381019061037b919061134c565b610a76565b60405161038d919061111f565b60405180910390f35b6103a03334610b0f565b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516103e6919061111f565b60405180910390a2565b60606040518060400160405280600a81526020017f5772617070656420495000000000000000000000000000000000000000000000815250905090565b60003373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361049f57336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610496919061139b565b60405180910390fd5b6104a98383610ba6565b905092915050565b60006805345cdf77eb68f44c54905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105365760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161052d919061139b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105a657306040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161059d919061139b565b60405180910390fd5b6105b1848484610c36565b90509392505050565b6105c43382610de3565b60003373ffffffffffffffffffffffffffffffffffffffff16826040516105ea906113e7565b60006040518083038185875af1925050503d8060008114610627576040519150601f19603f3d011682016040523d82523d6000602084013e61062c565b606091505b5050905080610667576040517f69bfc5f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65836040516106ad919061111f565b60405180910390a25050565b60006012905090565b6000806106cd610e7a565b90506000801b81036106eb576106e16103f0565b8051906020012090505b60006106f5610e7f565b90506040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815282602082015281604082015246606082015230608082015260a08120935050505090565b60006387a211a2600c52816000526020600c20549050919050565b60006338377508600c52816000526020600c20549050919050565b60606040518060400160405280600381526020017f5749500000000000000000000000000000000000000000000000000000000000815250905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108275760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161081e919061139b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361089757306040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161088e919061139b565b60405180910390fd5b6108a18383610eaa565b905092915050565b6108b1610f3c565b156108e5578419156e22d473030f116ddee9f6b43ac78ba38760601b60601c18176108e457633f68539a6000526004601cfd5b5b60006108ef610e7a565b90506000801b810361090d576109036103f0565b8051906020012090505b6000610917610e7f565b90508542111561092f57631a15a3cc6000526004601cfd5b6040518960601b60601c99508860601b60601c985065383775081901600e52896000526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835284602084015283604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528b60208401528a60408401528960608401528060808401528860a084015260c08320604e526042602c206000528760ff1660205286604052856060526020806080600060015afa8c3d5114610a1b5763ddafbaef6000526004601cfd5b80820183558b637f5e9f2060a01b176040528a6034602c20558b8d7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608801a383604052600060605250505050505050505050505050565b6000610a80610f3c565b15610af0576e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050610b09565b5b81602052637f5e9f20600c52826000526034600c205490505b92915050565b610b1b60008383610f45565b6805345cdf77eb68f44c5481810181811015610b3f5763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c556387a211a2600c52836000526020600c2083815401815583602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505050610ba260008383610f4a565b5050565b6000610bb0610f3c565b15610be4578119156e22d473030f116ddee9f6b43ac78ba38460601b60601c1817610be357633f68539a6000526004601cfd5b5b82602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a36001905092915050565b6000610c43848484610f45565b610c4b610f3c565b15610d1c578360601b6e22d473030f116ddee9f6b43ac78ba33314610ca55733602052637f5e9f208117600c526034600c208054801915610ca25780851115610c9c576313be252b6000526004601cfd5b84810382555b50505b6387a211a28117600c526020600c20805480851115610ccc5763f4d678b86000526004601cfd5b8481038255856000526020600c2085815401815585602052600c5160601c8460601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350505050610dcd565b8360601b33602052637f5e9f208117600c526034600c208054801915610d585780851115610d52576313be252b6000526004601cfd5b84810382555b6387a211a28317600c526020600c20805480871115610d7f5763f4d678b86000526004601cfd5b8681038255876000526020600c2087815401815587602052600c5160601c8660601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050505050505b610dd8848484610f4a565b600190509392505050565b610def82600083610f45565b6387a211a2600c52816000526020600c20805480831115610e185763f4d678b86000526004601cfd5b8281038255826805345cdf77eb68f44c54036805345cdf77eb68f44c558260005260008460601b60601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206000a35050610e7682600083610f4a565b5050565b600090565b60007fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660001b905090565b6000610eb7338484610f45565b6387a211a2600c52336000526020600c20805480841115610ee05763f4d678b86000526004601cfd5b8381038255846000526020600c2084815401815584602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505050610f32338484610f4a565b6001905092915050565b60006001905090565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f89578082015181840152602081019050610f6e565b60008484015250505050565b6000601f19601f8301169050919050565b6000610fb182610f4f565b610fbb8185610f5a565b9350610fcb818560208601610f6b565b610fd481610f95565b840191505092915050565b60006020820190508181036000830152610ff98184610fa6565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061103182611006565b9050919050565b61104181611026565b811461104c57600080fd5b50565b60008135905061105e81611038565b92915050565b6000819050919050565b61107781611064565b811461108257600080fd5b50565b6000813590506110948161106e565b92915050565b600080604083850312156110b1576110b0611001565b5b60006110bf8582860161104f565b92505060206110d085828601611085565b9150509250929050565b60008115159050919050565b6110ef816110da565b82525050565b600060208201905061110a60008301846110e6565b92915050565b61111981611064565b82525050565b60006020820190506111346000830184611110565b92915050565b60008060006060848603121561115357611152611001565b5b60006111618682870161104f565b93505060206111728682870161104f565b925050604061118386828701611085565b9150509250925092565b6000602082840312156111a3576111a2611001565b5b60006111b184828501611085565b91505092915050565b600060ff82169050919050565b6111d0816111ba565b82525050565b60006020820190506111eb60008301846111c7565b92915050565b6000819050919050565b611204816111f1565b82525050565b600060208201905061121f60008301846111fb565b92915050565b60006020828403121561123b5761123a611001565b5b60006112498482850161104f565b91505092915050565b61125b816111ba565b811461126657600080fd5b50565b60008135905061127881611252565b92915050565b611287816111f1565b811461129257600080fd5b50565b6000813590506112a48161127e565b92915050565b600080600080600080600060e0888a0312156112c9576112c8611001565b5b60006112d78a828b0161104f565b97505060206112e88a828b0161104f565b96505060406112f98a828b01611085565b955050606061130a8a828b01611085565b945050608061131b8a828b01611269565b93505060a061132c8a828b01611295565b92505060c061133d8a828b01611295565b91505092959891949750929550565b6000806040838503121561136357611362611001565b5b60006113718582860161104f565b92505060206113828582860161104f565b9150509250929050565b61139581611026565b82525050565b60006020820190506113b0600083018461138c565b92915050565b600081905092915050565b50565b60006113d16000836113b6565b91506113dc826113c1565b600082019050919050565b60006113f2826113c4565b915081905091905056fea2646970667358221220a8d81246ebc70d08abbc1d7fb40166f14e933bdcd103940be526137e4fab0cee64736f6c634300081a0033

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.