ETH Price: $3,180.40 (+3.05%)

Contract

0x42412CAcbf9989939299ddEFDEB8147AE72Dd99f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim142736912022-02-25 6:30:59997 days ago1645770659IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0061240341.52535187
Claim142709502022-02-24 20:25:04997 days ago1645734304IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0146648899.45869022
Claim142696682022-02-24 15:47:36998 days ago1645717656IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0096735765.60714492
Claim142694632022-02-24 15:04:03998 days ago1645715043IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0226274153.4383644
Claim142655402022-02-24 0:15:01998 days ago1645661701IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0081342755.15922826
Claim142597072022-02-23 2:36:23999 days ago1645583783IN
0x42412CAc...AE72Dd99f
0.1 ETH0.01491486101.13210541
Claim142589032022-02-22 23:37:04999 days ago1645573024IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0114502877.63486829
Claim142585962022-02-22 22:38:00999 days ago1645569480IN
0x42412CAc...AE72Dd99f
0.1 ETH0.02184333148.13559381
Claim142583902022-02-22 21:54:11999 days ago1645566851IN
0x42412CAc...AE72Dd99f
0.1 ETH0.01494509101.35085042
Claim142578582022-02-22 19:56:07999 days ago1645559767IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0134381492.21766842
Claim142573112022-02-22 17:49:35999 days ago1645552175IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0132279689.69387402
Claim142571572022-02-22 17:17:13999 days ago1645550233IN
0x42412CAc...AE72Dd99f
0.1 ETH0.01501134101.80425245
Claim142567522022-02-22 15:49:461000 days ago1645544986IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0110601775
Claim142551142022-02-22 9:45:271000 days ago1645523127IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0077350452.4498685
Claim142543132022-02-22 6:43:021000 days ago1645512182IN
0x42412CAc...AE72Dd99f
0.1 ETH0.01076773.00804938
Claim142539232022-02-22 5:08:451000 days ago1645506525IN
0x42412CAc...AE72Dd99f
0.1 ETH0.01533568104.00250789
Claim142527052022-02-22 0:44:451000 days ago1645490685IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0144049497.69575796
Claim142525082022-02-21 23:58:101000 days ago1645487890IN
0x42412CAc...AE72Dd99f
0.1 ETH0.01700666115.35183018
Claim142508022022-02-21 17:39:301000 days ago1645465170IN
0x42412CAc...AE72Dd99f
0.1 ETH0.02130933146.27695903
Claim142498272022-02-21 14:01:111001 days ago1645452071IN
0x42412CAc...AE72Dd99f
0.1 ETH0.01856356125.87433458
Claim142471342022-02-21 3:49:181001 days ago1645415358IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0106230172.03555114
Claim142464632022-02-21 1:26:381001 days ago1645406798IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0157523106.83220726
Claim142446422022-02-20 18:53:211001 days ago1645383201IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0068064446.1600854
Claim142445302022-02-20 18:28:511001 days ago1645381731IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0055881737.89648833
Claim142444222022-02-20 18:07:571001 days ago1645380477IN
0x42412CAc...AE72Dd99f
0.1 ETH0.0095798264.95721081
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
143483692022-03-08 20:42:01985 days ago1646772121
0x42412CAc...AE72Dd99f
7.1175 ETH
143483692022-03-08 20:42:01985 days ago1646772121
0x42412CAc...AE72Dd99f
0.1825 ETH
142187362022-02-16 18:20:171005 days ago1645035617  Contract Creation0 ETH
Loading...
Loading

Minimal Proxy Contract for 0x62bc88d480bf8b85962c9ebbd028fcc9c624946d

Contract Name:
ERC721MerkleDrop

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : ERC721MerkleDrop.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

import {IERC721MerkleDrop} from "./interface/IERC721MerkleDrop.sol";
import {Ownable} from "../lib/Ownable.sol";
import {Pausable} from "../lib/Pausable.sol";
import {Reentrancy} from "../lib/Reentrancy.sol";
import {IERC721, IERC721Events} from "../lib/ERC721/interface/IERC721.sol";
import {IMirrorFeeConfig} from "../fee-config/MirrorFeeConfig.sol";
import {ITreasuryConfig} from "../treasury/interface/ITreasuryConfig.sol";
import {IMirrorTreasury} from "../treasury/interface/IMirrorTreasury.sol";

/**
 * @title ERC721MerkleDrop
 * @author MirrorXYZ
 */
contract ERC721MerkleDrop is
    IERC721MerkleDrop,
    Ownable,
    Pausable,
    Reentrancy,
    IERC721Events
{
    /// @notice Address for factory that deploys clones
    address public immutable factory;

    /// @notice Address for Mirror's fee configuration
    address public immutable feeConfig;

    /// @notice Address for Mirror's treasury configuration
    address public immutable treasuryConfig;

    /// @notice Merkle root
    bytes32 public merkleRoot;

    /// @notice Claim deadline block
    uint256 public claimDeadline;

    /// @notice Funds recipient
    address public recipient;

    /// @notice ERC721 token address
    address public token;

    /// @notice ERC721 tokens holder
    address public tokenOwner;

    /// @notice Start token-id
    uint256 public startTokenId;

    /// @notice End token-id
    uint256 public endTokenId;

    /// @notice Current token-id
    uint256 public currentTokenId;

    /// @notice Map of claimed token hashes
    mapping(bytes32 => bool) public claimed;

    constructor(
        address factory_,
        address feeConfig_,
        address treasuryConfig_
    ) Ownable(address(0)) Pausable(true) {
        factory = factory_;
        feeConfig = feeConfig_;
        treasuryConfig = treasuryConfig_;
    }

    function initialize(
        address owner_,
        bool paused_,
        bytes32 merkleRoot_,
        uint256 claimDeadline_,
        address recipient_,
        address token_,
        address tokenOwner_,
        uint256 startTokenId_,
        uint256 endTokenId_
    ) external override {
        // ensure that this function is only callable by the factory
        require(msg.sender == factory, "unauthorized caller");

        // set owner
        _setOwner(address(0), owner_);

        // set pause status
        if (paused_) {
            _pause();
        }

        // set merkle-root
        merkleRoot = merkleRoot_;

        // set claim deadline
        claimDeadline = claimDeadline_;

        // set recipient
        recipient = recipient_;

        // set erc721 token address
        token = token_;

        // set address that owns the tokens
        tokenOwner = tokenOwner_;

        // set start and end token-ids
        startTokenId = startTokenId_;
        endTokenId = endTokenId_;

        // set currentTokenId
        currentTokenId = startTokenId_;
    }

    /// @notice Update claim deadline
    function setClaimDeadline(uint256 newClaimDeadline)
        external
        override
        onlyOwner
    {
        emit UpdateClaimDeadline(claimDeadline, newClaimDeadline);

        // set claim deadline
        claimDeadline = newClaimDeadline;
    }

    /// @notice Pause claiming
    function pause() external override onlyOwner {
        _pause();
    }

    /// @notice Unpause claiming
    function unpause() external override onlyOwner {
        _unpause();
    }

    /// @notice Cancel drop.
    /// @dev Pauses claiming, removes owner and withdraws
    function cancel(uint16 feePercentage_) external override onlyOwner {
        if (!paused) {
            _pause();
        }

        _renounceOwnership();

        _withdraw(feePercentage_);
    }

    /// @notice Number of claimed tokens
    function claimedTokens() external view override returns (uint256) {
        return currentTokenId - startTokenId;
    }

    /// @notice Claim tokens
    function claim(
        address account,
        uint256 allocation,
        uint256 price,
        uint256 index,
        bytes32[] calldata merkleProof
    ) external payable whenNotPaused {
        // assert claim deadline has not passed
        require(block.number <= claimDeadline, "claim deadline has passed");

        // assert enough funds are sent to cover the cost
        require(price * allocation <= msg.value, "insufficient funds");

        // assert there are enough tokens left to claim allocation amount
        require(
            currentTokenId + allocation <= endTokenId + 1,
            "insufficient tokens"
        );

        // assert account has not claimed already
        require(!isClaimed(index, account), "already claimed");

        // store account claim
        _setClaimed(index, account);

        // assert proof is valid
        require(
            _verifyProof(
                merkleProof,
                merkleRoot,
                _getNode(index, price, account, allocation)
            ),
            "invalid proof"
        );

        // transfer tokens
        for (uint256 i = 0; i < allocation; i++) {
            IERC721(token).transferFrom(tokenOwner, account, currentTokenId++);
        }
    }

    function isClaimed(uint256 index, address account)
        public
        view
        returns (bool)
    {
        return claimed[_getClaimHash(index, account)];
    }

    /// @notice Withdraw funds
    function withdraw(uint16 feePercentage_) external override nonReentrant {
        _withdraw(feePercentage_);
    }

    // ============ Internal Functions ============
    function _withdraw(uint16 feePercentage_) internal {
        uint256 balance = address(this).balance;

        if (balance > 0) {
            // assert that the fee is valid
            require(
                IMirrorFeeConfig(feeConfig).isFeeValid(feePercentage_),
                "invalid fee"
            );

            // calculate the fee on the current balance, using the fee percentage
            uint256 fee = _feeAmount(balance, feePercentage_);

            // if the fee is not zero, attempt to send it to the treasury
            if (fee != 0) {
                IMirrorTreasury(ITreasuryConfig(treasuryConfig).treasury())
                    .contribute{value: fee}(fee);
            }
            // broadcast the withdrawal event – with balance and fee
            emit Withdrawal(recipient, address(this).balance, fee);

            // transfer the remaining balance to the recipient
            _sendEther(payable(recipient), address(this).balance);
        }
    }

    function _feeAmount(uint256 amount, uint256 fee)
        internal
        pure
        returns (uint256)
    {
        return (amount * fee) / 10000;
    }

    function _sendEther(address payable recipient_, uint256 amount) internal {
        // Ensure sufficient balance.
        require(address(this).balance >= amount, "insufficient balance");
        // Send the value.
        (bool success, ) = recipient_.call{value: amount}("");
        require(success, "recipient reverted");
    }

    function _setClaimed(uint256 index, address account) internal {
        claimed[_getClaimHash(index, account)] = true;
    }

    function _getClaimHash(uint256 index, address account)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(index, account));
    }

    function _getNode(
        uint256 index,
        uint256 price,
        address account,
        uint256 allocation
    ) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account, allocation, price, index));
    }

    // From https://github.com/protofire/zeppelin-solidity/blob/master/contracts/MerkleProof.sol
    function _verifyProof(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

File 2 of 9 : IERC721MerkleDrop.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

interface IERC721MerkleDrop {
    event UpdateClaimDeadline(
        uint256 oldClaimDeadline,
        uint256 newClaimDeadline
    );

    event Withdrawal(address recipient, uint256 amount, uint256 fee);

    function initialize(
        address owner_,
        bool paused_,
        bytes32 merkleRoot_,
        uint256 claimDeadline_,
        address recipient_,
        address token_,
        address tokenOwner_,
        uint256 startTokenId_,
        uint256 endTokenId_
    ) external;

    function claim(
        address account,
        uint256 allocation,
        uint256 price,
        uint256 index,
        bytes32[] calldata merkleProof
    ) external payable;

    function setClaimDeadline(uint256 claimDeadline_) external;

    function pause() external;

    function unpause() external;

    function cancel(uint16 feePercentage_) external;

    function claimedTokens() external view returns (uint256);

    function withdraw(uint16 feePercentage_) external;
}

File 3 of 9 : Ownable.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

interface IOwnableEvents {
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
}

contract Ownable is IOwnableEvents {
    address public owner;
    address private nextOwner;

    // modifiers

    modifier onlyOwner() {
        require(isOwner(), "caller is not the owner.");
        _;
    }

    modifier onlyNextOwner() {
        require(isNextOwner(), "current owner must set caller as next owner.");
        _;
    }

    /**
     * @dev Initialize contract by setting transaction submitter as initial owner.
     */
    constructor(address owner_) {
        owner = owner_;
        emit OwnershipTransferred(address(0), owner);
    }

    /**
     * @dev Initiate ownership transfer by setting nextOwner.
     */
    function transferOwnership(address nextOwner_) external onlyOwner {
        require(nextOwner_ != address(0), "Next owner is the zero address.");

        nextOwner = nextOwner_;
    }

    /**
     * @dev Cancel ownership transfer by deleting nextOwner.
     */
    function cancelOwnershipTransfer() external onlyOwner {
        delete nextOwner;
    }

    /**
     * @dev Accepts ownership transfer by setting owner.
     */
    function acceptOwnership() external onlyNextOwner {
        delete nextOwner;

        owner = msg.sender;

        emit OwnershipTransferred(owner, msg.sender);
    }

    /**
     * @dev Renounce ownership by setting owner to zero address.
     */
    function renounceOwnership() external onlyOwner {
        _renounceOwnership();
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == owner;
    }

    /**
     * @dev Returns true if the caller is the next owner.
     */
    function isNextOwner() public view returns (bool) {
        return msg.sender == nextOwner;
    }

    function _setOwner(address previousOwner, address newOwner) internal {
        owner = newOwner;
        emit OwnershipTransferred(previousOwner, owner);
    }

    function _renounceOwnership() internal {
        emit OwnershipTransferred(owner, address(0));

        owner = address(0);
    }
}

File 4 of 9 : Pausable.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

interface IPausableEvents {
    /// @notice Emitted when the pause is triggered by `account`.
    event Paused(address account);

    /// @notice Emitted when the pause is lifted by `account`.
    event Unpaused(address account);
}

interface IPausable {
    function paused() external returns (bool);
}

contract Pausable is IPausable, IPausableEvents {
    bool public override paused;

    // Modifiers

    modifier whenNotPaused() {
        require(!paused, "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(paused, "Pausable: not paused");
        _;
    }

    /// @notice Initializes the contract in unpaused state.
    constructor(bool paused_) {
        paused = paused_;
    }

    // ============ Internal Functions ============

    function _pause() internal whenNotPaused {
        paused = true;

        emit Paused(msg.sender);
    }

    function _unpause() internal whenPaused {
        paused = false;

        emit Unpaused(msg.sender);
    }
}

File 5 of 9 : Reentrancy.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

contract Reentrancy {
    // ============ Constants ============

    uint256 internal constant REENTRANCY_NOT_ENTERED = 1;
    uint256 internal constant REENTRANCY_ENTERED = 2;

    // ============ Mutable Storage ============

    uint256 internal reentrancyStatus;

    // ============ Modifiers ============

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(reentrancyStatus != REENTRANCY_ENTERED, "Reentrant call");
        // Any calls to nonReentrant after this point will fail
        reentrancyStatus = REENTRANCY_ENTERED;
        _;
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip2200)
        reentrancyStatus = REENTRANCY_NOT_ENTERED;
    }
}

File 6 of 9 : IERC721.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

interface IERC721 {
    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Events {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );
}

interface IERC721Metadata {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

interface IERC721Burnable is IERC721 {
    function burn(uint256 tokenId) external;
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC721Royalties {
    function getFeeRecipients(uint256 id)
        external
        view
        returns (address payable[] memory);

    function getFeeBps(uint256 id) external view returns (uint256[] memory);
}

File 7 of 9 : MirrorFeeConfig.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

import {Ownable} from "../lib/Ownable.sol";

interface IMirrorFeeConfig {
    function maxFee() external returns (uint16);

    function minFee() external returns (uint16);

    function isFeeValid(uint16) external view returns (bool);

    function updateMaxFee(uint16 newFee) external;

    function updateMinFee(uint16 newFee) external;
}

/**
 * @title MirrorFeeConfig
 * @author MirrorXYZ
 */
contract MirrorFeeConfig is IMirrorFeeConfig, Ownable {
    uint16 public override maxFee = 500;
    uint16 public override minFee = 250;

    constructor(address owner_) Ownable(owner_) {}

    function updateMaxFee(uint16 newFee) external override onlyOwner {
        maxFee = newFee;
    }

    function updateMinFee(uint16 newFee) external override onlyOwner {
        minFee = newFee;
    }

    function isFeeValid(uint16 fee)
        external
        view
        returns (bool isBeweenMinAndMax)
    {
        isBeweenMinAndMax = (minFee <= fee) && (fee <= maxFee);
    }
}

File 8 of 9 : ITreasuryConfig.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

interface ITreasuryConfig {
    function treasury() external returns (address payable);

    function distributionModel() external returns (address);
}

File 9 of 9 : IMirrorTreasury.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;

interface IMirrorTreasury {
    function transferFunds(address payable to, uint256 value) external;

    function transferERC20(
        address token,
        address to,
        uint256 value
    ) external;

    function contributeWithTributary(address tributary) external payable;

    function contribute(uint256 amount) external payable;
}

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"factory_","type":"address"},{"internalType":"address","name":"feeConfig_","type":"address"},{"internalType":"address","name":"treasuryConfig_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldClaimDeadline","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newClaimDeadline","type":"uint256"}],"name":"UpdateClaimDeadline","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"feePercentage_","type":"uint16"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"allocation","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeConfig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"bool","name":"paused_","type":"bool"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"claimDeadline_","type":"uint256"},{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"uint256","name":"startTokenId_","type":"uint256"},{"internalType":"uint256","name":"endTokenId_","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isNextOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimDeadline","type":"uint256"}],"name":"setClaimDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nextOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryConfig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"feePercentage_","type":"uint16"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

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.