More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 694 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 21684728 | 17 hrs ago | IN | 0 ETH | 0.00095377 | ||||
Withdraw | 21676181 | 46 hrs ago | IN | 0 ETH | 0.0016858 | ||||
Deposit | 21667799 | 3 days ago | IN | 0 ETH | 0.00406312 | ||||
Deposit | 21664409 | 3 days ago | IN | 0 ETH | 0.00598557 | ||||
Claim | 21664024 | 3 days ago | IN | 0 ETH | 0.00343784 | ||||
Claim | 21663105 | 3 days ago | IN | 0 ETH | 0.00174681 | ||||
Claim | 21654429 | 4 days ago | IN | 0 ETH | 0.00083346 | ||||
Deposit | 21650511 | 5 days ago | IN | 0 ETH | 0.00152303 | ||||
Withdraw | 21646193 | 6 days ago | IN | 0 ETH | 0.00112592 | ||||
Claim | 21643257 | 6 days ago | IN | 0 ETH | 0.0005232 | ||||
Deposit | 21635912 | 7 days ago | IN | 0 ETH | 0.00084853 | ||||
Withdraw | 21634657 | 7 days ago | IN | 0 ETH | 0.00040213 | ||||
Claim | 21634313 | 7 days ago | IN | 0 ETH | 0.00028401 | ||||
Claim | 21633781 | 7 days ago | IN | 0 ETH | 0.00008645 | ||||
Claim | 21633706 | 7 days ago | IN | 0 ETH | 0.00008568 | ||||
Claim | 21633696 | 7 days ago | IN | 0 ETH | 0.00009003 | ||||
Deposit | 21621459 | 9 days ago | IN | 0 ETH | 0.00093311 | ||||
Deposit | 21621425 | 9 days ago | IN | 0 ETH | 0.00053156 | ||||
Deposit | 21618806 | 9 days ago | IN | 0 ETH | 0.00036891 | ||||
Claim | 21615934 | 10 days ago | IN | 0 ETH | 0.00097814 | ||||
Claim | 21615915 | 10 days ago | IN | 0 ETH | 0.00083113 | ||||
Withdraw | 21615914 | 10 days ago | IN | 0 ETH | 0.00191998 | ||||
Withdraw | 21615907 | 10 days ago | IN | 0 ETH | 0.00182492 | ||||
Claim | 21615903 | 10 days ago | IN | 0 ETH | 0.00098485 | ||||
Deposit | 21610280 | 11 days ago | IN | 0 ETH | 0.00056005 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LTDStaking
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-09-23 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } } // File: LTDStaking.sol pragma solidity ^0.8.26; // Importing required contracts and interfaces from OpenZeppelin contract LTDStaking is Ownable { using SafeERC20 for IERC20; struct PoolInfo { uint256 rewardPerBlock; uint256 rewardPerShare; } // Maintains user rewards and staked amount struct UserInfo { uint256 amount; mapping(uint256 => uint256) rewardDebt; mapping(uint256 => uint256) pendingRewards; uint256 lastClaimTime; } // Mapping of each users staking info mapping (address => UserInfo) public userInfo; mapping (uint256 => PoolInfo) public poolInfo; // LTD token - stake to earn rewards IERC20 public stakingToken; // Pool info to calculate rewards uint256 public totalStaked; uint256 public totalPools; uint256 public lastRewardBlock; uint256 public claimWaitTime = 30 days; // Used in rewards calculation to prevent truncation uint256 public constant PRECISION = 1e36; // Total supply of the LTD token is 12 decimals, so this will prevent truncation if the total supply is staked event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event Claim(uint256 poolId, address indexed user, uint256 amount); event UpdatePool(uint256 lastRewardBlock, uint256 totalStaked, uint256 accRewardPerShare, uint256 poolId); error EarlyClaim(); // 18 decimals // Ran on deployment to set up the contract. Pass in the LTD token address constructor(IERC20 _stakingToken, uint256[] memory rewardRates) Ownable(msg.sender) { stakingToken = _stakingToken; lastRewardBlock = block.number; for(uint256 i = 0; i < rewardRates.length; i++) { PoolInfo storage pool = poolInfo[i]; pool.rewardPerBlock = rewardRates[i]; totalPools++; } } // Returns the total amount of rewards owed to a user in the current block function pendingRewards(uint256 poolId, address _user) external view returns (uint256 pendingRewards) { UserInfo storage user = userInfo[_user]; uint256 accRewardPerShare = poolInfo[poolId].rewardPerShare; if (totalStaked == 0) { return user.pendingRewards[poolId]; } // Calculate the new reward per share for the current block if needed if (block.number > lastRewardBlock) { uint256 blocks = block.number - lastRewardBlock; uint256 rewards = blocks * poolInfo[poolId].rewardPerBlock; accRewardPerShare = accRewardPerShare + ((rewards * PRECISION) / totalStaked); } // Add any newly accumulated rewards to the users already stored rewards pendingRewards = (((user.amount * accRewardPerShare) / PRECISION) - user.rewardDebt[poolId]) + user.pendingRewards[poolId]; } // Updates the reward per share for the current block function updatePools() public { for(uint256 i = 0; i < totalPools; i++) { _updatePool(i); } // Set the last reward time to the current block lastRewardBlock = block.number; } function _updatePool(uint256 poolId) internal { // Only update if a block has passed from the last update and there are staked users if (block.number > lastRewardBlock) { if (totalStaked > 0) { PoolInfo storage pool = poolInfo[poolId]; // Calculate rewards per staked token accumulated from the last update uint256 blocks = block.number - lastRewardBlock; uint256 rewards = blocks * pool.rewardPerBlock; pool.rewardPerShare += ((rewards * PRECISION) / totalStaked); emit UpdatePool(lastRewardBlock, totalStaked, pool.rewardPerShare, poolId); } } } // Stakes the specified amount of the staking token in the contract function deposit(uint256 amount) public { // Update the rewards for the current block if needed updatePools(); UserInfo storage user = userInfo[msg.sender]; // Calculate the users pending rewards and credit them for the amount for(uint256 i = 0; i < totalPools; i++) { uint256 accRewardPerShare = poolInfo[i].rewardPerShare; uint256 accumulatedRewards = (user.amount * accRewardPerShare) / PRECISION; user.pendingRewards[i] += accumulatedRewards - user.rewardDebt[i]; } // Credit the user for the staked amount and update reward debt user.amount += amount; totalStaked += amount; for(uint256 i = 0; i < totalPools; i++) { uint256 accRewardPerShare = poolInfo[i].rewardPerShare; user.rewardDebt[i] = (user.amount * accRewardPerShare) / PRECISION; } if(user.lastClaimTime == 0) { user.lastClaimTime = block.timestamp; } // Store staked tokens in the contract stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, amount); } // Unstake and transfer the user the specified amount of staking tokens function withdraw(uint256 amount) public { // Update the rewards for the current block if needed updatePools(); UserInfo storage user = userInfo[msg.sender]; // Calculate the users pending rewards and credit them for the amount for(uint256 i = 0; i < totalPools; i++) { uint256 accRewardPerShare = poolInfo[i].rewardPerShare; uint256 accumulatedRewards = (user.amount * accRewardPerShare) / PRECISION; user.pendingRewards[i] += accumulatedRewards - user.rewardDebt[i]; } // Subtract the amount from the users staked amount and update reward debt user.amount -= amount; totalStaked -= amount; for(uint256 i = 0; i < totalPools; i++) { uint256 accRewardPerShare = poolInfo[i].rewardPerShare; user.rewardDebt[i] = (user.amount * accRewardPerShare) / PRECISION; } // Transfer the staking tokens back to the user stakingToken.safeTransfer(msg.sender, amount); emit Withdraw(msg.sender, amount); } // Claim the users pending rewards - triggers the RewardDistributor claimTokens function function claim() public { UserInfo storage user = userInfo[msg.sender]; // Users can only claim once every 30 days if(user.lastClaimTime + claimWaitTime > block.timestamp ) { revert EarlyClaim(); } // Update the rewards for the current block if needed updatePools(); // Calculate the users pending rewards for(uint256 i = 0; i < totalPools; i++) { uint256 accRewardPerShare = poolInfo[i].rewardPerShare; uint256 accumulatedRewards = (user.amount * accRewardPerShare) / PRECISION; uint256 pendingRewards = (accumulatedRewards - user.rewardDebt[i]) + user.pendingRewards[i]; user.pendingRewards[i] = 0; user.rewardDebt[i] = accumulatedRewards; if(pendingRewards > 0) { emit Claim(i, msg.sender, pendingRewards); } } // Set the users reward debt and pending rewards after claiming user.lastClaimTime = block.timestamp; } function addPool(uint256 rewardRate) public onlyOwner { updatePools(); PoolInfo storage pool = poolInfo[totalPools]; pool.rewardPerBlock = rewardRate; totalPools++; } // Owner restricted function to update the reward rate function updateRewardRate(uint256 _rewardPerBlock, uint256 poolId) public onlyOwner { poolInfo[poolId].rewardPerBlock = _rewardPerBlock; } function updateClaimWaitTime(uint256 waitTime) public onlyOwner { claimWaitTime = waitTime; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_stakingToken","type":"address"},{"internalType":"uint256[]","name":"rewardRates","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EarlyClaim","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardRate","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimWaitTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"pendingRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"waitTime","type":"uint256"}],"name":"updateClaimWaitTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"updateRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405262278d00600755348015610016575f80fd5b50604051611d1a380380611d1a8339818101604052810190610038919061042e565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a9575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100a09190610497565b60405180910390fd5b6100b88161016e60201b60201c565b508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550436006819055505f5b8151811015610166575f60025f8381526020019081526020015f209050828281518110610132576101316104b0565b5b6020026020010151815f018190555060055f8154809291906101539061050a565b9190505550508080600101915050610102565b505050610551565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61026982610240565b9050919050565b5f61027a8261025f565b9050919050565b61028a81610270565b8114610294575f80fd5b50565b5f815190506102a581610281565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6102f5826102af565b810181811067ffffffffffffffff82111715610314576103136102bf565b5b80604052505050565b5f61032661022f565b905061033282826102ec565b919050565b5f67ffffffffffffffff821115610351576103506102bf565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b61037881610366565b8114610382575f80fd5b50565b5f815190506103938161036f565b92915050565b5f6103ab6103a684610337565b61031d565b905080838252602082019050602084028301858111156103ce576103cd610362565b5b835b818110156103f757806103e38882610385565b8452602084019350506020810190506103d0565b5050509392505050565b5f82601f830112610415576104146102ab565b5b8151610425848260208601610399565b91505092915050565b5f806040838503121561044457610443610238565b5b5f61045185828601610297565b925050602083015167ffffffffffffffff8111156104725761047161023c565b5b61047e85828601610401565b9150509250929050565b6104918161025f565b82525050565b5f6020820190506104aa5f830184610488565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61051482610366565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610546576105456104dd565b5b600182019050919050565b6117bc8061055e5f395ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c8063817b1cd2116100ab578063ab3c7e521161006f578063ab3c7e52146102ab578063b32534cf146102c9578063b6b55f25146102e5578063d18df53c14610301578063f2fde38b146103315761011f565b8063817b1cd2146102175780638da5cb5b14610235578063a51d8dba14610253578063a9f8d1811461026f578063aaf5eb681461028d5761011f565b80634e71d92d116100f25780634e71d92d146101bf57806357770bee146101c9578063715018a6146101d357806372f702f3146101dd5780637769ea0a146101fb5761011f565b8063093d9b7b146101235780631526fe27146101415780631959a002146101725780632e1a7d4d146101a3575b5f80fd5b61012b61034d565b6040516101389190611271565b60405180910390f35b61015b600480360381019061015691906112b8565b610353565b6040516101699291906112e3565b60405180910390f35b61018c60048036038101906101879190611364565b610373565b60405161019a9291906112e3565b60405180910390f35b6101bd60048036038101906101b891906112b8565b610393565b005b6101c76105c4565b005b6101d161078d565b005b6101db6107b9565b005b6101e56107cc565b6040516101f291906113ea565b60405180910390f35b610215600480360381019061021091906112b8565b6107f1565b005b61021f61083a565b60405161022c9190611271565b60405180910390f35b61023d610840565b60405161024a9190611412565b60405180910390f35b61026d600480360381019061026891906112b8565b610867565b005b610277610879565b6040516102849190611271565b60405180910390f35b61029561087f565b6040516102a29190611271565b60405180910390f35b6102b3610892565b6040516102c09190611271565b60405180910390f35b6102e360048036038101906102de919061142b565b610898565b005b6102ff60048036038101906102fa91906112b8565b6108bc565b005b61031b60048036038101906103169190611469565b610b04565b6040516103289190611271565b60405180910390f35b61034b60048036038101906103469190611364565b610c68565b005b60075481565b6002602052805f5260405f205f91509050805f0154908060010154905082565b6001602052805f5260405f205f91509050805f0154908060030154905082565b61039b61078d565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5b600554811015610481575f60025f8381526020019081526020015f206001015490505f6ec097ce7bc90715b34b9f100000000082855f015461041f91906114d4565b6104299190611542565b9050836001015f8481526020019081526020015f20548161044a9190611572565b846002015f8581526020019081526020015f205f82825461046b91906115a5565b92505081905550505080806001019150506103dd565b5081815f015f8282546104949190611572565b925050819055508160045f8282546104ac9190611572565b925050819055505f5b600554811015610525575f60025f8381526020019081526020015f206001015490506ec097ce7bc90715b34b9f100000000081845f01546104f691906114d4565b6105009190611542565b836001015f8481526020019081526020015f20819055505080806001019150506104b5565b50610572338360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610cec9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364836040516105b89190611271565b60405180910390a25050565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905042600754826003015461061791906115a5565b111561064f576040517f2b08972a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61065761078d565b5f5b600554811015610780575f60025f8381526020019081526020015f206001015490505f6ec097ce7bc90715b34b9f100000000082855f015461069b91906114d4565b6106a59190611542565b90505f846002015f8581526020019081526020015f2054856001015f8681526020019081526020015f2054836106db9190611572565b6106e591906115a5565b90505f856002015f8681526020019081526020015f208190555081856001015f8681526020019081526020015f20819055505f811115610770573373ffffffffffffffffffffffffffffffffffffffff167f3ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30385836040516107679291906112e3565b60405180910390a25b5050508080600101915050610659565b5042816003018190555050565b5f5b6005548110156107af576107a281610d6b565b808060010191505061078f565b5043600681905550565b6107c1610e44565b6107ca5f610ecb565b565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107f9610e44565b61080161078d565b5f60025f60055481526020019081526020015f20905081815f018190555060055f815480929190610831906115d8565b91905055505050565b60045481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61086f610e44565b8060078190555050565b60065481565b6ec097ce7bc90715b34b9f100000000081565b60055481565b6108a0610e44565b8160025f8381526020019081526020015f205f01819055505050565b6108c461078d565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5b6005548110156109aa575f60025f8381526020019081526020015f206001015490505f6ec097ce7bc90715b34b9f100000000082855f015461094891906114d4565b6109529190611542565b9050836001015f8481526020019081526020015f2054816109739190611572565b846002015f8581526020019081526020015f205f82825461099491906115a5565b9250508190555050508080600101915050610906565b5081815f015f8282546109bd91906115a5565b925050819055508160045f8282546109d591906115a5565b925050819055505f5b600554811015610a4e575f60025f8381526020019081526020015f206001015490506ec097ce7bc90715b34b9f100000000081845f0154610a1f91906114d4565b610a299190611542565b836001015f8481526020019081526020015f20819055505080806001019150506109de565b505f816003015403610a64574281600301819055505b610ab233308460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f8c909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c83604051610af89190611271565b60405180910390a25050565b5f8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f60025f8681526020019081526020015f206001015490505f60045403610b8357816002015f8681526020019081526020015f205492505050610c62565b600654431115610bf8575f60065443610b9c9190611572565b90505f60025f8881526020019081526020015f205f015482610bbe91906114d4565b90506004546ec097ce7bc90715b34b9f100000000082610bde91906114d4565b610be89190611542565b83610bf391906115a5565b925050505b816002015f8681526020019081526020015f2054826001015f8781526020019081526020015f20546ec097ce7bc90715b34b9f100000000083855f0154610c3f91906114d4565b610c499190611542565b610c539190611572565b610c5d91906115a5565b925050505b92915050565b610c70610e44565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ce0575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610cd79190611412565b60405180910390fd5b610ce981610ecb565b50565b610d66838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610d1f92919061161f565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061100e565b505050565b600654431115610e41575f6004541115610e40575f60025f8381526020019081526020015f2090505f60065443610da29190611572565b90505f825f015482610db491906114d4565b90506004546ec097ce7bc90715b34b9f100000000082610dd491906114d4565b610dde9190611542565b836001015f828254610df091906115a5565b925050819055507f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46600654600454856001015487604051610e349493929190611646565b60405180910390a15050505b5b50565b610e4c6110a3565b73ffffffffffffffffffffffffffffffffffffffff16610e6a610840565b73ffffffffffffffffffffffffffffffffffffffff1614610ec957610e8d6110a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ec09190611412565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611008848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610fc193929190611689565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061100e565b50505050565b5f611038828473ffffffffffffffffffffffffffffffffffffffff166110aa90919063ffffffff16565b90505f81511415801561105c57508080602001905181019061105a91906116f3565b155b1561109e57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016110959190611412565b60405180910390fd5b505050565b5f33905090565b60606110b783835f6110bf565b905092915050565b60608147101561110657306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016110fd9190611412565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161112e9190611770565b5f6040518083038185875af1925050503d805f8114611168576040519150601f19603f3d011682016040523d82523d5f602084013e61116d565b606091505b509150915061117d868383611188565b925050509392505050565b60608261119d5761119882611215565b61120d565b5f82511480156111c357505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561120557836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016111fc9190611412565b60405180910390fd5b81905061120e565b5b9392505050565b5f815111156112275780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f819050919050565b61126b81611259565b82525050565b5f6020820190506112845f830184611262565b92915050565b5f80fd5b61129781611259565b81146112a1575f80fd5b50565b5f813590506112b28161128e565b92915050565b5f602082840312156112cd576112cc61128a565b5b5f6112da848285016112a4565b91505092915050565b5f6040820190506112f65f830185611262565b6113036020830184611262565b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6113338261130a565b9050919050565b61134381611329565b811461134d575f80fd5b50565b5f8135905061135e8161133a565b92915050565b5f602082840312156113795761137861128a565b5b5f61138684828501611350565b91505092915050565b5f819050919050565b5f6113b26113ad6113a88461130a565b61138f565b61130a565b9050919050565b5f6113c382611398565b9050919050565b5f6113d4826113b9565b9050919050565b6113e4816113ca565b82525050565b5f6020820190506113fd5f8301846113db565b92915050565b61140c81611329565b82525050565b5f6020820190506114255f830184611403565b92915050565b5f80604083850312156114415761144061128a565b5b5f61144e858286016112a4565b925050602061145f858286016112a4565b9150509250929050565b5f806040838503121561147f5761147e61128a565b5b5f61148c858286016112a4565b925050602061149d85828601611350565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6114de82611259565b91506114e983611259565b92508282026114f781611259565b9150828204841483151761150e5761150d6114a7565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61154c82611259565b915061155783611259565b92508261156757611566611515565b5b828204905092915050565b5f61157c82611259565b915061158783611259565b925082820390508181111561159f5761159e6114a7565b5b92915050565b5f6115af82611259565b91506115ba83611259565b92508282019050808211156115d2576115d16114a7565b5b92915050565b5f6115e282611259565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611614576116136114a7565b5b600182019050919050565b5f6040820190506116325f830185611403565b61163f6020830184611262565b9392505050565b5f6080820190506116595f830187611262565b6116666020830186611262565b6116736040830185611262565b6116806060830184611262565b95945050505050565b5f60608201905061169c5f830186611403565b6116a96020830185611403565b6116b66040830184611262565b949350505050565b5f8115159050919050565b6116d2816116be565b81146116dc575f80fd5b50565b5f815190506116ed816116c9565b92915050565b5f602082840312156117085761170761128a565b5b5f611715848285016116df565b91505092915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61174a8261171e565b6117548185611728565b9350611764818560208601611732565b80840191505092915050565b5f61177b8284611740565b91508190509291505056fea2646970667358221220666af2e9071030b78aee0b1471073b0cae822f4440d10e098bf1bb812c5687cc64736f6c634300081a00330000000000000000000000001fdb29ad49330b07ae5a87483f598aa6b292039e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061011f575f3560e01c8063817b1cd2116100ab578063ab3c7e521161006f578063ab3c7e52146102ab578063b32534cf146102c9578063b6b55f25146102e5578063d18df53c14610301578063f2fde38b146103315761011f565b8063817b1cd2146102175780638da5cb5b14610235578063a51d8dba14610253578063a9f8d1811461026f578063aaf5eb681461028d5761011f565b80634e71d92d116100f25780634e71d92d146101bf57806357770bee146101c9578063715018a6146101d357806372f702f3146101dd5780637769ea0a146101fb5761011f565b8063093d9b7b146101235780631526fe27146101415780631959a002146101725780632e1a7d4d146101a3575b5f80fd5b61012b61034d565b6040516101389190611271565b60405180910390f35b61015b600480360381019061015691906112b8565b610353565b6040516101699291906112e3565b60405180910390f35b61018c60048036038101906101879190611364565b610373565b60405161019a9291906112e3565b60405180910390f35b6101bd60048036038101906101b891906112b8565b610393565b005b6101c76105c4565b005b6101d161078d565b005b6101db6107b9565b005b6101e56107cc565b6040516101f291906113ea565b60405180910390f35b610215600480360381019061021091906112b8565b6107f1565b005b61021f61083a565b60405161022c9190611271565b60405180910390f35b61023d610840565b60405161024a9190611412565b60405180910390f35b61026d600480360381019061026891906112b8565b610867565b005b610277610879565b6040516102849190611271565b60405180910390f35b61029561087f565b6040516102a29190611271565b60405180910390f35b6102b3610892565b6040516102c09190611271565b60405180910390f35b6102e360048036038101906102de919061142b565b610898565b005b6102ff60048036038101906102fa91906112b8565b6108bc565b005b61031b60048036038101906103169190611469565b610b04565b6040516103289190611271565b60405180910390f35b61034b60048036038101906103469190611364565b610c68565b005b60075481565b6002602052805f5260405f205f91509050805f0154908060010154905082565b6001602052805f5260405f205f91509050805f0154908060030154905082565b61039b61078d565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5b600554811015610481575f60025f8381526020019081526020015f206001015490505f6ec097ce7bc90715b34b9f100000000082855f015461041f91906114d4565b6104299190611542565b9050836001015f8481526020019081526020015f20548161044a9190611572565b846002015f8581526020019081526020015f205f82825461046b91906115a5565b92505081905550505080806001019150506103dd565b5081815f015f8282546104949190611572565b925050819055508160045f8282546104ac9190611572565b925050819055505f5b600554811015610525575f60025f8381526020019081526020015f206001015490506ec097ce7bc90715b34b9f100000000081845f01546104f691906114d4565b6105009190611542565b836001015f8481526020019081526020015f20819055505080806001019150506104b5565b50610572338360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610cec9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364836040516105b89190611271565b60405180910390a25050565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905042600754826003015461061791906115a5565b111561064f576040517f2b08972a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61065761078d565b5f5b600554811015610780575f60025f8381526020019081526020015f206001015490505f6ec097ce7bc90715b34b9f100000000082855f015461069b91906114d4565b6106a59190611542565b90505f846002015f8581526020019081526020015f2054856001015f8681526020019081526020015f2054836106db9190611572565b6106e591906115a5565b90505f856002015f8681526020019081526020015f208190555081856001015f8681526020019081526020015f20819055505f811115610770573373ffffffffffffffffffffffffffffffffffffffff167f3ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30385836040516107679291906112e3565b60405180910390a25b5050508080600101915050610659565b5042816003018190555050565b5f5b6005548110156107af576107a281610d6b565b808060010191505061078f565b5043600681905550565b6107c1610e44565b6107ca5f610ecb565b565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107f9610e44565b61080161078d565b5f60025f60055481526020019081526020015f20905081815f018190555060055f815480929190610831906115d8565b91905055505050565b60045481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61086f610e44565b8060078190555050565b60065481565b6ec097ce7bc90715b34b9f100000000081565b60055481565b6108a0610e44565b8160025f8381526020019081526020015f205f01819055505050565b6108c461078d565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5b6005548110156109aa575f60025f8381526020019081526020015f206001015490505f6ec097ce7bc90715b34b9f100000000082855f015461094891906114d4565b6109529190611542565b9050836001015f8481526020019081526020015f2054816109739190611572565b846002015f8581526020019081526020015f205f82825461099491906115a5565b9250508190555050508080600101915050610906565b5081815f015f8282546109bd91906115a5565b925050819055508160045f8282546109d591906115a5565b925050819055505f5b600554811015610a4e575f60025f8381526020019081526020015f206001015490506ec097ce7bc90715b34b9f100000000081845f0154610a1f91906114d4565b610a299190611542565b836001015f8481526020019081526020015f20819055505080806001019150506109de565b505f816003015403610a64574281600301819055505b610ab233308460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f8c909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c83604051610af89190611271565b60405180910390a25050565b5f8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f60025f8681526020019081526020015f206001015490505f60045403610b8357816002015f8681526020019081526020015f205492505050610c62565b600654431115610bf8575f60065443610b9c9190611572565b90505f60025f8881526020019081526020015f205f015482610bbe91906114d4565b90506004546ec097ce7bc90715b34b9f100000000082610bde91906114d4565b610be89190611542565b83610bf391906115a5565b925050505b816002015f8681526020019081526020015f2054826001015f8781526020019081526020015f20546ec097ce7bc90715b34b9f100000000083855f0154610c3f91906114d4565b610c499190611542565b610c539190611572565b610c5d91906115a5565b925050505b92915050565b610c70610e44565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ce0575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610cd79190611412565b60405180910390fd5b610ce981610ecb565b50565b610d66838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610d1f92919061161f565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061100e565b505050565b600654431115610e41575f6004541115610e40575f60025f8381526020019081526020015f2090505f60065443610da29190611572565b90505f825f015482610db491906114d4565b90506004546ec097ce7bc90715b34b9f100000000082610dd491906114d4565b610dde9190611542565b836001015f828254610df091906115a5565b925050819055507f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46600654600454856001015487604051610e349493929190611646565b60405180910390a15050505b5b50565b610e4c6110a3565b73ffffffffffffffffffffffffffffffffffffffff16610e6a610840565b73ffffffffffffffffffffffffffffffffffffffff1614610ec957610e8d6110a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ec09190611412565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611008848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610fc193929190611689565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061100e565b50505050565b5f611038828473ffffffffffffffffffffffffffffffffffffffff166110aa90919063ffffffff16565b90505f81511415801561105c57508080602001905181019061105a91906116f3565b155b1561109e57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016110959190611412565b60405180910390fd5b505050565b5f33905090565b60606110b783835f6110bf565b905092915050565b60608147101561110657306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016110fd9190611412565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161112e9190611770565b5f6040518083038185875af1925050503d805f8114611168576040519150601f19603f3d011682016040523d82523d5f602084013e61116d565b606091505b509150915061117d868383611188565b925050509392505050565b60608261119d5761119882611215565b61120d565b5f82511480156111c357505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561120557836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016111fc9190611412565b60405180910390fd5b81905061120e565b5b9392505050565b5f815111156112275780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f819050919050565b61126b81611259565b82525050565b5f6020820190506112845f830184611262565b92915050565b5f80fd5b61129781611259565b81146112a1575f80fd5b50565b5f813590506112b28161128e565b92915050565b5f602082840312156112cd576112cc61128a565b5b5f6112da848285016112a4565b91505092915050565b5f6040820190506112f65f830185611262565b6113036020830184611262565b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6113338261130a565b9050919050565b61134381611329565b811461134d575f80fd5b50565b5f8135905061135e8161133a565b92915050565b5f602082840312156113795761137861128a565b5b5f61138684828501611350565b91505092915050565b5f819050919050565b5f6113b26113ad6113a88461130a565b61138f565b61130a565b9050919050565b5f6113c382611398565b9050919050565b5f6113d4826113b9565b9050919050565b6113e4816113ca565b82525050565b5f6020820190506113fd5f8301846113db565b92915050565b61140c81611329565b82525050565b5f6020820190506114255f830184611403565b92915050565b5f80604083850312156114415761144061128a565b5b5f61144e858286016112a4565b925050602061145f858286016112a4565b9150509250929050565b5f806040838503121561147f5761147e61128a565b5b5f61148c858286016112a4565b925050602061149d85828601611350565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6114de82611259565b91506114e983611259565b92508282026114f781611259565b9150828204841483151761150e5761150d6114a7565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61154c82611259565b915061155783611259565b92508261156757611566611515565b5b828204905092915050565b5f61157c82611259565b915061158783611259565b925082820390508181111561159f5761159e6114a7565b5b92915050565b5f6115af82611259565b91506115ba83611259565b92508282019050808211156115d2576115d16114a7565b5b92915050565b5f6115e282611259565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611614576116136114a7565b5b600182019050919050565b5f6040820190506116325f830185611403565b61163f6020830184611262565b9392505050565b5f6080820190506116595f830187611262565b6116666020830186611262565b6116736040830185611262565b6116806060830184611262565b95945050505050565b5f60608201905061169c5f830186611403565b6116a96020830185611403565b6116b66040830184611262565b949350505050565b5f8115159050919050565b6116d2816116be565b81146116dc575f80fd5b50565b5f815190506116ed816116c9565b92915050565b5f602082840312156117085761170761128a565b5b5f611715848285016116df565b91505092915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61174a8261171e565b6117548185611728565b9350611764818560208601611732565b80840191505092915050565b5f61177b8284611740565b91508190509291505056fea2646970667358221220666af2e9071030b78aee0b1471073b0cae822f4440d10e098bf1bb812c5687cc64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001fdb29ad49330b07ae5a87483f598aa6b292039e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x1FdB29Ad49330B07aE5a87483F598AA6b292039E
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001fdb29ad49330b07ae5a87483f598aa6b292039e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
23381:8106:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24165:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23889:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;23837;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;28659:1099;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29861:1070;;;:::i;:::-;;26350:228;;;:::i;:::-;;22412:103;;;:::i;:::-;;23986:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30939:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24061:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21737:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31375:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24126:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24271:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24094:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31215:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27376:1198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25400:882;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22670:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24165:38;;;;:::o;23889:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23837:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28659:1099::-;28775:13;:11;:13::i;:::-;28799:21;28823:8;:20;28832:10;28823:20;;;;;;;;;;;;;;;28799:44;;28938:9;28934:290;28957:10;;28953:1;:14;28934:290;;;28989:25;29017:8;:11;29026:1;29017:11;;;;;;;;;;;:26;;;28989:54;;29058:26;24307:4;29102:17;29088:4;:11;;;:31;;;;:::i;:::-;29087:45;;;;:::i;:::-;29058:74;;29194:4;:15;;:18;29210:1;29194:18;;;;;;;;;;;;29173;:39;;;;:::i;:::-;29147:4;:19;;:22;29167:1;29147:22;;;;;;;;;;;;:65;;;;;;;:::i;:::-;;;;;;;;28974:250;;28969:3;;;;;;;28934:290;;;;29336:6;29321:4;:11;;;:21;;;;;;;:::i;:::-;;;;;;;;29368:6;29353:11;;:21;;;;;;;:::i;:::-;;;;;;;;29391:9;29387:202;29410:10;;29406:1;:14;29387:202;;;29442:25;29470:8;:11;29479:1;29470:11;;;;;;;;;;;:26;;;29442:54;;24307:4;29547:17;29533:4;:11;;;:31;;;;:::i;:::-;29532:45;;;;:::i;:::-;29511:4;:15;;:18;29527:1;29511:18;;;;;;;;;;;:66;;;;29427:162;29422:3;;;;;;;29387:202;;;;29659:45;29685:10;29697:6;29659:12;;;;;;;;;;;:25;;;;:45;;;;;:::i;:::-;29731:10;29722:28;;;29743:6;29722:28;;;;;;:::i;:::-;;;;;;;;28700:1058;28659:1099;:::o;29861:1070::-;29896:21;29920:8;:20;29929:10;29920:20;;;;;;;;;;;;;;;29896:44;;30054:15;30038:13;;30017:4;:18;;;:34;;;;:::i;:::-;:52;30014:104;;;30094:12;;;;;;;;;;;;;;30014:104;30193:13;:11;:13::i;:::-;30280:9;30276:525;30299:10;;30295:1;:14;30276:525;;;30331:25;30359:8;:11;30368:1;30359:11;;;;;;;;;;;:26;;;30331:54;;30400:26;24307:4;30444:17;30430:4;:11;;;:31;;;;:::i;:::-;30429:45;;;;:::i;:::-;30400:74;;30489:22;30558:4;:19;;:22;30578:1;30558:22;;;;;;;;;;;;30536:4;:15;;:18;30552:1;30536:18;;;;;;;;;;;;30515;:39;;;;:::i;:::-;30514:66;;;;:::i;:::-;30489:91;;30620:1;30595:4;:19;;:22;30615:1;30595:22;;;;;;;;;;;:26;;;;30657:18;30636:4;:15;;:18;30652:1;30636:18;;;;;;;;;;;:39;;;;30710:1;30693:14;:18;30690:100;;;30746:10;30737:37;;;30743:1;30759:14;30737:37;;;;;;;:::i;:::-;;;;;;;;30690:100;30316:485;;;30311:3;;;;;;;30276:525;;;;30908:15;30887:4;:18;;:36;;;;29885:1046;29861:1070::o;26350:228::-;26395:9;26391:81;26414:10;;26410:1;:14;26391:81;;;26446:14;26458:1;26446:11;:14::i;:::-;26426:3;;;;;;;26391:81;;;;26558:12;26540:15;:30;;;;26350:228::o;22412:103::-;21623:13;:11;:13::i;:::-;22477:30:::1;22504:1;22477:18;:30::i;:::-;22412:103::o:0;23986:26::-;;;;;;;;;;;;;:::o;30939:207::-;21623:13;:11;:13::i;:::-;31004::::1;:11;:13::i;:::-;31028:21;31052:8;:20;31061:10;;31052:20;;;;;;;;;;;31028:44;;31105:10;31083:4;:19;;:32;;;;31126:10;;:12;;;;;;;;;:::i;:::-;;;;;;30993:153;30939:207:::0;:::o;24061:26::-;;;;:::o;21737:87::-;21783:7;21810:6;;;;;;;;;;;21803:13;;21737:87;:::o;31375:107::-;21623:13;:11;:13::i;:::-;31466:8:::1;31450:13;:24;;;;31375:107:::0;:::o;24126:30::-;;;;:::o;24271:40::-;24307:4;24271:40;:::o;24094:25::-;;;;:::o;31215:152::-;21623:13;:11;:13::i;:::-;31344:15:::1;31310:8;:16;31319:6;31310:16;;;;;;;;;;;:31;;:49;;;;31215:152:::0;;:::o;27376:1198::-;27491:13;:11;:13::i;:::-;27515:21;27539:8;:20;27548:10;27539:20;;;;;;;;;;;;;;;27515:44;;27654:9;27650:290;27673:10;;27669:1;:14;27650:290;;;27705:25;27733:8;:11;27742:1;27733:11;;;;;;;;;;;:26;;;27705:54;;27774:26;24307:4;27818:17;27804:4;:11;;;:31;;;;:::i;:::-;27803:45;;;;:::i;:::-;27774:74;;27910:4;:15;;:18;27926:1;27910:18;;;;;;;;;;;;27889;:39;;;;:::i;:::-;27863:4;:19;;:22;27883:1;27863:22;;;;;;;;;;;;:65;;;;;;;:::i;:::-;;;;;;;;27690:250;;27685:3;;;;;;;27650:290;;;;28040:6;28025:4;:11;;;:21;;;;;;;:::i;:::-;;;;;;;;28072:6;28057:11;;:21;;;;;;;:::i;:::-;;;;;;;;28095:9;28091:202;28114:10;;28110:1;:14;28091:202;;;28146:25;28174:8;:11;28183:1;28174:11;;;;;;;;;;;:26;;;28146:54;;24307:4;28251:17;28237:4;:11;;;:31;;;;:::i;:::-;28236:45;;;;:::i;:::-;28215:4;:15;;:18;28231:1;28215:18;;;;;;;;;;;:66;;;;28131:162;28126:3;;;;;;;28091:202;;;;28330:1;28308:4;:18;;;:23;28305:91;;28369:15;28348:4;:18;;:36;;;;28305:91;28457:64;28487:10;28507:4;28514:6;28457:12;;;;;;;;;;;:29;;;;:64;;;;;;:::i;:::-;28547:10;28539:27;;;28559:6;28539:27;;;;;;:::i;:::-;;;;;;;;27416:1158;27376:1198;:::o;25400:882::-;25478:22;25513:21;25537:8;:15;25546:5;25537:15;;;;;;;;;;;;;;;25513:39;;25563:25;25591:8;:16;25600:6;25591:16;;;;;;;;;;;:31;;;25563:59;;25652:1;25637:11;;:16;25633:61;;25664:4;:19;;:27;25684:6;25664:27;;;;;;;;;;;;25657:34;;;;;;25633:61;25802:15;;25787:12;:30;25783:276;;;25834:14;25866:15;;25851:12;:30;;;;:::i;:::-;25834:47;;25896:15;25923:8;:16;25932:6;25923:16;;;;;;;;;;;:31;;;25914:6;:40;;;;:::i;:::-;25896:58;;26034:11;;24307:4;26011:7;:19;;;;:::i;:::-;26010:35;;;;:::i;:::-;25989:17;:57;;;;:::i;:::-;25969:77;;25819:240;;25783:276;26247:4;:19;;:27;26267:6;26247:27;;;;;;;;;;;;26220:4;:15;;:23;26236:6;26220:23;;;;;;;;;;;;24307:4;26186:17;26172:4;:11;;;:31;;;;:::i;:::-;26171:45;;;;:::i;:::-;26170:73;;;;:::i;:::-;26169:105;;;;:::i;:::-;26152:122;;25502:780;;25400:882;;;;;:::o;22670:220::-;21623:13;:11;:13::i;:::-;22775:1:::1;22755:22;;:8;:22;;::::0;22751:93:::1;;22829:1;22801:31;;;;;;;;;;;:::i;:::-;;;;;;;;22751:93;22854:28;22873:8;22854:18;:28::i;:::-;22670:220:::0;:::o;14499:162::-;14582:71;14602:5;14624;:14;;;14641:2;14645:5;14609:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14582:19;:71::i;:::-;14499:162;;;:::o;26586:708::-;26756:15;;26741:12;:30;26737:550;;;26806:1;26792:11;;:15;26788:487;;;26828:21;26852:8;:16;26861:6;26852:16;;;;;;;;;;;26828:40;;26975:14;27007:15;;26992:12;:30;;;;:::i;:::-;26975:47;;27041:15;27068:4;:19;;;27059:6;:28;;;;:::i;:::-;27041:46;;27154:11;;24307:4;27131:7;:19;;;;:::i;:::-;27130:35;;;;:::i;:::-;27106:4;:19;;;:60;;;;;;;:::i;:::-;;;;;;;;27190:69;27201:15;;27218:11;;27231:4;:19;;;27252:6;27190:69;;;;;;;;;:::i;:::-;;;;;;;;26809:466;;;26788:487;26737:550;26586:708;:::o;21902:166::-;21973:12;:10;:12::i;:::-;21962:23;;:7;:5;:7::i;:::-;:23;;;21958:103;;22036:12;:10;:12::i;:::-;22009:40;;;;;;;;;;;:::i;:::-;;;;;;;;21958:103;21902:166::o;23050:191::-;23124:16;23143:6;;;;;;;;;;;23124:25;;23169:8;23160:6;;:17;;;;;;;;;;;;;;;;;;23224:8;23193:40;;23214:8;23193:40;;;;;;;;;;;;23113:128;23050:191;:::o;14906:190::-;15007:81;15027:5;15049;:18;;;15070:4;15076:2;15080:5;15034:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15007:19;:81::i;:::-;14906:190;;;;:::o;17310:638::-;17734:23;17760:33;17788:4;17768:5;17760:27;;;;:33;;;;:::i;:::-;17734:59;;17829:1;17808:10;:17;:22;;:57;;;;;17846:10;17835:30;;;;;;;;;;;;:::i;:::-;17834:31;17808:57;17804:137;;;17922:5;17889:40;;;;;;;;;;;:::i;:::-;;;;;;;;17804:137;17380:568;17310:638;;:::o;19746:98::-;19799:7;19826:10;19819:17;;19746:98;:::o;9625:153::-;9700:12;9732:38;9754:6;9762:4;9768:1;9732:21;:38::i;:::-;9725:45;;9625:153;;;;:::o;10113:398::-;10212:12;10265:5;10241:21;:29;10237:110;;;10329:4;10294:41;;;;;;;;;;;:::i;:::-;;;;;;;;10237:110;10358:12;10372:23;10399:6;:11;;10418:5;10425:4;10399:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10357:73;;;;10448:55;10475:6;10483:7;10492:10;10448:26;:55::i;:::-;10441:62;;;;10113:398;;;;;:::o;11589:597::-;11737:12;11767:7;11762:417;;11791:19;11799:10;11791:7;:19::i;:::-;11762:417;;;12040:1;12019:10;:17;:22;:49;;;;;12067:1;12045:6;:18;;;:23;12019:49;12015:121;;;12113:6;12096:24;;;;;;;;;;;:::i;:::-;;;;;;;;12015:121;12157:10;12150:17;;;;11762:417;11589:597;;;;;;:::o;12739:528::-;12892:1;12872:10;:17;:21;12868:392;;;13104:10;13098:17;13161:15;13148:10;13144:2;13140:19;13133:44;12868:392;13231:17;;;;;;;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:332::-;1498:4;1536:2;1525:9;1521:18;1513:26;;1549:71;1617:1;1606:9;1602:17;1593:6;1549:71;:::i;:::-;1630:72;1698:2;1687:9;1683:18;1674:6;1630:72;:::i;:::-;1377:332;;;;;:::o;1715:126::-;1752:7;1792:42;1785:5;1781:54;1770:65;;1715:126;;;:::o;1847:96::-;1884:7;1913:24;1931:5;1913:24;:::i;:::-;1902:35;;1847:96;;;:::o;1949:122::-;2022:24;2040:5;2022:24;:::i;:::-;2015:5;2012:35;2002:63;;2061:1;2058;2051:12;2002:63;1949:122;:::o;2077:139::-;2123:5;2161:6;2148:20;2139:29;;2177:33;2204:5;2177:33;:::i;:::-;2077:139;;;;:::o;2222:329::-;2281:6;2330:2;2318:9;2309:7;2305:23;2301:32;2298:119;;;2336:79;;:::i;:::-;2298:119;2456:1;2481:53;2526:7;2517:6;2506:9;2502:22;2481:53;:::i;:::-;2471:63;;2427:117;2222:329;;;;:::o;2557:60::-;2585:3;2606:5;2599:12;;2557:60;;;:::o;2623:142::-;2673:9;2706:53;2724:34;2733:24;2751:5;2733:24;:::i;:::-;2724:34;:::i;:::-;2706:53;:::i;:::-;2693:66;;2623:142;;;:::o;2771:126::-;2821:9;2854:37;2885:5;2854:37;:::i;:::-;2841:50;;2771:126;;;:::o;2903:139::-;2966:9;2999:37;3030:5;2999:37;:::i;:::-;2986:50;;2903:139;;;:::o;3048:157::-;3148:50;3192:5;3148:50;:::i;:::-;3143:3;3136:63;3048:157;;:::o;3211:248::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:84;3449:1;3438:9;3434:17;3425:6;3368:84;:::i;:::-;3211:248;;;;:::o;3465:118::-;3552:24;3570:5;3552:24;:::i;:::-;3547:3;3540:37;3465:118;;:::o;3589:222::-;3682:4;3720:2;3709:9;3705:18;3697:26;;3733:71;3801:1;3790:9;3786:17;3777:6;3733:71;:::i;:::-;3589:222;;;;:::o;3817:474::-;3885:6;3893;3942:2;3930:9;3921:7;3917:23;3913:32;3910:119;;;3948:79;;:::i;:::-;3910:119;4068:1;4093:53;4138:7;4129:6;4118:9;4114:22;4093:53;:::i;:::-;4083:63;;4039:117;4195:2;4221:53;4266:7;4257:6;4246:9;4242:22;4221:53;:::i;:::-;4211:63;;4166:118;3817:474;;;;;:::o;4297:::-;4365:6;4373;4422:2;4410:9;4401:7;4397:23;4393:32;4390:119;;;4428:79;;:::i;:::-;4390:119;4548:1;4573:53;4618:7;4609:6;4598:9;4594:22;4573:53;:::i;:::-;4563:63;;4519:117;4675:2;4701:53;4746:7;4737:6;4726:9;4722:22;4701:53;:::i;:::-;4691:63;;4646:118;4297:474;;;;;:::o;4777:180::-;4825:77;4822:1;4815:88;4922:4;4919:1;4912:15;4946:4;4943:1;4936:15;4963:410;5003:7;5026:20;5044:1;5026:20;:::i;:::-;5021:25;;5060:20;5078:1;5060:20;:::i;:::-;5055:25;;5115:1;5112;5108:9;5137:30;5155:11;5137:30;:::i;:::-;5126:41;;5316:1;5307:7;5303:15;5300:1;5297:22;5277:1;5270:9;5250:83;5227:139;;5346:18;;:::i;:::-;5227:139;5011:362;4963:410;;;;:::o;5379:180::-;5427:77;5424:1;5417:88;5524:4;5521:1;5514:15;5548:4;5545:1;5538:15;5565:185;5605:1;5622:20;5640:1;5622:20;:::i;:::-;5617:25;;5656:20;5674:1;5656:20;:::i;:::-;5651:25;;5695:1;5685:35;;5700:18;;:::i;:::-;5685:35;5742:1;5739;5735:9;5730:14;;5565:185;;;;:::o;5756:194::-;5796:4;5816:20;5834:1;5816:20;:::i;:::-;5811:25;;5850:20;5868:1;5850:20;:::i;:::-;5845:25;;5894:1;5891;5887:9;5879:17;;5918:1;5912:4;5909:11;5906:37;;;5923:18;;:::i;:::-;5906:37;5756:194;;;;:::o;5956:191::-;5996:3;6015:20;6033:1;6015:20;:::i;:::-;6010:25;;6049:20;6067:1;6049:20;:::i;:::-;6044:25;;6092:1;6089;6085:9;6078:16;;6113:3;6110:1;6107:10;6104:36;;;6120:18;;:::i;:::-;6104:36;5956:191;;;;:::o;6153:233::-;6192:3;6215:24;6233:5;6215:24;:::i;:::-;6206:33;;6261:66;6254:5;6251:77;6248:103;;6331:18;;:::i;:::-;6248:103;6378:1;6371:5;6367:13;6360:20;;6153:233;;;:::o;6392:332::-;6513:4;6551:2;6540:9;6536:18;6528:26;;6564:71;6632:1;6621:9;6617:17;6608:6;6564:71;:::i;:::-;6645:72;6713:2;6702:9;6698:18;6689:6;6645:72;:::i;:::-;6392:332;;;;;:::o;6730:553::-;6907:4;6945:3;6934:9;6930:19;6922:27;;6959:71;7027:1;7016:9;7012:17;7003:6;6959:71;:::i;:::-;7040:72;7108:2;7097:9;7093:18;7084:6;7040:72;:::i;:::-;7122;7190:2;7179:9;7175:18;7166:6;7122:72;:::i;:::-;7204;7272:2;7261:9;7257:18;7248:6;7204:72;:::i;:::-;6730:553;;;;;;;:::o;7289:442::-;7438:4;7476:2;7465:9;7461:18;7453:26;;7489:71;7557:1;7546:9;7542:17;7533:6;7489:71;:::i;:::-;7570:72;7638:2;7627:9;7623:18;7614:6;7570:72;:::i;:::-;7652;7720:2;7709:9;7705:18;7696:6;7652:72;:::i;:::-;7289:442;;;;;;:::o;7737:90::-;7771:7;7814:5;7807:13;7800:21;7789:32;;7737:90;;;:::o;7833:116::-;7903:21;7918:5;7903:21;:::i;:::-;7896:5;7893:32;7883:60;;7939:1;7936;7929:12;7883:60;7833:116;:::o;7955:137::-;8009:5;8040:6;8034:13;8025:22;;8056:30;8080:5;8056:30;:::i;:::-;7955:137;;;;:::o;8098:345::-;8165:6;8214:2;8202:9;8193:7;8189:23;8185:32;8182:119;;;8220:79;;:::i;:::-;8182:119;8340:1;8365:61;8418:7;8409:6;8398:9;8394:22;8365:61;:::i;:::-;8355:71;;8311:125;8098:345;;;;:::o;8449:98::-;8500:6;8534:5;8528:12;8518:22;;8449:98;;;:::o;8553:147::-;8654:11;8691:3;8676:18;;8553:147;;;;:::o;8706:139::-;8795:6;8790:3;8785;8779:23;8836:1;8827:6;8822:3;8818:16;8811:27;8706:139;;;:::o;8851:386::-;8955:3;8983:38;9015:5;8983:38;:::i;:::-;9037:88;9118:6;9113:3;9037:88;:::i;:::-;9030:95;;9134:65;9192:6;9187:3;9180:4;9173:5;9169:16;9134:65;:::i;:::-;9224:6;9219:3;9215:16;9208:23;;8959:278;8851:386;;;;:::o;9243:271::-;9373:3;9395:93;9484:3;9475:6;9395:93;:::i;:::-;9388:100;;9505:3;9498:10;;9243:271;;;;:::o
Swarm Source
ipfs://666af2e9071030b78aee0b1471073b0cae822f4440d10e098bf1bb812c5687cc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000007 | 24,617,736,601.3469 | $169,669.6 |
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.