Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,570 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Verify And Claim... | 20098632 | 15 days ago | IN | 0 ETH | 0.0006556 | ||||
Claim Reward | 19997786 | 29 days ago | IN | 0 ETH | 0.0004809 | ||||
Verify And Claim... | 19946174 | 37 days ago | IN | 0 ETH | 0.0004217 | ||||
Verify And Claim... | 19932369 | 39 days ago | IN | 0 ETH | 0.00118527 | ||||
Claim Reward | 19905216 | 42 days ago | IN | 0 ETH | 0.0002281 | ||||
Claim Reward | 19877544 | 46 days ago | IN | 0 ETH | 0.00040332 | ||||
Claim Reward | 19871594 | 47 days ago | IN | 0 ETH | 0.0002383 | ||||
Claim Reward | 19781256 | 60 days ago | IN | 0 ETH | 0.00043553 | ||||
Verify And Claim... | 19773155 | 61 days ago | IN | 0 ETH | 0.00043226 | ||||
Claim Reward | 19771782 | 61 days ago | IN | 0 ETH | 0.00024187 | ||||
Claim Reward | 19770664 | 61 days ago | IN | 0 ETH | 0.0005736 | ||||
Verify And Claim... | 19770016 | 61 days ago | IN | 0 ETH | 0.00113804 | ||||
Claim Reward | 19769987 | 61 days ago | IN | 0 ETH | 0.00048141 | ||||
Verify And Claim... | 19769877 | 61 days ago | IN | 0 ETH | 0.00111483 | ||||
Verify And Claim... | 19769248 | 61 days ago | IN | 0 ETH | 0.00146179 | ||||
Verify And Claim... | 19769050 | 61 days ago | IN | 0 ETH | 0.001517 | ||||
Claim Reward | 19768617 | 61 days ago | IN | 0 ETH | 0.00116511 | ||||
Claim Reward | 19767617 | 62 days ago | IN | 0 ETH | 0.00038472 | ||||
Verify And Claim... | 19767335 | 62 days ago | IN | 0 ETH | 0.0008942 | ||||
Verify And Claim... | 19767319 | 62 days ago | IN | 0 ETH | 0.00086505 | ||||
Verify And Claim... | 19767289 | 62 days ago | IN | 0 ETH | 0.00096303 | ||||
Verify And Claim... | 19767171 | 62 days ago | IN | 0 ETH | 0.00098645 | ||||
Claim Reward | 19765692 | 62 days ago | IN | 0 ETH | 0.00042463 | ||||
Verify And Claim... | 19765675 | 62 days ago | IN | 0 ETH | 0.00071557 | ||||
Claim Reward | 19700214 | 71 days ago | IN | 0 ETH | 0.0004241 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RetroactiveVesting
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.6; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; /** * @title RetroactiveVesting * @notice A token holder contract that can release its token balance linearly over * the vesting period of 2 years. Respective address and the amount are included in each merkle node. */ contract RetroactiveVesting { using SafeERC20 for IERC20; struct VestingData { bool isVerified; uint120 totalAmount; uint120 released; } event Claimed(address indexed account, uint256 amount); // Address of the token that is subject to vesting IERC20 public immutable token; // Merkle root used to verify the beneficiary address and the amount of the tokens bytes32 public immutable merkleRoot; // Epoch unix timestamp in seconds when the vesting starts to decay uint256 public immutable startTimestamp; // Vesting period of 2 years uint256 public constant DURATION = 2 * (52 weeks); mapping(address => VestingData) public vestings; /** * @notice Deploys this contract with given parameters * @dev The information about the method used to generate the merkle root and how to replicate it * can be found on https://docs.saddle.finance. * @param token_ Address of the token that will be vested * @param merkleRoot_ Bytes of the merkle root node which is generated off chain. * @param startTimestamp_ Timestamp in seconds when to start vesting. This can be backdated as well. */ constructor( IERC20 token_, bytes32 merkleRoot_, uint256 startTimestamp_ ) public { require(address(token_) != address(0), "token_ cannot be empty"); require(merkleRoot_[0] != 0, "merkleRoot_ cannot be empty"); require(startTimestamp_ != 0, "startTimestamp_ cannot be 0"); token = token_; merkleRoot = merkleRoot_; startTimestamp = startTimestamp_; } /** * @notice Verifies the given account is eligible for the given amount. Then claims the * vested amount out of the total amount eligible. * @param account Address of the account that the caller is verifying for * @param totalAmount Total amount that will be vested linearly * @param merkleProof Merkle proof that was generated off chain. */ function verifyAndClaimReward( address account, uint256 totalAmount, bytes32[] calldata merkleProof ) external { require( totalAmount > 0 && totalAmount < type(uint120).max, "totalAmount cannot be 0 or larger than max uint120 value" ); VestingData storage vesting = vestings[account]; if (!vesting.isVerified) { // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(account, totalAmount)); require( MerkleProof.verify(merkleProof, merkleRoot, node), "could not verify merkleProof" ); // Save the verified state vesting.isVerified = true; vesting.totalAmount = uint120(totalAmount); } _claimReward(account); } /** * @notice Claims the vested amount out of the total amount eligible for the given account. * @param account Address of the account that the caller is claiming for. If this is set * to `address(0)`, it will use the `msg.sender` instead. */ function claimReward(address account) external { if (account == address(0)) { account = msg.sender; } require(vestings[account].isVerified, "must verify first"); _claimReward(account); } function _claimReward(address account) internal { VestingData storage vesting = vestings[account]; uint256 released = vesting.released; uint256 amount = _vestedAmount( vesting.totalAmount, released, startTimestamp, DURATION ); uint256 newReleased = amount + released; require( newReleased < type(uint120).max, "newReleased is too big to be cast uint120" ); vesting.released = uint120(newReleased); token.safeTransfer(account, amount); emit Claimed(account, amount); } /** * @notice Calculated the amount that has already vested but hasn't been released yet. * Reverts if the given account has not been verified. * @param account Address to calculate the vested amount for */ function vestedAmount(address account) external view returns (uint256) { require(vestings[account].isVerified, "must verify first"); return _vestedAmount( vestings[account].totalAmount, vestings[account].released, startTimestamp, DURATION ); } /** * @notice Calculates the amount that has already vested but hasn't been released yet. */ function _vestedAmount( uint256 total, uint256 released, uint256 startTimestamp, uint256 durationInSeconds ) internal view returns (uint256) { uint256 blockTimestamp = block.timestamp; // If current block is before the start, there are no vested amount. if (blockTimestamp < startTimestamp) { return 0; } uint256 elapsedTime = blockTimestamp - startTimestamp; uint256 vested; // If over vesting duration, all tokens vested if (elapsedTime >= durationInSeconds) { vested = total; } else { vested = (total * elapsedTime) / durationInSeconds; } return vested - released; } }
// 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// 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; } }
{ "evmVersion": "berlin", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 10000 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"token_","type":"address"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"startTimestamp_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"verifyAndClaimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"vestedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestings","outputs":[{"internalType":"bool","name":"isVerified","type":"bool"},{"internalType":"uint120","name":"totalAmount","type":"uint120"},{"internalType":"uint120","name":"released","type":"uint120"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e060405234801561001057600080fd5b5060405161112e38038061112e83398101604081905261002f9161016a565b6001600160a01b03831661008a5760405162461bcd60e51b815260206004820152601660248201527f746f6b656e5f2063616e6e6f7420626520656d7074790000000000000000000060448201526064015b60405180910390fd5b8160001a60f81b7fff00000000000000000000000000000000000000000000000000000000000000166100ff5760405162461bcd60e51b815260206004820152601b60248201527f6d65726b6c65526f6f745f2063616e6e6f7420626520656d70747900000000006044820152606401610081565b8061014c5760405162461bcd60e51b815260206004820152601b60248201527f737461727454696d657374616d705f2063616e6e6f74206265203000000000006044820152606401610081565b60609290921b6001600160601b03191660805260a05260c0526101ad565b60008060006060848603121561017f57600080fd5b83516001600160a01b038116811461019657600080fd5b602085015160409095015190969495509392505050565b60805160601c60a05160c051610f346101fa60003960008181610193015281816102ee015261078e01526000818160b0015261047e0152600081816101ba01526108b60152610f346000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063d279c1911161005b578063d279c191146100fa578063daf498631461010d578063e6fd48bc1461018e578063fc0c546a146101b557600080fd5b80631be052891461008d5780632eb4a7ab146100ab578063384711cc146100d2578063935fe8c8146100e5575b600080fd5b6100986303bfc40081565b6040519081526020015b60405180910390f35b6100987f000000000000000000000000000000000000000000000000000000000000000081565b6100986100e0366004610c5c565b610201565b6100f86100f3366004610c77565b61031d565b005b6100f8610108366004610c5c565b610563565b61015f61011b366004610c5c565b60006020819052908152604090205460ff8116906effffffffffffffffffffffffffffff610100820481169170010000000000000000000000000000000090041683565b6040805193151584526effffffffffffffffffffffffffffff92831660208501529116908201526060016100a2565b6100987f000000000000000000000000000000000000000000000000000000000000000081565b6101dc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604081205460ff16610295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6d7573742076657269667920666972737400000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054610317906effffffffffffffffffffffffffffff61010082048116917001000000000000000000000000000000009004167f00000000000000000000000000000000000000000000000000000000000000006303bfc40061061c565b92915050565b60008311801561033b57506effffffffffffffffffffffffffffff83105b6103c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f746f74616c416d6f756e742063616e6e6f742062652030206f72206c6172676560448201527f72207468616e206d61782075696e743132302076616c75650000000000000000606482015260840161028c565b73ffffffffffffffffffffffffffffffffffffffff84166000908152602081905260409020805460ff16610553576040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506104a98484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f0000000000000000000000000000000000000000000000000000000000000000925085915061067f9050565b61050f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f636f756c64206e6f7420766572696679206d65726b6c6550726f6f6600000000604482015260640161028c565b5080546effffffffffffffffffffffffffffff8516610100027fffffffffffffffffffffffffffffffff000000000000000000000000000000009091161760011781555b61055c85610730565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff81166105815750335b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604090205460ff16610610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6d75737420766572696679206669727374000000000000000000000000000000604482015260640161028c565b61061981610730565b50565b60004283811015610631576000915050610677565b600061063d8583610e20565b9050600084821061064f575086610667565b8461065a838a610de3565b6106649190610da8565b90505b6106718782610e20565b93505050505b949350505050565b600081815b85518110156107235760008682815181106106a1576106a1610ecf565b602002602001015190508083116106e3576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610710565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061071b81610e67565b915050610684565b50831490505b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260408120805490916effffffffffffffffffffffffffffff70010000000000000000000000000000000083048116926107b79161010090910416837f00000000000000000000000000000000000000000000000000000000000000006303bfc40061061c565b905060006107c58383610d90565b90506effffffffffffffffffffffffffffff8110610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f6e657752656c656173656420697320746f6f2062696720746f2062652063617360448201527f742075696e743132300000000000000000000000000000000000000000000000606482015260840161028c565b83547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000006effffffffffffffffffffffffffffff8316021784556108f27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168684610949565b8473ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a8360405161093a91815260200190565b60405180910390a25050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526109d69084906109db565b505050565b6000610a3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610ae79092919063ffffffff16565b8051909150156109d65780806020019051810190610a5b9190610d01565b6109d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161028c565b6060610677848460008585843b610b5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161028c565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610b839190610d23565b60006040518083038185875af1925050503d8060008114610bc0576040519150601f19603f3d011682016040523d82523d6000602084013e610bc5565b606091505b5091509150610bd5828286610be0565b979650505050505050565b60608315610bef575081610729565b825115610bff5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028c9190610d3f565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b919050565b600060208284031215610c6e57600080fd5b61072982610c33565b60008060008060608587031215610c8d57600080fd5b610c9685610c33565b935060208501359250604085013567ffffffffffffffff80821115610cba57600080fd5b818701915087601f830112610cce57600080fd5b813581811115610cdd57600080fd5b8860208260051b8501011115610cf257600080fd5b95989497505060200194505050565b600060208284031215610d1357600080fd5b8151801515811461072957600080fd5b60008251610d35818460208701610e37565b9190910192915050565b6020815260008251806020840152610d5e816040850160208701610e37565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115610da357610da3610ea0565b500190565b600082610dde577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e1b57610e1b610ea0565b500290565b600082821015610e3257610e32610ea0565b500390565b60005b83811015610e52578181015183820152602001610e3a565b83811115610e61576000848401525b50505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610e9957610e99610ea0565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122055338b0816d4d2b2cb0f40cc2b0d7bd0c7c1c26e03de953c914f1a364201940364736f6c63430008060033000000000000000000000000f1dc500fde233a4055e25e5bbf516372bc4f6871235d88efaae4e04494277ca85279b0550806a2b3efb124e38933a167ba4e7cec00000000000000000000000000000000000000000000000000000000619348e0
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063d279c1911161005b578063d279c191146100fa578063daf498631461010d578063e6fd48bc1461018e578063fc0c546a146101b557600080fd5b80631be052891461008d5780632eb4a7ab146100ab578063384711cc146100d2578063935fe8c8146100e5575b600080fd5b6100986303bfc40081565b6040519081526020015b60405180910390f35b6100987f235d88efaae4e04494277ca85279b0550806a2b3efb124e38933a167ba4e7cec81565b6100986100e0366004610c5c565b610201565b6100f86100f3366004610c77565b61031d565b005b6100f8610108366004610c5c565b610563565b61015f61011b366004610c5c565b60006020819052908152604090205460ff8116906effffffffffffffffffffffffffffff610100820481169170010000000000000000000000000000000090041683565b6040805193151584526effffffffffffffffffffffffffffff92831660208501529116908201526060016100a2565b6100987f00000000000000000000000000000000000000000000000000000000619348e081565b6101dc7f000000000000000000000000f1dc500fde233a4055e25e5bbf516372bc4f687181565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604081205460ff16610295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6d7573742076657269667920666972737400000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054610317906effffffffffffffffffffffffffffff61010082048116917001000000000000000000000000000000009004167f00000000000000000000000000000000000000000000000000000000619348e06303bfc40061061c565b92915050565b60008311801561033b57506effffffffffffffffffffffffffffff83105b6103c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f746f74616c416d6f756e742063616e6e6f742062652030206f72206c6172676560448201527f72207468616e206d61782075696e743132302076616c75650000000000000000606482015260840161028c565b73ffffffffffffffffffffffffffffffffffffffff84166000908152602081905260409020805460ff16610553576040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506104a98484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f235d88efaae4e04494277ca85279b0550806a2b3efb124e38933a167ba4e7cec925085915061067f9050565b61050f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f636f756c64206e6f7420766572696679206d65726b6c6550726f6f6600000000604482015260640161028c565b5080546effffffffffffffffffffffffffffff8516610100027fffffffffffffffffffffffffffffffff000000000000000000000000000000009091161760011781555b61055c85610730565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff81166105815750335b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604090205460ff16610610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6d75737420766572696679206669727374000000000000000000000000000000604482015260640161028c565b61061981610730565b50565b60004283811015610631576000915050610677565b600061063d8583610e20565b9050600084821061064f575086610667565b8461065a838a610de3565b6106649190610da8565b90505b6106718782610e20565b93505050505b949350505050565b600081815b85518110156107235760008682815181106106a1576106a1610ecf565b602002602001015190508083116106e3576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610710565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061071b81610e67565b915050610684565b50831490505b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260408120805490916effffffffffffffffffffffffffffff70010000000000000000000000000000000083048116926107b79161010090910416837f00000000000000000000000000000000000000000000000000000000619348e06303bfc40061061c565b905060006107c58383610d90565b90506effffffffffffffffffffffffffffff8110610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f6e657752656c656173656420697320746f6f2062696720746f2062652063617360448201527f742075696e743132300000000000000000000000000000000000000000000000606482015260840161028c565b83547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000006effffffffffffffffffffffffffffff8316021784556108f27f000000000000000000000000f1dc500fde233a4055e25e5bbf516372bc4f687173ffffffffffffffffffffffffffffffffffffffff168684610949565b8473ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a8360405161093a91815260200190565b60405180910390a25050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526109d69084906109db565b505050565b6000610a3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610ae79092919063ffffffff16565b8051909150156109d65780806020019051810190610a5b9190610d01565b6109d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161028c565b6060610677848460008585843b610b5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161028c565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610b839190610d23565b60006040518083038185875af1925050503d8060008114610bc0576040519150601f19603f3d011682016040523d82523d6000602084013e610bc5565b606091505b5091509150610bd5828286610be0565b979650505050505050565b60608315610bef575081610729565b825115610bff5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028c9190610d3f565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b919050565b600060208284031215610c6e57600080fd5b61072982610c33565b60008060008060608587031215610c8d57600080fd5b610c9685610c33565b935060208501359250604085013567ffffffffffffffff80821115610cba57600080fd5b818701915087601f830112610cce57600080fd5b813581811115610cdd57600080fd5b8860208260051b8501011115610cf257600080fd5b95989497505060200194505050565b600060208284031215610d1357600080fd5b8151801515811461072957600080fd5b60008251610d35818460208701610e37565b9190910192915050565b6020815260008251806020840152610d5e816040850160208701610e37565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115610da357610da3610ea0565b500190565b600082610dde577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e1b57610e1b610ea0565b500290565b600082821015610e3257610e32610ea0565b500390565b60005b83811015610e52578181015183820152602001610e3a565b83811115610e61576000848401525b50505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610e9957610e99610ea0565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122055338b0816d4d2b2cb0f40cc2b0d7bd0c7c1c26e03de953c914f1a364201940364736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f1dc500fde233a4055e25e5bbf516372bc4f6871235d88efaae4e04494277ca85279b0550806a2b3efb124e38933a167ba4e7cec00000000000000000000000000000000000000000000000000000000619348e0
-----Decoded View---------------
Arg [0] : token_ (address): 0xf1Dc500FdE233A4055e25e5BbF516372BC4F6871
Arg [1] : merkleRoot_ (bytes32): 0x235d88efaae4e04494277ca85279b0550806a2b3efb124e38933a167ba4e7cec
Arg [2] : startTimestamp_ (uint256): 1637042400
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f1dc500fde233a4055e25e5bbf516372bc4f6871
Arg [1] : 235d88efaae4e04494277ca85279b0550806a2b3efb124e38933a167ba4e7cec
Arg [2] : 00000000000000000000000000000000000000000000000000000000619348e0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.