ETH Price: $3,341.99 (-1.95%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim153729592022-08-19 18:42:39865 days ago1660934559IN
Frax Finance: FPIS Airgrab
0 ETH0.0010300914.01771487
Claim153342042022-08-13 15:28:51872 days ago1660404531IN
Frax Finance: FPIS Airgrab
0 ETH0.0008950910.05752913
Claim153288502022-08-12 19:27:58872 days ago1660332478IN
Frax Finance: FPIS Airgrab
0 ETH0.0012780214.10704961
Claim153065142022-08-09 6:50:08876 days ago1660027808IN
Frax Finance: FPIS Airgrab
0 ETH0.000701467.74198392
Claim152614042022-08-02 6:14:27883 days ago1659420867IN
Frax Finance: FPIS Airgrab
0 ETH0.000638187.04421804
Claim152434692022-07-30 11:20:43886 days ago1659180043IN
Frax Finance: FPIS Airgrab
0 ETH0.000863339.53006529
Claim152423202022-07-30 6:59:59886 days ago1659164399IN
Frax Finance: FPIS Airgrab
0 ETH0.0009407610.3817377
Claim151954472022-07-22 23:34:59893 days ago1658532899IN
Frax Finance: FPIS Airgrab
0 ETH0.000891099.83363064
Claim151685182022-07-18 19:29:14897 days ago1658172554IN
Frax Finance: FPIS Airgrab
0 ETH0.0019480221.88501607
Claim151462712022-07-15 8:53:30901 days ago1657875210IN
Frax Finance: FPIS Airgrab
0 ETH0.0011774412.99536038
Claim151016472022-07-08 11:31:27908 days ago1657279887IN
Frax Finance: FPIS Airgrab
0 ETH0.0014456315.9554072
Claim150824592022-07-05 12:17:26911 days ago1657023446IN
Frax Finance: FPIS Airgrab
0 ETH0.0020083922.15914397
Claim150592022022-07-01 22:19:41914 days ago1656713981IN
Frax Finance: FPIS Airgrab
0 ETH0.0006293721.08116574
Claim150276472022-06-26 6:23:26920 days ago1656224606IN
Frax Finance: FPIS Airgrab
0 ETH0.0016011217.6718828
Claim150108242022-06-23 2:50:38923 days ago1655952638IN
Frax Finance: FPIS Airgrab
0 ETH0.0020218722.30740545
Claim150103272022-06-23 0:32:47923 days ago1655944367IN
Frax Finance: FPIS Airgrab
0 ETH0.0035314138.97165794
Claim149999802022-06-21 2:22:58925 days ago1655778178IN
Frax Finance: FPIS Airgrab
0 ETH0.0008157511.1
Claim149692622022-06-15 19:40:04930 days ago1655322004IN
Frax Finance: FPIS Airgrab
0 ETH0.0082517391.06169645
Claim149539962022-06-13 4:14:37933 days ago1655093677IN
Frax Finance: FPIS Airgrab
0 ETH0.0078428986.53278137
Claim149532712022-06-13 1:15:36933 days ago1655082936IN
Frax Finance: FPIS Airgrab
0 ETH0.00944326128.43606945
Claim149446532022-06-11 14:01:17935 days ago1654956077IN
Frax Finance: FPIS Airgrab
0 ETH0.0032097935.43016002
Claim149253762022-06-08 7:02:45938 days ago1654671765IN
Frax Finance: FPIS Airgrab
0 ETH0.0036376440.1342151
Claim149170822022-06-06 21:15:59939 days ago1654550159IN
Frax Finance: FPIS Airgrab
0 ETH0.0040452244.64186061
Claim149142912022-06-06 9:48:36940 days ago1654508916IN
Frax Finance: FPIS Airgrab
0 ETH0.0018488620.40577473
Claim149075172022-06-05 6:12:39941 days ago1654409559IN
Frax Finance: FPIS Airgrab
0 ETH0.0018376220.27455182
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MerkleClaim

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : MerkleClaim.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// ============ Imports ============

//import { MerkleProof } from "@openzeppelin/utils/cryptography/MerkleProof.sol"; // OZ: MerkleProof
import { Owned } from "./Owned.sol";
import { TransferHelper } from "./TransferHelper.sol";
import { MerkleProof } from "./MerkleProof.sol"; // OZ: MerkleProof

interface IERC20 {
  function approve(address spender, uint256 amount) external returns (bool);
  function allowance(address owner, address spender) external view returns (uint256);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address to, uint256 amount) external returns (bool);
  function transferFrom(address from, address to, uint256 amount ) external returns (bool);
}

/// @title MerkleClaim
/// @notice Allows a held ERC20 to be claimable by members of a merkle tree
/// @author Anish Agnihotri <[email protected]>
/// @author Jack Corddry https://github.com/corddry
contract MerkleClaim is Owned{

  /// ============ Immutable storage ============

  /// @notice ERC20-claimee inclusion root
  bytes32 public immutable merkleRoot;

  /// @notice Contract address of airdropped token
  IERC20 public immutable token;

  address public timelock_address;

  /// ============ Mutable storage ============

  /// @notice Mapping of addresses who have claimed tokens
  mapping(address => bool) public hasClaimed;

  /// ============ Errors ============

  /// @notice Thrown if address has already claimed
  error AlreadyClaimed();
  /// @notice Thrown if address/amount are not part of Merkle tree
  error NotInMerkle();
  /// @notice Thrown if claim contract doesn't have enough tokens to payout
  error notEnoughRewards();

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

  modifier onlyByOwnGov() {
    require(msg.sender == owner || msg.sender == timelock_address, "Not owner or timelock");
    _;
  }

  /// ============ Constructor ============

  /// @notice Creates a new MerkleClaimERC20 contract
  /// @param _erc20Address of token to be airdropped
  /// @param _merkleRoot of claimees
  constructor(
    address _erc20Address,
    bytes32 _merkleRoot,
    address _owner_address,
    address _timelock_address
  ) Owned(_owner_address)
  {
    merkleRoot = _merkleRoot;
    token = IERC20(_erc20Address);
    timelock_address = _timelock_address;
  }

  /// ============ Events ============

  /// @notice Emitted after a successful token claim
  /// @param to recipient of claim
  /// @param amount of tokens claimed
  event Claim(address indexed to, uint256 amount);

  /// @notice Emitted after a successful token recovery
  /// @param token address being recovered
  /// @param amount of tokens recoverd
  event Recovered(address token, uint256 amount);

  /// ============ Functions ============

  /// @notice Allows claiming tokens if address is part of merkle tree
  /// @param to address of claimee
  /// @param amount of tokens owed to claimee
  /// @param proof merkle proof to prove address and amount are in tree
  function claim(address to, uint256 amount, bytes32[] calldata proof) external {
    // Throw if address has already claimed tokens
    if (hasClaimed[to]) revert AlreadyClaimed();

    // Verify merkle proof, or revert if not in tree
    bytes32 leaf = keccak256(abi.encodePacked(to, amount));
    bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf);
    if (!isValidLeaf) revert NotInMerkle();

    // Throw if the contract doesn't hold enough tokens for claimee
    if (amount > token.balanceOf(address(this))) revert notEnoughRewards();

    // Set address to claimed
    hasClaimed[to] = true;

    // Award tokens to address
    token.transfer(to, amount);

    // Emit claim event
    emit Claim(to, amount);
  }

    /// ============ Permissioned Functions ============
  
    function setTimelock(address _new_timelock_address) external onlyByOwnGov {
      timelock_address = _new_timelock_address;
    }
    
    function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyByOwnGov {
        // Can only be triggered by owner or governance
        TransferHelper.safeTransfer(tokenAddress, owner, tokenAmount);
        
        emit Recovered(tokenAddress, tokenAmount);
    }

    // Generic proxy
    function execute(
        address _to,
        uint256 _value,
        bytes calldata _data
    ) external onlyByOwnGov returns (bool, bytes memory) {
        (bool success, bytes memory result) = _to.call{value:_value}(_data);
        return (success, result);
    }
}

File 2 of 4 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 3 of 4 : TransferHelper.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.11;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

File 4 of 4 : Owned.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.11;

// https://docs.synthetix.io/contracts/Owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor (address _owner) {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        require(msg.sender == owner, "Only the contract owner may perform this action");
        _;
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_erc20Address","type":"address"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"address","name":"_owner_address","type":"address"},{"internalType":"address","name":"_timelock_address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"inputs":[],"name":"notEnoughRewards","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_timelock_address","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelock_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c060405234801561001057600080fd5b50604051610e86380380610e8683398101604081905261002f9161013c565b816001600160a01b03811661008a5760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1506080929092525060609190911b6001600160601b03191660a052600280546001600160a01b0319166001600160a01b03909216919091179055610189565b80516001600160a01b038116811461013757600080fd5b919050565b6000806000806080858703121561015257600080fd5b61015b85610120565b93506020850151925061017060408601610120565b915061017e60608601610120565b905092959194509250565b60805160a05160601c610cc16101c5600039600081816101f3015281816103f201526104d601526000818160d301526103920152610cc16000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638980f11f116100715780638980f11f146101815780638da5cb5b14610194578063b61d27f6146101a7578063bdacb303146101c8578063dc6663c7146101db578063fc0c546a146101ee57600080fd5b80631627540c146100b95780632eb4a7ab146100ce5780633d13f8741461010857806353a47bb71461011b57806373b2e80e1461014657806379ba509714610179575b600080fd5b6100cc6100c73660046109fc565b610215565b005b6100f57f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100cc610116366004610a48565b6102e0565b60015461012e906001600160a01b031681565b6040516001600160a01b0390911681526020016100ff565b6101696101543660046109fc565b60036020526000908152604090205460ff1681565b60405190151581526020016100ff565b6100cc6105a0565b6100cc61018f366004610a1e565b61068a565b60005461012e906001600160a01b031681565b6101ba6101b5366004610ad2565b610727565b6040516100ff929190610bb1565b6100cc6101d63660046109fc565b6107da565b60025461012e906001600160a01b031681565b61012e7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b0316331461028c5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b60648201526084015b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a150565b6001600160a01b03841660009081526003602052604090205460ff161561031a57604051630c8d9eab60e31b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606086901b1660208201526034810184905260009060540160405160208183030381529060405280519060200120905060006103bd8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f0000000000000000000000000000000000000000000000000000000000000000925086915061083b9050565b9050806103dd5760405163452c2df160e11b815260040160405180910390fd5b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561043c57600080fd5b505afa158015610450573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104749190610b6c565b8511156104945760405163963c0ffb60e01b815260040160405180910390fd5b6001600160a01b0386811660008181526003602052604090819020805460ff191660011790555163a9059cbb60e01b81526004810191909152602481018790527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b15801561051c57600080fd5b505af1158015610530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105549190610b4a565b50856001600160a01b03167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d48660405161059091815260200190565b60405180910390a2505050505050565b6001546001600160a01b031633146106185760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610283565b600054600154604080516001600160a01b0393841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314806106ad57506002546001600160a01b031633145b6106c95760405162461bcd60e51b815260040161028390610bed565b6000546106e19083906001600160a01b031683610851565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28910160405180910390a15050565b600080546060906001600160a01b031633148061074e57506002546001600160a01b031633145b61076a5760405162461bcd60e51b815260040161028390610bed565b600080876001600160a01b0316878787604051610788929190610b85565b60006040518083038185875af1925050503d80600081146107c5576040519150601f19603f3d011682016040523d82523d6000602084013e6107ca565b606091505b5090999098509650505050505050565b6000546001600160a01b03163314806107fd57506002546001600160a01b031633145b6108195760405162461bcd60e51b815260040161028390610bed565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600082610848858461096c565b14949350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916108ad9190610b95565b6000604051808303816000865af19150503d80600081146108ea576040519150601f19603f3d011682016040523d82523d6000602084013e6108ef565b606091505b50915091508180156109195750805115806109195750808060200190518101906109199190610b4a565b6109655760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610283565b5050505050565b600081815b84518110156109d857600085828151811061098e5761098e610c75565b602002602001015190508083116109b457600083815260208290526040902092506109c5565b600081815260208490526040902092505b50806109d081610c4c565b915050610971565b509392505050565b80356001600160a01b03811681146109f757600080fd5b919050565b600060208284031215610a0e57600080fd5b610a17826109e0565b9392505050565b60008060408385031215610a3157600080fd5b610a3a836109e0565b946020939093013593505050565b60008060008060608587031215610a5e57600080fd5b610a67856109e0565b935060208501359250604085013567ffffffffffffffff80821115610a8b57600080fd5b818701915087601f830112610a9f57600080fd5b813581811115610aae57600080fd5b8860208260051b8501011115610ac357600080fd5b95989497505060200194505050565b60008060008060608587031215610ae857600080fd5b610af1856109e0565b935060208501359250604085013567ffffffffffffffff80821115610b1557600080fd5b818701915087601f830112610b2957600080fd5b813581811115610b3857600080fd5b886020828501011115610ac357600080fd5b600060208284031215610b5c57600080fd5b81518015158114610a1757600080fd5b600060208284031215610b7e57600080fd5b5051919050565b8183823760009101908152919050565b60008251610ba7818460208701610c1c565b9190910192915050565b82151581526040602082015260008251806040840152610bd8816060850160208701610c1c565b601f01601f1916919091016060019392505050565b6020808252601590820152744e6f74206f776e6572206f722074696d656c6f636b60581b604082015260600190565b60005b83811015610c37578181015183820152602001610c1f565b83811115610c46576000848401525b50505050565b6000600019821415610c6e57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fdfea26469706673582212204fc6d05bc691befe0e143b1ae54c331968b54a7e1a621d9d8027e738ba38a96664736f6c63430008070033000000000000000000000000c2544a32872a91f4a553b404c6950e89de901fdb1cc89145d7ddfb4a255e327ab01d1f98259db2b14430efdc24124d5cdb169ba10000000000000000000000003ce4d19c155d977b04c8560ed1cc9c6f38ee3d320000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638980f11f116100715780638980f11f146101815780638da5cb5b14610194578063b61d27f6146101a7578063bdacb303146101c8578063dc6663c7146101db578063fc0c546a146101ee57600080fd5b80631627540c146100b95780632eb4a7ab146100ce5780633d13f8741461010857806353a47bb71461011b57806373b2e80e1461014657806379ba509714610179575b600080fd5b6100cc6100c73660046109fc565b610215565b005b6100f57f1cc89145d7ddfb4a255e327ab01d1f98259db2b14430efdc24124d5cdb169ba181565b6040519081526020015b60405180910390f35b6100cc610116366004610a48565b6102e0565b60015461012e906001600160a01b031681565b6040516001600160a01b0390911681526020016100ff565b6101696101543660046109fc565b60036020526000908152604090205460ff1681565b60405190151581526020016100ff565b6100cc6105a0565b6100cc61018f366004610a1e565b61068a565b60005461012e906001600160a01b031681565b6101ba6101b5366004610ad2565b610727565b6040516100ff929190610bb1565b6100cc6101d63660046109fc565b6107da565b60025461012e906001600160a01b031681565b61012e7f000000000000000000000000c2544a32872a91f4a553b404c6950e89de901fdb81565b6000546001600160a01b0316331461028c5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b60648201526084015b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a150565b6001600160a01b03841660009081526003602052604090205460ff161561031a57604051630c8d9eab60e31b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606086901b1660208201526034810184905260009060540160405160208183030381529060405280519060200120905060006103bd8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f1cc89145d7ddfb4a255e327ab01d1f98259db2b14430efdc24124d5cdb169ba1925086915061083b9050565b9050806103dd5760405163452c2df160e11b815260040160405180910390fd5b6040516370a0823160e01b81523060048201527f000000000000000000000000c2544a32872a91f4a553b404c6950e89de901fdb6001600160a01b0316906370a082319060240160206040518083038186803b15801561043c57600080fd5b505afa158015610450573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104749190610b6c565b8511156104945760405163963c0ffb60e01b815260040160405180910390fd5b6001600160a01b0386811660008181526003602052604090819020805460ff191660011790555163a9059cbb60e01b81526004810191909152602481018790527f000000000000000000000000c2544a32872a91f4a553b404c6950e89de901fdb9091169063a9059cbb90604401602060405180830381600087803b15801561051c57600080fd5b505af1158015610530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105549190610b4a565b50856001600160a01b03167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d48660405161059091815260200190565b60405180910390a2505050505050565b6001546001600160a01b031633146106185760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610283565b600054600154604080516001600160a01b0393841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314806106ad57506002546001600160a01b031633145b6106c95760405162461bcd60e51b815260040161028390610bed565b6000546106e19083906001600160a01b031683610851565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28910160405180910390a15050565b600080546060906001600160a01b031633148061074e57506002546001600160a01b031633145b61076a5760405162461bcd60e51b815260040161028390610bed565b600080876001600160a01b0316878787604051610788929190610b85565b60006040518083038185875af1925050503d80600081146107c5576040519150601f19603f3d011682016040523d82523d6000602084013e6107ca565b606091505b5090999098509650505050505050565b6000546001600160a01b03163314806107fd57506002546001600160a01b031633145b6108195760405162461bcd60e51b815260040161028390610bed565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600082610848858461096c565b14949350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916108ad9190610b95565b6000604051808303816000865af19150503d80600081146108ea576040519150601f19603f3d011682016040523d82523d6000602084013e6108ef565b606091505b50915091508180156109195750805115806109195750808060200190518101906109199190610b4a565b6109655760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610283565b5050505050565b600081815b84518110156109d857600085828151811061098e5761098e610c75565b602002602001015190508083116109b457600083815260208290526040902092506109c5565b600081815260208490526040902092505b50806109d081610c4c565b915050610971565b509392505050565b80356001600160a01b03811681146109f757600080fd5b919050565b600060208284031215610a0e57600080fd5b610a17826109e0565b9392505050565b60008060408385031215610a3157600080fd5b610a3a836109e0565b946020939093013593505050565b60008060008060608587031215610a5e57600080fd5b610a67856109e0565b935060208501359250604085013567ffffffffffffffff80821115610a8b57600080fd5b818701915087601f830112610a9f57600080fd5b813581811115610aae57600080fd5b8860208260051b8501011115610ac357600080fd5b95989497505060200194505050565b60008060008060608587031215610ae857600080fd5b610af1856109e0565b935060208501359250604085013567ffffffffffffffff80821115610b1557600080fd5b818701915087601f830112610b2957600080fd5b813581811115610b3857600080fd5b886020828501011115610ac357600080fd5b600060208284031215610b5c57600080fd5b81518015158114610a1757600080fd5b600060208284031215610b7e57600080fd5b5051919050565b8183823760009101908152919050565b60008251610ba7818460208701610c1c565b9190910192915050565b82151581526040602082015260008251806040840152610bd8816060850160208701610c1c565b601f01601f1916919091016060019392505050565b6020808252601590820152744e6f74206f776e6572206f722074696d656c6f636b60581b604082015260600190565b60005b83811015610c37578181015183820152602001610c1f565b83811115610c46576000848401525b50505050565b6000600019821415610c6e57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fdfea26469706673582212204fc6d05bc691befe0e143b1ae54c331968b54a7e1a621d9d8027e738ba38a96664736f6c63430008070033

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

000000000000000000000000c2544a32872a91f4a553b404c6950e89de901fdb1cc89145d7ddfb4a255e327ab01d1f98259db2b14430efdc24124d5cdb169ba10000000000000000000000003ce4d19c155d977b04c8560ed1cc9c6f38ee3d320000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca

-----Decoded View---------------
Arg [0] : _erc20Address (address): 0xc2544A32872A91F4A553b404C6950e89De901fdb
Arg [1] : _merkleRoot (bytes32): 0x1cc89145d7ddfb4a255e327ab01d1f98259db2b14430efdc24124d5cdb169ba1
Arg [2] : _owner_address (address): 0x3CE4d19C155D977B04C8560Ed1Cc9C6F38Ee3d32
Arg [3] : _timelock_address (address): 0x8412ebf45bAC1B340BbE8F318b928C466c4E39CA

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c2544a32872a91f4a553b404c6950e89de901fdb
Arg [1] : 1cc89145d7ddfb4a255e327ab01d1f98259db2b14430efdc24124d5cdb169ba1
Arg [2] : 0000000000000000000000003ce4d19c155d977b04c8560ed1cc9c6f38ee3d32
Arg [3] : 0000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca


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  ]

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.