ETH Price: $2,417.64 (+0.66%)

Contract

0x7B7371C28aFee7212B7BB2e13B399edaA7C83D18
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...202470052024-07-06 10:55:4791 days ago1720263347IN
0x7B7371C2...aA7C83D18
0 ETH0.000121832.24864348
Set Approval For...202153572024-07-02 0:49:2396 days ago1719881363IN
0x7B7371C2...aA7C83D18
0 ETH0.000122962.2694667
Set Approval For...199285862024-05-22 23:04:59136 days ago1716419099IN
0x7B7371C2...aA7C83D18
0 ETH0.000400367.38913523
Safe Transfer Fr...199235012024-05-22 6:00:35136 days ago1716357635IN
0x7B7371C2...aA7C83D18
0 ETH0.000489057.18126113
Safe Transfer Fr...199234392024-05-22 5:47:47136 days ago1716356867IN
0x7B7371C2...aA7C83D18
0 ETH0.000458626.50766996
Safe Transfer Fr...199230742024-05-22 4:33:23136 days ago1716352403IN
0x7B7371C2...aA7C83D18
0 ETH0.000403565.72642315
Set Approval For...198326892024-05-09 13:08:47149 days ago1715260127IN
0x7B7371C2...aA7C83D18
0 ETH0.000152084.71275063
Safe Transfer Fr...198009772024-05-05 2:40:59153 days ago1714876859IN
0x7B7371C2...aA7C83D18
0 ETH0.000284464.03645225
Safe Transfer Fr...197866672024-05-03 2:40:11155 days ago1714704011IN
0x7B7371C2...aA7C83D18
0 ETH0.000718235.39578969
Safe Transfer Fr...197866542024-05-03 2:37:35155 days ago1714703855IN
0x7B7371C2...aA7C83D18
0 ETH0.000747925.7570692
Set Approval For...196151562024-04-09 2:37:11179 days ago1712630231IN
0x7B7371C2...aA7C83D18
0 ETH0.0006227119.29652196
Set Approval For...195620672024-04-01 16:07:47187 days ago1711987667IN
0x7B7371C2...aA7C83D18
0 ETH0.0024458645.14087318
Set Approval For...195138442024-03-25 20:25:47194 days ago1711398347IN
0x7B7371C2...aA7C83D18
0 ETH0.0022824842.12541881
Safe Transfer Fr...195138252024-03-25 20:21:59194 days ago1711398119IN
0x7B7371C2...aA7C83D18
0 ETH0.0027746839.37783516
Set Approval For...194157002024-03-12 1:24:11208 days ago1710206651IN
0x7B7371C2...aA7C83D18
0 ETH0.0027669251.06632751
Safe Transfer Fr...193780472024-03-06 18:53:23213 days ago1709751203IN
0x7B7371C2...aA7C83D18
0 ETH0.00780847103.74912133
Safe Transfer Fr...193780222024-03-06 18:48:23213 days ago1709750903IN
0x7B7371C2...aA7C83D18
0 ETH0.0112800179.048199
Transfer From193074552024-02-25 22:04:11223 days ago1708898651IN
0x7B7371C2...aA7C83D18
0 ETH0.0025726434.16031532
Safe Transfer Fr...193011102024-02-25 0:46:23224 days ago1708821983IN
0x7B7371C2...aA7C83D18
0 ETH0.0018019524.61314159
Safe Transfer Fr...193001562024-02-24 21:34:23224 days ago1708810463IN
0x7B7371C2...aA7C83D18
0 ETH0.002176927.88218416
Transfer From192971912024-02-24 11:36:59224 days ago1708774619IN
0x7B7371C2...aA7C83D18
0 ETH0.0014961322.09974536
Safe Transfer Fr...192941052024-02-24 1:16:59225 days ago1708737419IN
0x7B7371C2...aA7C83D18
0 ETH0.0034332824.39971831
Set Approval For...192926222024-02-23 20:17:59225 days ago1708719479IN
0x7B7371C2...aA7C83D18
0 ETH0.0016648730.72697512
Transfer From192926092024-02-23 20:15:23225 days ago1708719323IN
0x7B7371C2...aA7C83D18
0 ETH0.0047945436.09098811
Safe Transfer Fr...192925892024-02-23 20:11:23225 days ago1708719083IN
0x7B7371C2...aA7C83D18
0 ETH0.0030288238.79377595
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
192269502024-02-14 14:59:59234 days ago1707922799  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DN404Mirror

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
File 1 of 1 : DN404Mirror.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @title DN404Mirror
/// @notice DN404Mirror provides an interface for interacting with the
/// NFT tokens in a DN404 implementation.
///
/// @author vectorized.eth (@optimizoor)
/// @author Quit (@0xQuit)
/// @author Michael Amadi (@AmadiMichaels)
/// @author cygaar (@0xCygaar)
/// @author Thomas (@0xjustadev)
/// @author Harrison (@PopPunkOnChain)
///
/// @dev Note:
/// - The ERC721 data is stored in the base DN404 contract.
contract DN404Mirror {
    /*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
    /*                           EVENTS                           */
    /*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/

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

    /// @dev Emitted when `owner` enables `account` to manage the `id` token.
    event Approval(address indexed owner, address indexed account, uint256 indexed id);

    /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.
    event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);

    /// @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;

    /// @dev `keccak256(bytes("ApprovalForAll(address,address,bool)"))`.
    uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =
        0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;

    /*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
    /*                        CUSTOM ERRORS                       */
    /*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/

    /// @dev Thrown when a call for an NFT function did not originate
    /// from the base DN404 contract.
    error SenderNotBase();

    /// @dev Thrown when a call for an NFT function did not originate from the deployer.
    error SenderNotDeployer();

    /// @dev Thrown when transferring an NFT to a contract address that
    /// does not implement ERC721Receiver.
    error TransferToNonERC721ReceiverImplementer();

    /// @dev Thrown when linking to the DN404 base contract and the
    /// DN404 supportsInterface check fails or the call reverts.
    error CannotLink();

    /// @dev Thrown when a linkMirrorContract call is received and the
    /// NFT mirror contract has already been linked to a DN404 base contract.
    error AlreadyLinked();

    /// @dev Thrown when retrieving the base DN404 address when a link has not
    /// been established.
    error NotLinked();

    /*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
    /*                          STORAGE                           */
    /*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/

    /// @dev Struct contain the NFT mirror contract storage.
    struct DN404NFTStorage {
        address baseERC20;
        address deployer;
    }

    /// @dev Returns a storage pointer for DN404NFTStorage.
    function _getDN404NFTStorage() internal pure virtual returns (DN404NFTStorage storage $) {
        /// @solidity memory-safe-assembly
        assembly {
            // `uint72(bytes9(keccak256("DN404_MIRROR_STORAGE")))`.
            $.slot := 0x3602298b8c10b01230 // Truncate to 9 bytes to reduce bytecode size.
        }
    }

    /*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
    /*                        CONSTRUCTOR                         */
    /*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/

    constructor(address deployer) {
        // For non-proxies, we will store the deployer so that only the deployer can
        // link the base contract.
        _getDN404NFTStorage().deployer = deployer;
    }

    /*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
    /*                     ERC721 OPERATIONS                      */
    /*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/

    /// @dev Returns the token collection name from the base DN404 contract.
    function name() public view virtual returns (string memory result) {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            result := mload(0x40)
            mstore(0x00, 0x06fdde03) // `name()`.
            if iszero(staticcall(gas(), base, 0x1c, 0x04, 0x00, 0x00)) {
                returndatacopy(result, 0x00, returndatasize())
                revert(result, returndatasize())
            }
            returndatacopy(0x00, 0x00, 0x20)
            returndatacopy(result, mload(0x00), 0x20)
            returndatacopy(add(result, 0x20), add(mload(0x00), 0x20), mload(result))
            mstore(0x40, add(add(result, 0x20), mload(result)))
        }
    }

    /// @dev Returns the token collection symbol from the base DN404 contract.
    function symbol() public view virtual returns (string memory result) {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            result := mload(0x40)
            mstore(0x00, 0x95d89b41) // `symbol()`.
            if iszero(staticcall(gas(), base, 0x1c, 0x04, 0x00, 0x00)) {
                returndatacopy(result, 0x00, returndatasize())
                revert(result, returndatasize())
            }
            returndatacopy(0x00, 0x00, 0x20)
            returndatacopy(result, mload(0x00), 0x20)
            returndatacopy(add(result, 0x20), add(mload(0x00), 0x20), mload(result))
            mstore(0x40, add(add(result, 0x20), mload(result)))
        }
    }

    /// @dev Returns the Uniform Resource Identifier (URI) for token `id` from
    /// the base DN404 contract.
    function tokenURI(uint256 id) public view virtual returns (string memory result) {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            result := mload(0x40)
            mstore(0x20, id)
            mstore(0x00, 0xc87b56dd) // `tokenURI()`.
            if iszero(staticcall(gas(), base, 0x1c, 0x24, 0x00, 0x00)) {
                returndatacopy(result, 0x00, returndatasize())
                revert(result, returndatasize())
            }
            returndatacopy(0x00, 0x00, 0x20)
            returndatacopy(result, mload(0x00), 0x20)
            returndatacopy(add(result, 0x20), add(mload(0x00), 0x20), mload(result))
            mstore(0x40, add(add(result, 0x20), mload(result)))
        }
    }

    /// @dev Returns the total NFT supply from the base DN404 contract.
    function totalSupply() public view virtual returns (uint256 result) {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, 0xe2c79281) // `totalNFTSupply()`.
            if iszero(
                and(gt(returndatasize(), 0x1f), staticcall(gas(), base, 0x1c, 0x04, 0x00, 0x20))
            ) {
                returndatacopy(mload(0x40), 0x00, returndatasize())
                revert(mload(0x40), returndatasize())
            }
            result := mload(0x00)
        }
    }

    /// @dev Returns the number of NFT tokens owned by `owner` from the base DN404 contract.
    ///
    /// Requirements:
    /// - `owner` must not be the zero address.
    function balanceOf(address owner) public view virtual returns (uint256 result) {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, shr(96, shl(96, owner)))
            mstore(0x00, 0xf5b100ea) // `balanceOfNFT(address)`.
            if iszero(
                and(gt(returndatasize(), 0x1f), staticcall(gas(), base, 0x1c, 0x24, 0x00, 0x20))
            ) {
                returndatacopy(mload(0x40), 0x00, returndatasize())
                revert(mload(0x40), returndatasize())
            }
            result := mload(0x00)
        }
    }

    /// @dev Returns the owner of token `id` from the base DN404 contract.
    ///
    /// Requirements:
    /// - Token `id` must exist.
    function ownerOf(uint256 id) public view virtual returns (address result) {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, 0x6352211e) // `ownerOf(uint256)`.
            mstore(0x20, id)
            if iszero(
                and(gt(returndatasize(), 0x1f), staticcall(gas(), base, 0x1c, 0x24, 0x00, 0x20))
            ) {
                returndatacopy(mload(0x40), 0x00, returndatasize())
                revert(mload(0x40), returndatasize())
            }
            result := shr(96, mload(0x0c))
        }
    }

    /// @dev Sets `spender` as the approved account to manage token `id` in
    /// the base DN404 contract.
    ///
    /// Requirements:
    /// - Token `id` must exist.
    /// - The caller must be the owner of the token,
    ///   or an approved operator for the token owner.
    ///
    /// Emits an {Approval} event.
    function approve(address spender, uint256 id) public virtual {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            spender := shr(96, shl(96, spender))
            let m := mload(0x40)
            mstore(0x00, 0xd10b6e0c) // `approveNFT(address,uint256,address)`.
            mstore(0x20, spender)
            mstore(0x40, id)
            mstore(0x60, caller())
            if iszero(
                and(
                    gt(returndatasize(), 0x1f),
                    call(gas(), base, callvalue(), 0x1c, 0x64, 0x00, 0x20)
                )
            ) {
                returndatacopy(m, 0x00, returndatasize())
                revert(m, returndatasize())
            }
            mstore(0x40, m) // Restore the free memory pointer.
            mstore(0x60, 0) // Restore the zero pointer.
            // Emit the {Approval} event.
            log4(codesize(), 0x00, _APPROVAL_EVENT_SIGNATURE, shr(96, mload(0x0c)), spender, id)
        }
    }

    /// @dev Returns the account approved to manage token `id` from
    /// the base DN404 contract.
    ///
    /// Requirements:
    /// - Token `id` must exist.
    function getApproved(uint256 id) public view virtual returns (address result) {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, 0x081812fc) // `getApproved(uint256)`.
            mstore(0x20, id)
            if iszero(
                and(gt(returndatasize(), 0x1f), staticcall(gas(), base, 0x1c, 0x24, 0x00, 0x20))
            ) {
                returndatacopy(mload(0x40), 0x00, returndatasize())
                revert(mload(0x40), returndatasize())
            }
            result := shr(96, mload(0x0c))
        }
    }

    /// @dev Sets whether `operator` is approved to manage the tokens of the caller in
    /// the base DN404 contract.
    ///
    /// Emits an {ApprovalForAll} event.
    function setApprovalForAll(address operator, bool approved) public virtual {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            operator := shr(96, shl(96, operator))
            let m := mload(0x40)
            mstore(0x00, 0x813500fc) // `setApprovalForAll(address,bool,address)`.
            mstore(0x20, operator)
            mstore(0x40, iszero(iszero(approved)))
            mstore(0x60, caller())
            if iszero(
                and(eq(mload(0x00), 1), call(gas(), base, callvalue(), 0x1c, 0x64, 0x00, 0x20))
            ) {
                returndatacopy(m, 0x00, returndatasize())
                revert(m, returndatasize())
            }
            // Emit the {ApprovalForAll} event.
            log3(0x40, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), operator)
            mstore(0x40, m) // Restore the free memory pointer.
            mstore(0x60, 0) // Restore the zero pointer.
        }
    }

    /// @dev Returns whether `operator` is approved to manage the tokens of `owner` from
    /// the base DN404 contract.
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        returns (bool result)
    {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(0x40, operator)
            mstore(0x2c, shl(96, owner))
            mstore(0x0c, 0xe985e9c5000000000000000000000000) // `isApprovedForAll(address,address)`.
            if iszero(
                and(gt(returndatasize(), 0x1f), staticcall(gas(), base, 0x1c, 0x44, 0x00, 0x20))
            ) {
                returndatacopy(m, 0x00, returndatasize())
                revert(m, returndatasize())
            }
            mstore(0x40, m) // Restore the free memory pointer.
            result := iszero(iszero(mload(0x00)))
        }
    }

    /// @dev Transfers token `id` from `from` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must exist.
    /// - `from` must be the owner of the token.
    /// - `to` cannot be the zero address.
    /// - The caller must be the owner of the token, or be approved to manage the token.
    ///
    /// Emits a {Transfer} event.
    function transferFrom(address from, address to, uint256 id) public virtual {
        address base = baseERC20();
        /// @solidity memory-safe-assembly
        assembly {
            from := shr(96, shl(96, from))
            to := shr(96, shl(96, to))
            let m := mload(0x40)
            mstore(m, 0xe5eb36c8) // `transferFromNFT(address,address,uint256,address)`.
            mstore(add(m, 0x20), from)
            mstore(add(m, 0x40), to)
            mstore(add(m, 0x60), id)
            mstore(add(m, 0x80), caller())
            if iszero(
                and(eq(mload(m), 1), call(gas(), base, callvalue(), add(m, 0x1c), 0x84, m, 0x20))
            ) {
                returndatacopy(m, 0x00, returndatasize())
                revert(m, returndatasize())
            }
            // Emit the {Transfer} event.
            log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, from, to, id)
        }
    }

    /// @dev Equivalent to `safeTransferFrom(from, to, id, "")`.
    function safeTransferFrom(address from, address to, uint256 id) public payable virtual {
        transferFrom(from, to, id);

        if (_hasCode(to)) _checkOnERC721Received(from, to, id, "");
    }

    /// @dev Transfers token `id` from `from` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must exist.
    /// - `from` must be the owner of the token.
    /// - `to` cannot be the zero address.
    /// - The caller must be the owner of the token, or be approved to manage the token.
    /// - If `to` refers to a smart contract, it must implement
    ///   {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
    ///
    /// Emits a {Transfer} event.
    function safeTransferFrom(address from, address to, uint256 id, bytes calldata data)
        public
        virtual
    {
        transferFrom(from, to, id);

        if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
    }

    /// @dev Returns true if this contract implements the interface defined by `interfaceId`.
    /// See: https://eips.ethereum.org/EIPS/eip-165
    /// This function call must use less than 30000 gas.
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {
        /// @solidity memory-safe-assembly
        assembly {
            let s := shr(224, interfaceId)
            // ERC165: 0x01ffc9a7, ERC721: 0x80ac58cd, ERC721Metadata: 0x5b5e139f.
            result := or(or(eq(s, 0x01ffc9a7), eq(s, 0x80ac58cd)), eq(s, 0x5b5e139f))
        }
    }

    /*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
    /*                     MIRROR OPERATIONS                      */
    /*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/

    /// @dev Returns the address of the base DN404 contract.
    function baseERC20() public view virtual returns (address base) {
        base = _getDN404NFTStorage().baseERC20;
        if (base == address(0)) revert NotLinked();
    }

    /// @dev Fallback modifier to execute calls from the base DN404 contract.
    modifier dn404NFTFallback() virtual {
        DN404NFTStorage storage $ = _getDN404NFTStorage();

        uint256 fnSelector = _calldataload(0x00) >> 224;

        // `logTransfer(uint256[])`.
        if (fnSelector == 0x263c69d6) {
            if (msg.sender != $.baseERC20) revert SenderNotBase();
            /// @solidity memory-safe-assembly
            assembly {
                // When returndatacopy copies 1 or more out-of-bounds bytes, it reverts.
                returndatacopy(0x00, returndatasize(), lt(calldatasize(), 0x20))
                let o := add(0x24, calldataload(0x04)) // Packed logs offset.
                returndatacopy(0x00, returndatasize(), lt(calldatasize(), o))
                let end := add(o, shl(5, calldataload(sub(o, 0x20))))
                returndatacopy(0x00, returndatasize(), lt(calldatasize(), end))

                for {} iszero(eq(o, end)) { o := add(0x20, o) } {
                    let d := calldataload(o) // Entry in the packed logs.
                    let a := shr(96, d) // The address.
                    let b := and(1, d) // Whether it is a burn.
                    log4(
                        codesize(),
                        0x00,
                        _TRANSFER_EVENT_SIGNATURE,
                        mul(a, b),
                        mul(a, iszero(b)),
                        shr(168, shl(160, d))
                    )
                }
                mstore(0x00, 0x01)
                return(0x00, 0x20)
            }
        }
        // `linkMirrorContract(address)`.
        if (fnSelector == 0x0f4599e5) {
            if ($.deployer != address(0)) {
                if (address(uint160(_calldataload(0x04))) != $.deployer) {
                    revert SenderNotDeployer();
                }
            }
            if ($.baseERC20 != address(0)) revert AlreadyLinked();
            $.baseERC20 = msg.sender;
            /// @solidity memory-safe-assembly
            assembly {
                mstore(0x00, 0x01)
                return(0x00, 0x20)
            }
        }
        _;
    }

    /// @dev Fallback function for calls from base DN404 contract.
    fallback() external payable virtual dn404NFTFallback {}

    receive() external payable virtual {}

    /*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
    /*                      PRIVATE HELPERS                       */
    /*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/

    /// @dev Returns the calldata value at `offset`.
    function _calldataload(uint256 offset) private pure returns (uint256 value) {
        /// @solidity memory-safe-assembly
        assembly {
            value := calldataload(offset)
        }
    }

    /// @dev Returns if `a` has bytecode of non-zero length.
    function _hasCode(address a) private view returns (bool result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := extcodesize(a) // Can handle dirty upper bits.
        }
    }

    /// @dev Perform a call to invoke {IERC721Receiver-onERC721Received} on `to`.
    /// Reverts if the target does not support the function correctly.
    function _checkOnERC721Received(address from, address to, uint256 id, bytes memory data)
        private
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the calldata.
            let m := mload(0x40)
            let onERC721ReceivedSelector := 0x150b7a02
            mstore(m, onERC721ReceivedSelector)
            mstore(add(m, 0x20), caller()) // The `operator`, which is always `msg.sender`.
            mstore(add(m, 0x40), shr(96, shl(96, from)))
            mstore(add(m, 0x60), id)
            mstore(add(m, 0x80), 0x80)
            let n := mload(data)
            mstore(add(m, 0xa0), n)
            if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xc0), n)) }
            // Revert if the call reverts.
            if iszero(call(gas(), to, 0, add(m, 0x1c), add(n, 0xa4), m, 0x20)) {
                if returndatasize() {
                    // Bubble up the revert if the call reverts.
                    returndatacopy(m, 0x00, returndatasize())
                    revert(m, returndatasize())
                }
            }
            // Load the returndata and compare it.
            if iszero(eq(mload(m), shl(224, onERC721ReceivedSelector))) {
                mstore(0x00, 0xd1a57ed6) // `TransferToNonERC721ReceiverImplementer()`.
                revert(0x1c, 0x04)
            }
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"deployer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyLinked","type":"error"},{"inputs":[],"name":"CannotLink","type":"error"},{"inputs":[],"name":"NotLinked","type":"error"},{"inputs":[],"name":"SenderNotBase","type":"error"},{"inputs":[],"name":"SenderNotDeployer","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isApproved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"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":"baseERC20","outputs":[{"internalType":"address","name":"base","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"result","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"result","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"result","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200137f3803806200137f83398181016040528101906200003791906200010b565b80620000486200009060201b60201c565b60010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200013d565b6000683602298b8c10b01230905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000d382620000a6565b9050919050565b620000e581620000c6565b8114620000f157600080fd5b50565b6000815190506200010581620000da565b92915050565b600060208284031215620001245762000123620000a1565b5b60006200013484828501620000f4565b91505092915050565b611232806200014d6000396000f3fe6080604052600436106100ec5760003560e01c80636352211e1161008a578063a22cb46511610059578063a22cb46514610607578063b88d4fde14610630578063c87b56dd14610659578063e985e9c514610696576100f3565b80636352211e1461053757806370a082311461057457806395d89b41146105b157806397e5311c146105dc576100f3565b8063095ea7b3116100c6578063095ea7b31461049e57806318160ddd146104c757806323b872dd146104f257806342842e0e1461051b576100f3565b806301ffc9a7146103f957806306fdde0314610436578063081812fc14610461576100f3565b366100f357005b60006100fd6106d3565b9050600060e061010d60006106e4565b901c905063263c69d68103610229578160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101a5576040517f363cb31200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602036103d60003e6004356024018036103d60003e602081033560051b81018036103d60003e5b80821461021e5781358060601c816001168260a01b60a81c811583028284027fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a45050508160200191506101cc565b600160005260206000f35b630f4599e581036103f757600073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461031f578160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166102d160046106e4565b73ffffffffffffffffffffffffffffffffffffffff161461031e576040517fc59ec47a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146103a9576040517fbf656a4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b338260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160005260206000f35b005b34801561040557600080fd5b50610420600480360381019061041b9190610d79565b6106ef565b60405161042d9190610dc1565b60405180910390f35b34801561044257600080fd5b5061044b610714565b6040516104589190610e6c565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190610ec4565b61076e565b6040516104959190610f32565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190610f79565b6107b6565b005b3480156104d357600080fd5b506104dc61083c565b6040516104e99190610fc8565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190610fe3565b61087b565b005b61053560048036038101906105309190610fe3565b61090a565b005b34801561054357600080fd5b5061055e60048036038101906105599190610ec4565b610944565b60405161056b9190610f32565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190611036565b61098c565b6040516105a89190610fc8565b60405180910390f35b3480156105bd57600080fd5b506105c66109d7565b6040516105d39190610e6c565b60405180910390f35b3480156105e857600080fd5b506105f1610a31565b6040516105fe9190610f32565b60405180910390f35b34801561061357600080fd5b5061062e6004803603810190610629919061108f565b610aca565b005b34801561063c57600080fd5b5061065760048036038101906106529190611134565b610b4f565b005b34801561066557600080fd5b50610680600480360381019061067b9190610ec4565b610bc0565b60405161068d9190610e6c565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b891906111bc565b610c20565b6040516106ca9190610dc1565b60405180910390f35b6000683602298b8c10b01230905090565b600081359050919050565b60008160e01c635b5e139f81146380ac58cd82146301ffc9a783141717915050919050565b60606000610720610a31565b905060405191506306fdde036000526000806004601c845afa610746573d6000833e3d82fd5b60206000803e6020600051833e8151602060005101602084013e815160208301016040525090565b600080610779610a31565b905063081812fc60005282602052602060006024601c845afa601f3d11166107a8573d60006040513e3d604051fd5b600c5160601c915050919050565b60006107c0610a31565b90508260601b60601c925060405163d10b6e0c600052836020528260405233606052602060006064601c34865af1601f3d1116610800573d6000823e3d81fd5b8060405260006060528284600c5160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600038a450505050565b600080610847610a31565b905063e2c79281600052602060006004601c845afa601f3d1116610872573d60006040513e3d604051fd5b60005191505090565b6000610885610a31565b90508360601b60601c93508260601b60601c925060405163e5eb36c881528460208201528360408201528260608201523360808201526020816084601c840134865af16001825114166108db573d6000823e3d81fd5b8284867fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a45050505050565b61091583838361087b565b61091e82610c7f565b1561093f5761093e83838360405180602001604052806000815250610c8a565b5b505050565b60008061094f610a31565b9050636352211e60005282602052602060006024601c845afa601f3d111661097e573d60006040513e3d604051fd5b600c5160601c915050919050565b600080610997610a31565b90508260601b60601c60205263f5b100ea600052602060006024601c845afa601f3d11166109cc573d60006040513e3d604051fd5b600051915050919050565b606060006109e3610a31565b905060405191506395d89b416000526000806004601c845afa610a09573d6000833e3d82fd5b60206000803e6020600051833e8151602060005101602084013e815160208301016040525090565b6000610a3b6106d3565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ac7576040517f5b2a47ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b90565b6000610ad4610a31565b90508260601b60601c925060405163813500fc6000528360205282151560405233606052602060006064601c34865af160016000511416610b18573d6000823e3d81fd5b83337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206040a380604052600060605250505050565b610b5a85858561087b565b610b6384610c7f565b15610bb957610bb885858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610c8a565b5b5050505050565b60606000610bcc610a31565b905060405191508260205263c87b56dd6000526000806024601c845afa610bf6573d6000833e3d82fd5b60206000803e6020600051833e8151602060005101602084013e8151602083010160405250919050565b600080610c2b610a31565b9050604051836040528460601b602c526fe985e9c5000000000000000000000000600c52602060006044601c855afa601f3d1116610c6c573d6000823e3d81fd5b8060405260005115159250505092915050565b6000813b9050919050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a08401528015610cd1578060c08401826020870160045afa505b60208360a48301601c860160008a5af1610cf5573d15610cf4573d6000843e3d83fd5b5b8160e01b835114610d0e5763d1a57ed66000526004601cfd5b50505050505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610d5681610d21565b8114610d6157600080fd5b50565b600081359050610d7381610d4d565b92915050565b600060208284031215610d8f57610d8e610d17565b5b6000610d9d84828501610d64565b91505092915050565b60008115159050919050565b610dbb81610da6565b82525050565b6000602082019050610dd66000830184610db2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e16578082015181840152602081019050610dfb565b60008484015250505050565b6000601f19601f8301169050919050565b6000610e3e82610ddc565b610e488185610de7565b9350610e58818560208601610df8565b610e6181610e22565b840191505092915050565b60006020820190508181036000830152610e868184610e33565b905092915050565b6000819050919050565b610ea181610e8e565b8114610eac57600080fd5b50565b600081359050610ebe81610e98565b92915050565b600060208284031215610eda57610ed9610d17565b5b6000610ee884828501610eaf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f1c82610ef1565b9050919050565b610f2c81610f11565b82525050565b6000602082019050610f476000830184610f23565b92915050565b610f5681610f11565b8114610f6157600080fd5b50565b600081359050610f7381610f4d565b92915050565b60008060408385031215610f9057610f8f610d17565b5b6000610f9e85828601610f64565b9250506020610faf85828601610eaf565b9150509250929050565b610fc281610e8e565b82525050565b6000602082019050610fdd6000830184610fb9565b92915050565b600080600060608486031215610ffc57610ffb610d17565b5b600061100a86828701610f64565b935050602061101b86828701610f64565b925050604061102c86828701610eaf565b9150509250925092565b60006020828403121561104c5761104b610d17565b5b600061105a84828501610f64565b91505092915050565b61106c81610da6565b811461107757600080fd5b50565b60008135905061108981611063565b92915050565b600080604083850312156110a6576110a5610d17565b5b60006110b485828601610f64565b92505060206110c58582860161107a565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126110f4576110f36110cf565b5b8235905067ffffffffffffffff811115611111576111106110d4565b5b60208301915083600182028301111561112d5761112c6110d9565b5b9250929050565b6000806000806000608086880312156111505761114f610d17565b5b600061115e88828901610f64565b955050602061116f88828901610f64565b945050604061118088828901610eaf565b935050606086013567ffffffffffffffff8111156111a1576111a0610d1c565b5b6111ad888289016110de565b92509250509295509295909350565b600080604083850312156111d3576111d2610d17565b5b60006111e185828601610f64565b92505060206111f285828601610f64565b915050925092905056fea2646970667358221220a5f01210ff2cf075f45837fcf819d75ba3fa055593abbef236cc88753bf397c164736f6c63430008150033000000000000000000000000373946dcac70de46e2fe6fe095e301d746cc57ed

Deployed Bytecode

0x6080604052600436106100ec5760003560e01c80636352211e1161008a578063a22cb46511610059578063a22cb46514610607578063b88d4fde14610630578063c87b56dd14610659578063e985e9c514610696576100f3565b80636352211e1461053757806370a082311461057457806395d89b41146105b157806397e5311c146105dc576100f3565b8063095ea7b3116100c6578063095ea7b31461049e57806318160ddd146104c757806323b872dd146104f257806342842e0e1461051b576100f3565b806301ffc9a7146103f957806306fdde0314610436578063081812fc14610461576100f3565b366100f357005b60006100fd6106d3565b9050600060e061010d60006106e4565b901c905063263c69d68103610229578160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101a5576040517f363cb31200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602036103d60003e6004356024018036103d60003e602081033560051b81018036103d60003e5b80821461021e5781358060601c816001168260a01b60a81c811583028284027fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a45050508160200191506101cc565b600160005260206000f35b630f4599e581036103f757600073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461031f578160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166102d160046106e4565b73ffffffffffffffffffffffffffffffffffffffff161461031e576040517fc59ec47a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146103a9576040517fbf656a4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b338260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160005260206000f35b005b34801561040557600080fd5b50610420600480360381019061041b9190610d79565b6106ef565b60405161042d9190610dc1565b60405180910390f35b34801561044257600080fd5b5061044b610714565b6040516104589190610e6c565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190610ec4565b61076e565b6040516104959190610f32565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190610f79565b6107b6565b005b3480156104d357600080fd5b506104dc61083c565b6040516104e99190610fc8565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190610fe3565b61087b565b005b61053560048036038101906105309190610fe3565b61090a565b005b34801561054357600080fd5b5061055e60048036038101906105599190610ec4565b610944565b60405161056b9190610f32565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190611036565b61098c565b6040516105a89190610fc8565b60405180910390f35b3480156105bd57600080fd5b506105c66109d7565b6040516105d39190610e6c565b60405180910390f35b3480156105e857600080fd5b506105f1610a31565b6040516105fe9190610f32565b60405180910390f35b34801561061357600080fd5b5061062e6004803603810190610629919061108f565b610aca565b005b34801561063c57600080fd5b5061065760048036038101906106529190611134565b610b4f565b005b34801561066557600080fd5b50610680600480360381019061067b9190610ec4565b610bc0565b60405161068d9190610e6c565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b891906111bc565b610c20565b6040516106ca9190610dc1565b60405180910390f35b6000683602298b8c10b01230905090565b600081359050919050565b60008160e01c635b5e139f81146380ac58cd82146301ffc9a783141717915050919050565b60606000610720610a31565b905060405191506306fdde036000526000806004601c845afa610746573d6000833e3d82fd5b60206000803e6020600051833e8151602060005101602084013e815160208301016040525090565b600080610779610a31565b905063081812fc60005282602052602060006024601c845afa601f3d11166107a8573d60006040513e3d604051fd5b600c5160601c915050919050565b60006107c0610a31565b90508260601b60601c925060405163d10b6e0c600052836020528260405233606052602060006064601c34865af1601f3d1116610800573d6000823e3d81fd5b8060405260006060528284600c5160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600038a450505050565b600080610847610a31565b905063e2c79281600052602060006004601c845afa601f3d1116610872573d60006040513e3d604051fd5b60005191505090565b6000610885610a31565b90508360601b60601c93508260601b60601c925060405163e5eb36c881528460208201528360408201528260608201523360808201526020816084601c840134865af16001825114166108db573d6000823e3d81fd5b8284867fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a45050505050565b61091583838361087b565b61091e82610c7f565b1561093f5761093e83838360405180602001604052806000815250610c8a565b5b505050565b60008061094f610a31565b9050636352211e60005282602052602060006024601c845afa601f3d111661097e573d60006040513e3d604051fd5b600c5160601c915050919050565b600080610997610a31565b90508260601b60601c60205263f5b100ea600052602060006024601c845afa601f3d11166109cc573d60006040513e3d604051fd5b600051915050919050565b606060006109e3610a31565b905060405191506395d89b416000526000806004601c845afa610a09573d6000833e3d82fd5b60206000803e6020600051833e8151602060005101602084013e815160208301016040525090565b6000610a3b6106d3565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ac7576040517f5b2a47ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b90565b6000610ad4610a31565b90508260601b60601c925060405163813500fc6000528360205282151560405233606052602060006064601c34865af160016000511416610b18573d6000823e3d81fd5b83337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206040a380604052600060605250505050565b610b5a85858561087b565b610b6384610c7f565b15610bb957610bb885858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610c8a565b5b5050505050565b60606000610bcc610a31565b905060405191508260205263c87b56dd6000526000806024601c845afa610bf6573d6000833e3d82fd5b60206000803e6020600051833e8151602060005101602084013e8151602083010160405250919050565b600080610c2b610a31565b9050604051836040528460601b602c526fe985e9c5000000000000000000000000600c52602060006044601c855afa601f3d1116610c6c573d6000823e3d81fd5b8060405260005115159250505092915050565b6000813b9050919050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a08401528015610cd1578060c08401826020870160045afa505b60208360a48301601c860160008a5af1610cf5573d15610cf4573d6000843e3d83fd5b5b8160e01b835114610d0e5763d1a57ed66000526004601cfd5b50505050505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610d5681610d21565b8114610d6157600080fd5b50565b600081359050610d7381610d4d565b92915050565b600060208284031215610d8f57610d8e610d17565b5b6000610d9d84828501610d64565b91505092915050565b60008115159050919050565b610dbb81610da6565b82525050565b6000602082019050610dd66000830184610db2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e16578082015181840152602081019050610dfb565b60008484015250505050565b6000601f19601f8301169050919050565b6000610e3e82610ddc565b610e488185610de7565b9350610e58818560208601610df8565b610e6181610e22565b840191505092915050565b60006020820190508181036000830152610e868184610e33565b905092915050565b6000819050919050565b610ea181610e8e565b8114610eac57600080fd5b50565b600081359050610ebe81610e98565b92915050565b600060208284031215610eda57610ed9610d17565b5b6000610ee884828501610eaf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f1c82610ef1565b9050919050565b610f2c81610f11565b82525050565b6000602082019050610f476000830184610f23565b92915050565b610f5681610f11565b8114610f6157600080fd5b50565b600081359050610f7381610f4d565b92915050565b60008060408385031215610f9057610f8f610d17565b5b6000610f9e85828601610f64565b9250506020610faf85828601610eaf565b9150509250929050565b610fc281610e8e565b82525050565b6000602082019050610fdd6000830184610fb9565b92915050565b600080600060608486031215610ffc57610ffb610d17565b5b600061100a86828701610f64565b935050602061101b86828701610f64565b925050604061102c86828701610eaf565b9150509250925092565b60006020828403121561104c5761104b610d17565b5b600061105a84828501610f64565b91505092915050565b61106c81610da6565b811461107757600080fd5b50565b60008135905061108981611063565b92915050565b600080604083850312156110a6576110a5610d17565b5b60006110b485828601610f64565b92505060206110c58582860161107a565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126110f4576110f36110cf565b5b8235905067ffffffffffffffff811115611111576111106110d4565b5b60208301915083600182028301111561112d5761112c6110d9565b5b9250929050565b6000806000806000608086880312156111505761114f610d17565b5b600061115e88828901610f64565b955050602061116f88828901610f64565b945050604061118088828901610eaf565b935050606086013567ffffffffffffffff8111156111a1576111a0610d1c565b5b6111ad888289016110de565b92509250509295509295909350565b600080604083850312156111d3576111d2610d17565b5b60006111e185828601610f64565b92505060206111f285828601610f64565b915050925092905056fea2646970667358221220a5f01210ff2cf075f45837fcf819d75ba3fa055593abbef236cc88753bf397c164736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000373946dcac70de46e2fe6fe095e301d746cc57ed

-----Decoded View---------------
Arg [0] : deployer (address): 0x373946DCac70De46E2FE6fE095E301d746CC57ED

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000373946dcac70de46e2fe6fe095e301d746cc57ed


Block Transaction Difficulty 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
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.