More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 291 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Claim | 19882116 | 13 hrs ago | IN | 0 ETH | 0.00050365 | ||||
Claim | 19854178 | 4 days ago | IN | 0 ETH | 0.00037177 | ||||
Claim | 19852818 | 4 days ago | IN | 0 ETH | 0.0003565 | ||||
Claim | 19808621 | 10 days ago | IN | 0 ETH | 0.00048524 | ||||
Claim | 19808391 | 10 days ago | IN | 0 ETH | 0.00049277 | ||||
Claim | 19806118 | 11 days ago | IN | 0 ETH | 0.00055658 | ||||
Claim | 19806092 | 11 days ago | IN | 0 ETH | 0.00048574 | ||||
Claim | 19794659 | 12 days ago | IN | 0 ETH | 0.00045217 | ||||
Claim | 19784801 | 14 days ago | IN | 0 ETH | 0.00063073 | ||||
Claim | 19783672 | 14 days ago | IN | 0 ETH | 0.00117292 | ||||
Claim | 19782208 | 14 days ago | IN | 0 ETH | 0.00069263 | ||||
Claim | 19780529 | 14 days ago | IN | 0 ETH | 0.0004358 | ||||
Claim | 19774393 | 15 days ago | IN | 0 ETH | 0.00085864 | ||||
Claim | 19774374 | 15 days ago | IN | 0 ETH | 0.00090377 | ||||
Claim | 19774356 | 15 days ago | IN | 0 ETH | 0.00108285 | ||||
Claim | 19770544 | 16 days ago | IN | 0 ETH | 0.00104601 | ||||
Claim | 19770529 | 16 days ago | IN | 0 ETH | 0.00114425 | ||||
Claim | 19768864 | 16 days ago | IN | 0 ETH | 0.00177714 | ||||
Claim | 19763439 | 17 days ago | IN | 0 ETH | 0.00073974 | ||||
Claim | 19762107 | 17 days ago | IN | 0 ETH | 0.00168011 | ||||
Claim | 19757671 | 17 days ago | IN | 0 ETH | 0.00092254 | ||||
Claim | 19753481 | 18 days ago | IN | 0 ETH | 0.00075849 | ||||
Claim | 19750098 | 19 days ago | IN | 0 ETH | 0.00039833 | ||||
Claim | 19749926 | 19 days ago | IN | 0 ETH | 0.00042645 | ||||
Claim | 19749867 | 19 days ago | IN | 0 ETH | 0.00040159 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AirdropSeason1
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.18; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "./ArcadeAirdropBase.sol"; import "../../external/dao-contracts/interfaces/IAirdropSingleSidedStaking.sol"; import { AA_ZeroAddress } from "../../errors/Airdrop.sol"; /** * @title Airdrop Season 1 * @author Non-Fungible Technologies, Inc. * * This contract is used to distribute tokens to users who have been airdropped * tokens. The tokens are distributed to the users directly, or users can choose * to have thier allocation staked in the ArcadeSingleSidedStaking contract. */ contract AirdropSeason1 is ArcadeAirdropBase, ReentrancyGuard { using SafeERC20 for IERC20; // ============================================ STATE ============================================== /// @notice the voting vault vault which receives airdropped tokens IAirdropSingleSidedStaking public immutable votingVault; // ============================================ EVENTS ============================================= event Claimed(address indexed user, uint128 totalGrant); // ========================================== CONSTRUCTOR ========================================== /** * @notice Initiate the contract with a merkle tree root, a token for distribution, * an expiration time for claims, and the voting vault that tokens will be * airdropped into. * * @param _token The token to airdrop * @param _merkleRoot The merkle root with deposits encoded into it as hash [address, amount] * @param _expiration The expiration of the airdrop * @param _votingVault The voting vault to deposit tokens to */ constructor( IERC20 _token, bytes32 _merkleRoot, uint256 _expiration, IAirdropSingleSidedStaking _votingVault ) ArcadeAirdropBase(_token, _merkleRoot, _expiration) { if (address(_votingVault) == address(0)) revert AA_ZeroAddress("votingVault"); votingVault = _votingVault; } // ===================================== CLAIM FUNCTIONALITY ======================================= /** * @notice Claims an amount of tokens in the tree and stakes the tokens in the ArcadeSingleSidedStaking * contract. The caller can choose who to delegate their voting power to by passing in the * address of their delegate. If a user already has an active stake in the ArcadeSingleSidedStaking * voting vault they must use the same delegate address they are already delegating to. * * @param delegate The address the user will delegate to * @param totalGrant The total amount of tokens the user was granted * @param merkleProof The merkle proof showing the user is in the merkle tree * @param lock The locking period to apply to the staked tokens */ function claimAndStake( address delegate, uint128 totalGrant, bytes32[] calldata merkleProof, IAirdropSingleSidedStaking.Lock lock ) external { _validateWithdraw(totalGrant, merkleProof); _setClaimed(msg.sender, totalGrant); // approve the voting vault to transfer tokens token.approve(address(votingVault), uint256(totalGrant)); // stake tokens in voting vault for this msg.sender and delegate votingVault.airdropReceive(msg.sender, totalGrant, delegate, lock); emit Claimed(msg.sender, totalGrant); } /** * @notice Claims an amount of tokens in the tree and send them to the caller. * * @param totalGrant The total amount of tokens the user was granted * @param merkleProof The merkle proof showing the user is in the merkle tree */ function claim(uint128 totalGrant, bytes32[] calldata merkleProof) external nonReentrant { _validateWithdraw(totalGrant, merkleProof); _setClaimed(msg.sender, totalGrant); // transfer tokens to the caller token.safeTransfer(msg.sender, totalGrant); emit Claimed(msg.sender, totalGrant); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// 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); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.18; /** * @title AirdropErrors * @author Non-Fungible Technologies, Inc. * * This file contains all custom errors for the Arcade Token airdrop contract. * All errors are prefixed by "AA_" for ArcadeAirdrop. Errors located in one place * to make it possible to holistically look at all the failure cases. */ // ==================================== ARCADE AIRDROP ====================================== /// @notice All errors prefixed with AA_, to separate from other contracts in governance. /** * @notice Ensure airdrop claim period has expired before reclaiming tokens. */ error AA_ClaimingNotExpired(); /** * @notice Cannot claim tokens after airdrop has expired. */ error AA_ClaimingExpired(); /** * @notice Cannot claim tokens multiple times. */ error AA_AlreadyClaimed(); /** * @notice Merkle proof not verified. User is not a participant in the airdrop. */ error AA_NonParticipant(); /** * @notice Zero address passed in where not allowed. * * @param addressType The name of the parameter for which a zero * address was provided. */ error AA_ZeroAddress(string addressType); /** * @notice Thrown when the merkle root is set to bytes32(0). */ error AA_NotInitialized();
// SPDX-License-Identifier: Apache-2.0 pragma solidity >=0.7.0; contract Authorizable { // This contract allows a flexible authorization scheme // The owner who can change authorization status address public owner; // A mapping from an address to its authorization status mapping(address => bool) public authorized; /// @dev We set the deployer to the owner constructor() { owner = msg.sender; } /// @dev This modifier checks if the msg.sender is the owner modifier onlyOwner() { require(msg.sender == owner, "Sender not owner"); _; } /// @dev This modifier checks if an address is authorized modifier onlyAuthorized() { require(isAuthorized(msg.sender), "Sender not Authorized"); _; } /// @dev Returns true if an address is authorized /// @param who the address to check /// @return true if authorized false if not function isAuthorized(address who) public view returns (bool) { return authorized[who]; } /// @dev Privileged function authorize an address /// @param who the address to authorize function authorize(address who) external onlyOwner() { _authorize(who); } /// @dev Privileged function to de authorize an address /// @param who The address to remove authorization from function deauthorize(address who) external onlyOwner() { authorized[who] = false; } /// @dev Function to change owner /// @param who The new owner address function setOwner(address who) public onlyOwner() { owner = who; } /// @dev Inheritable function which authorizes someone /// @param who the address to authorize function _authorize(address who) internal { authorized[who] = true; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.18; interface IAirdropSingleSidedStaking { enum Lock { Short, Medium, Long } function airdropReceive( address recipient, uint256 amount, address delegation, Lock lock ) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.18; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "../../external/council/libraries/Authorizable.sol"; import { AA_ClaimingNotExpired, AA_AlreadyClaimed, AA_NonParticipant, AA_ClaimingExpired, AA_ZeroAddress, AA_NotInitialized } from "../../errors/Airdrop.sol"; /** * @title Arcade Airdrop * @author Non-Fungible Technologies, Inc. * * This contract contains the base functionality for an airdrop. The contract is ownable, where the * owner can reclaim any remaining tokens once the airdrop is over and also change the merkle root * and expiration at their discretion. */ abstract contract ArcadeAirdropBase is Authorizable { using SafeERC20 for IERC20; // ============================================ STATE ============================================== /// @notice the token to airdrop IERC20 public immutable token; /// @notice the merkle root with deposits encoded into it as hash [address, amount] bytes32 public rewardsRoot; /// @notice the timestamp expiration of the rewards root uint256 public expiration; /// @notice user claim history by merkle root used to claim mapping(address => mapping(bytes32 => uint256)) public claimed; // ============================================= EVENTS ============================================= event SetMerkleRoot(bytes32 indexed merkleRoot, uint256 indexed expiration); // ========================================== CONSTRUCTOR =========================================== /** * @notice Initiate the contract with a merkle tree root, a token for distribution, * an expiration time for claims. * * @param _token The token to airdrop * @param _rewardsRoot The merkle root with deposits encoded into it as hash [address, amount] * @param _expiration The expiration of the airdrop */ constructor(IERC20 _token, bytes32 _rewardsRoot, uint256 _expiration) { if (address(_token) == address(0)) revert AA_ZeroAddress("token"); if (_expiration <= block.timestamp) revert AA_ClaimingExpired(); token = _token; rewardsRoot = _rewardsRoot; expiration = _expiration; } // ======================================= REWARDS VALIDATION ======================================== /** * @notice Validate a withdraw attempt by checking merkle proof and ensuring the user has not * previously withdrawn. * * @param totalGrant The total amount of tokens the user was granted * @param merkleProof The merkle proof showing the user is in the merkle tree */ function _validateWithdraw(uint256 totalGrant, bytes32[] memory merkleProof) internal view { // merkle root must be set if (rewardsRoot == bytes32(0)) revert AA_NotInitialized(); // can only claim before the expiration time if (block.timestamp > expiration) revert AA_ClaimingExpired(); // validate proof and leaf hash bytes32 leafHash = keccak256(abi.encodePacked(msg.sender, totalGrant)); if (!MerkleProof.verify(merkleProof, rewardsRoot, leafHash)) revert AA_NonParticipant(); } // ========================================== HELPERS =============================================== /** * @notice Get the claimed amount for a user and merkle root * * @param user The user to check * @param merkleRoot The merkle root to check * * @return claimed The amount claimed by the user */ function getClaimed(address user, bytes32 merkleRoot) external view returns (uint256) { return claimed[user][merkleRoot]; } /** * @notice Set the claimed amount for a user and merkle root. The user * cannot claim twice from the same root. * * @param user The user to set * @param totalGrant The total amount claimed */ function _setClaimed(address user, uint256 totalGrant) internal { // ensure the user has not already claimed the airdrop for this merkle root if (claimed[user][rewardsRoot] != 0) revert AA_AlreadyClaimed(); claimed[user][rewardsRoot] = totalGrant; } // ===================================== ADMIN FUNCTIONALITY ======================================== /** * @notice Allows governance to remove the funds in this contract once the airdrop is over. * This function can only be called after the expiration time. * * @param destination The address which will receive the remaining tokens */ function reclaim(address destination) external onlyOwner { if (block.timestamp <= expiration) revert AA_ClaimingNotExpired(); if (destination == address(0)) revert AA_ZeroAddress("destination"); uint256 unclaimed = token.balanceOf(address(this)); token.safeTransfer(destination, unclaimed); } /** * @notice Allows the owner to set a merkle root and its expiration timestamp. When creating * a merkle trie, a users address should not be associated with multiple leaves. * * @param _merkleRoot The new merkle root * @param _expiration The new expiration timestamp for this root */ function setMerkleRoot(bytes32 _merkleRoot, uint256 _expiration) external onlyOwner { if (_expiration <= block.timestamp) revert AA_ClaimingExpired(); rewardsRoot = _merkleRoot; expiration = _expiration; emit SetMerkleRoot(_merkleRoot, _expiration); } }
{ "metadata": { "bytecodeHash": "none" }, "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
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":"_expiration","type":"uint256"},{"internalType":"contract IAirdropSingleSidedStaking","name":"_votingVault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AA_AlreadyClaimed","type":"error"},{"inputs":[],"name":"AA_ClaimingExpired","type":"error"},{"inputs":[],"name":"AA_ClaimingNotExpired","type":"error"},{"inputs":[],"name":"AA_NonParticipant","type":"error"},{"inputs":[],"name":"AA_NotInitialized","type":"error"},{"inputs":[{"internalType":"string","name":"addressType","type":"string"}],"name":"AA_ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint128","name":"totalGrant","type":"uint128"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"SetMerkleRoot","type":"event"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"totalGrant","type":"uint128"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint128","name":"totalGrant","type":"uint128"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"enum IAirdropSingleSidedStaking.Lock","name":"lock","type":"uint8"}],"name":"claimAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"deauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"getClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"}],"name":"reclaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_expiration","type":"uint256"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingVault","outputs":[{"internalType":"contract IAirdropSingleSidedStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620017fd380380620017fd833981016040819052620000349162000139565b600080546001600160a01b031916331790558383836001600160a01b0383166200008e5760405163167ab04560e01b81526020600482015260056024820152643a37b5b2b760d91b60448201526064015b60405180910390fd5b428111620000af576040516334213fb560e01b815260040160405180910390fd5b6001600160a01b03928316608052600291909155600355600160055581166200010a5760405163167ab04560e01b815260206004820152600b60248201526a1d9bdd1a5b99d5985d5b1d60aa1b604482015260640162000085565b6001600160a01b031660a052506200018a915050565b6001600160a01b03811681146200013657600080fd5b50565b600080600080608085870312156200015057600080fd5b84516200015d8162000120565b80945050602085015192506040850151915060608501516200017f8162000120565b939692955090935050565b60805160a051611623620001da600039600081816102890152818161072f015261081a0152600081816102b00152818161076f015281816109ce01528181610bc20152610c5e01526116236000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063b6a5d7de11610097578063dcb0c0a711610066578063dcb0c0a714610284578063fc0c546a146102ab578063fc772c8b146102d2578063fe9fbb80146102e557600080fd5b8063b6a5d7de14610218578063b91816111461022b578063d22092211461025e578063dadb4ce91461027157600080fd5b80634665096d116100d35780634665096d146101745780636e0d803b1461017d5780637c382d0b146101c05780638da5cb5b146101d357600080fd5b80630f2d940b1461010557806313af403514610143578063217863b71461015857806327c97fa514610161575b600080fd5b610130610113366004611296565b600460209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6101566101513660046112c0565b61031e565b005b61013060025481565b61015661016f3660046112c0565b6103eb565b61013060035481565b61013061018b366004611296565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600460209081526040808320938352929052205490565b6101566101ce3660046112db565b6104b8565b6000546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013a565b6101566102263660046112c0565b6105ad565b61024e6102393660046112c0565b60016020526000908152604090205460ff1681565b604051901515815260200161013a565b61015661026c366004611369565b610687565b61015661027f3660046113e6565b6108d5565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b6101566102e03660046112c0565b610a58565b61024e6102f33660046112c0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e65720000000000000000000000000000000060448201526064015b60405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461046c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e657200000000000000000000000000000000604482015260640161039b565b73ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e657200000000000000000000000000000000604482015260640161039b565b428111610572576040517f34213fb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028290556003819055604051819083907fa4fb0d479840a4d45d2a99f88a08ecd594d37877df52df65cf27c03c2fe88e7f90600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e657200000000000000000000000000000000604482015260640161039b565b6106848173ffffffffffffffffffffffffffffffffffffffff16600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055565b50565b6106d6846fffffffffffffffffffffffffffffffff16848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610c8992505050565b6106f233856fffffffffffffffffffffffffffffffff16610d99565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff861660248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af11580156107b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dc9190611439565b506040517f87cef13000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906387cef1309061085590339088908a90879060040161145b565b600060405180830381600087803b15801561086f57600080fd5b505af1158015610883573d6000803e3d6000fd5b50506040516fffffffffffffffffffffffffffffffff871681523392507fd6a5432c9cd958f74af2d34217454e7dea5a846e344fadafcd1ff310b5f449fd915060200160405180910390a25050505050565b600260055403610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161039b565b6002600581905550610998836fffffffffffffffffffffffffffffffff16838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610c8992505050565b6109b433846fffffffffffffffffffffffffffffffff16610d99565b610a0773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016336fffffffffffffffffffffffffffffffff8616610e39565b6040516fffffffffffffffffffffffffffffffff8416815233907fd6a5432c9cd958f74af2d34217454e7dea5a846e344fadafcd1ff310b5f449fd9060200160405180910390a25050600160055550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e657200000000000000000000000000000000604482015260640161039b565b6003544211610b14576040517f3faad85400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610b91576040517f167ab04500000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f64657374696e6174696f6e000000000000000000000000000000000000000000604482015260640161039b565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906114de565b9050610c8573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383610e39565b5050565b600254610cc2576040517f51f1176a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354421115610cfe576040517f34213fb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260348101839052600090605401604051602081830303815290604052805190602001209050610d5e8260025483610ec6565b610d94576040517f07f1276c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320600254845290915290205415610e03576040517fdc48477b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff90911660009081526004602090815260408083206002548452909152902055565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610d94908490610f77565b600081815b8551811015610f6a576000868281518110610ee857610ee86114f7565b60200260200101519050808311610f2a576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610f57565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080610f6281611526565b915050610ecb565b50831490505b9392505050565b6000610fd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166110839092919063ffffffff16565b805190915015610d945780806020019051810190610ff79190611439565b610d94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161039b565b6060611092848460008561109a565b949350505050565b60608247101561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161039b565b843b611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161039b565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516111bd91906115a9565b60006040518083038185875af1925050503d80600081146111fa576040519150601f19603f3d011682016040523d82523d6000602084013e6111ff565b606091505b509150915061120f82828661121a565b979650505050505050565b60608315611229575081610f70565b8251156112395782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039b91906115c5565b803573ffffffffffffffffffffffffffffffffffffffff8116811461129157600080fd5b919050565b600080604083850312156112a957600080fd5b6112b28361126d565b946020939093013593505050565b6000602082840312156112d257600080fd5b610f708261126d565b600080604083850312156112ee57600080fd5b50508035926020909101359150565b80356fffffffffffffffffffffffffffffffff8116811461129157600080fd5b60008083601f84011261132f57600080fd5b50813567ffffffffffffffff81111561134757600080fd5b6020830191508360208260051b850101111561136257600080fd5b9250929050565b60008060008060006080868803121561138157600080fd5b61138a8661126d565b9450611398602087016112fd565b9350604086013567ffffffffffffffff8111156113b457600080fd5b6113c08882890161131d565b9094509250506060860135600381106113d857600080fd5b809150509295509295909350565b6000806000604084860312156113fb57600080fd5b611404846112fd565b9250602084013567ffffffffffffffff81111561142057600080fd5b61142c8682870161131d565b9497909650939450505050565b60006020828403121561144b57600080fd5b81518015158114610f7057600080fd5b73ffffffffffffffffffffffffffffffffffffffff85811682526fffffffffffffffffffffffffffffffff851660208301528316604082015260808101600383106114cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82606083015295945050505050565b6000602082840312156114f057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361157e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60005b838110156115a0578181015183820152602001611588565b50506000910152565b600082516115bb818460208701611585565b9190910192915050565b60208152600082518060208401526115e4816040850160208701611585565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea164736f6c6343000812000a000000000000000000000000e020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf6132c21a5d8c33218fb0866c9d46fc215d26968637c97ced2d7383871dd85fd300000000000000000000000000000000000000000000000000000000666f2aa600000000000000000000000072854fbb44d3dd87109d46a9298aeb0d018740f0
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063b6a5d7de11610097578063dcb0c0a711610066578063dcb0c0a714610284578063fc0c546a146102ab578063fc772c8b146102d2578063fe9fbb80146102e557600080fd5b8063b6a5d7de14610218578063b91816111461022b578063d22092211461025e578063dadb4ce91461027157600080fd5b80634665096d116100d35780634665096d146101745780636e0d803b1461017d5780637c382d0b146101c05780638da5cb5b146101d357600080fd5b80630f2d940b1461010557806313af403514610143578063217863b71461015857806327c97fa514610161575b600080fd5b610130610113366004611296565b600460209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6101566101513660046112c0565b61031e565b005b61013060025481565b61015661016f3660046112c0565b6103eb565b61013060035481565b61013061018b366004611296565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600460209081526040808320938352929052205490565b6101566101ce3660046112db565b6104b8565b6000546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013a565b6101566102263660046112c0565b6105ad565b61024e6102393660046112c0565b60016020526000908152604090205460ff1681565b604051901515815260200161013a565b61015661026c366004611369565b610687565b61015661027f3660046113e6565b6108d5565b6101f37f00000000000000000000000072854fbb44d3dd87109d46a9298aeb0d018740f081565b6101f37f000000000000000000000000e020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf81565b6101566102e03660046112c0565b610a58565b61024e6102f33660046112c0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e65720000000000000000000000000000000060448201526064015b60405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461046c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e657200000000000000000000000000000000604482015260640161039b565b73ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e657200000000000000000000000000000000604482015260640161039b565b428111610572576040517f34213fb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028290556003819055604051819083907fa4fb0d479840a4d45d2a99f88a08ecd594d37877df52df65cf27c03c2fe88e7f90600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e657200000000000000000000000000000000604482015260640161039b565b6106848173ffffffffffffffffffffffffffffffffffffffff16600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055565b50565b6106d6846fffffffffffffffffffffffffffffffff16848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610c8992505050565b6106f233856fffffffffffffffffffffffffffffffff16610d99565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000072854fbb44d3dd87109d46a9298aeb0d018740f0811660048301526fffffffffffffffffffffffffffffffff861660248301527f000000000000000000000000e020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf169063095ea7b3906044016020604051808303816000875af11580156107b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dc9190611439565b506040517f87cef13000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000072854fbb44d3dd87109d46a9298aeb0d018740f016906387cef1309061085590339088908a90879060040161145b565b600060405180830381600087803b15801561086f57600080fd5b505af1158015610883573d6000803e3d6000fd5b50506040516fffffffffffffffffffffffffffffffff871681523392507fd6a5432c9cd958f74af2d34217454e7dea5a846e344fadafcd1ff310b5f449fd915060200160405180910390a25050505050565b600260055403610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161039b565b6002600581905550610998836fffffffffffffffffffffffffffffffff16838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610c8992505050565b6109b433846fffffffffffffffffffffffffffffffff16610d99565b610a0773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf16336fffffffffffffffffffffffffffffffff8616610e39565b6040516fffffffffffffffffffffffffffffffff8416815233907fd6a5432c9cd958f74af2d34217454e7dea5a846e344fadafcd1ff310b5f449fd9060200160405180910390a25050600160055550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f53656e646572206e6f74206f776e657200000000000000000000000000000000604482015260640161039b565b6003544211610b14576040517f3faad85400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610b91576040517f167ab04500000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f64657374696e6174696f6e000000000000000000000000000000000000000000604482015260640161039b565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000e020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf73ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906114de565b9050610c8573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf168383610e39565b5050565b600254610cc2576040517f51f1176a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354421115610cfe576040517f34213fb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260348101839052600090605401604051602081830303815290604052805190602001209050610d5e8260025483610ec6565b610d94576040517f07f1276c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320600254845290915290205415610e03576040517fdc48477b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff90911660009081526004602090815260408083206002548452909152902055565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610d94908490610f77565b600081815b8551811015610f6a576000868281518110610ee857610ee86114f7565b60200260200101519050808311610f2a576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610f57565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080610f6281611526565b915050610ecb565b50831490505b9392505050565b6000610fd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166110839092919063ffffffff16565b805190915015610d945780806020019051810190610ff79190611439565b610d94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161039b565b6060611092848460008561109a565b949350505050565b60608247101561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161039b565b843b611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161039b565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516111bd91906115a9565b60006040518083038185875af1925050503d80600081146111fa576040519150601f19603f3d011682016040523d82523d6000602084013e6111ff565b606091505b509150915061120f82828661121a565b979650505050505050565b60608315611229575081610f70565b8251156112395782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039b91906115c5565b803573ffffffffffffffffffffffffffffffffffffffff8116811461129157600080fd5b919050565b600080604083850312156112a957600080fd5b6112b28361126d565b946020939093013593505050565b6000602082840312156112d257600080fd5b610f708261126d565b600080604083850312156112ee57600080fd5b50508035926020909101359150565b80356fffffffffffffffffffffffffffffffff8116811461129157600080fd5b60008083601f84011261132f57600080fd5b50813567ffffffffffffffff81111561134757600080fd5b6020830191508360208260051b850101111561136257600080fd5b9250929050565b60008060008060006080868803121561138157600080fd5b61138a8661126d565b9450611398602087016112fd565b9350604086013567ffffffffffffffff8111156113b457600080fd5b6113c08882890161131d565b9094509250506060860135600381106113d857600080fd5b809150509295509295909350565b6000806000604084860312156113fb57600080fd5b611404846112fd565b9250602084013567ffffffffffffffff81111561142057600080fd5b61142c8682870161131d565b9497909650939450505050565b60006020828403121561144b57600080fd5b81518015158114610f7057600080fd5b73ffffffffffffffffffffffffffffffffffffffff85811682526fffffffffffffffffffffffffffffffff851660208301528316604082015260808101600383106114cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82606083015295945050505050565b6000602082840312156114f057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361157e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60005b838110156115a0578181015183820152602001611588565b50506000910152565b600082516115bb818460208701611585565b9190910192915050565b60208152600082518060208401526115e4816040850160208701611585565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea164736f6c6343000812000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf6132c21a5d8c33218fb0866c9d46fc215d26968637c97ced2d7383871dd85fd300000000000000000000000000000000000000000000000000000000666f2aa600000000000000000000000072854fbb44d3dd87109d46a9298aeb0d018740f0
-----Decoded View---------------
Arg [0] : _token (address): 0xe020B01B6fbD83066aa2e8ee0CCD1eB8d9Cc70bF
Arg [1] : _merkleRoot (bytes32): 0x6132c21a5d8c33218fb0866c9d46fc215d26968637c97ced2d7383871dd85fd3
Arg [2] : _expiration (uint256): 1718561446
Arg [3] : _votingVault (address): 0x72854FBb44d3dd87109D46a9298AEB0d018740f0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000e020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf
Arg [1] : 6132c21a5d8c33218fb0866c9d46fc215d26968637c97ced2d7383871dd85fd3
Arg [2] : 00000000000000000000000000000000000000000000000000000000666f2aa6
Arg [3] : 00000000000000000000000072854fbb44d3dd87109d46a9298aeb0d018740f0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 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.