ETH Price: $2,426.62 (-2.53%)

Contract

0x17F82986caea04A52060b7398ECE9E788ebc4B58
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim141442802022-02-05 6:10:341002 days ago1644041434IN
0x17F82986...88ebc4B58
0 ETH0.0088824953.96412178
Claim141425592022-02-04 23:27:201002 days ago1644017240IN
0x17F82986...88ebc4B58
0 ETH0.0133170480.90648758
Claim141368862022-02-04 2:43:441003 days ago1643942624IN
0x17F82986...88ebc4B58
0 ETH0.0135911282.5605767
Claim141367162022-02-04 2:03:061003 days ago1643940186IN
0x17F82986...88ebc4B58
0 ETH0.0132171980.2940002
Claim141355532022-02-03 21:55:301003 days ago1643925330IN
0x17F82986...88ebc4B58
0 ETH0.03431991208.52017136
Claim141307852022-02-03 4:05:581004 days ago1643861158IN
0x17F82986...88ebc4B58
0 ETH0.01889281114.79549256
Claim141304652022-02-03 2:52:301004 days ago1643856750IN
0x17F82986...88ebc4B58
0 ETH0.0150373191.37005717
Claim141302542022-02-03 2:00:211004 days ago1643853621IN
0x17F82986...88ebc4B58
0 ETH0.01559355105.73480817
Claim141301982022-02-03 1:45:031004 days ago1643852703IN
0x17F82986...88ebc4B58
0 ETH0.0128616878.13902499
Claim141301482022-02-03 1:34:301004 days ago1643852070IN
0x17F82986...88ebc4B58
0 ETH0.0165055111.90171881
Claim141300172022-02-03 1:03:331004 days ago1643850213IN
0x17F82986...88ebc4B58
0 ETH0.01866544113.39053892
Claim141297342022-02-03 0:02:301004 days ago1643846550IN
0x17F82986...88ebc4B58
0 ETH0.01823695110.77406545
Claim141297282022-02-03 0:01:291004 days ago1643846489IN
0x17F82986...88ebc4B58
0 ETH0.0163348199.23945994
Claim141297052022-02-02 23:56:591004 days ago1643846219IN
0x17F82986...88ebc4B58
0 ETH0.020173122.55027184
Claim141248182022-02-02 5:50:431005 days ago1643781043IN
0x17F82986...88ebc4B58
0 ETH0.0195229132.32100757
Claim141243922022-02-02 4:10:101005 days ago1643775010IN
0x17F82986...88ebc4B58
0 ETH0.01976339120.06194358
Claim141203082022-02-01 13:15:131006 days ago1643721313IN
0x17F82986...88ebc4B58
0 ETH0.0137109883.30489806
Claim141122152022-01-31 7:11:011007 days ago1643613061IN
0x17F82986...88ebc4B58
0 ETH0.0084121951.11
Claim141113372022-01-31 3:55:041007 days ago1643601304IN
0x17F82986...88ebc4B58
0 ETH0.01631522110.59521196
Claim141111652022-01-31 3:14:501007 days ago1643598890IN
0x17F82986...88ebc4B58
0 ETH0.0155146394.27604652
Claim140955252022-01-28 17:29:181009 days ago1643390958IN
0x17F82986...88ebc4B58
0 ETH0.01621107109.90562179
Claim140925052022-01-28 6:20:451010 days ago1643350845IN
0x17F82986...88ebc4B58
0 ETH0.01716248104.25390319
Claim140905192022-01-27 22:54:431010 days ago1643324083IN
0x17F82986...88ebc4B58
0 ETH0.02314676156.90380899
Claim140900552022-01-27 21:09:381010 days ago1643317778IN
0x17F82986...88ebc4B58
0 ETH0.03963994240.84052307
Claim140877062022-01-27 12:38:281011 days ago1643287108IN
0x17F82986...88ebc4B58
0 ETH0.0164466887.48238696
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
140762512022-01-25 18:07:501012 days ago1643134070  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.