Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AirdropDistributor
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import "Ownable.sol"; import "MerkleProof.sol"; import "IERC20.sol"; import "Address.sol"; import "ITokenLocker.sol"; import "IVault.sol"; interface IClaimCallback { function claimCallback(address claimant, uint256 amount) external returns (bool success); } /** @title Prisma Airdrop Distributor @notice Distributes PRISMA to veCRV holders that voted in favor of Prisma's initial Curve governance proposal, and to early users who interacted with the protocol prior to token emissions. @dev Airdropped PRISMA tokens are given as a locked position. Distribution is via a merkle proof. The proof and script used to create are available on Github: https://github.com/prisma-fi/airdrop-proofs */ contract AirdropDistributor is Ownable { using Address for address; bytes32 public merkleRoot; uint256 public canClaimUntil; mapping(uint256 => uint256) private claimedBitMap; mapping(address receiver => address callback) public claimCallback; IERC20 public immutable token; ITokenLocker public immutable locker; address public immutable vault; uint256 private immutable lockToTokenRatio; uint256 private immutable CLAIM_LOCK_WEEKS; uint256 public constant CLAIM_DURATION = 13 weeks; event Claimed(address indexed claimant, address indexed receiver, uint256 index, uint256 amount); event MerkleRootSet(bytes32 root, uint256 canClaimUntil); constructor(IERC20 _token, ITokenLocker _locker, address _vault, uint256 lockWeeks) { token = _token; locker = _locker; vault = _vault; CLAIM_LOCK_WEEKS = lockWeeks; lockToTokenRatio = _locker.lockToTokenRatio(); } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { require(merkleRoot == bytes32(0), "merkleRoot already set"); merkleRoot = _merkleRoot; canClaimUntil = block.timestamp + CLAIM_DURATION; emit MerkleRootSet(_merkleRoot, canClaimUntil); } function sweepUnclaimedTokens() external { require(merkleRoot != bytes32(0), "merkleRoot not set"); require(block.timestamp > canClaimUntil, "Claims still active"); uint256 amount = token.allowance(vault, address(this)); require(amount > 0, "Nothing to sweep"); token.transferFrom(vault, address(this), amount); token.approve(vault, amount); IPrismaVault(vault).increaseUnallocatedSupply(amount); } function isClaimed(uint256 index) public view returns (bool) { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; uint256 claimedWord = claimedBitMap[claimedWordIndex]; uint256 mask = (1 << claimedBitIndex); return claimedWord & mask == mask; } function _setClaimed(uint256 index) private { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; claimedBitMap[claimedWordIndex] = claimedBitMap[claimedWordIndex] | (1 << claimedBitIndex); } /** @dev `amount` is after dividing by `locker.lockToTokenRatio()` */ function claim( address claimant, address receiver, uint256 index, uint256 amount, bytes32[] calldata merkleProof ) external { if (msg.sender != claimant) { require(msg.sender == owner(), "onlyOwner"); require(claimant.isContract(), "Claimant must be a contract"); } require(merkleRoot != bytes32(0), "merkleRoot not set"); require(block.timestamp < canClaimUntil, "Claims period has finished"); require(!isClaimed(index), "Already claimed"); bytes32 node = keccak256(abi.encodePacked(index, claimant, amount)); require(MerkleProof.verifyCalldata(merkleProof, merkleRoot, node), "Invalid proof"); _setClaimed(index); token.transferFrom(vault, address(this), amount * lockToTokenRatio); locker.lock(receiver, amount, CLAIM_LOCK_WEEKS); if (claimant != receiver) { address callback = claimCallback[receiver]; if (callback != address(0)) IClaimCallback(callback).claimCallback(claimant, amount); } emit Claimed(claimant, receiver, index, amount * lockToTokenRatio); } /** @notice Set a claim callback contract @dev When set, claims directed to the caller trigger a callback to this address */ function setClaimCallback(address _callback) external returns (bool) { claimCallback[msg.sender] = _callback; return true; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-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; interface ITokenLocker { struct LockData { uint256 amount; uint256 weeksToUnlock; } struct ExtendLockData { uint256 amount; uint256 currentWeeks; uint256 newWeeks; } event LockCreated(address indexed account, uint256 amount, uint256 _weeks); event LockExtended(address indexed account, uint256 amount, uint256 _weeks, uint256 newWeeks); event LocksCreated(address indexed account, LockData[] newLocks); event LocksExtended(address indexed account, ExtendLockData[] locks); event LocksFrozen(address indexed account, uint256 amount); event LocksUnfrozen(address indexed account, uint256 amount); event LocksWithdrawn(address indexed account, uint256 withdrawn, uint256 penalty); function extendLock(uint256 _amount, uint256 _weeks, uint256 _newWeeks) external returns (bool); function extendMany(ExtendLockData[] calldata newExtendLocks) external returns (bool); function freeze() external; function getAccountWeightWrite(address account) external returns (uint256); function getTotalWeightWrite() external returns (uint256); function lock(address _account, uint256 _amount, uint256 _weeks) external returns (bool); function lockMany(address _account, LockData[] calldata newLocks) external returns (bool); function setPenaltyWithdrawalsEnabled(bool _enabled) external returns (bool); function unfreeze(bool keepIncentivesVote) external; function withdrawExpiredLocks(uint256 _weeks) external returns (bool); function withdrawWithPenalty(uint256 amountToWithdraw) external returns (uint256); function MAX_LOCK_WEEKS() external view returns (uint256); function PRISMA_CORE() external view returns (address); function getAccountActiveLocks( address account, uint256 minWeeks ) external view returns (LockData[] memory lockData, uint256 frozenAmount); function getAccountBalances(address account) external view returns (uint256 locked, uint256 unlocked); function getAccountWeight(address account) external view returns (uint256); function getAccountWeightAt(address account, uint256 week) external view returns (uint256); function getTotalWeight() external view returns (uint256); function getTotalWeightAt(uint256 week) external view returns (uint256); function getWeek() external view returns (uint256 week); function getWithdrawWithPenaltyAmounts( address account, uint256 amountToWithdraw ) external view returns (uint256 amountWithdrawn, uint256 penaltyAmountPaid); function guardian() external view returns (address); function incentiveVoter() external view returns (address); function lockToTokenRatio() external view returns (uint256); function lockToken() external view returns (address); function owner() external view returns (address); function penaltyWithdrawalsEnabled() external view returns (bool); function prismaCore() external view returns (address); function totalDecayRate() external view returns (uint32); function totalUpdatedWeek() external view returns (uint16); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IPrismaVault { struct InitialAllowance { address receiver; uint256 amount; } event BoostCalculatorSet(address boostCalculator); event BoostDelegationSet(address indexed boostDelegate, bool isEnabled, uint256 feePct, address callback); event EmissionScheduleSet(address emissionScheduler); event IncreasedAllocation(address indexed receiver, uint256 increasedAmount); event NewReceiverRegistered(address receiver, uint256 id); event ReceiverIsActiveStatusModified(uint256 indexed id, bool isActive); event UnallocatedSupplyIncreased(uint256 increasedAmount, uint256 unallocatedTotal); event UnallocatedSupplyReduced(uint256 reducedAmount, uint256 unallocatedTotal); function allocateNewEmissions(uint256 id) external returns (uint256); function batchClaimRewards( address receiver, address boostDelegate, address[] calldata rewardContracts, uint256 maxFeePct ) external returns (bool); function increaseUnallocatedSupply(uint256 amount) external returns (bool); function registerReceiver(address receiver, uint256 count) external returns (bool); function setBoostCalculator(address _boostCalculator) external returns (bool); function setBoostDelegationParams(bool isEnabled, uint256 feePct, address callback) external returns (bool); function setEmissionSchedule(address _emissionSchedule) external returns (bool); function setInitialParameters( address _emissionSchedule, address _boostCalculator, uint256 totalSupply, uint64 initialLockWeeks, uint128[] calldata _fixedInitialAmounts, InitialAllowance[] calldata initialAllowances ) external; function setReceiverIsActive(uint256 id, bool isActive) external returns (bool); function transferAllocatedTokens(address claimant, address receiver, uint256 amount) external returns (bool); function transferTokens(address token, address receiver, uint256 amount) external returns (bool); function PRISMA_CORE() external view returns (address); function allocated(address) external view returns (uint256); function boostCalculator() external view returns (address); function boostDelegation(address) external view returns (bool isEnabled, uint16 feePct, address callback); function claimableRewardAfterBoost( address account, address receiver, address boostDelegate, address rewardContract ) external view returns (uint256 adjustedAmount, uint256 feeToDelegate); function emissionSchedule() external view returns (address); function getClaimableWithBoost(address claimant) external view returns (uint256 maxBoosted, uint256 boosted); function getWeek() external view returns (uint256 week); function guardian() external view returns (address); function idToReceiver(uint256) external view returns (address account, bool isActive); function lockWeeks() external view returns (uint64); function locker() external view returns (address); function owner() external view returns (address); function claimableBoostDelegationFees(address claimant) external view returns (uint256 amount); function prismaToken() external view returns (address); function receiverUpdatedWeek(uint256) external view returns (uint16); function totalUpdateWeek() external view returns (uint64); function unallocatedTotal() external view returns (uint128); function voter() external view returns (address); function weeklyEmissions(uint256) external view returns (uint128); }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "AirdropDistributor.sol": {} }, "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":"contract ITokenLocker","name":"_locker","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"lockWeeks","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"canClaimUntil","type":"uint256"}],"name":"MerkleRootSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"CLAIM_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canClaimUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"claimCallback","outputs":[{"internalType":"address","name":"callback","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locker","outputs":[{"internalType":"contract ITokenLocker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_callback","type":"address"}],"name":"setClaimCallback","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sweepUnclaimedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101206040523480156200001257600080fd5b50604051620012753803806200127583398101604081905262000035916200013b565b6200004033620000d2565b6001600160a01b0380851660805283811660a081905290831660c0526101008290526040805163c5438b1b60e01b8152905163c5438b1b916004808201926020929091908290030181865afa1580156200009e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c4919062000195565b60e05250620001af92505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200013857600080fd5b50565b600080600080608085870312156200015257600080fd5b84516200015f8162000122565b6020860151909450620001728162000122565b6040860151909350620001858162000122565b6060959095015193969295505050565b600060208284031215620001a857600080fd5b5051919050565b60805160a05160c05160e05161010051611034620002416000396000610ad6015260008181610a120152610c50015260008181610247015281816103410152818161043b015281816104f5015281816105a801526109ed0152600081816101fa0152610afc01526000818161026e01528181610372015281816104700152818161052401526109c601526110346000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063a7511f1411610097578063fa46d7ac11610066578063fa46d7ac1461022f578063fbfa77cf14610242578063fc0c546a14610269578063ff844a631461029057600080fd5b8063a7511f14146101ac578063ba1ef3d1146101ec578063d7b96d4e146101f5578063f2fde38b1461021c57600080fd5b80637cb64759116100d35780637cb64759146101285780638da5cb5b1461013b5780638f4a7182146101605780639e34070f1461018957600080fd5b806324a53201146100fa5780632eb4a7ab14610104578063715018a614610120575b600080fd5b61010261029a565b005b61010d60015481565b6040519081526020015b60405180910390f35b610102610621565b610102610136366004610e16565b610635565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610117565b61014861016e366004610e4b565b6004602052600090815260409020546001600160a01b031681565b61019c610197366004610e16565b6106da565b6040519015158152602001610117565b61019c6101ba366004610e4b565b33600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055600190565b61010d60025481565b6101487f000000000000000000000000000000000000000000000000000000000000000081565b61010261022a366004610e4b565b61071b565b61010261023d366004610e66565b610794565b6101487f000000000000000000000000000000000000000000000000000000000000000081565b6101487f000000000000000000000000000000000000000000000000000000000000000081565b61010d6277f88081565b6001546102e35760405162461bcd60e51b81526020600482015260126024820152711b595c9adb19549bdbdd081b9bdd081cd95d60721b60448201526064015b60405180910390fd5b600254421161032a5760405162461bcd60e51b8152602060048201526013602482015272436c61696d73207374696c6c2061637469766560681b60448201526064016102da565b604051636eb1769f60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301523060248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e90604401602060405180830381865afa1580156103bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103df9190610f0f565b9050600081116104245760405162461bcd60e51b815260206004820152601060248201526f04e6f7468696e6720746f2073776565760841b60448201526064016102da565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303816000875af11580156104b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dd9190610f28565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af115801561056d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105919190610f28565b506040516309ec4ecf60e21b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906327b13b3c906024016020604051808303816000875af11580156105f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061d9190610f28565b5050565b610629610c96565b6106336000610cf0565b565b61063d610c96565b600154156106865760405162461bcd60e51b81526020600482015260166024820152751b595c9adb19549bdbdd08185b1c9958591e481cd95d60521b60448201526064016102da565b60018190556106986277f88042610f67565b60028190556040805183815260208101929092527fc34c51f14a1ba51ad7984f0e9ce0ef7a0e18364f76ba670ee057653f719d9a69910160405180910390a150565b6000806106e961010084610f90565b905060006106f961010085610fa4565b60009283526003602052604090922054600190921b9182169091149392505050565b610723610c96565b6001600160a01b0381166107885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102da565b61079181610cf0565b50565b336001600160a01b03871614610841576000546001600160a01b031633146107ea5760405162461bcd60e51b815260206004820152600960248201526837b7363ca7bbb732b960b91b60448201526064016102da565b6001600160a01b0386163b6108415760405162461bcd60e51b815260206004820152601b60248201527f436c61696d616e74206d757374206265206120636f6e7472616374000000000060448201526064016102da565b6001546108855760405162461bcd60e51b81526020600482015260126024820152711b595c9adb19549bdbdd081b9bdd081cd95d60721b60448201526064016102da565b60025442106108d65760405162461bcd60e51b815260206004820152601a60248201527f436c61696d7320706572696f64206861732066696e697368656400000000000060448201526064016102da565b6108df846106da565b1561091e5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016102da565b60408051602081018690526bffffffffffffffffffffffff19606089901b169181019190915260548101849052600090607401604051602081830303815290604052805190602001209050610977838360015484610d40565b6109b35760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016102da565b6109bc85610d58565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166323b872dd7f000000000000000000000000000000000000000000000000000000000000000030610a377f000000000000000000000000000000000000000000000000000000000000000089610fb8565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf9190610f28565b5060405163e2ab691d60e01b81526001600160a01b038781166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000060448301527f0000000000000000000000000000000000000000000000000000000000000000169063e2ab691d906064016020604051808303816000875af1158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b699190610f28565b50856001600160a01b0316876001600160a01b031614610c1b576001600160a01b03808716600090815260046020526040902054168015610c1957604051631367af1d60e21b81526001600160a01b03898116600483015260248201879052821690634d9ebc74906044016020604051808303816000875af1158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c179190610f28565b505b505b6001600160a01b038087169088167f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e6887610c757f000000000000000000000000000000000000000000000000000000000000000089610fb8565b6040805192835260208301919091520160405180910390a350505050505050565b6000546001600160a01b031633146106335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082610d4e868685610d96565b1495945050505050565b6000610d6661010083610f90565b90506000610d7661010084610fa4565b6000928352600360205260409092208054600190931b9092179091555050565b600081815b84811015610dd957610dc582878784818110610db957610db9610fcf565b90506020020135610de2565b915080610dd181610fe5565b915050610d9b565b50949350505050565b6000818310610dfe576000828152602084905260409020610e0d565b60008381526020839052604090205b90505b92915050565b600060208284031215610e2857600080fd5b5035919050565b80356001600160a01b0381168114610e4657600080fd5b919050565b600060208284031215610e5d57600080fd5b610e0d82610e2f565b60008060008060008060a08789031215610e7f57600080fd5b610e8887610e2f565b9550610e9660208801610e2f565b94506040870135935060608701359250608087013567ffffffffffffffff80821115610ec157600080fd5b818901915089601f830112610ed557600080fd5b813581811115610ee457600080fd5b8a60208260051b8501011115610ef957600080fd5b6020830194508093505050509295509295509295565b600060208284031215610f2157600080fd5b5051919050565b600060208284031215610f3a57600080fd5b81518015158114610f4a57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e1057610e10610f51565b634e487b7160e01b600052601260045260246000fd5b600082610f9f57610f9f610f7a565b500490565b600082610fb357610fb3610f7a565b500690565b8082028115828204841417610e1057610e10610f51565b634e487b7160e01b600052603260045260246000fd5b600060018201610ff757610ff7610f51565b506001019056fea26469706673582212206751d009072a3b891ed97ff0e02678736c88998d846af70541a500f32d8c6bb564736f6c63430008130033000000000000000000000000da47862a83dac0c112ba89c6abc2159b95afd71c0000000000000000000000003f78544364c3eccdce4d9c89a630aea26122829d00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c0000000000000000000000000000000000000000000000000000000000000034
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063a7511f1411610097578063fa46d7ac11610066578063fa46d7ac1461022f578063fbfa77cf14610242578063fc0c546a14610269578063ff844a631461029057600080fd5b8063a7511f14146101ac578063ba1ef3d1146101ec578063d7b96d4e146101f5578063f2fde38b1461021c57600080fd5b80637cb64759116100d35780637cb64759146101285780638da5cb5b1461013b5780638f4a7182146101605780639e34070f1461018957600080fd5b806324a53201146100fa5780632eb4a7ab14610104578063715018a614610120575b600080fd5b61010261029a565b005b61010d60015481565b6040519081526020015b60405180910390f35b610102610621565b610102610136366004610e16565b610635565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610117565b61014861016e366004610e4b565b6004602052600090815260409020546001600160a01b031681565b61019c610197366004610e16565b6106da565b6040519015158152602001610117565b61019c6101ba366004610e4b565b33600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055600190565b61010d60025481565b6101487f0000000000000000000000003f78544364c3eccdce4d9c89a630aea26122829d81565b61010261022a366004610e4b565b61071b565b61010261023d366004610e66565b610794565b6101487f00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c81565b6101487f000000000000000000000000da47862a83dac0c112ba89c6abc2159b95afd71c81565b61010d6277f88081565b6001546102e35760405162461bcd60e51b81526020600482015260126024820152711b595c9adb19549bdbdd081b9bdd081cd95d60721b60448201526064015b60405180910390fd5b600254421161032a5760405162461bcd60e51b8152602060048201526013602482015272436c61696d73207374696c6c2061637469766560681b60448201526064016102da565b604051636eb1769f60e11b81526001600160a01b037f00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c811660048301523060248301526000917f000000000000000000000000da47862a83dac0c112ba89c6abc2159b95afd71c9091169063dd62ed3e90604401602060405180830381865afa1580156103bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103df9190610f0f565b9050600081116104245760405162461bcd60e51b815260206004820152601060248201526f04e6f7468696e6720746f2073776565760841b60448201526064016102da565b6040516323b872dd60e01b81526001600160a01b037f00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c81166004830152306024830152604482018390527f000000000000000000000000da47862a83dac0c112ba89c6abc2159b95afd71c16906323b872dd906064016020604051808303816000875af11580156104b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dd9190610f28565b5060405163095ea7b360e01b81526001600160a01b037f00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c81166004830152602482018390527f000000000000000000000000da47862a83dac0c112ba89c6abc2159b95afd71c169063095ea7b3906044016020604051808303816000875af115801561056d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105919190610f28565b506040516309ec4ecf60e21b8152600481018290527f00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c6001600160a01b0316906327b13b3c906024016020604051808303816000875af11580156105f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061d9190610f28565b5050565b610629610c96565b6106336000610cf0565b565b61063d610c96565b600154156106865760405162461bcd60e51b81526020600482015260166024820152751b595c9adb19549bdbdd08185b1c9958591e481cd95d60521b60448201526064016102da565b60018190556106986277f88042610f67565b60028190556040805183815260208101929092527fc34c51f14a1ba51ad7984f0e9ce0ef7a0e18364f76ba670ee057653f719d9a69910160405180910390a150565b6000806106e961010084610f90565b905060006106f961010085610fa4565b60009283526003602052604090922054600190921b9182169091149392505050565b610723610c96565b6001600160a01b0381166107885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102da565b61079181610cf0565b50565b336001600160a01b03871614610841576000546001600160a01b031633146107ea5760405162461bcd60e51b815260206004820152600960248201526837b7363ca7bbb732b960b91b60448201526064016102da565b6001600160a01b0386163b6108415760405162461bcd60e51b815260206004820152601b60248201527f436c61696d616e74206d757374206265206120636f6e7472616374000000000060448201526064016102da565b6001546108855760405162461bcd60e51b81526020600482015260126024820152711b595c9adb19549bdbdd081b9bdd081cd95d60721b60448201526064016102da565b60025442106108d65760405162461bcd60e51b815260206004820152601a60248201527f436c61696d7320706572696f64206861732066696e697368656400000000000060448201526064016102da565b6108df846106da565b1561091e5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016102da565b60408051602081018690526bffffffffffffffffffffffff19606089901b169181019190915260548101849052600090607401604051602081830303815290604052805190602001209050610977838360015484610d40565b6109b35760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016102da565b6109bc85610d58565b6001600160a01b037f000000000000000000000000da47862a83dac0c112ba89c6abc2159b95afd71c166323b872dd7f00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c30610a377f0000000000000000000000000000000000000000000000000de0b6b3a764000089610fb8565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf9190610f28565b5060405163e2ab691d60e01b81526001600160a01b038781166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000003460448301527f0000000000000000000000003f78544364c3eccdce4d9c89a630aea26122829d169063e2ab691d906064016020604051808303816000875af1158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b699190610f28565b50856001600160a01b0316876001600160a01b031614610c1b576001600160a01b03808716600090815260046020526040902054168015610c1957604051631367af1d60e21b81526001600160a01b03898116600483015260248201879052821690634d9ebc74906044016020604051808303816000875af1158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c179190610f28565b505b505b6001600160a01b038087169088167f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e6887610c757f0000000000000000000000000000000000000000000000000de0b6b3a764000089610fb8565b6040805192835260208301919091520160405180910390a350505050505050565b6000546001600160a01b031633146106335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082610d4e868685610d96565b1495945050505050565b6000610d6661010083610f90565b90506000610d7661010084610fa4565b6000928352600360205260409092208054600190931b9092179091555050565b600081815b84811015610dd957610dc582878784818110610db957610db9610fcf565b90506020020135610de2565b915080610dd181610fe5565b915050610d9b565b50949350505050565b6000818310610dfe576000828152602084905260409020610e0d565b60008381526020839052604090205b90505b92915050565b600060208284031215610e2857600080fd5b5035919050565b80356001600160a01b0381168114610e4657600080fd5b919050565b600060208284031215610e5d57600080fd5b610e0d82610e2f565b60008060008060008060a08789031215610e7f57600080fd5b610e8887610e2f565b9550610e9660208801610e2f565b94506040870135935060608701359250608087013567ffffffffffffffff80821115610ec157600080fd5b818901915089601f830112610ed557600080fd5b813581811115610ee457600080fd5b8a60208260051b8501011115610ef957600080fd5b6020830194508093505050509295509295509295565b600060208284031215610f2157600080fd5b5051919050565b600060208284031215610f3a57600080fd5b81518015158114610f4a57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e1057610e10610f51565b634e487b7160e01b600052601260045260246000fd5b600082610f9f57610f9f610f7a565b500490565b600082610fb357610fb3610f7a565b500690565b8082028115828204841417610e1057610e10610f51565b634e487b7160e01b600052603260045260246000fd5b600060018201610ff757610ff7610f51565b506001019056fea26469706673582212206751d009072a3b891ed97ff0e02678736c88998d846af70541a500f32d8c6bb564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000da47862a83dac0c112ba89c6abc2159b95afd71c0000000000000000000000003f78544364c3eccdce4d9c89a630aea26122829d00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c0000000000000000000000000000000000000000000000000000000000000034
-----Decoded View---------------
Arg [0] : _token (address): 0xdA47862a83dac0c112BA89c6abC2159b95afd71C
Arg [1] : _locker (address): 0x3f78544364c3eCcDCe4d9C89a630AEa26122829d
Arg [2] : _vault (address): 0x06bDF212C290473dCACea9793890C5024c7Eb02c
Arg [3] : lockWeeks (uint256): 52
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000da47862a83dac0c112ba89c6abc2159b95afd71c
Arg [1] : 0000000000000000000000003f78544364c3eccdce4d9c89a630aea26122829d
Arg [2] : 00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000034
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.