ETH Price: $2,686.61 (+0.34%)

Contract

0x0c331e00703a9857819fa1Eb72aA3d4DE0f6f725
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NFTBatchTransfer

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2023-09-20
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - 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 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - 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 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

/**
 * @title ICryptoPunksMarket
 * @author Unlockd
 * @notice Defines the basic interface to interact with PunksMarket.
 **/
interface ICryptoPunksMarket {
  function punkIndexToAddress(uint256 index) external view returns (address);
}

/**
 * @title NFTBatchTransfer
 * @dev This is a public contract in order to allow batch transfers of NFTs,
 * in a single transaction, reducing gas costs and improving efficiency.
 * It is designed to work with standard ERC721 contracts, as well as the CryptoPunks contract.
 * No events, use the ones from the ERC721 contract
 */
contract NFTBatchTransfer {

    /*//////////////////////////////////////////////////////////////
                             ERRORS
    //////////////////////////////////////////////////////////////*/
    error TransferFromFailed();
    error BuyFailed();
    error TransferFailed();
    error NotOwner();
    error CantReceiveETH();
    error Fallback();
    
    /*//////////////////////////////////////////////////////////////
                           IMMUTABLES
    //////////////////////////////////////////////////////////////*/
    // Immutable address for the CryptoPunks contract. This is set at deployment and cannot be altered afterwards.
    address public immutable punkContract;

    /*//////////////////////////////////////////////////////////////
                              STRUCTS
    //////////////////////////////////////////////////////////////*/
    // Struct to encapsulate information about an individual NFT transfer.
    // It holds the address of the ERC721 contract and the specific token ID to be transferred.
    struct NftTransfer {
        address contractAddress;
        uint256 tokenId;
    }

    /*//////////////////////////////////////////////////////////////
                          INITIALIZATION
    //////////////////////////////////////////////////////////////*/
    /**
     * @dev Constructor to set the initial state of the contract.
     * @param _punkContract The address of the CryptoPunks contract.
     */
    constructor(address _punkContract) {
        punkContract = _punkContract;
    }

    /*//////////////////////////////////////////////////////////////
                    Fallback and Receive Functions
    //////////////////////////////////////////////////////////////*/
    // Explicitly reject any Ether sent to the contract
    fallback() external payable {
        revert Fallback();
    }

    // Explicitly reject any Ether transfered to the contract
    receive() external payable {
        revert CantReceiveETH();
    }

    /*//////////////////////////////////////////////////////////////
                          LOGIC
    //////////////////////////////////////////////////////////////*/
    /**
     * @dev Orchestrates a batch transfer of standard ERC721 NFTs.
     * @param nftTransfers An array of NftTransfer structs detailing the NFTs to be moved.
     * @param to The recipient's address.
     */
    function batchTransferFrom(
        NftTransfer[] calldata nftTransfers,
        address to
    ) external payable {
        uint256 length = nftTransfers.length;

        // Iterate through each NFT in the array to facilitate the transfer.
        for (uint i = 0; i < length;) {
            address contractAddress = nftTransfers[i].contractAddress;
            uint256 tokenId = nftTransfers[i].tokenId;

            // Dynamically call the `transferFrom` function on the target ERC721 contract.
            (bool success, ) = contractAddress.call(
                abi.encodeWithSignature(
                    "transferFrom(address,address,uint256)",
                    msg.sender,
                    to,
                    tokenId
                )
            );

            // Check the transfer status.
            if (!success) {
                revert TransferFromFailed();
            }

            // Use unchecked block to bypass overflow checks for efficiency.
            unchecked {
                i++;
            }
        }
    }

    /**
     * @dev Manages a batch transfer of NFTs, that allow the use of 
     * CryptoPunks alongside other standard ERC721 NFTs.
     * @param nftTransfers An array of NftTransfer structs specifying the NFTs for transfer.
     * @param to The destination address for the NFTs.
     */
    function batchPunkTransferFrom(
        NftTransfer[] calldata nftTransfers,
        address to
    ) external payable {
        uint256 length = nftTransfers.length;
        bool success;

        // Process batch transfers, differentiate between CryptoPunks and standard ERC721 tokens.
        for (uint i = 0; i < length;) {
            address contractAddr = nftTransfers[i].contractAddress;
            uint256 tokenId = nftTransfers[i].tokenId;

            // Check if the NFT is a CryptoPunk.
            if (contractAddr != punkContract) {
                // If it's not a CryptoPunk, use the standard ERC721 `transferFrom` function.
                (success, ) = contractAddr.call(
                    abi.encodeWithSignature(
                        "transferFrom(address,address,uint256)",
                        msg.sender,
                        to,
                        tokenId
                    )
                );
            } 
            // If it's a CryptoPunk, use the CryptoPunksMarket contract to transfer the punk.
            else { 
                // Verify OwnerShip
                if(ICryptoPunksMarket(punkContract).punkIndexToAddress(tokenId) != msg.sender) 
                    revert NotOwner();
                
                // If it's a CryptoPunk, first the contract buy the punk to be allowed to transfer it.
                (success, ) = punkContract.call{value: 0}(
                    abi.encodeWithSignature("buyPunk(uint256)", tokenId)
                );

                // Check the buyPunk status
                if (!success) {
                    revert BuyFailed();
                }

                // Once the punk is owned by the contract, the transfer method is executed
                (success, ) = punkContract.call(
                    abi.encodeWithSignature(
                        "transferPunk(address,uint256)",
                        to,
                        tokenId
                    )
                );
                
                // Check the transfer status.
                if (!success) {
                    revert TransferFailed();
                }
            }

            // Use unchecked block to bypass overflow checks for efficiency.
            unchecked { 
                i++; 
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_punkContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BuyFailed","type":"error"},{"inputs":[],"name":"CantReceiveETH","type":"error"},{"inputs":[],"name":"Fallback","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferFromFailed","type":"error"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct NFTBatchTransfer.NftTransfer[]","name":"nftTransfers","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"}],"name":"batchPunkTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct NFTBatchTransfer.NftTransfer[]","name":"nftTransfers","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"punkContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405234801561001057600080fd5b506040516107cb3803806107cb83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516107256100a66000396000818160a901528181610273015281816103720152818161040601526104fa01526107256000f3fe6080604052600436106100385760003560e01c80631f58128e1461006f578063862f3c5c14610084578063f97e48ee1461009757610056565b366100565760405163abdfd30160e01b815260040160405180910390fd5b6040516314ad190f60e21b815260040160405180910390fd5b61008261007d3660046105e3565b6100e7565b005b6100826100923660046105e3565b610218565b3480156100a357600080fd5b506100cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b8160005b8181101561021157600085858381811061010757610107610669565b61011d926020604090920201908101915061067f565b9050600086868481811061013357610133610669565b604080513360248201526001600160a01b038a81166044830152602092909302949094010135606484018190529350600092908516915060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516101a291906106a3565b6000604051808303816000865af19150503d80600081146101df576040519150601f19603f3d011682016040523d82523d6000602084013e6101e4565b606091505b505090508061020657604051631e4e7d0960e21b815260040160405180910390fd5b5050506001016100eb565b5050505050565b816000805b828110156105c357600086868381811061023957610239610669565b61024f926020604090920201908101915061067f565b9050600087878481811061026557610265610669565b9050604002016020013590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614610352576040513360248201526001600160a01b0387811660448301526064820183905283169060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b1790525161030591906106a3565b6000604051808303816000865af19150503d8060008114610342576040519150601f19603f3d011682016040523d82523d6000602084013e610347565b606091505b5050809450506105b9565b604051630b02f02d60e31b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635817816890602401602060405180830381865afa1580156103b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103dd91906106d2565b6001600160a01b031614610404576040516330cd747160e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660008260405160240161044391815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663104c9fd360e31b1790525161047891906106a3565b60006040518083038185875af1925050503d80600081146104b5576040519150601f19603f3d011682016040523d82523d6000602084013e6104ba565b606091505b505080945050836104de5760405163632a71e160e11b815260040160405180910390fd5b6040516001600160a01b038781166024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169060640160408051601f198184030181529181526020820180516001600160e01b03166322dca8bb60e21b1790525161055391906106a3565b6000604051808303816000865af19150503d8060008114610590576040519150601f19603f3d011682016040523d82523d6000602084013e610595565b606091505b505080945050836105b9576040516312171d8360e31b815260040160405180910390fd5b505060010161021d565b505050505050565b6001600160a01b03811681146105e057600080fd5b50565b6000806000604084860312156105f857600080fd5b833567ffffffffffffffff8082111561061057600080fd5b818601915086601f83011261062457600080fd5b81358181111561063357600080fd5b8760208260061b850101111561064857600080fd5b6020928301955093505084013561065e816105cb565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561069157600080fd5b813561069c816105cb565b9392505050565b6000825160005b818110156106c457602081860181015185830152016106aa565b506000920191825250919050565b6000602082840312156106e457600080fd5b815161069c816105cb56fea264697066735822122053851de2876355d5f677ee1b533a1a45029c9c696babd22c335977ba031b1ae564736f6c63430008130033000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb

Deployed Bytecode

0x6080604052600436106100385760003560e01c80631f58128e1461006f578063862f3c5c14610084578063f97e48ee1461009757610056565b366100565760405163abdfd30160e01b815260040160405180910390fd5b6040516314ad190f60e21b815260040160405180910390fd5b61008261007d3660046105e3565b6100e7565b005b6100826100923660046105e3565b610218565b3480156100a357600080fd5b506100cb7f000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb81565b6040516001600160a01b03909116815260200160405180910390f35b8160005b8181101561021157600085858381811061010757610107610669565b61011d926020604090920201908101915061067f565b9050600086868481811061013357610133610669565b604080513360248201526001600160a01b038a81166044830152602092909302949094010135606484018190529350600092908516915060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516101a291906106a3565b6000604051808303816000865af19150503d80600081146101df576040519150601f19603f3d011682016040523d82523d6000602084013e6101e4565b606091505b505090508061020657604051631e4e7d0960e21b815260040160405180910390fd5b5050506001016100eb565b5050505050565b816000805b828110156105c357600086868381811061023957610239610669565b61024f926020604090920201908101915061067f565b9050600087878481811061026557610265610669565b9050604002016020013590507f000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb6001600160a01b0316826001600160a01b031614610352576040513360248201526001600160a01b0387811660448301526064820183905283169060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b1790525161030591906106a3565b6000604051808303816000865af19150503d8060008114610342576040519150601f19603f3d011682016040523d82523d6000602084013e610347565b606091505b5050809450506105b9565b604051630b02f02d60e31b81526004810182905233906001600160a01b037f000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb1690635817816890602401602060405180830381865afa1580156103b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103dd91906106d2565b6001600160a01b031614610404576040516330cd747160e01b815260040160405180910390fd5b7f000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb6001600160a01b031660008260405160240161044391815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663104c9fd360e31b1790525161047891906106a3565b60006040518083038185875af1925050503d80600081146104b5576040519150601f19603f3d011682016040523d82523d6000602084013e6104ba565b606091505b505080945050836104de5760405163632a71e160e11b815260040160405180910390fd5b6040516001600160a01b038781166024830152604482018390527f000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb169060640160408051601f198184030181529181526020820180516001600160e01b03166322dca8bb60e21b1790525161055391906106a3565b6000604051808303816000865af19150503d8060008114610590576040519150601f19603f3d011682016040523d82523d6000602084013e610595565b606091505b505080945050836105b9576040516312171d8360e31b815260040160405180910390fd5b505060010161021d565b505050505050565b6001600160a01b03811681146105e057600080fd5b50565b6000806000604084860312156105f857600080fd5b833567ffffffffffffffff8082111561061057600080fd5b818601915086601f83011261062457600080fd5b81358181111561063357600080fd5b8760208260061b850101111561064857600080fd5b6020928301955093505084013561065e816105cb565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561069157600080fd5b813561069c816105cb565b9392505050565b6000825160005b818110156106c457602081860181015185830152016106aa565b506000920191825250919050565b6000602082840312156106e457600080fd5b815161069c816105cb56fea264697066735822122053851de2876355d5f677ee1b533a1a45029c9c696babd22c335977ba031b1ae564736f6c63430008130033

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

000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb

-----Decoded View---------------
Arg [0] : _punkContract (address): 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb


Deployed Bytecode Sourcemap

6366:6215:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8389:16;;-1:-1:-1;;;8389:16:0;;;;;;;;;;;6366:6215;8255:10;;-1:-1:-1;;;8255:10:0;;;;;;;;;;;8815:1084;;;;;;:::i;:::-;;:::i;:::-;;10203:2375;;;;;;:::i;:::-;;:::i;7040:37::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1105:32:1;;;1087:51;;1075:2;1060:18;7040:37:0;;;;;;;8815:1084;8961:12;8944:14;9071:821;9092:6;9088:1;:10;9071:821;;;9116:23;9142:12;;9155:1;9142:15;;;;;;;:::i;:::-;:31;;;:15;;;;;:31;;;;-1:-1:-1;9142:31:0;:::i;:::-;9116:57;;9188:15;9206:12;;9219:1;9206:15;;;;;;;:::i;:::-;;9396:192;;9504:10;9396:192;;;1773:34:1;-1:-1:-1;;;;;1843:15:1;;;1823:18;;;1816:43;9206:23:0;:15;;;;;;;;:23;;1875:18:1;;;1868:34;;;9206:23:0;-1:-1:-1;9339:12:0;;9357:20;;;;-1:-1:-1;1708:18:1;;9396:192:0;;;-1:-1:-1;;9396:192:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9396:192:0;-1:-1:-1;;;9396:192:0;;;9357:246;;;9396:192;9357:246;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9338:265;;;9668:7;9663:76;;9703:20;;-1:-1:-1;;;9703:20:0;;;;;;;;;;;9663:76;-1:-1:-1;;;9862:3:0;;9071:821;;;;8933:966;8815:1084;;;:::o;10203:2375::-;10353:12;10336:14;;10507:2064;10528:6;10524:1;:10;10507:2064;;;10552:20;10575:12;;10588:1;10575:15;;;;;;;:::i;:::-;:31;;;:15;;;;;:31;;;;-1:-1:-1;10575:31:0;:::i;:::-;10552:54;;10621:15;10639:12;;10652:1;10639:15;;;;;;;:::i;:::-;;;;;;:23;;;10621:41;;10749:12;-1:-1:-1;;;;;10733:28:0;:12;-1:-1:-1;;;;;10733:28:0;;10729:1687;;10931:212;;11047:10;10931:212;;;1773:34:1;-1:-1:-1;;;;;1843:15:1;;;1823:18;;;1816:43;1875:18;;;1868:34;;;10891:17:0;;;1708:18:1;;10931:212:0;;;-1:-1:-1;;10931:212:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10931:212:0;-1:-1:-1;;;10931:212:0;;;10891:271;;;10931:212;10891:271;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10877:285;;;;;10729:1687;;;11353:60;;-1:-1:-1;;;11353:60:0;;;;;2476:25:1;;;11417:10:0;;-1:-1:-1;;;;;11372:12:0;11353:51;;;;2449:18:1;;11353:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11353:74:0;;11350:118;;11458:10;;-1:-1:-1;;;11458:10:0;;;;;;;;;;;11350:118;11623:12;-1:-1:-1;;;;;11623:17:0;11648:1;11717:7;11673:52;;;;;;2476:25:1;;2464:2;2449:18;;2330:177;11673:52:0;;;;-1:-1:-1;;11673:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;11673:52:0;-1:-1:-1;;;11673:52:0;;;11623:121;;;11673:52;11623:121;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11609:135;;;;;11815:7;11810:75;;11854:11;;-1:-1:-1;;;11854:11:0;;;;;;;;;;;11810:75;12051:167;;-1:-1:-1;;;;;2960:32:1;;;12051:167:0;;;2942:51:1;3009:18;;;3002:34;;;12011:12:0;:17;;2915:18:1;;12051:167:0;;;-1:-1:-1;;12051:167:0;;;;;;;;;;;;;;-1:-1:-1;;;;;12051:167:0;-1:-1:-1;;;12051:167:0;;;12011:226;;;12051:167;12011:226;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11997:240;;;;;12326:7;12321:80;;12365:16;;-1:-1:-1;;;12365:16:0;;;;;;;;;;;12321:80;-1:-1:-1;;12540:3:0;;10507:2064;;;;10325:2253;;10203:2375;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:786::-;275:6;283;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;400:9;387:23;429:18;470:2;462:6;459:14;456:34;;;486:1;483;476:12;456:34;524:6;513:9;509:22;499:32;;569:7;562:4;558:2;554:13;550:27;540:55;;591:1;588;581:12;540:55;631:2;618:16;657:2;649:6;646:14;643:34;;;673:1;670;663:12;643:34;728:7;721:4;711:6;708:1;704:14;700:2;696:23;692:34;689:47;686:67;;;749:1;746;739:12;686:67;780:4;772:13;;;;-1:-1:-1;804:6:1;-1:-1:-1;;845:20:1;;832:34;875:31;832:34;875:31;:::i;:::-;925:5;915:15;;;150:786;;;;;:::o;1149:127::-;1210:10;1205:3;1201:20;1198:1;1191:31;1241:4;1238:1;1231:15;1265:4;1262:1;1255:15;1281:247;1340:6;1393:2;1381:9;1372:7;1368:23;1364:32;1361:52;;;1409:1;1406;1399:12;1361:52;1448:9;1435:23;1467:31;1492:5;1467:31;:::i;:::-;1517:5;1281:247;-1:-1:-1;;;1281:247:1:o;1913:412::-;2042:3;2080:6;2074:13;2105:1;2115:129;2129:6;2126:1;2123:13;2115:129;;;2227:4;2211:14;;;2207:25;;2201:32;2188:11;;;2181:53;2144:12;2115:129;;;-1:-1:-1;2299:1:1;2263:16;;2288:13;;;-1:-1:-1;2263:16:1;1913:412;-1:-1:-1;1913:412:1:o;2512:251::-;2582:6;2635:2;2623:9;2614:7;2610:23;2606:32;2603:52;;;2651:1;2648;2641:12;2603:52;2683:9;2677:16;2702:31;2727:5;2702:31;:::i

Swarm Source

ipfs://53851de2876355d5f677ee1b533a1a45029c9c696babd22c335977ba031b1ae5

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

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.