ETH Price: $2,025.23 (-2.34%)

Contract

0xB360498aDFAb181c4e3575bC9521Dbd0EC137b1F
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim193284022024-02-28 20:26:47392 days ago1709152007IN
0xB360498a...0EC137b1F
0 ETH0.0015828351.97628598
Claim147856942022-05-16 10:24:561046 days ago1652696696IN
0xB360498a...0EC137b1F
0 ETH0.0004411714.47572206
Claim147263592022-05-06 23:07:591055 days ago1651878479IN
0xB360498a...0EC137b1F
0 ETH0.0012749241.81579378
Claim145896172022-04-15 11:13:321076 days ago1650021212IN
0xB360498a...0EC137b1F
0 ETH0.0006078620
Claim145664132022-04-11 20:05:161080 days ago1649707516IN
0xB360498a...0EC137b1F
0 ETH0.00960514111.1552268
Claim145663242022-04-11 19:45:431080 days ago1649706343IN
0xB360498a...0EC137b1F
0 ETH0.0060217769.63362685
Claim145663232022-04-11 19:45:391080 days ago1649706339IN
0xB360498a...0EC137b1F
0 ETH0.0046951955.46599299
Claim145663202022-04-11 19:44:571080 days ago1649706297IN
0xB360498a...0EC137b1F
0 ETH0.0054335462.87804927
Claim145662142022-04-11 19:21:001080 days ago1649704860IN
0xB360498a...0EC137b1F
0 ETH0.0039199945.36926273
Claim145660532022-04-11 18:44:321080 days ago1649702672IN
0xB360498a...0EC137b1F
0 ETH0.0050594158.54448978
Claim145660062022-04-11 18:34:121080 days ago1649702052IN
0xB360498a...0EC137b1F
0 ETH0.0055822864.59329359
Claim145643332022-04-11 12:11:231080 days ago1649679083IN
0xB360498a...0EC137b1F
0 ETH0.0035891541.50076911
Claim145641452022-04-11 11:30:151080 days ago1649676615IN
0xB360498a...0EC137b1F
0 ETH0.0031543536.50452506
Claim145636292022-04-11 9:33:421081 days ago1649669622IN
0xB360498a...0EC137b1F
0 ETH0.0007446822.68719125
Claim145636252022-04-11 9:32:491081 days ago1649669569IN
0xB360498a...0EC137b1F
0 ETH0.0018660821.59369271
Claim145633552022-04-11 8:32:491081 days ago1649665969IN
0xB360498a...0EC137b1F
0 ETH0.0017101819.78558962
Claim145632542022-04-11 8:11:401081 days ago1649664700IN
0xB360498a...0EC137b1F
0 ETH0.0031116836.38037556
Claim145629422022-04-11 7:01:081081 days ago1649660468IN
0xB360498a...0EC137b1F
0 ETH0.0006668720.28703729
Claim145628222022-04-11 6:38:461081 days ago1649659126IN
0xB360498a...0EC137b1F
0 ETH0.002043623.63757063
Claim145626522022-04-11 6:01:381081 days ago1649656898IN
0xB360498a...0EC137b1F
0 ETH0.0030145735.24992598
Claim145624982022-04-11 5:23:361081 days ago1649654616IN
0xB360498a...0EC137b1F
0 ETH0.0017004719.67141871
Claim145620932022-04-11 3:57:251081 days ago1649649445IN
0xB360498a...0EC137b1F
0 ETH0.0023611527.87735118
Claim145619512022-04-11 3:25:191081 days ago1649647519IN
0xB360498a...0EC137b1F
0 ETH0.0028932133.82607591
Claim145618412022-04-11 3:00:511081 days ago1649646051IN
0xB360498a...0EC137b1F
0 ETH0.0036888443.11616081
Claim145615222022-04-11 1:49:191081 days ago1649641759IN
0xB360498a...0EC137b1F
0 ETH0.0023909527.65512548
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:
MerkleDistributor

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 6 : MerkleDistributor.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.4;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "./interfaces/IMerkleDistributor.sol";

contract MerkleDistributor is IMerkleDistributor, Ownable {
    // Token to be claimed
    address public immutable override token;
    bytes32 public immutable override merkleRoot;

    // This is a packed array of booleans
    mapping(uint256 => uint256) private claimedBitMap;

    // Lock timestamp used to allow/disallow claim() and recover()
    uint256 public immutable lockTime;

    /**
     * @dev validate and set required parameters
     * @param token_ token to be claimed, must be non-zero
     * @param merkleRoot_ merkle root, must be non-zero
     * @param lockTime_ timestamp used for claim() and recover(), must be in the future
     */
    constructor(address token_, bytes32 merkleRoot_, uint256 lockTime_) {
        require(token_ != address(0), "Token must be non-zero address");
        require(merkleRoot_ != bytes32(0), "Merkle root must be non-zero");
        require(block.timestamp < lockTime_, "Lock time must be in the future");
        token = token_;
        merkleRoot = merkleRoot_;
        lockTime = lockTime_;
    }

    /**
     * @dev checks whether an index have been already claimed
     * @param index index to be checked
     * @return boolean value of the claim status
     */
    function isClaimed(uint256 index) public view override returns (bool) {
        uint256 claimedWordIndex = index / 256;
        uint256 claimedBitIndex = index % 256;
        uint256 claimedWord = claimedBitMap[claimedWordIndex];
        uint256 mask = (1 << claimedBitIndex);
        return claimedWord & mask == mask;
    }

    /**
     * @dev mark the index as claimed in a gas-efficient way
     * @param index index to be marked
     */
    function _setClaimed(uint256 index) private {
        uint256 claimedWordIndex = index / 256;
        uint256 claimedBitIndex = index % 256;
        claimedBitMap[claimedWordIndex] = claimedBitMap[claimedWordIndex] | (1 << claimedBitIndex);
    }

    /**
     * @dev verifies the parameters and transfers the tokens if not yet claimed
     * @param index index used for claiming
     * @param account wallet eligible for the claim
     * @param amount amount of tokens to be claimed
     */
    function claim(
        uint256 index,
        address account,
        uint256 amount,
        bytes32[] calldata merkleProof
    ) external override {
        // Allow claiming only before the lock time
        require(block.timestamp <= lockTime, "MerkleDistributor: Cannot claim after lock time");

        require(!isClaimed(index), "MerkleDistributor: Drop already claimed");

        // Verify the merkle proof
        bytes32 node = keccak256(abi.encodePacked(index, account, amount));
        require(
            MerkleProof.verify(merkleProof, merkleRoot, node),
            "MerkleDistributor: Invalid proof"
        );

        // Mark it claimed and transfer the tokens
        _setClaimed(index);
        require(IERC20(token).transfer(account, amount), "MerkleDistributor: Transfer failed");

        emit Claimed(index, account, amount);
    }

    /**
     * @dev recovers remaining tokens, but only when after lockTime timestamp
     * @param amount amount of tokens to be recovered
     */
    function recover(uint256 amount) external onlyOwner {
        require(
            block.timestamp > lockTime,
            "MerkleDistributor: Cannot recover the tokens before lock time"
        );

        require(IERC20(token).transfer(owner(), amount), "MerkleDistributor: Recovery failed");

        emit Recovered(amount);
    }

    /**
     * @dev this inherited function leaves the contract without an owner, which compromises
     *      any ability to manage the contract. It is overridden to disable that behavior.
     */
    function renounceOwnership() public pure override {
        revert("MerkleDistributor: Renouncing the ownership disallowed");
    }

    event Recovered(uint256 amount);
}

File 2 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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);
}

File 4 of 6 : MerkleProof.sol
// SPDX-License-Identifier: MIT

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.
 */
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 5 of 6 : IMerkleDistributor.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.4;

// Allows anyone to claim a token if they exist in a merkle root.
interface IMerkleDistributor {
    // Returns the address of the token distributed by this contract.
    function token() external view returns (address);

    // Returns the merkle root of the merkle tree containing account balances available to claim.
    function merkleRoot() external view returns (bytes32);

    // Returns true if the index has been marked claimed.
    function isClaimed(uint256 index) external view returns (bool);

    // Claim the given amount of the token to the given address. Reverts if the inputs are invalid.
    function claim(
        uint256 index,
        address account,
        uint256 amount,
        bytes32[] calldata merkleProof
    ) external;

    // This event is triggered whenever a call to #claim succeeds.
    event Claimed(uint256 index, address account, uint256 amount);
}

File 6 of 6 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"lockTime_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","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":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405234801561001057600080fd5b5060405161107c38038061107c83398101604081905261002f9161019d565b6100383361014d565b6001600160a01b0383166100935760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e206d757374206265206e6f6e2d7a65726f2061646472657373000060448201526064015b60405180910390fd5b816100e05760405162461bcd60e51b815260206004820152601c60248201527f4d65726b6c6520726f6f74206d757374206265206e6f6e2d7a65726f00000000604482015260640161008a565b80421061012f5760405162461bcd60e51b815260206004820152601f60248201527f4c6f636b2074696d65206d75737420626520696e207468652066757475726500604482015260640161008a565b60609290921b6001600160601b03191660805260a05260c0526101de565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000606084860312156101b1578283fd5b83516001600160a01b03811681146101c7578384fd5b602085015160409095015190969495509392505050565b60805160601c60a05160c051610e4a6102326000396000818160c20152818161025d01526104ce01526000818161010f01526106a50152600081816101b30152818161030c015261078b0152610e4a6000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063715018a6116100765780639e34070f1161005b5780639e34070f14610178578063f2fde38b1461019b578063fc0c546a146101ae57600080fd5b8063715018a6146101315780638da5cb5b1461013957600080fd5b80630ca35682146100a85780630d668087146100bd5780632e7ba6ef146100f75780632eb4a7ab1461010a575b600080fd5b6100bb6100b6366004610cde565b6101d5565b005b6100e47f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100bb610105366004610cf6565b6104cc565b6100e47f000000000000000000000000000000000000000000000000000000000000000081565b6100bb6108f1565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ee565b61018b610186366004610cde565b610979565b60405190151581526020016100ee565b6100bb6101a9366004610c9d565b6109ba565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b60005473ffffffffffffffffffffffffffffffffffffffff16331461025b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000421161030a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c654469737472696275746f723a2043616e6e6f74207265636f766560448201527f722074686520746f6b656e73206265666f7265206c6f636b2074696d650000006064820152608401610252565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61036560005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401602060405180830381600087803b1580156103d257600080fd5b505af11580156103e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040a9190610cbe565b610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4d65726b6c654469737472696275746f723a205265636f76657279206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610252565b6040518181527f32e95f921f72e9e736ccad1cc1c0ef6e3c3c08204eb74e9ee4ae8f98e195e3f09060200160405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000042111561057c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d65726b6c654469737472696275746f723a2043616e6e6f7420636c61696d2060448201527f6166746572206c6f636b2074696d6500000000000000000000000000000000006064820152608401610252565b61058585610979565b15610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c654469737472696275746f723a2044726f7020616c72656164792060448201527f636c61696d6564000000000000000000000000000000000000000000000000006064820152608401610252565b60408051602081018790527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1691810191909152605481018490526000906074016040516020818303038152906040528051906020012090506106d08383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610aea9050565b610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152606401610252565b61073f86610bc0565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108079190610cbe565b610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4d65726b6c654469737472696275746f723a205472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610252565b6040805187815273ffffffffffffffffffffffffffffffffffffffff871660208201529081018590527f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269060600160405180910390a1505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4d65726b6c654469737472696275746f723a2052656e6f756e63696e6720746860448201527f65206f776e65727368697020646973616c6c6f776564000000000000000000006064820152608401610252565b60008061098861010084610d88565b9050600061099861010085610dfa565b60009283526001602081905260409093205492901b9182169091149392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610252565b73ffffffffffffffffffffffffffffffffffffffff8116610ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610252565b610ae781610bff565b50565b600081815b8551811015610bb5576000868281518110610b33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311610b75576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610ba2565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080610bad81610d9c565b915050610aef565b509092149392505050565b6000610bce61010083610d88565b90506000610bde61010084610dfa565b600092835260016020819052604090932080549390911b9092179091555050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c9857600080fd5b919050565b600060208284031215610cae578081fd5b610cb782610c74565b9392505050565b600060208284031215610ccf578081fd5b81518015158114610cb7578182fd5b600060208284031215610cef578081fd5b5035919050565b600080600080600060808688031215610d0d578081fd5b85359450610d1d60208701610c74565b935060408601359250606086013567ffffffffffffffff80821115610d40578283fd5b818801915088601f830112610d53578283fd5b813581811115610d61578384fd5b8960208260051b8501011115610d75578384fd5b9699959850939650602001949392505050565b600082610d9757610d97610e0e565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610df3577f4e487b710000000000000000000000000000000000000000000000000000000081526011600452602481fd5b5060010190565b600082610e0957610e09610e0e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c6343000804000a0000000000000000000000002f9411088cef82fd9fb904eb8092f28eb485c8f69f4e583d2b48d45c5e0b3c16a6acaf08d822d5a488125a135e4a078245a84543000000000000000000000000000000000000000000000000000000006254a4e0

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a35760003560e01c8063715018a6116100765780639e34070f1161005b5780639e34070f14610178578063f2fde38b1461019b578063fc0c546a146101ae57600080fd5b8063715018a6146101315780638da5cb5b1461013957600080fd5b80630ca35682146100a85780630d668087146100bd5780632e7ba6ef146100f75780632eb4a7ab1461010a575b600080fd5b6100bb6100b6366004610cde565b6101d5565b005b6100e47f000000000000000000000000000000000000000000000000000000006254a4e081565b6040519081526020015b60405180910390f35b6100bb610105366004610cf6565b6104cc565b6100e47f9f4e583d2b48d45c5e0b3c16a6acaf08d822d5a488125a135e4a078245a8454381565b6100bb6108f1565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ee565b61018b610186366004610cde565b610979565b60405190151581526020016100ee565b6100bb6101a9366004610c9d565b6109ba565b6101537f0000000000000000000000002f9411088cef82fd9fb904eb8092f28eb485c8f681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461025b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000006254a4e0421161030a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c654469737472696275746f723a2043616e6e6f74207265636f766560448201527f722074686520746f6b656e73206265666f7265206c6f636b2074696d650000006064820152608401610252565b7f0000000000000000000000002f9411088cef82fd9fb904eb8092f28eb485c8f673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61036560005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401602060405180830381600087803b1580156103d257600080fd5b505af11580156103e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040a9190610cbe565b610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4d65726b6c654469737472696275746f723a205265636f76657279206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610252565b6040518181527f32e95f921f72e9e736ccad1cc1c0ef6e3c3c08204eb74e9ee4ae8f98e195e3f09060200160405180910390a150565b7f000000000000000000000000000000000000000000000000000000006254a4e042111561057c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d65726b6c654469737472696275746f723a2043616e6e6f7420636c61696d2060448201527f6166746572206c6f636b2074696d6500000000000000000000000000000000006064820152608401610252565b61058585610979565b15610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c654469737472696275746f723a2044726f7020616c72656164792060448201527f636c61696d6564000000000000000000000000000000000000000000000000006064820152608401610252565b60408051602081018790527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1691810191909152605481018490526000906074016040516020818303038152906040528051906020012090506106d08383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f9f4e583d2b48d45c5e0b3c16a6acaf08d822d5a488125a135e4a078245a845439250859150610aea9050565b610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152606401610252565b61073f86610bc0565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000002f9411088cef82fd9fb904eb8092f28eb485c8f6169063a9059cbb90604401602060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108079190610cbe565b610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4d65726b6c654469737472696275746f723a205472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610252565b6040805187815273ffffffffffffffffffffffffffffffffffffffff871660208201529081018590527f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269060600160405180910390a1505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4d65726b6c654469737472696275746f723a2052656e6f756e63696e6720746860448201527f65206f776e65727368697020646973616c6c6f776564000000000000000000006064820152608401610252565b60008061098861010084610d88565b9050600061099861010085610dfa565b60009283526001602081905260409093205492901b9182169091149392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610252565b73ffffffffffffffffffffffffffffffffffffffff8116610ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610252565b610ae781610bff565b50565b600081815b8551811015610bb5576000868281518110610b33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311610b75576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610ba2565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080610bad81610d9c565b915050610aef565b509092149392505050565b6000610bce61010083610d88565b90506000610bde61010084610dfa565b600092835260016020819052604090932080549390911b9092179091555050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c9857600080fd5b919050565b600060208284031215610cae578081fd5b610cb782610c74565b9392505050565b600060208284031215610ccf578081fd5b81518015158114610cb7578182fd5b600060208284031215610cef578081fd5b5035919050565b600080600080600060808688031215610d0d578081fd5b85359450610d1d60208701610c74565b935060408601359250606086013567ffffffffffffffff80821115610d40578283fd5b818801915088601f830112610d53578283fd5b813581811115610d61578384fd5b8960208260051b8501011115610d75578384fd5b9699959850939650602001949392505050565b600082610d9757610d97610e0e565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610df3577f4e487b710000000000000000000000000000000000000000000000000000000081526011600452602481fd5b5060010190565b600082610e0957610e09610e0e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c6343000804000a

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

0000000000000000000000002f9411088cef82fd9fb904eb8092f28eb485c8f69f4e583d2b48d45c5e0b3c16a6acaf08d822d5a488125a135e4a078245a84543000000000000000000000000000000000000000000000000000000006254a4e0

-----Decoded View---------------
Arg [0] : token_ (address): 0x2F9411088cEF82Fd9fB904Eb8092f28eB485C8F6
Arg [1] : merkleRoot_ (bytes32): 0x9f4e583d2b48d45c5e0b3c16a6acaf08d822d5a488125a135e4a078245a84543
Arg [2] : lockTime_ (uint256): 1649714400

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002f9411088cef82fd9fb904eb8092f28eb485c8f6
Arg [1] : 9f4e583d2b48d45c5e0b3c16a6acaf08d822d5a488125a135e4a078245a84543
Arg [2] : 000000000000000000000000000000000000000000000000000000006254a4e0


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.