Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,410 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 12156601 | 1214 days ago | IN | 0 ETH | 0.00420582 | ||||
Claim | 11766068 | 1274 days ago | IN | 0 ETH | 0.00714105 | ||||
Claim | 11764136 | 1274 days ago | IN | 0 ETH | 0.0092753 | ||||
Claim | 11764066 | 1274 days ago | IN | 0 ETH | 0.01048493 | ||||
Claim | 11763979 | 1274 days ago | IN | 0 ETH | 0.00621632 | ||||
Claim | 11763971 | 1274 days ago | IN | 0 ETH | 0.00649565 | ||||
Claim | 11763870 | 1274 days ago | IN | 0 ETH | 0.00827424 | ||||
Claim | 11762829 | 1275 days ago | IN | 0 ETH | 0.00899568 | ||||
Claim | 11762700 | 1275 days ago | IN | 0 ETH | 0.0090892 | ||||
Claim | 11761800 | 1275 days ago | IN | 0 ETH | 0.01604488 | ||||
Claim | 11761763 | 1275 days ago | IN | 0 ETH | 0.00936825 | ||||
Claim | 11761389 | 1275 days ago | IN | 0 ETH | 0.01183655 | ||||
Claim | 11761040 | 1275 days ago | IN | 0 ETH | 0.00933324 | ||||
Claim | 11760810 | 1275 days ago | IN | 0 ETH | 0.00649369 | ||||
Claim | 11760773 | 1275 days ago | IN | 0 ETH | 0.00741944 | ||||
Claim | 11760750 | 1275 days ago | IN | 0 ETH | 0.00946631 | ||||
Claim | 11760674 | 1275 days ago | IN | 0 ETH | 0.0161751 | ||||
Claim | 11760571 | 1275 days ago | IN | 0 ETH | 0.00732685 | ||||
Claim | 11759578 | 1275 days ago | IN | 0 ETH | 0.00862435 | ||||
Claim | 11759559 | 1275 days ago | IN | 0 ETH | 0.00992499 | ||||
Claim | 11759503 | 1275 days ago | IN | 0 ETH | 0.01391475 | ||||
Claim | 11759503 | 1275 days ago | IN | 0 ETH | 0.01391595 | ||||
Claim | 11759498 | 1275 days ago | IN | 0 ETH | 0.01391445 | ||||
Claim | 11759353 | 1275 days ago | IN | 0 ETH | 0.01530556 | ||||
Claim | 11758443 | 1275 days ago | IN | 0 ETH | 0.01623247 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BadgerHunt
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-20 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; // Part: IERC20Upgradeable /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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 ); } // Part: IMerkleDistributor // Allows anyone to claim a token if they exist in a merkle root. interface IMerkleDistributor { // Returns true if the index has been marked claimed. function isClaimed(uint256 index) external view returns (bool); // Claim the given amount of the token to the given address. Reverts if the inputs are invalid. function claim( uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof ) external; // This event is triggered whenever a call to #claim succeeds. event Claimed(uint256 index, address account, uint256 amount); } // Part: Initializable /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require( _initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized" ); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; // solhint-disable-next-line no-inline-assembly assembly { cs := extcodesize(self) } return cs == 0; } } // Part: MerkleProofUpgradeable /** * @dev These functions deal with verification of Merkle trees (hash trees), */ library MerkleProofUpgradeable { /** * @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; } } // Part: SafeMathUpgradeable /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Part: ContextUpgradeable /* * @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 GSN 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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} function _msgSender() internal virtual view returns (address payable) { return msg.sender; } function _msgData() internal virtual view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // Part: MerkleDistributor contract MerkleDistributor is Initializable, IMerkleDistributor { address public token; bytes32 public merkleRoot; // This is a packed array of booleans. mapping(uint256 => uint256) internal claimedBitMap; function __MerkleDistributor_init(address token_, bytes32 merkleRoot_) public initializer { token = token_; merkleRoot = merkleRoot_; } function isClaimed(uint256 index) public override 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) internal { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; claimedBitMap[claimedWordIndex] = claimedBitMap[claimedWordIndex] | (1 << claimedBitIndex); } function claim( uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof ) external virtual override { require(!isClaimed(index), "MerkleDistributor: Drop already claimed."); // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(index, account, amount)); require( MerkleProofUpgradeable.verify(merkleProof, merkleRoot, node), "MerkleDistributor: Invalid proof." ); // Mark it claimed and send the token. _setClaimed(index); require( IERC20Upgradeable(token).transfer(account, amount), "MerkleDistributor: Transfer failed." ); emit Claimed(index, account, amount); } } // Part: OwnableUpgradeable /** * @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. */ contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File: BadgerHunt.sol contract BadgerHunt is MerkleDistributor, OwnableUpgradeable { using SafeMathUpgradeable for uint256; uint256 public constant MAX_BPS = 10000; uint256 public claimsStart; uint256 public gracePeriod; uint256 public epochDuration; uint256 public rewardReductionPerEpoch; uint256 public currentRewardRate; uint256 public finalEpoch; address public rewardsEscrow; event Hunt( uint256 index, address indexed account, uint256 amount, uint256 userClaim, uint256 rewardsEscrowClaim ); function initialize( address token_, bytes32 merkleRoot_, uint256 epochDuration_, uint256 rewardReductionPerEpoch_, uint256 claimsStart_, uint256 gracePeriod_, address rewardsEscrow_, address owner_ ) public initializer { __MerkleDistributor_init(token_, merkleRoot_); __Ownable_init(); transferOwnership(owner_); epochDuration = epochDuration_; rewardReductionPerEpoch = rewardReductionPerEpoch_; claimsStart = claimsStart_; gracePeriod = gracePeriod_; rewardsEscrow = rewardsEscrow_; currentRewardRate = 10000; finalEpoch = (currentRewardRate / rewardReductionPerEpoch_) - 1; } /// ===== View Functions ===== /// @dev Get grace period end timestamp function getGracePeriodEnd() public view returns (uint256) { return claimsStart.add(gracePeriod); } /// @dev Get claims start timestamp function getClaimsStartTime() public view returns (uint256) { return claimsStart; } /// @dev Get the next epoch start function getNextEpochStart() public view returns (uint256) { uint256 epoch = getCurrentEpoch(); if (epoch == 0) { return getGracePeriodEnd(); } else { return getGracePeriodEnd().add(epochDuration.mul(epoch)); } } function getTimeUntilNextEpoch() public view returns (uint256) { uint256 epoch = getCurrentEpoch(); if (epoch == 0) { return getGracePeriodEnd().sub(now); } else { return (getGracePeriodEnd().add(epochDuration.mul(epoch))).sub(now); } } /// @dev Get the current epoch number function getCurrentEpoch() public view returns (uint256) { uint256 gracePeriodEnd = claimsStart.add(gracePeriod); if (now < gracePeriodEnd) { return 0; } uint256 secondsPastGracePeriod = now.sub(gracePeriodEnd); return (secondsPastGracePeriod / epochDuration).add(1); } /// @dev Get the rewards % of current epoch function getCurrentRewardsRate() public view returns (uint256) { uint256 epoch = getCurrentEpoch(); if (epoch == 0) return MAX_BPS; if (epoch > finalEpoch) return 0; else return MAX_BPS.sub(epoch.mul(rewardReductionPerEpoch)); } /// @dev Get the rewards % of following epoch function getNextEpochRewardsRate() public view returns (uint256) { uint256 epoch = getCurrentEpoch().add(1); if (epoch == 0) return MAX_BPS; if (epoch > finalEpoch) return 0; else return MAX_BPS.sub(epoch.mul(rewardReductionPerEpoch)); } /// ===== Public Actions ===== function claim( uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof ) external virtual override { require(now >= claimsStart, "BadgerDistributor: Before claim start."); require( account == msg.sender, "BadgerDistributor: Can only claim for own account." ); require( getCurrentRewardsRate() > 0, "BadgerDistributor: Past rewards claim period." ); require(!isClaimed(index), "BadgerDistributor: Drop already claimed."); // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(index, account, amount)); require( MerkleProofUpgradeable.verify(merkleProof, merkleRoot, node), "BadgerDistributor: Invalid proof." ); // Mark it claimed and send the token. _setClaimed(index); require(getCurrentRewardsRate() <= MAX_BPS, "Excessive Rewards Rate"); uint256 claimable = amount.mul(getCurrentRewardsRate()).div(MAX_BPS); require( IERC20Upgradeable(token).transfer(account, claimable), "Transfer to user failed." ); emit Hunt(index, account, amount, claimable, amount.sub(claimable)); } /// ===== Gated Actions: Owner ===== /// @notice After hunt is complete, transfer excess funds to rewardsEscrow function recycleExcess() external onlyOwner { require( getCurrentRewardsRate() == 0 && getCurrentEpoch() > finalEpoch, "Hunt period not finished" ); uint256 remainingBalance = IERC20Upgradeable(token).balanceOf( address(this) ); IERC20Upgradeable(token).transfer(rewardsEscrow, remainingBalance); } function setGracePeriod(uint256 duration) external onlyOwner { gracePeriod = duration; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userClaim","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsEscrowClaim","type":"uint256"}],"name":"Hunt","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":"MAX_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"__MerkleDistributor_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimsStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimsStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRewardsRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGracePeriodEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextEpochRewardsRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextEpochStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeUntilNextEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"epochDuration_","type":"uint256"},{"internalType":"uint256","name":"rewardReductionPerEpoch_","type":"uint256"},{"internalType":"uint256","name":"claimsStart_","type":"uint256"},{"internalType":"uint256","name":"gracePeriod_","type":"uint256"},{"internalType":"address","name":"rewardsEscrow_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"recycleExcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardReductionPerEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsEscrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setGracePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611612806100206000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80639e34070f116100de578063f215793211610097578063f51ace7011610071578063f51ace70146103c4578063f9f1f302146103cc578063fc0c546a146103d4578063fd967f47146103dc5761018e565b8063f215793214610379578063f2f6596014610381578063f2fde38b1461039e5761018e565b80639e34070f146103205780639f2e7b1914610351578063a06db7dc14610359578063b97dd9e214610361578063be084c7714610369578063e58e230a146103715761018e565b8063601839ae1161014b578063829eb92c11610125578063829eb92c146102e45780638d0f7e11146102ec5780638da5cb5b146102f457806396d857c5146103185761018e565b8063601839ae146102a857806365c5f94a146102d4578063715018a6146102dc5761018e565b806306f46166146101935780632e7ba6ef146101ad5780632eb4a7ab1461023b5780633a98d88e146102435780634ff0876a1461024b5780635a857e5814610253575b600080fd5b61019b6103e4565b60408051918252519081900360200190f35b610239600480360360808110156101c357600080fd5b8135916001600160a01b0360208201351691604082013591908101906080810160608201356401000000008111156101fa57600080fd5b82018360208201111561020c57600080fd5b8035906020019184602083028401116401000000008311171561022e57600080fd5b50909250905061043d565b005b61019b6107e4565b61019b6107ea565b61019b6107f0565b610239600480360361010081101561026a57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359160808201359160a08101359160c082013581169160e00135166107f6565b610239600480360360408110156102be57600080fd5b506001600160a01b038135169060200135610903565b61019b6109ce565b6102396109f9565b61019b610a9b565b61019b610aa1565b6102fc610af8565b604080516001600160a01b039092168252519081900360200190f35b61019b610b07565b61033d6004803603602081101561033657600080fd5b5035610b0d565b604080519115158252519081900360200190f35b61019b610b33565b61019b610b39565b61019b610b3f565b61019b610b99565b61019b610ba4565b6102fc610bc2565b6102396004803603602081101561039757600080fd5b5035610bd1565b610239600480360360208110156103b457600080fd5b50356001600160a01b0316610c2e565b61019b610d27565b610239610d2d565b6102fc610efd565b61019b610f12565b6000806103ef610b3f565b9050806104105761040842610402610ba4565b90610f18565b91505061043a565b6104084261040261042c84606954610f6390919063ffffffff16565b610434610ba4565b90610fbc565b90565b60675442101561047e5760405162461bcd60e51b81526004018080602001828103825260268152602001806115b76026913960400191505060405180910390fd5b6001600160a01b03841633146104c55760405162461bcd60e51b815260040180806020018281038252603281526020018061147a6032913960400191505060405180910390fd5b60006104cf610b99565b1161050b5760405162461bcd60e51b815260040180806020018281038252602d81526020018061151b602d913960400191505060405180910390fd5b61051485610b0d565b156105505760405162461bcd60e51b81526004018080602001828103825260288152602001806114f36028913960400191505060405180910390fd5b600085858560405160200180848152602001836001600160a01b031660601b815260140182815260200193505050506040516020818303038152906040528051906020012090506105d8838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506001549150849050611016565b6106135760405162461bcd60e51b81526004018080602001828103825260218152602001806114d26021913960400191505060405180910390fd5b61061c866110bf565b612710610627610b99565b1115610673576040805162461bcd60e51b81526020600482015260166024820152754578636573736976652052657761726473205261746560501b604482015290519081900360640190fd5b600061069361271061068d610686610b99565b8890610f63565b906110e6565b9050600060029054906101000a90046001600160a01b03166001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561070157600080fd5b505af1158015610715573d6000803e3d6000fd5b505050506040513d602081101561072b57600080fd5b505161077e576040805162461bcd60e51b815260206004820152601860248201527f5472616e7366657220746f2075736572206661696c65642e0000000000000000604482015290519081900360640190fd5b6001600160a01b0386167f8eaf15614908a4e9022141fe4a596b1ab0cb72ab32b25023e3da2a459c9a335c8887846107b68282610f18565b604080519485526020850193909352838301919091526060830152519081900360800190a250505050505050565b60015481565b606c5481565b60695481565b600054610100900460ff168061080f575061080f611128565b8061081d575060005460ff16155b6108585760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff16158015610883576000805460ff1961ff0019909116610100171660011790555b61088d8989610903565b61089561112e565b61089e82610c2e565b6069879055606a86905560678590556068849055606d80546001600160a01b0319166001600160a01b038516179055612710606b8190556001908790816108e157fe5b0403606c5580156108f8576000805461ff00191690555b505050505050505050565b600054610100900460ff168061091c575061091c611128565b8061092a575060005460ff16155b6109655760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff16158015610990576000805460ff1961ff0019909116610100171660011790555b6000805462010000600160b01b031916620100006001600160a01b03861602179055600182905580156109c9576000805461ff00191690555b505050565b6000806109d9610b3f565b9050806109e857610408610ba4565b6069546104089061042c9083610f63565b610a016111e0565b6035546001600160a01b03908116911614610a51576040805162461bcd60e51b81526020600482018190526024820152600080516020611597833981519152604482015290519081900360640190fd5b6035546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603580546001600160a01b0319169055565b60675481565b600080610ab16001610434610b3f565b905080610ac35761271091505061043a565b606c54811115610ad757600091505061043a565b610408610aef606a5483610f6390919063ffffffff16565b61271090610f18565b6035546001600160a01b031690565b60675490565b6101008104600090815260026020526040902054600160ff9092169190911b9081161490565b606a5481565b60685481565b600080610b59606854606754610fbc90919063ffffffff16565b905080421015610b6d57600091505061043a565b6000610b794283610f18565b9050610b9260016069548381610b8b57fe5b0490610fbc565b9250505090565b600080610ab1610b3f565b6000610bbd606854606754610fbc90919063ffffffff16565b905090565b606d546001600160a01b031681565b610bd96111e0565b6035546001600160a01b03908116911614610c29576040805162461bcd60e51b81526020600482018190526024820152600080516020611597833981519152604482015290519081900360640190fd5b606855565b610c366111e0565b6035546001600160a01b03908116911614610c86576040805162461bcd60e51b81526020600482018190526024820152600080516020611597833981519152604482015290519081900360640190fd5b6001600160a01b038116610ccb5760405162461bcd60e51b81526004018080602001828103825260268152602001806114ac6026913960400191505060405180910390fd5b6035546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603580546001600160a01b0319166001600160a01b0392909216919091179055565b606b5481565b610d356111e0565b6035546001600160a01b03908116911614610d85576040805162461bcd60e51b81526020600482018190526024820152600080516020611597833981519152604482015290519081900360640190fd5b610d8d610b99565b158015610da25750606c54610da0610b3f565b115b610df3576040805162461bcd60e51b815260206004820152601860248201527f48756e7420706572696f64206e6f742066696e69736865640000000000000000604482015290519081900360640190fd5b60008054604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015610e4457600080fd5b505afa158015610e58573d6000803e3d6000fd5b505050506040513d6020811015610e6e57600080fd5b505160008054606d546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101869052905194955062010000909204169263a9059cbb92604480840193602093929083900390910190829087803b158015610ed357600080fd5b505af1158015610ee7573d6000803e3d6000fd5b505050506040513d60208110156109c957600080fd5b6000546201000090046001600160a01b031681565b61271081565b6000610f5a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506111e4565b90505b92915050565b600082610f7257506000610f5d565b82820282848281610f7f57fe5b0414610f5a5760405162461bcd60e51b81526004018080602001828103825260218152602001806115766021913960400191505060405180910390fd5b600082820183811015610f5a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081815b85518110156110b457600086828151811061103257fe5b6020026020010151905080831161107957828160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092506110ab565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b5060010161101b565b509092149392505050565b610100810460009081526002602052604090208054600160ff9093169290921b9091179055565b6000610f5a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061127b565b303b1590565b600054610100900460ff16806111475750611147611128565b80611155575060005460ff16155b6111905760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff161580156111bb576000805460ff1961ff0019909116610100171660011790555b6111c36112e0565b6111cb611380565b80156111dd576000805461ff00191690555b50565b3390565b600081848411156112735760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611238578181015183820152602001611220565b50505050905090810190601f1680156112655780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836112ca5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611238578181015183820152602001611220565b5060008385816112d657fe5b0495945050505050565b600054610100900460ff16806112f957506112f9611128565b80611307575060005460ff16155b6113425760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff161580156111cb576000805460ff1961ff00199091166101001716600117905580156111dd576000805461ff001916905550565b600054610100900460ff16806113995750611399611128565b806113a7575060005460ff16155b6113e25760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff1615801561140d576000805460ff1961ff0019909116610100171660011790555b60006114176111e0565b603580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156111dd576000805461ff00191690555056fe4261646765724469737472696275746f723a2043616e206f6e6c7920636c61696d20666f72206f776e206163636f756e742e4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734261646765724469737472696275746f723a20496e76616c69642070726f6f662e4261646765724469737472696275746f723a2044726f7020616c726561647920636c61696d65642e4261646765724469737472696275746f723a2050617374207265776172647320636c61696d20706572696f642e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724261646765724469737472696275746f723a204265666f726520636c61696d2073746172742ea26469706673582212200f7f37301be679af16198797813c41afad34b623d6dcb6dee46e94c54c774a5c64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80639e34070f116100de578063f215793211610097578063f51ace7011610071578063f51ace70146103c4578063f9f1f302146103cc578063fc0c546a146103d4578063fd967f47146103dc5761018e565b8063f215793214610379578063f2f6596014610381578063f2fde38b1461039e5761018e565b80639e34070f146103205780639f2e7b1914610351578063a06db7dc14610359578063b97dd9e214610361578063be084c7714610369578063e58e230a146103715761018e565b8063601839ae1161014b578063829eb92c11610125578063829eb92c146102e45780638d0f7e11146102ec5780638da5cb5b146102f457806396d857c5146103185761018e565b8063601839ae146102a857806365c5f94a146102d4578063715018a6146102dc5761018e565b806306f46166146101935780632e7ba6ef146101ad5780632eb4a7ab1461023b5780633a98d88e146102435780634ff0876a1461024b5780635a857e5814610253575b600080fd5b61019b6103e4565b60408051918252519081900360200190f35b610239600480360360808110156101c357600080fd5b8135916001600160a01b0360208201351691604082013591908101906080810160608201356401000000008111156101fa57600080fd5b82018360208201111561020c57600080fd5b8035906020019184602083028401116401000000008311171561022e57600080fd5b50909250905061043d565b005b61019b6107e4565b61019b6107ea565b61019b6107f0565b610239600480360361010081101561026a57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359160808201359160a08101359160c082013581169160e00135166107f6565b610239600480360360408110156102be57600080fd5b506001600160a01b038135169060200135610903565b61019b6109ce565b6102396109f9565b61019b610a9b565b61019b610aa1565b6102fc610af8565b604080516001600160a01b039092168252519081900360200190f35b61019b610b07565b61033d6004803603602081101561033657600080fd5b5035610b0d565b604080519115158252519081900360200190f35b61019b610b33565b61019b610b39565b61019b610b3f565b61019b610b99565b61019b610ba4565b6102fc610bc2565b6102396004803603602081101561039757600080fd5b5035610bd1565b610239600480360360208110156103b457600080fd5b50356001600160a01b0316610c2e565b61019b610d27565b610239610d2d565b6102fc610efd565b61019b610f12565b6000806103ef610b3f565b9050806104105761040842610402610ba4565b90610f18565b91505061043a565b6104084261040261042c84606954610f6390919063ffffffff16565b610434610ba4565b90610fbc565b90565b60675442101561047e5760405162461bcd60e51b81526004018080602001828103825260268152602001806115b76026913960400191505060405180910390fd5b6001600160a01b03841633146104c55760405162461bcd60e51b815260040180806020018281038252603281526020018061147a6032913960400191505060405180910390fd5b60006104cf610b99565b1161050b5760405162461bcd60e51b815260040180806020018281038252602d81526020018061151b602d913960400191505060405180910390fd5b61051485610b0d565b156105505760405162461bcd60e51b81526004018080602001828103825260288152602001806114f36028913960400191505060405180910390fd5b600085858560405160200180848152602001836001600160a01b031660601b815260140182815260200193505050506040516020818303038152906040528051906020012090506105d8838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506001549150849050611016565b6106135760405162461bcd60e51b81526004018080602001828103825260218152602001806114d26021913960400191505060405180910390fd5b61061c866110bf565b612710610627610b99565b1115610673576040805162461bcd60e51b81526020600482015260166024820152754578636573736976652052657761726473205261746560501b604482015290519081900360640190fd5b600061069361271061068d610686610b99565b8890610f63565b906110e6565b9050600060029054906101000a90046001600160a01b03166001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561070157600080fd5b505af1158015610715573d6000803e3d6000fd5b505050506040513d602081101561072b57600080fd5b505161077e576040805162461bcd60e51b815260206004820152601860248201527f5472616e7366657220746f2075736572206661696c65642e0000000000000000604482015290519081900360640190fd5b6001600160a01b0386167f8eaf15614908a4e9022141fe4a596b1ab0cb72ab32b25023e3da2a459c9a335c8887846107b68282610f18565b604080519485526020850193909352838301919091526060830152519081900360800190a250505050505050565b60015481565b606c5481565b60695481565b600054610100900460ff168061080f575061080f611128565b8061081d575060005460ff16155b6108585760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff16158015610883576000805460ff1961ff0019909116610100171660011790555b61088d8989610903565b61089561112e565b61089e82610c2e565b6069879055606a86905560678590556068849055606d80546001600160a01b0319166001600160a01b038516179055612710606b8190556001908790816108e157fe5b0403606c5580156108f8576000805461ff00191690555b505050505050505050565b600054610100900460ff168061091c575061091c611128565b8061092a575060005460ff16155b6109655760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff16158015610990576000805460ff1961ff0019909116610100171660011790555b6000805462010000600160b01b031916620100006001600160a01b03861602179055600182905580156109c9576000805461ff00191690555b505050565b6000806109d9610b3f565b9050806109e857610408610ba4565b6069546104089061042c9083610f63565b610a016111e0565b6035546001600160a01b03908116911614610a51576040805162461bcd60e51b81526020600482018190526024820152600080516020611597833981519152604482015290519081900360640190fd5b6035546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603580546001600160a01b0319169055565b60675481565b600080610ab16001610434610b3f565b905080610ac35761271091505061043a565b606c54811115610ad757600091505061043a565b610408610aef606a5483610f6390919063ffffffff16565b61271090610f18565b6035546001600160a01b031690565b60675490565b6101008104600090815260026020526040902054600160ff9092169190911b9081161490565b606a5481565b60685481565b600080610b59606854606754610fbc90919063ffffffff16565b905080421015610b6d57600091505061043a565b6000610b794283610f18565b9050610b9260016069548381610b8b57fe5b0490610fbc565b9250505090565b600080610ab1610b3f565b6000610bbd606854606754610fbc90919063ffffffff16565b905090565b606d546001600160a01b031681565b610bd96111e0565b6035546001600160a01b03908116911614610c29576040805162461bcd60e51b81526020600482018190526024820152600080516020611597833981519152604482015290519081900360640190fd5b606855565b610c366111e0565b6035546001600160a01b03908116911614610c86576040805162461bcd60e51b81526020600482018190526024820152600080516020611597833981519152604482015290519081900360640190fd5b6001600160a01b038116610ccb5760405162461bcd60e51b81526004018080602001828103825260268152602001806114ac6026913960400191505060405180910390fd5b6035546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603580546001600160a01b0319166001600160a01b0392909216919091179055565b606b5481565b610d356111e0565b6035546001600160a01b03908116911614610d85576040805162461bcd60e51b81526020600482018190526024820152600080516020611597833981519152604482015290519081900360640190fd5b610d8d610b99565b158015610da25750606c54610da0610b3f565b115b610df3576040805162461bcd60e51b815260206004820152601860248201527f48756e7420706572696f64206e6f742066696e69736865640000000000000000604482015290519081900360640190fd5b60008054604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015610e4457600080fd5b505afa158015610e58573d6000803e3d6000fd5b505050506040513d6020811015610e6e57600080fd5b505160008054606d546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101869052905194955062010000909204169263a9059cbb92604480840193602093929083900390910190829087803b158015610ed357600080fd5b505af1158015610ee7573d6000803e3d6000fd5b505050506040513d60208110156109c957600080fd5b6000546201000090046001600160a01b031681565b61271081565b6000610f5a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506111e4565b90505b92915050565b600082610f7257506000610f5d565b82820282848281610f7f57fe5b0414610f5a5760405162461bcd60e51b81526004018080602001828103825260218152602001806115766021913960400191505060405180910390fd5b600082820183811015610f5a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081815b85518110156110b457600086828151811061103257fe5b6020026020010151905080831161107957828160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092506110ab565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b5060010161101b565b509092149392505050565b610100810460009081526002602052604090208054600160ff9093169290921b9091179055565b6000610f5a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061127b565b303b1590565b600054610100900460ff16806111475750611147611128565b80611155575060005460ff16155b6111905760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff161580156111bb576000805460ff1961ff0019909116610100171660011790555b6111c36112e0565b6111cb611380565b80156111dd576000805461ff00191690555b50565b3390565b600081848411156112735760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611238578181015183820152602001611220565b50505050905090810190601f1680156112655780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836112ca5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611238578181015183820152602001611220565b5060008385816112d657fe5b0495945050505050565b600054610100900460ff16806112f957506112f9611128565b80611307575060005460ff16155b6113425760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff161580156111cb576000805460ff1961ff00199091166101001716600117905580156111dd576000805461ff001916905550565b600054610100900460ff16806113995750611399611128565b806113a7575060005460ff16155b6113e25760405162461bcd60e51b815260040180806020018281038252602e815260200180611548602e913960400191505060405180910390fd5b600054610100900460ff1615801561140d576000805460ff1961ff0019909116610100171660011790555b60006114176111e0565b603580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156111dd576000805461ff00191690555056fe4261646765724469737472696275746f723a2043616e206f6e6c7920636c61696d20666f72206f776e206163636f756e742e4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734261646765724469737472696275746f723a20496e76616c69642070726f6f662e4261646765724469737472696275746f723a2044726f7020616c726561647920636c61696d65642e4261646765724469737472696275746f723a2050617374207265776172647320636c61696d20706572696f642e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724261646765724469737472696275746f723a204265666f726520636c61696d2073746172742ea26469706673582212200f7f37301be679af16198797813c41afad34b623d6dcb6dee46e94c54c774a5c64736f6c634300060c0033
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.