Contract 0xDE3e5a990bCE7fC60a6f017e7c4a95fc4939299E 3

 
Txn Hash Method
Block
From
To
Value
0x877ec27db9fc3ee727b8c1fe58266c39299ba62cdbf610e645d28c34fbe95e2fClaim Tokens(pending)2021-09-16 0:33:599 hrs 18 mins ago0x30f1995d8ea624f7e629f66fbefb67d508c25eb7 IN Gitcoin: GTC Distributor0 Ether(Pending)(Pending)
0x0fbf992fab5ad4e02e5a3f37d1c6756801a5a758468f89aabeb4f43b80d8ce1fClaim Tokens(pending)2021-09-14 6:00:122 days 3 hrs ago0xc4e91208271cdd384c777da4a27b462ebb876e1d IN Gitcoin: GTC Distributor0 Ether(Pending)(Pending)
0x61a3be9626573d7611a844db3839615bd899c10733ca831964a54e36e38a2873Claim Tokens(pending)2021-09-05 5:00:1511 days 4 hrs ago0x4c184ca487f9af9fb3378eb5008f177f7b418400 IN Gitcoin: GTC Distributor0 Ether(Pending)(Pending)
0x5e9defe825e8badb2015a459ea76e53ce3196e8dd9e3b8308ca5fcc5e4981cb2Claim Tokens(pending)2021-09-05 3:30:1211 days 6 hrs ago0xed5fde2428e244024312083cbafca6b69fd012cd IN Gitcoin: GTC Distributor0 Ether(Pending)(Pending)
0xded8a713859db4a6f49fcb1fee2edfb6f969e2800f58f22432503d279fef73c0Claim Tokens(pending)2021-09-05 2:49:4411 days 7 hrs ago0xcba0ef104fd08f5e167341d5e4168032941e9359 IN Gitcoin: GTC Distributor0 Ether(Pending)(Pending)
0xcfab222cf0252f4be1d2c50c92066bbc4f6f81077b97892fb71ae3f98bf84e36Claim Tokens132081262021-09-12 2:04:094 days 7 hrs ago0x228bb6c83e8d0767ed342dd333ddbd55ad217a3d IN  Gitcoin: GTC Distributor0 Ether0.00114771232
0x6142c54b46adc9d11d130e6bb89143b64d4c3abcbf214ddd4cbde7b0aeff43a3Claim Tokens132080082021-09-12 1:40:064 days 8 hrs ago0x228bb6c83e8d0767ed342dd333ddbd55ad217a3d IN  Gitcoin: GTC Distributor0 Ether0.00118357833.000000001
0xb4eb41530bf594e32cfea4d290eb7d10c52ce336850a33b881495e671125e4b0Claim Tokens130412432021-08-17 6:56:3230 days 2 hrs ago0xcba0ef104fd08f5e167341d5e4168032941e9359 IN  Gitcoin: GTC Distributor0 Ether0.00096870627
0x9438e97f22d46e2e4eec17345ae5deb699540882926e851ea51b311db0ac97cdClaim Tokens130343802021-08-16 5:34:3931 days 4 hrs ago0x6103c9ce91ac6028e0b19d5886edeed4bb13aac4 IN  Gitcoin: GTC Distributor0 Ether0.0015406943
0xa60f678ee1ec7ca9cea8c257753146480aa5efb5d4efd09f33e362a5d357759fClaim Tokens130343802021-08-16 5:34:3931 days 4 hrs ago0x6103c9ce91ac6028e0b19d5886edeed4bb13aac4 IN  Gitcoin: GTC Distributor0 Ether0.00136154005238.000001459
0x36472a9d7ca0c728a1f0f1852196e1a17e1093c70877600ffb5c3ca2d0f64ddbClaim Tokens130343802021-08-16 5:34:3931 days 4 hrs ago0x6103c9ce91ac6028e0b19d5886edeed4bb13aac4 IN  Gitcoin: GTC Distributor0 Ether0.00122180334.1
0x48c8f1c205c6dd322c90527dc0fed66da45ea1cb70d5d00436c931eef502ceb9Claim Tokens130343572021-08-16 5:30:2031 days 4 hrs ago0x6103c9ce91ac6028e0b19d5886edeed4bb13aac4 IN  Gitcoin: GTC Distributor0 Ether0.0016123545
0x716136c40c9f5c70ea207d7191d595857a57c43b795e21861f2bb5454f54258dClaim Tokens130343572021-08-16 5:30:2031 days 4 hrs ago0x6103c9ce91ac6028e0b19d5886edeed4bb13aac4 IN  Gitcoin: GTC Distributor0 Ether0.0016123545
0x0a7ce0b94e261bfd0c2a6b587c890ac0a46f2a4f350ff78ce0b78fddf06cfbc2Claim Tokens130343572021-08-16 5:30:2031 days 4 hrs ago0x6103c9ce91ac6028e0b19d5886edeed4bb13aac4 IN  Gitcoin: GTC Distributor0 Ether0.0016123545
0xcb0c5e016d4f0423f3fa4ea95f06d3b1738b1a7fe0fe160f570d9a7cbaed68c2Claim Tokens130343572021-08-16 5:30:2031 days 4 hrs ago0x6103c9ce91ac6028e0b19d5886edeed4bb13aac4 IN  Gitcoin: GTC Distributor0 Ether0.0013973739
0xc73195fbb29eac16ab5e651194ae023a4731969a0e41cf143bad959c4e6d335eTransfer129499322021-08-03 3:22:4844 days 6 hrs ago0xc1a061afb7279fbccf269f862c912ca5a0046be2 IN  Gitcoin: GTC Distributor0 Ether0.00056727
0x3be6570d283e839182f9adc75c72e09be6695bfce8fe85978e1b7ec48e4748fcClaim Tokens128865542021-07-24 3:16:5454 days 6 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.0003434210
0xaad47d2e3a6a392d8a542efc1c3f77115a7f84291d7afcdc2a36e8495f22f448Claim Tokens128848812021-07-23 20:55:1954 days 12 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.000504827414.7
0xb315dde49c2135e7efe5934a5a041359dedf48a77c9ffd13b07e8c3e697fcb72Claim Tokens128848792021-07-23 20:54:5654 days 12 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.0005151315
0x7c92f4ce1210aae5e65c74846c9a40cd0b9e625a26fca59332ff2d63a1036495Claim Tokens128848472021-07-23 20:47:4754 days 13 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.00058381417
0x3b991e9f17b3a36f47ca40b7472d24508fbefebba51a208c564aad429fddf2deClaim Tokens128848472021-07-23 20:47:4754 days 13 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.00058381417
0xf30b5674cb08639f13cbf459cb19bb7d1f9551dd3facfc752502f05e21868df8Claim Tokens128848472021-07-23 20:47:4754 days 13 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.0005685318116.555
0x763e3f97a69b0b81682c29ff12470706c28b0e6e6e8a701c39b1bfdda806bbd5Claim Tokens128848472021-07-23 20:47:4754 days 13 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.0005838140517.000001459
0x6b2f75cf6789afb5dea4e468cd92e17963964a3f68bee7c373dfe16eff15ad93Claim Tokens128848472021-07-23 20:47:4754 days 13 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.0005685318116.555
0x4556bce3b910fdbc35ae51f480113fe16a55228490a731750a7c908624938845Claim Tokens128848472021-07-23 20:47:4754 days 13 hrs ago0x9b480086f5eaa01fe4bfc64a22a17ec67a7131e8 IN  Gitcoin: GTC Distributor0 Ether0.00054947216
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenDistributor

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2021-05-24
*/

// SPDX-License-Identifier: AGPL-3.0-only

pragma solidity 0.6.12;



// Part: GTCErc20

/** 
 * @title - A retroactive ERC20 token distribution contract 
 * @author - [email protected]
 * @notice - Provided an EIP712 compliant signed message & token claim, distributes GTC tokens 
 **/

/**
* @notice interface for interacting with GTCToken delegate function
*/
interface GTCErc20 {
    function delegateOnDist(address, address) external;
}

// Part: OpenZeppelin/[email protected]/ECDSA

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            revert("ECDSA: invalid signature 's' value");
        }

        if (v != 27 && v != 28) {
            revert("ECDSA: invalid signature 'v' value");
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}

// Part: OpenZeppelin/[email protected]/IERC20

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// Part: OpenZeppelin/[email protected]/MerkleProof

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(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: TokenDistributor.sol

contract TokenDistributor{ 
    
    address immutable public signer;
    address immutable public token; 
    uint immutable public deployTime;
    address immutable public timeLockContract;
    bytes32 immutable public merkleRoot;

    // hash of the domain separator
    bytes32 DOMAIN_SEPARATOR;

    // This is a packed array of booleans.
    mapping(uint256 => uint256) private claimedBitMap;
    
    // EIP712 domain struct 
    struct EIP712Domain {
        string  name;
        string  version;
        uint256 chainId;
        address verifyingContract;
    }

    // How long will this contract process token claims? 30 days
    uint public constant CONTRACT_ACTIVE = 30 days;

    // as required by EIP712, we create type hash that will be rolled up into the final signed message
    bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256(
        "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
    );

    // typehash for our token claim - matches the Claim struct  
    bytes32 constant GTC_TOKEN_CLAIM_TYPEHASH = keccak256(
        "Claim(uint32 user_id,address user_address,uint256 user_amount,address delegate_address,bytes32 leaf)"
    );
    
    // This event is triggered when a call to ClaimTokens succeeds.
    event Claimed(uint256 user_id, address account, uint256 amount, bytes32 leaf);

    // This event is triggered when unclaimed drops are moved to Timelock after CONTRACT_ACTIVE period 
    event TransferUnclaimed(uint256 amount);

    /**
     * @notice Construct a new TokenDistribution contract 
     * @param _signer - public key matching the private key that will be signing claims
     * @param _token - address of ERC20 that claims will be distributed from
     * @param _timeLock - address of the timelock contract where unclaimed funds will be swept   
     **/
    constructor(address _token, address _signer, address _timeLock, bytes32 _merkleRoot) public {
        signer = _signer;
        token = _token;
        merkleRoot = _merkleRoot;
        timeLockContract = _timeLock;
        deployTime = block.timestamp; 
        
        DOMAIN_SEPARATOR = hash(EIP712Domain({
            name: "GTC",
            version: '1.0.0',
            chainId: 1,
            verifyingContract: address(this)
        }));

    }
    
    /**
    * @notice process incoming token claims, must be signed by <signer>  
    * @param user_id - serves as nonce - only one claim per user_id
    * @param user_address - ethereum account token claim will be transfered too
    * @param user_amount - amount user will receive, in wei
    * @param delegate_address - address token claim will be deletaged too 
    * @param eth_signed_message_hash_hex - EIP712 pre-signed message hash payload
    * @param eth_signed_signature_hex = eth_sign style, EIP712 compliant, signed message
    * @param merkleProof - proof hashes for leaf
    * @param leaf - leaf hash for user claim in merkle tree    
    **/
    function claimTokens(
        uint32 user_id, 
        address user_address, 
        uint256 user_amount,
        address delegate_address, 
        bytes32 eth_signed_message_hash_hex, 
        bytes memory eth_signed_signature_hex,
        bytes32[] calldata merkleProof,
        bytes32 leaf

        ) external {

        // only accept claim if msg.sender address is in signed claim   
        require(msg.sender == user_address, 'TokenDistributor: Must be msg sender.');

        // one claim per user  
        require(!isClaimed(user_id), 'TokenDistributor: Tokens already claimed.');
        
        // claim must provide a message signed by defined <signer>  
        require(isSigned(eth_signed_message_hash_hex, eth_signed_signature_hex), 'TokenDistributor: Valid Signature Required.');
        
        bytes32 hashed_base_claim = keccak256(abi.encode( 
            GTC_TOKEN_CLAIM_TYPEHASH,
            user_id,
            user_address,
            user_amount, 
            delegate_address, 
            leaf
        ));

        bytes32 digest = keccak256(abi.encodePacked(
            "\x19\x01",
            DOMAIN_SEPARATOR,
            hashed_base_claim
        ));

        // can we reproduce the same hash from the raw claim metadata? 
        require(digest == eth_signed_message_hash_hex, 'TokenDistributor: Claim Hash Mismatch.');
        
        // can we repoduce leaf hash included in the claim?
        bytes32 leaf_hash = keccak256(abi.encode(keccak256(abi.encode(user_id, user_amount))));
        require(leaf == leaf_hash, 'TokenDistributor: Leaf Hash Mismatch.');

        // does the leaf exist on our tree? 
        require(MerkleProof.verify(merkleProof, merkleRoot, leaf), 'TokenDistributor: Valid Proof Required.');
        
        // process token claim !! 
        _delegateTokens(user_address, delegate_address); 
        _setClaimed(user_id);
   
        require(IERC20(token).transfer(user_address, user_amount), 'TokenDistributor: Transfer failed.');
        emit Claimed(user_id, user_address, user_amount, leaf);
    }
    
    /**
    * @notice checks claimedBitMap to see if if user_id is 0/1
    * @dev fork from uniswap merkle distributor, unmodified
    * @return - boolean  
    **/
    function isClaimed(uint256 index) public view returns (bool) {
        uint256 claimedWordIndex = index / 256;
        uint256 claimedBitIndex = index % 256;
        uint256 claimedWord = claimedBitMap[claimedWordIndex];
        uint256 mask = (1 << claimedBitIndex);
        return claimedWord & mask == mask;
    }
    
    /**
    * @notice used to move any remaining tokens out of the contract after expiration   
    **/
    function transferUnclaimed() public {
        require(block.timestamp >= deployTime + CONTRACT_ACTIVE, 'TokenDistributor: Contract is still active.');
        // transfer all GTC to TimeLock
        uint remainingBalance = IERC20(token).balanceOf(address(this));
        require(IERC20(token).transfer(timeLockContract, remainingBalance), 'TokenDistributor: Transfer unclaimed failed.');
        emit TransferUnclaimed(remainingBalance);
    }

    /**
    * @notice verify that a message was signed by the holder of the private keys of a given address
    * @return true if message was signed by signer designated on contstruction, else false 
    **/
    function isSigned(bytes32 eth_signed_message_hash_hex, bytes memory eth_signed_signature_hex) internal view returns (bool) {
        address untrusted_signer = ECDSA.recover(eth_signed_message_hash_hex, eth_signed_signature_hex);
        return untrusted_signer == signer;
    }

    /**
    * @notice - function can be used to create DOMAIN_SEPARATORs
    * @dev - from EIP712 spec, unmodified 
    **/
    function hash(EIP712Domain memory eip712Domain) internal pure returns (bytes32) {
        return keccak256(abi.encode(
            EIP712DOMAIN_TYPEHASH,
            keccak256(bytes(eip712Domain.name)),
            keccak256(bytes(eip712Domain.version)),
            eip712Domain.chainId,
            eip712Domain.verifyingContract
        ));
    }

    /**
    * @notice Sets a given user_id to claimed 
    * @dev taken from uniswap merkle distributor, unmodified
    **/
    function _setClaimed(uint256 index) private {
        uint256 claimedWordIndex = index / 256;
        uint256 claimedBitIndex = index % 256;
        claimedBitMap[claimedWordIndex] = claimedBitMap[claimedWordIndex] | (1 << claimedBitIndex);
    }

    /**
    * @notice execute call on token contract to delegate tokens   
    */
    function _delegateTokens(address delegator, address delegatee) private {
         GTCErc20  GTCToken = GTCErc20(token);
         GTCToken.delegateOnDist(delegator, delegatee);
    } 
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_signer","type":"address"},{"internalType":"address","name":"_timeLock","type":"address"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"user_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferUnclaimed","type":"event"},{"inputs":[],"name":"CONTRACT_ACTIVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"user_id","type":"uint32"},{"internalType":"address","name":"user_address","type":"address"},{"internalType":"uint256","name":"user_amount","type":"uint256"},{"internalType":"address","name":"delegate_address","type":"address"},{"internalType":"bytes32","name":"eth_signed_message_hash_hex","type":"bytes32"},{"internalType":"bytes","name":"eth_signed_signature_hex","type":"bytes"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isClaimed","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":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeLockContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferUnclaimed","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61012060405234801561001157600080fd5b506040516111043803806111048339818101604052608081101561003457600080fd5b5080516020808301516040808501516060958601516001600160601b031984881b8116608090815287891b821660a0908152610100849052848a1b90921660e0524260c09081528551908101865260039181019182526247544360e81b9281019290925281528351808501855260058152640312e302e360dc1b818801529581019590955260019285019290925230958401959095529293909290916100d9906100e6565b6000555061016f92505050565b805180516020918201208183015180519083012060408085015160608087015183517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81890152808501969096529085019390935260808401526001600160a01b0390911660a0808401919091528151808403909101815260c090920190528051910120919050565b60805160601c60a05160601c60c05160e05160601c61010051610f256101df6000398061028052806107c35250806102a452806103dd5250806102cc52806104fb52508061032e52806104115280610844528061098c5280610ace52508061025c52806109bf5250610f256000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80637a40624b116100665780637a40624b146100e85780639e34070f146100f05780639e5167e514610121578063d076bbca1461024a578063fc0c546a1461025257610093565b8063238ac933146100985780632eb4a7ab146100bc5780632f660362146100d657806352e88c84146100de575b600080fd5b6100a061025a565b604080516001600160a01b039092168252519081900360200190f35b6100c461027e565b60408051918252519081900360200190f35b6100a06102a2565b6100e66102c6565b005b6100c46104f9565b61010d6004803603602081101561010657600080fd5b503561051d565b604080519115158252519081900360200190f35b6100e6600480360361010081101561013857600080fd5b63ffffffff823516916001600160a01b03602082013581169260408301359260608101359092169160808101359181019060c0810160a082013564010000000081111561018457600080fd5b82018360208201111561019657600080fd5b803590602001918460018302840111640100000000831117156101b857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561020b57600080fd5b82018360208201111561021d57600080fd5b8035906020019184602083028401116401000000008311171561023f57600080fd5b919350915035610541565b6100c4610983565b6100a061098a565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b62278d007f00000000000000000000000000000000000000000000000000000000000000000142101561032a5760405162461bcd60e51b815260040180806020018281038252602b815260200180610d90602b913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561039957600080fd5b505afa1580156103ad573d6000803e3d6000fd5b505050506040513d60208110156103c357600080fd5b50516040805163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820184905291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163a9059cbb916044808201926020929091908290030181600087803b15801561045c57600080fd5b505af1158015610470573d6000803e3d6000fd5b505050506040513d602081101561048657600080fd5b50516104c35760405162461bcd60e51b815260040180806020018281038252602c815260200180610ddd602c913960400191505060405180910390fd5b6040805182815290517f0ddb3ab0ee452a393437c5d8f69f476f1dce0fae03bf5942b36a4e23c3d378369181900360200190a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b610100810460009081526001602081905260409091205460ff9092161b9081161490565b336001600160a01b038916146105885760405162461bcd60e51b8152600401808060200182810382526025815260200180610e526025913960400191505060405180910390fd5b6105978963ffffffff1661051d565b156105d35760405162461bcd60e51b8152600401808060200182810382526029815260200180610e776029913960400191505060405180910390fd5b6105dd85856109ae565b6106185760405162461bcd60e51b815260040180806020018281038252602b815260200180610ec5602b913960400191505060405180910390fd5b604080517f6910c22ff957b5ea1ed54301f013852ac2fc9604b64343199ac885dcbfcebc7d60208083019190915263ffffffff8c16828401526001600160a01b03808c166060840152608083018b9052891660a083015260c08083018590528351808403909101815260e08301845280519082012060005461190160f01b6101008501526101028401526101228084018290528451808503909101815261014290930190935281519101208681146107015760405162461bcd60e51b8152600401808060200182810382526026815260200180610d486026913960400191505060405180910390fd5b6040805163ffffffff8d166020808301919091528183018c90528251808303840181526060830184528051908201206080808401919091528351808403909101815260a0909201909252805191012083811461078e5760405162461bcd60e51b8152600401808060200182810382526025815260200180610ea06025913960400191505060405180910390fd5b6107ee8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f000000000000000000000000000000000000000000000000000000000000000092508891506109fb9050565b6108295760405162461bcd60e51b8152600401808060200182810382526027815260200180610e2b6027913960400191505060405180910390fd5b6108338b8a610aa4565b6108428c63ffffffff16610b34565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb8c8c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156108b957600080fd5b505af11580156108cd573d6000803e3d6000fd5b505050506040513d60208110156108e357600080fd5b50516109205760405162461bcd60e51b8152600401808060200182810382526022815260200180610dbb6022913960400191505060405180910390fd5b6040805163ffffffff8e1681526001600160a01b038d1660208201528082018c90526060810186905290517f04672052dcb6b5b19a9cc2ec1b8f447f1f5e47b5e24cfa5e4ffb640d63ca2be79181900360800190a1505050505050505050505050565b62278d0081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806109bb8484610b5c565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161491505092915050565b600081815b8551811015610a99576000868281518110610a1757fe5b60200260200101519050808311610a5e5782816040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250610a90565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b50600101610a00565b509092149392505050565b60408051635c583e1560e01b81526001600160a01b038481166004830152838116602483015291517f000000000000000000000000000000000000000000000000000000000000000092831691635c583e1591604480830192600092919082900301818387803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b50505050505050565b61010081046000908152600160208190526040909120805460ff9093169190911b9091179055565b60008151604114610bb4576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610c255760405162461bcd60e51b8152600401808060200182810382526022815260200180610d6e6022913960400191505060405180910390fd5b8060ff16601b14158015610c3d57508060ff16601c14155b15610c795760405162461bcd60e51b8152600401808060200182810382526022815260200180610e096022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610cd5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610d3d576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b969550505050505056fe546f6b656e4469737472696275746f723a20436c61696d2048617368204d69736d617463682e45434453413a20696e76616c6964207369676e6174757265202773272076616c7565546f6b656e4469737472696275746f723a20436f6e7472616374206973207374696c6c206163746976652e546f6b656e4469737472696275746f723a205472616e73666572206661696c65642e546f6b656e4469737472696275746f723a205472616e7366657220756e636c61696d6564206661696c65642e45434453413a20696e76616c6964207369676e6174757265202776272076616c7565546f6b656e4469737472696275746f723a2056616c69642050726f6f662052657175697265642e546f6b656e4469737472696275746f723a204d757374206265206d73672073656e6465722e546f6b656e4469737472696275746f723a20546f6b656e7320616c726561647920636c61696d65642e546f6b656e4469737472696275746f723a204c6561662048617368204d69736d617463682e546f6b656e4469737472696275746f723a2056616c6964205369676e61747572652052657175697265642ea264697066735822122061e9ffb2767d7814b5c315f3d294b38353df05b8f9e230f0c3e5a414e20feb5364736f6c634300060c0033000000000000000000000000de30da39c46104798bb5aa3fe8b9e0e1f348163f0000000000000000000000002a864f9b07c51480c62fe09601d4469dc95296f700000000000000000000000057a8865cfb1ecef7253c27da6b4bc3daee5be518adbd1f4ac8653b35d3e4e3383beeea3a616b3efaa94932a654035a03c49313e6

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

000000000000000000000000de30da39c46104798bb5aa3fe8b9e0e1f348163f0000000000000000000000002a864f9b07c51480c62fe09601d4469dc95296f700000000000000000000000057a8865cfb1ecef7253c27da6b4bc3daee5be518adbd1f4ac8653b35d3e4e3383beeea3a616b3efaa94932a654035a03c49313e6

-----Decoded View---------------
Arg [0] : _token (address): 0xde30da39c46104798bb5aa3fe8b9e0e1f348163f
Arg [1] : _signer (address): 0x2a864f9b07c51480c62fe09601d4469dc95296f7
Arg [2] : _timeLock (address): 0x57a8865cfb1ecef7253c27da6b4bc3daee5be518
Arg [3] : _merkleRoot (bytes32): 0xadbd1f4ac8653b35d3e4e3383beeea3a616b3efaa94932a654035a03c49313e6

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000de30da39c46104798bb5aa3fe8b9e0e1f348163f
Arg [1] : 0000000000000000000000002a864f9b07c51480c62fe09601d4469dc95296f7
Arg [2] : 00000000000000000000000057a8865cfb1ecef7253c27da6b4bc3daee5be518
Arg [3] : adbd1f4ac8653b35d3e4e3383beeea3a616b3efaa94932a654035a03c49313e6


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.