More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 628 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw All | 17618074 | 364 days ago | IN | 0 ETH | 0.00143442 | ||||
Claim Rewards | 17577877 | 369 days ago | IN | 0 ETH | 0.00120132 | ||||
Deposit | 17562146 | 372 days ago | IN | 0 ETH | 0.00164859 | ||||
Withdraw All | 17551991 | 373 days ago | IN | 0 ETH | 0.00104504 | ||||
Deposit | 17551974 | 373 days ago | IN | 0 ETH | 0.00090214 | ||||
Deposit | 17551973 | 373 days ago | IN | 0 ETH | 0.0013658 | ||||
Claim Rewards | 17544825 | 374 days ago | IN | 0 ETH | 0.00114017 | ||||
Claim Rewards | 17535664 | 375 days ago | IN | 0 ETH | 0.00117225 | ||||
Claim Rewards | 17518723 | 378 days ago | IN | 0 ETH | 0.0014185 | ||||
Deposit | 17516605 | 378 days ago | IN | 0 ETH | 0.00174311 | ||||
Withdraw All | 17503416 | 380 days ago | IN | 0 ETH | 0.00109732 | ||||
Withdraw All | 17503378 | 380 days ago | IN | 0 ETH | 0.0013782 | ||||
Withdraw All | 17486526 | 382 days ago | IN | 0 ETH | 0.00254943 | ||||
Withdraw All | 17471855 | 384 days ago | IN | 0 ETH | 0.00185846 | ||||
Withdraw All | 17469513 | 385 days ago | IN | 0 ETH | 0.00107834 | ||||
Withdraw All | 17469508 | 385 days ago | IN | 0 ETH | 0.00146574 | ||||
Withdraw All | 17467217 | 385 days ago | IN | 0 ETH | 0.00186727 | ||||
Withdraw All | 17458300 | 386 days ago | IN | 0 ETH | 0.0014768 | ||||
Withdraw All | 17449368 | 387 days ago | IN | 0 ETH | 0.00136814 | ||||
Withdraw All | 17443901 | 388 days ago | IN | 0 ETH | 0.00164262 | ||||
Withdraw All | 17441113 | 389 days ago | IN | 0 ETH | 0.00174885 | ||||
Withdraw All | 17441075 | 389 days ago | IN | 0 ETH | 0.0020612 | ||||
Withdraw All | 17440647 | 389 days ago | IN | 0 ETH | 0.00130297 | ||||
Claim Rewards | 17440645 | 389 days ago | IN | 0 ETH | 0.00153909 | ||||
Withdraw All | 17440443 | 389 days ago | IN | 0 ETH | 0.00124074 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Staking
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-01 */ /** *Submitted for verification at Etherscan.io on 2022-12-20 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @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. */ 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]. */ 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/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/STAKING/IStaking.sol pragma solidity =0.8.10; /// @author RetreebInc /// @title Interface Staking Platform with fixed APY and lockup interface IStaking { /** * @notice function that start the staking * @dev set `startPeriod` to the current current `block.timestamp` * set `lockupPeriod` which is `block.timestamp` + `lockupDuration` * and `endPeriod` which is `startPeriod` + `stakingDuration` */ function startStaking() external; /** * @notice function that allows a user to deposit tokens * @dev user must first approve the amount to deposit before calling this function, * cannot exceed the `maxAmountStaked` * @param amount, the amount to be deposited * @dev `endPeriod` to equal 0 (Staking didn't started yet), * or `endPeriod` more than current `block.timestamp` (staking not finished yet) * @dev `totalStaked + amount` must be less than `stakingMax` * @dev that the amount deposited should greater than 0 */ function deposit(uint amount) external; /** * @notice function that allows a user to withdraw its initial deposit * @dev must be called only when `block.timestamp` >= `endPeriod` * @dev `block.timestamp` higher than `lockupPeriod` (lockupPeriod finished) * withdraw reset all states variable for the `msg.sender` to 0, and claim rewards * if rewards to claim */ function withdrawAll() external; /** * @notice function that allows a user to withdraw its initial deposit * @param amount, amount to withdraw * @dev `block.timestamp` must be higher than `lockupPeriod` (lockupPeriod finished) * @dev `amount` must be higher than `0` * @dev `amount` must be lower or equal to the amount staked * withdraw reset all states variable for the `msg.sender` to 0, and claim rewards * if rewards to claim */ function withdraw(uint amount) external; /** * @notice function that returns the amount of total Staked tokens * for a specific user * @param stakeHolder, address of the user to check * @return uint amount of the total deposited Tokens by the caller */ function amountStaked(address stakeHolder) external view returns (uint); /** * @notice function that returns the amount of total Staked tokens * on the smart contract * @return uint amount of the total deposited Tokens */ function totalDeposited() external view returns (uint); /** * @notice function that returns the amount of pending rewards * that can be claimed by the user * @param stakeHolder, address of the user to be checked * @return uint amount of claimable rewards */ function rewardOf(address stakeHolder) external view returns (uint); /** * @notice function that claims pending rewards * @dev transfer the pending rewards to the `msg.sender` */ function claimRewards() external; /** * @dev Emitted when `amount` tokens are deposited into * staking platform */ event Deposit(address indexed owner, uint amount); /** * @dev Emitted when user withdraw deposited `amount` */ event Withdraw(address indexed owner, uint amount); /** * @dev Emitted when `stakeHolder` claim rewards */ event Claim(address indexed stakeHolder, uint amount); /** * @dev Emitted when staking has started */ event StartStaking(uint startPeriod, uint lockupPeriod, uint endingPeriod); } // File: contracts/STAKING/Staking.sol pragma solidity =0.8.10; /// @title Staking Platform with fixed APY and lockup contract Staking is IStaking, Ownable, ReentrancyGuard { using SafeERC20 for IERC20; IERC20 public immutable token; uint8 public immutable fixedAPY; uint public immutable stakingDuration; uint public immutable lockupDuration; uint public immutable stakingMax; uint public startPeriod; uint public lockupPeriod; uint public endPeriod; uint private _totalStaked; uint internal _precision = 1E6; mapping(address => uint) public staked; mapping(address => uint) private _rewardsToClaim; mapping(address => uint) private _userStartTime; /** * @notice constructor contains all the parameters of the staking platform * @dev all parameters are immutable */ constructor( address _token, uint8 _fixedAPY, uint _durationInDays, uint _lockDurationInDays, uint _maxAmountStaked ) { stakingDuration = _durationInDays * 1 days; lockupDuration = _lockDurationInDays * 1 days; token = IERC20(_token); fixedAPY = _fixedAPY; stakingMax = _maxAmountStaked; } /** * @notice function that start the staking * @dev set `startPeriod` to the current current `block.timestamp` * set `lockupPeriod` which is `block.timestamp` + `lockupDuration` * and `endPeriod` which is `startPeriod` + `stakingDuration` */ function startStaking() external override onlyOwner { require(startPeriod == 0, "Staking has already started"); startPeriod = block.timestamp; lockupPeriod = block.timestamp + lockupDuration; endPeriod = block.timestamp + stakingDuration; emit StartStaking(startPeriod, lockupDuration, endPeriod); } /** * @notice function that allows a user to deposit tokens * @dev user must first approve the amount to deposit before calling this function, * cannot exceed the `maxAmountStaked` * @param amount, the amount to be deposited * @dev `endPeriod` to equal 0 (Staking didn't started yet), * or `endPeriod` more than current `block.timestamp` (staking not finished yet) * @dev `totalStaked + amount` must be less than `stakingMax` * @dev that the amount deposited should greater than 0 */ function deposit(uint amount) external override { require( endPeriod == 0 || endPeriod > block.timestamp, "Staking period ended" ); require( _totalStaked + amount <= stakingMax, "Amount staked exceeds MaxStake" ); require(amount > 0, "Amount must be greater than 0"); if (_userStartTime[_msgSender()] == 0) { _userStartTime[_msgSender()] = block.timestamp; } _updateRewards(); staked[_msgSender()] += amount; _totalStaked += amount; token.safeTransferFrom(_msgSender(), address(this), amount); emit Deposit(_msgSender(), amount); } /** * @notice function that allows a user to withdraw its initial deposit * @param amount, amount to withdraw * @dev `amount` must be higher than `0` * @dev `amount` must be lower or equal to the amount staked * withdraw reset all states variable for the `msg.sender` to 0, and claim rewards * if rewards to claim */ function withdraw(uint amount) external nonReentrant override { require(amount > 0, "Amount must be greater than 0"); require( amount <= staked[_msgSender()], "Amount higher than stakedAmount" ); _updateRewards(); if (_rewardsToClaim[_msgSender()] > 0) { _claimRewards(); } _totalStaked -= amount; staked[_msgSender()] -= amount; token.safeTransfer(_msgSender(), amount); emit Withdraw(_msgSender(), amount); } /** * @notice function that allows a user to withdraw its initial deposit * @dev `block.timestamp` higher than `lockupPeriod` (lockupPeriod finished) * withdraw reset all states variable for the `msg.sender` to 0, and claim rewards * if rewards to claim */ function withdrawAll() external nonReentrant override { _updateRewards(); if (_rewardsToClaim[_msgSender()] > 0) { _claimRewards(); } _userStartTime[_msgSender()] = 0; _totalStaked -= staked[_msgSender()]; uint stakedBalance = staked[_msgSender()]; staked[_msgSender()] = 0; token.safeTransfer(_msgSender(), stakedBalance); emit Withdraw(_msgSender(), stakedBalance); } /** * @notice claim all remaining balance on the contract * Residual balance is all the remaining tokens that have not been distributed * (e.g, in case the number of stakeholders is not sufficient) * Cannot claim initial stakeholders deposit */ function withdrawResidualBalance() external onlyOwner { uint balance = token.balanceOf(address(this)); uint residualBalance = balance - (_totalStaked); require(residualBalance > 0, "No residual Balance to withdraw"); token.safeTransfer(owner(), residualBalance); } /** * @notice function that returns the amount of total Staked tokens * for a specific user * @param stakeHolder, address of the user to check * @return uint amount of the total deposited Tokens by the caller */ function amountStaked(address stakeHolder) external view override returns (uint) { return staked[stakeHolder]; } /** * @notice function that returns the amount of total Staked tokens * on the smart contract * @return uint amount of the total deposited Tokens */ function totalDeposited() external view override returns (uint) { return _totalStaked; } /** * @notice function that returns the amount of pending rewards * that can be claimed by the user * @param stakeHolder, address of the user to be checked * @return uint amount of claimable rewards */ function rewardOf(address stakeHolder) external view override returns (uint) { return _calculateRewards(stakeHolder); } /** * @notice function that claims pending rewards * @dev transfer the pending rewards to the `msg.sender` */ function claimRewards() external override { _claimRewards(); } /** * @notice calculate rewards based on the `fixedAPY`, `_percentageTimeRemaining()` * @dev the higher is the precision and the more the time remaining will be precise * @param stakeHolder, address of the user to be checked * @return uint amount of claimable tokens of the specified address */ function _calculateRewards(address stakeHolder) internal view returns (uint) { if (startPeriod == 0 || staked[stakeHolder] == 0) { return 0; } return (((staked[stakeHolder] * fixedAPY) * _percentageTimeRemaining(stakeHolder)) / (_precision * 100)) + _rewardsToClaim[stakeHolder]; } /** * @notice function that returns the remaining time in seconds of the staking period * @dev the higher is the precision and the more the time remaining will be precise * @param stakeHolder, address of the user to be checked * @return uint percentage of time remaining * precision */ function _percentageTimeRemaining(address stakeHolder) internal view returns (uint) { bool early = startPeriod > _userStartTime[stakeHolder]; uint startTime; if (endPeriod > block.timestamp) { startTime = early ? startPeriod : _userStartTime[stakeHolder]; uint timeRemaining = stakingDuration - (block.timestamp - startTime); return (_precision * (stakingDuration - timeRemaining)) / stakingDuration; } startTime = early ? 0 : stakingDuration - (endPeriod - _userStartTime[stakeHolder]); return (_precision * (stakingDuration - startTime)) / stakingDuration; } /** * @notice internal function that claims pending rewards * @dev transfer the pending rewards to the user address */ function _claimRewards() private { _updateRewards(); uint rewardsToClaim = _rewardsToClaim[_msgSender()]; require(rewardsToClaim > 0, "Nothing to claim"); _rewardsToClaim[_msgSender()] = 0; token.safeTransfer(_msgSender(), rewardsToClaim); emit Claim(_msgSender(), rewardsToClaim); } /** * @notice function that update pending rewards * and shift them to rewardsToClaim * @dev update rewards claimable * and check the time spent since deposit for the `msg.sender` */ function _updateRewards() private { _rewardsToClaim[_msgSender()] = _calculateRewards(_msgSender()); _userStartTime[_msgSender()] = (block.timestamp >= endPeriod) ? endPeriod : block.timestamp; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint8","name":"_fixedAPY","type":"uint8"},{"internalType":"uint256","name":"_durationInDays","type":"uint256"},{"internalType":"uint256","name":"_lockDurationInDays","type":"uint256"},{"internalType":"uint256","name":"_maxAmountStaked","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeHolder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","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":"startPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockupPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endingPeriod","type":"uint256"}],"name":"StartStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"stakeHolder","type":"address"}],"name":"amountStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedAPY","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockupDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockupPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakeHolder","type":"address"}],"name":"rewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposited","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":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawResidualBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610120604052620f42406006553480156200001957600080fd5b5060405162002ae738038062002ae783398181016040528101906200003f91906200029b565b6200005f62000053620000ec60201b60201c565b620000f460201b60201c565b60018081905550620151808362000077919062000352565b60c0818152505062015180826200008f919062000352565b60e081815250508473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508360ff1660a08160ff16815250508061010081815250505050505050620003b3565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001ea82620001bd565b9050919050565b620001fc81620001dd565b81146200020857600080fd5b50565b6000815190506200021c81620001f1565b92915050565b600060ff82169050919050565b6200023a8162000222565b81146200024657600080fd5b50565b6000815190506200025a816200022f565b92915050565b6000819050919050565b620002758162000260565b81146200028157600080fd5b50565b60008151905062000295816200026a565b92915050565b600080600080600060a08688031215620002ba57620002b9620001b8565b5b6000620002ca888289016200020b565b9550506020620002dd8882890162000249565b9450506040620002f08882890162000284565b9350506060620003038882890162000284565b9250506080620003168882890162000284565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200035f8262000260565b91506200036c8362000260565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620003a857620003a762000323565b5b828202905092915050565b60805160a05160c05160e051610100516126786200046f60003960008181610a8b0152610d52015260008181610380015281816106b4015261073c0152600081816106e6015281816107790152818161166f0152818161169c015281816116be0152818161175c0152818161179101526117b3015260008181610622015261103001526000818161056c0152818161095301528181610c6401528181610e0401528181610f0101528181610f4b01526112c401526126786000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063853828b6116100b8578063ef40a6701161007c578063ef40a670146102ce578063f0316bc8146102fe578063f2fde38b1461031c578063fb468ac314610338578063fc0c546a14610342578063ff50abdc1461036057610137565b8063853828b61461023c5780638da5cb5b1461024657806398807d8414610264578063b6b55f2514610294578063ee947a7c146102b057610137565b806348c9eaaf116100ff57806348c9eaaf146101ce5780635faa65ff146101ec578063715018a61461020a57806371b0cbfa146102145780638005a7de1461021e57610137565b80631ada70a81461013c5780631d62ebd91461015a5780632e1a7d4d1461018a57806330bfb9bb146101a6578063372500ab146101c4575b600080fd5b61014461037e565b6040516101519190611aab565b60405180910390f35b610174600480360381019061016f9190611b29565b6103a2565b6040516101819190611aab565b60405180910390f35b6101a4600480360381019061019f9190611b82565b6103b4565b005b6101ae610610565b6040516101bb9190611aab565b60405180910390f35b6101cc610616565b005b6101d6610620565b6040516101e39190611bcb565b60405180910390f35b6101f4610644565b6040516102019190611aab565b60405180910390f35b61021261064a565b005b61021c61065e565b005b610226610777565b6040516102339190611aab565b60405180910390f35b61024461079b565b005b61024e6109f7565b60405161025b9190611bf5565b60405180910390f35b61027e60048036038101906102799190611b29565b610a20565b60405161028b9190611aab565b60405180910390f35b6102ae60048036038101906102a99190611b82565b610a38565b005b6102b8610d01565b6040516102c59190611aab565b60405180910390f35b6102e860048036038101906102e39190611b29565b610d07565b6040516102f59190611aab565b60405180910390f35b610306610d50565b6040516103139190611aab565b60405180910390f35b61033660048036038101906103319190611b29565b610d74565b005b610340610df8565b005b61034a610f49565b6040516103579190611c6f565b60405180910390f35b610368610f6d565b6040516103759190611aab565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60006103ad82610f77565b9050919050565b6103bc6110c2565b600081116103ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f690611ce7565b60405180910390fd5b6007600061040b611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047f90611d53565b60405180910390fd5b61049061111a565b60006008600061049e611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156104e8576104e76111d4565b5b80600560008282546104fa9190611da2565b92505081905550806007600061050e611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105579190611da2565b925050819055506105b0610569611112565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166113609092919063ffffffff16565b6105b8611112565b73ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516105fd9190611aab565b60405180910390a261060d6113e6565b50565b60025481565b61061e6111d4565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045481565b6106526113ef565b61065c600061146d565b565b6106666113ef565b6000600254146106ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a290611e22565b60405180910390fd5b426002819055507f0000000000000000000000000000000000000000000000000000000000000000426106de9190611e42565b6003819055507f0000000000000000000000000000000000000000000000000000000000000000426107109190611e42565b6004819055507f0cdba3fb0a2020e0c9dc500b2679007a9c91cfcf35acab0eb46766c1200b42cd6002547f000000000000000000000000000000000000000000000000000000000000000060045460405161076d93929190611e98565b60405180910390a1565b7f000000000000000000000000000000000000000000000000000000000000000081565b6107a36110c2565b6107ab61111a565b6000600860006107b9611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610803576108026111d4565b5b600060096000610811611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506007600061085b611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008282546108a79190611da2565b925050819055506000600760006108bc611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600060076000610907611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610997610950611112565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166113609092919063ffffffff16565b61099f611112565b73ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516109e49190611aab565b60405180910390a2506109f56113e6565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60076020528060005260406000206000915090505481565b60006004541480610a4a575042600454115b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090611f1b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081600554610ab89190611e42565b1115610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090611f87565b60405180910390fd5b60008111610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390611ce7565b60405180910390fd5b600060096000610b4a611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610bd7574260096000610b98611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610bdf61111a565b8060076000610bec611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c359190611e42565b925050819055508060056000828254610c4e9190611e42565b92505081905550610ca9610c60611112565b30837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611531909392919063ffffffff16565b610cb1611112565b73ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c82604051610cf69190611aab565b60405180910390a250565b60035481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610d7c6113ef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390612019565b60405180910390fd5b610df58161146d565b50565b610e006113ef565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e5b9190611bf5565b602060405180830381865afa158015610e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9c919061204e565b9050600060055482610eae9190611da2565b905060008111610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea906120c7565b60405180910390fd5b610f45610efe6109f7565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166113609092919063ffffffff16565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600554905090565b6000806002541480610fc857506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15610fd657600090506110bd565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054606460065461102591906120e7565b61102e846115ba565b7f000000000000000000000000000000000000000000000000000000000000000060ff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109c91906120e7565b6110a691906120e7565b6110b09190612170565b6110ba9190611e42565b90505b919050565b60026001541415611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff906121ed565b60405180910390fd5b6002600181905550565b600033905090565b61112a611125611112565b610f77565b60086000611136611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506004544210156111845742611188565b6004545b60096000611194611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6111dc61111a565b6000600860006111ea611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161126a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126190612259565b60405180910390fd5b600060086000611278611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113086112c1611112565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166113609092919063ffffffff16565b611310611112565b73ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4826040516113559190611aab565b60405180910390a250565b6113e18363a9059cbb60e01b848460405160240161137f929190612279565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117fd565b505050565b60018081905550565b6113f7611112565b73ffffffffffffffffffffffffffffffffffffffff166114156109f7565b73ffffffffffffffffffffffffffffffffffffffff161461146b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611462906122ee565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6115b4846323b872dd60e01b8585856040516024016115529392919061230e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117fd565b50505050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546002541190506000426004541115611708578161165957600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461165d565b6002545b90506000814261166d9190611da2565b7f00000000000000000000000000000000000000000000000000000000000000006116989190611da2565b90507f0000000000000000000000000000000000000000000000000000000000000000817f00000000000000000000000000000000000000000000000000000000000000006116e79190611da2565b6006546116f491906120e7565b6116fe9190612170565b93505050506117f8565b8161178a57600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460045461175a9190611da2565b7f00000000000000000000000000000000000000000000000000000000000000006117859190611da2565b61178d565b60005b90507f0000000000000000000000000000000000000000000000000000000000000000817f00000000000000000000000000000000000000000000000000000000000000006117dc9190611da2565b6006546117e991906120e7565b6117f39190612170565b925050505b919050565b600061185f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166118c49092919063ffffffff16565b90506000815111156118bf578080602001905181019061187f919061237d565b6118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59061241c565b60405180910390fd5b5b505050565b60606118d384846000856118dc565b90509392505050565b606082471015611921576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611918906124ae565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161194a9190612548565b60006040518083038185875af1925050503d8060008114611987576040519150601f19603f3d011682016040523d82523d6000602084013e61198c565b606091505b509150915061199d878383876119a9565b92505050949350505050565b60608315611a0c57600083511415611a04576119c485611a1f565b611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa906125ab565b60405180910390fd5b5b829050611a17565b611a168383611a42565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115611a555781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a899190612620565b60405180910390fd5b6000819050919050565b611aa581611a92565b82525050565b6000602082019050611ac06000830184611a9c565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611af682611acb565b9050919050565b611b0681611aeb565b8114611b1157600080fd5b50565b600081359050611b2381611afd565b92915050565b600060208284031215611b3f57611b3e611ac6565b5b6000611b4d84828501611b14565b91505092915050565b611b5f81611a92565b8114611b6a57600080fd5b50565b600081359050611b7c81611b56565b92915050565b600060208284031215611b9857611b97611ac6565b5b6000611ba684828501611b6d565b91505092915050565b600060ff82169050919050565b611bc581611baf565b82525050565b6000602082019050611be06000830184611bbc565b92915050565b611bef81611aeb565b82525050565b6000602082019050611c0a6000830184611be6565b92915050565b6000819050919050565b6000611c35611c30611c2b84611acb565b611c10565b611acb565b9050919050565b6000611c4782611c1a565b9050919050565b6000611c5982611c3c565b9050919050565b611c6981611c4e565b82525050565b6000602082019050611c846000830184611c60565b92915050565b600082825260208201905092915050565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000611cd1601d83611c8a565b9150611cdc82611c9b565b602082019050919050565b60006020820190508181036000830152611d0081611cc4565b9050919050565b7f416d6f756e7420686967686572207468616e207374616b6564416d6f756e7400600082015250565b6000611d3d601f83611c8a565b9150611d4882611d07565b602082019050919050565b60006020820190508181036000830152611d6c81611d30565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611dad82611a92565b9150611db883611a92565b925082821015611dcb57611dca611d73565b5b828203905092915050565b7f5374616b696e672068617320616c726561647920737461727465640000000000600082015250565b6000611e0c601b83611c8a565b9150611e1782611dd6565b602082019050919050565b60006020820190508181036000830152611e3b81611dff565b9050919050565b6000611e4d82611a92565b9150611e5883611a92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611e8d57611e8c611d73565b5b828201905092915050565b6000606082019050611ead6000830186611a9c565b611eba6020830185611a9c565b611ec76040830184611a9c565b949350505050565b7f5374616b696e6720706572696f6420656e646564000000000000000000000000600082015250565b6000611f05601483611c8a565b9150611f1082611ecf565b602082019050919050565b60006020820190508181036000830152611f3481611ef8565b9050919050565b7f416d6f756e74207374616b65642065786365656473204d61785374616b650000600082015250565b6000611f71601e83611c8a565b9150611f7c82611f3b565b602082019050919050565b60006020820190508181036000830152611fa081611f64565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612003602683611c8a565b915061200e82611fa7565b604082019050919050565b6000602082019050818103600083015261203281611ff6565b9050919050565b60008151905061204881611b56565b92915050565b60006020828403121561206457612063611ac6565b5b600061207284828501612039565b91505092915050565b7f4e6f20726573696475616c2042616c616e636520746f20776974686472617700600082015250565b60006120b1601f83611c8a565b91506120bc8261207b565b602082019050919050565b600060208201905081810360008301526120e0816120a4565b9050919050565b60006120f282611a92565b91506120fd83611a92565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561213657612135611d73565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061217b82611a92565b915061218683611a92565b92508261219657612195612141565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006121d7601f83611c8a565b91506121e2826121a1565b602082019050919050565b60006020820190508181036000830152612206816121ca565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b6000612243601083611c8a565b915061224e8261220d565b602082019050919050565b6000602082019050818103600083015261227281612236565b9050919050565b600060408201905061228e6000830185611be6565b61229b6020830184611a9c565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006122d8602083611c8a565b91506122e3826122a2565b602082019050919050565b60006020820190508181036000830152612307816122cb565b9050919050565b60006060820190506123236000830186611be6565b6123306020830185611be6565b61233d6040830184611a9c565b949350505050565b60008115159050919050565b61235a81612345565b811461236557600080fd5b50565b60008151905061237781612351565b92915050565b60006020828403121561239357612392611ac6565b5b60006123a184828501612368565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612406602a83611c8a565b9150612411826123aa565b604082019050919050565b60006020820190508181036000830152612435816123f9565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612498602683611c8a565b91506124a38261243c565b604082019050919050565b600060208201905081810360008301526124c78161248b565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156125025780820151818401526020810190506124e7565b83811115612511576000848401525b50505050565b6000612522826124ce565b61252c81856124d9565b935061253c8185602086016124e4565b80840191505092915050565b60006125548284612517565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612595601d83611c8a565b91506125a08261255f565b602082019050919050565b600060208201905081810360008301526125c481612588565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b60006125f2826125cb565b6125fc8185611c8a565b935061260c8185602086016124e4565b612615816125d6565b840191505092915050565b6000602082019050818103600083015261263a81846125e7565b90509291505056fea26469706673582212206b3598f5d3f451e974f8c80054cf545a1509106b4967db45c98c790ed1f0f38764736f6c634300080a00330000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c6960000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000016d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a0000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c8063853828b6116100b8578063ef40a6701161007c578063ef40a670146102ce578063f0316bc8146102fe578063f2fde38b1461031c578063fb468ac314610338578063fc0c546a14610342578063ff50abdc1461036057610137565b8063853828b61461023c5780638da5cb5b1461024657806398807d8414610264578063b6b55f2514610294578063ee947a7c146102b057610137565b806348c9eaaf116100ff57806348c9eaaf146101ce5780635faa65ff146101ec578063715018a61461020a57806371b0cbfa146102145780638005a7de1461021e57610137565b80631ada70a81461013c5780631d62ebd91461015a5780632e1a7d4d1461018a57806330bfb9bb146101a6578063372500ab146101c4575b600080fd5b61014461037e565b6040516101519190611aab565b60405180910390f35b610174600480360381019061016f9190611b29565b6103a2565b6040516101819190611aab565b60405180910390f35b6101a4600480360381019061019f9190611b82565b6103b4565b005b6101ae610610565b6040516101bb9190611aab565b60405180910390f35b6101cc610616565b005b6101d6610620565b6040516101e39190611bcb565b60405180910390f35b6101f4610644565b6040516102019190611aab565b60405180910390f35b61021261064a565b005b61021c61065e565b005b610226610777565b6040516102339190611aab565b60405180910390f35b61024461079b565b005b61024e6109f7565b60405161025b9190611bf5565b60405180910390f35b61027e60048036038101906102799190611b29565b610a20565b60405161028b9190611aab565b60405180910390f35b6102ae60048036038101906102a99190611b82565b610a38565b005b6102b8610d01565b6040516102c59190611aab565b60405180910390f35b6102e860048036038101906102e39190611b29565b610d07565b6040516102f59190611aab565b60405180910390f35b610306610d50565b6040516103139190611aab565b60405180910390f35b61033660048036038101906103319190611b29565b610d74565b005b610340610df8565b005b61034a610f49565b6040516103579190611c6f565b60405180910390f35b610368610f6d565b6040516103759190611aab565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60006103ad82610f77565b9050919050565b6103bc6110c2565b600081116103ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f690611ce7565b60405180910390fd5b6007600061040b611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047f90611d53565b60405180910390fd5b61049061111a565b60006008600061049e611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156104e8576104e76111d4565b5b80600560008282546104fa9190611da2565b92505081905550806007600061050e611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105579190611da2565b925050819055506105b0610569611112565b827f0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c69673ffffffffffffffffffffffffffffffffffffffff166113609092919063ffffffff16565b6105b8611112565b73ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516105fd9190611aab565b60405180910390a261060d6113e6565b50565b60025481565b61061e6111d4565b565b7f000000000000000000000000000000000000000000000000000000000000003281565b60045481565b6106526113ef565b61065c600061146d565b565b6106666113ef565b6000600254146106ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a290611e22565b60405180910390fd5b426002819055507f0000000000000000000000000000000000000000000000000000000000000000426106de9190611e42565b6003819055507f0000000000000000000000000000000000000000000000000000000001e13380426107109190611e42565b6004819055507f0cdba3fb0a2020e0c9dc500b2679007a9c91cfcf35acab0eb46766c1200b42cd6002547f000000000000000000000000000000000000000000000000000000000000000060045460405161076d93929190611e98565b60405180910390a1565b7f0000000000000000000000000000000000000000000000000000000001e1338081565b6107a36110c2565b6107ab61111a565b6000600860006107b9611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610803576108026111d4565b5b600060096000610811611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506007600061085b611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008282546108a79190611da2565b925050819055506000600760006108bc611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600060076000610907611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610997610950611112565b827f0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c69673ffffffffffffffffffffffffffffffffffffffff166113609092919063ffffffff16565b61099f611112565b73ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516109e49190611aab565b60405180910390a2506109f56113e6565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60076020528060005260406000206000915090505481565b60006004541480610a4a575042600454115b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090611f1b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000016345785d8a000081600554610ab89190611e42565b1115610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090611f87565b60405180910390fd5b60008111610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390611ce7565b60405180910390fd5b600060096000610b4a611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610bd7574260096000610b98611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610bdf61111a565b8060076000610bec611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c359190611e42565b925050819055508060056000828254610c4e9190611e42565b92505081905550610ca9610c60611112565b30837f0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c69673ffffffffffffffffffffffffffffffffffffffff16611531909392919063ffffffff16565b610cb1611112565b73ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c82604051610cf69190611aab565b60405180910390a250565b60035481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000016345785d8a000081565b610d7c6113ef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390612019565b60405180910390fd5b610df58161146d565b50565b610e006113ef565b60007f0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c69673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e5b9190611bf5565b602060405180830381865afa158015610e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9c919061204e565b9050600060055482610eae9190611da2565b905060008111610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea906120c7565b60405180910390fd5b610f45610efe6109f7565b827f0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c69673ffffffffffffffffffffffffffffffffffffffff166113609092919063ffffffff16565b5050565b7f0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c69681565b6000600554905090565b6000806002541480610fc857506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15610fd657600090506110bd565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054606460065461102591906120e7565b61102e846115ba565b7f000000000000000000000000000000000000000000000000000000000000003260ff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109c91906120e7565b6110a691906120e7565b6110b09190612170565b6110ba9190611e42565b90505b919050565b60026001541415611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff906121ed565b60405180910390fd5b6002600181905550565b600033905090565b61112a611125611112565b610f77565b60086000611136611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506004544210156111845742611188565b6004545b60096000611194611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6111dc61111a565b6000600860006111ea611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161126a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126190612259565b60405180910390fd5b600060086000611278611112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113086112c1611112565b827f0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c69673ffffffffffffffffffffffffffffffffffffffff166113609092919063ffffffff16565b611310611112565b73ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4826040516113559190611aab565b60405180910390a250565b6113e18363a9059cbb60e01b848460405160240161137f929190612279565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117fd565b505050565b60018081905550565b6113f7611112565b73ffffffffffffffffffffffffffffffffffffffff166114156109f7565b73ffffffffffffffffffffffffffffffffffffffff161461146b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611462906122ee565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6115b4846323b872dd60e01b8585856040516024016115529392919061230e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117fd565b50505050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546002541190506000426004541115611708578161165957600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461165d565b6002545b90506000814261166d9190611da2565b7f0000000000000000000000000000000000000000000000000000000001e133806116989190611da2565b90507f0000000000000000000000000000000000000000000000000000000001e13380817f0000000000000000000000000000000000000000000000000000000001e133806116e79190611da2565b6006546116f491906120e7565b6116fe9190612170565b93505050506117f8565b8161178a57600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460045461175a9190611da2565b7f0000000000000000000000000000000000000000000000000000000001e133806117859190611da2565b61178d565b60005b90507f0000000000000000000000000000000000000000000000000000000001e13380817f0000000000000000000000000000000000000000000000000000000001e133806117dc9190611da2565b6006546117e991906120e7565b6117f39190612170565b925050505b919050565b600061185f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166118c49092919063ffffffff16565b90506000815111156118bf578080602001905181019061187f919061237d565b6118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59061241c565b60405180910390fd5b5b505050565b60606118d384846000856118dc565b90509392505050565b606082471015611921576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611918906124ae565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161194a9190612548565b60006040518083038185875af1925050503d8060008114611987576040519150601f19603f3d011682016040523d82523d6000602084013e61198c565b606091505b509150915061199d878383876119a9565b92505050949350505050565b60608315611a0c57600083511415611a04576119c485611a1f565b611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa906125ab565b60405180910390fd5b5b829050611a17565b611a168383611a42565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115611a555781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a899190612620565b60405180910390fd5b6000819050919050565b611aa581611a92565b82525050565b6000602082019050611ac06000830184611a9c565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611af682611acb565b9050919050565b611b0681611aeb565b8114611b1157600080fd5b50565b600081359050611b2381611afd565b92915050565b600060208284031215611b3f57611b3e611ac6565b5b6000611b4d84828501611b14565b91505092915050565b611b5f81611a92565b8114611b6a57600080fd5b50565b600081359050611b7c81611b56565b92915050565b600060208284031215611b9857611b97611ac6565b5b6000611ba684828501611b6d565b91505092915050565b600060ff82169050919050565b611bc581611baf565b82525050565b6000602082019050611be06000830184611bbc565b92915050565b611bef81611aeb565b82525050565b6000602082019050611c0a6000830184611be6565b92915050565b6000819050919050565b6000611c35611c30611c2b84611acb565b611c10565b611acb565b9050919050565b6000611c4782611c1a565b9050919050565b6000611c5982611c3c565b9050919050565b611c6981611c4e565b82525050565b6000602082019050611c846000830184611c60565b92915050565b600082825260208201905092915050565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000611cd1601d83611c8a565b9150611cdc82611c9b565b602082019050919050565b60006020820190508181036000830152611d0081611cc4565b9050919050565b7f416d6f756e7420686967686572207468616e207374616b6564416d6f756e7400600082015250565b6000611d3d601f83611c8a565b9150611d4882611d07565b602082019050919050565b60006020820190508181036000830152611d6c81611d30565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611dad82611a92565b9150611db883611a92565b925082821015611dcb57611dca611d73565b5b828203905092915050565b7f5374616b696e672068617320616c726561647920737461727465640000000000600082015250565b6000611e0c601b83611c8a565b9150611e1782611dd6565b602082019050919050565b60006020820190508181036000830152611e3b81611dff565b9050919050565b6000611e4d82611a92565b9150611e5883611a92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611e8d57611e8c611d73565b5b828201905092915050565b6000606082019050611ead6000830186611a9c565b611eba6020830185611a9c565b611ec76040830184611a9c565b949350505050565b7f5374616b696e6720706572696f6420656e646564000000000000000000000000600082015250565b6000611f05601483611c8a565b9150611f1082611ecf565b602082019050919050565b60006020820190508181036000830152611f3481611ef8565b9050919050565b7f416d6f756e74207374616b65642065786365656473204d61785374616b650000600082015250565b6000611f71601e83611c8a565b9150611f7c82611f3b565b602082019050919050565b60006020820190508181036000830152611fa081611f64565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612003602683611c8a565b915061200e82611fa7565b604082019050919050565b6000602082019050818103600083015261203281611ff6565b9050919050565b60008151905061204881611b56565b92915050565b60006020828403121561206457612063611ac6565b5b600061207284828501612039565b91505092915050565b7f4e6f20726573696475616c2042616c616e636520746f20776974686472617700600082015250565b60006120b1601f83611c8a565b91506120bc8261207b565b602082019050919050565b600060208201905081810360008301526120e0816120a4565b9050919050565b60006120f282611a92565b91506120fd83611a92565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561213657612135611d73565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061217b82611a92565b915061218683611a92565b92508261219657612195612141565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006121d7601f83611c8a565b91506121e2826121a1565b602082019050919050565b60006020820190508181036000830152612206816121ca565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b6000612243601083611c8a565b915061224e8261220d565b602082019050919050565b6000602082019050818103600083015261227281612236565b9050919050565b600060408201905061228e6000830185611be6565b61229b6020830184611a9c565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006122d8602083611c8a565b91506122e3826122a2565b602082019050919050565b60006020820190508181036000830152612307816122cb565b9050919050565b60006060820190506123236000830186611be6565b6123306020830185611be6565b61233d6040830184611a9c565b949350505050565b60008115159050919050565b61235a81612345565b811461236557600080fd5b50565b60008151905061237781612351565b92915050565b60006020828403121561239357612392611ac6565b5b60006123a184828501612368565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612406602a83611c8a565b9150612411826123aa565b604082019050919050565b60006020820190508181036000830152612435816123f9565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612498602683611c8a565b91506124a38261243c565b604082019050919050565b600060208201905081810360008301526124c78161248b565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156125025780820151818401526020810190506124e7565b83811115612511576000848401525b50505050565b6000612522826124ce565b61252c81856124d9565b935061253c8185602086016124e4565b80840191505092915050565b60006125548284612517565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612595601d83611c8a565b91506125a08261255f565b602082019050919050565b600060208201905081810360008301526125c481612588565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b60006125f2826125cb565b6125fc8185611c8a565b935061260c8185602086016124e4565b612615816125d6565b840191505092915050565b6000602082019050818103600083015261263a81846125e7565b90509291505056fea26469706673582212206b3598f5d3f451e974f8c80054cf545a1509106b4967db45c98c790ed1f0f38764736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c6960000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000016d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a0000
-----Decoded View---------------
Arg [0] : _token (address): 0x6Fbc20483b53CEa47839Bb8e171Abd6D67C3c696
Arg [1] : _fixedAPY (uint8): 50
Arg [2] : _durationInDays (uint256): 365
Arg [3] : _lockDurationInDays (uint256): 0
Arg [4] : _maxAmountStaked (uint256): 100000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000006fbc20483b53cea47839bb8e171abd6d67c3c696
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [2] : 000000000000000000000000000000000000000000000000000000000000016d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000016345785d8a0000
Deployed Bytecode Sourcemap
29556:9494:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29775:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35853:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32979:550;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29859:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36168:76;;;:::i;:::-;;29691:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29920:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24969:103;;;:::i;:::-;;30992:349;;;:::i;:::-;;29731:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33829:474;;;:::i;:::-;;24321:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30021:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31892:715;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29889:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35153:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29818:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25227:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34591:307;;;:::i;:::-;;29653:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35506:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29775:36;;;:::o;35853:174::-;35960:4;35989:30;36007:11;35989:17;:30::i;:::-;35982:37;;35853:174;;;:::o;32979:550::-;2416:21;:19;:21::i;:::-;33071:1:::1;33062:6;:10;33054:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;33149:6;:20;33156:12;:10;:12::i;:::-;33149:20;;;;;;;;;;;;;;;;33139:6;:30;;33117:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33241:16;:14;:16::i;:::-;33304:1;33272:15;:29;33288:12;:10;:12::i;:::-;33272:29;;;;;;;;;;;;;;;;:33;33268:81;;;33322:15;:13;:15::i;:::-;33268:81;33375:6;33359:12;;:22;;;;;;;:::i;:::-;;;;;;;;33416:6;33392;:20;33399:12;:10;:12::i;:::-;33392:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;33433:40;33452:12;:10;:12::i;:::-;33466:6;33433:5;:18;;;;:40;;;;;:::i;:::-;33500:12;:10;:12::i;:::-;33491:30;;;33514:6;33491:30;;;;;;:::i;:::-;;;;;;;;2460:20:::0;:18;:20::i;:::-;32979:550;:::o;29859:23::-;;;;:::o;36168:76::-;36221:15;:13;:15::i;:::-;36168:76::o;29691:31::-;;;:::o;29920:21::-;;;;:::o;24969:103::-;24207:13;:11;:13::i;:::-;25034:30:::1;25061:1;25034:18;:30::i;:::-;24969:103::o:0;30992:349::-;24207:13;:11;:13::i;:::-;31078:1:::1;31063:11;;:16;31055:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;31136:15;31122:11;:29;;;;31195:14;31177:15;:32;;;;:::i;:::-;31162:12;:47;;;;31250:15;31232;:33;;;;:::i;:::-;31220:9;:45;;;;31281:52;31294:11;;31307:14;31323:9;;31281:52;;;;;;;;:::i;:::-;;;;;;;;30992:349::o:0;29731:37::-;;;:::o;33829:474::-;2416:21;:19;:21::i;:::-;33896:16:::1;:14;:16::i;:::-;33959:1;33927:15;:29;33943:12;:10;:12::i;:::-;33927:29;;;;;;;;;;;;;;;;:33;33923:81;;;33977:15;:13;:15::i;:::-;33923:81;34047:1;34016:14;:28;34031:12;:10;:12::i;:::-;34016:28;;;;;;;;;;;;;;;:32;;;;34075:6;:20;34082:12;:10;:12::i;:::-;34075:20;;;;;;;;;;;;;;;;34059:12;;:36;;;;;;;:::i;:::-;;;;;;;;34106:18;34127:6;:20;34134:12;:10;:12::i;:::-;34127:20;;;;;;;;;;;;;;;;34106:41;;34181:1;34158:6;:20;34165:12;:10;:12::i;:::-;34158:20;;;;;;;;;;;;;;;:24;;;;34193:47;34212:12;:10;:12::i;:::-;34226:13;34193:5;:18;;;;:47;;;;;:::i;:::-;34267:12;:10;:12::i;:::-;34258:37;;;34281:13;34258:37;;;;;;:::i;:::-;;;;;;;;33883:420;2460:20:::0;:18;:20::i;:::-;33829:474::o;24321:87::-;24367:7;24394:6;;;;;;;;;;;24387:13;;24321:87;:::o;30021:38::-;;;;;;;;;;;;;;;;;:::o;31892:715::-;31986:1;31973:9;;:14;:45;;;;32003:15;31991:9;;:27;31973:45;31951:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;32124:10;32114:6;32099:12;;:21;;;;:::i;:::-;:35;;32077:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;32220:1;32211:6;:10;32203:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;32304:1;32272:14;:28;32287:12;:10;:12::i;:::-;32272:28;;;;;;;;;;;;;;;;:33;32268:112;;;32353:15;32322:14;:28;32337:12;:10;:12::i;:::-;32322:28;;;;;;;;;;;;;;;:46;;;;32268:112;32392:16;:14;:16::i;:::-;32445:6;32421;:20;32428:12;:10;:12::i;:::-;32421:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;32478:6;32462:12;;:22;;;;;;;:::i;:::-;;;;;;;;32495:59;32518:12;:10;:12::i;:::-;32540:4;32547:6;32495:5;:22;;;;:59;;;;;;:::i;:::-;32578:12;:10;:12::i;:::-;32570:29;;;32592:6;32570:29;;;;;;:::i;:::-;;;;;;;;31892:715;:::o;29889:24::-;;;;:::o;35153:167::-;35264:4;35293:6;:19;35300:11;35293:19;;;;;;;;;;;;;;;;35286:26;;35153:167;;;:::o;29818:32::-;;;:::o;25227:201::-;24207:13;:11;:13::i;:::-;25336:1:::1;25316:22;;:8;:22;;;;25308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25392:28;25411:8;25392:18;:28::i;:::-;25227:201:::0;:::o;34591:307::-;24207:13;:11;:13::i;:::-;34658:12:::1;34673:5;:15;;;34697:4;34673:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34658:45;;34714:20;34748:12;;34737:7;:24;;;;:::i;:::-;34714:47;;34798:1;34780:15;:19;34772:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34846:44;34865:7;:5;:7::i;:::-;34874:15;34846:5;:18;;;;:44;;;;;:::i;:::-;34645:253;;34591:307::o:0;29653:29::-;;;:::o;35506:102::-;35564:4;35588:12;;35581:19;;35506:102;:::o;36582:403::-;36680:4;36721:1;36706:11;;:16;:44;;;;36749:1;36726:6;:19;36733:11;36726:19;;;;;;;;;;;;;;;;:24;36706:44;36702:85;;;36774:1;36767:8;;;;36702:85;36949:15;:28;36965:11;36949:28;;;;;;;;;;;;;;;;36928:3;36915:10;;:16;;;;:::i;:::-;36873:37;36898:11;36873:24;:37::i;:::-;36844:8;36822:30;;:6;:19;36829:11;36822:19;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;36821:89;;;;:::i;:::-;36820:112;;;;:::i;:::-;36819:158;;;;:::i;:::-;36799:178;;36582:403;;;;:::o;2496:293::-;1898:1;2630:7;;:19;;2622:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1898:1;2763:7;:18;;;;2496:293::o;22872:98::-;22925:7;22952:10;22945:17;;22872:98;:::o;38803:244::-;38880:31;38898:12;:10;:12::i;:::-;38880:17;:31::i;:::-;38848:15;:29;38864:12;:10;:12::i;:::-;38848:29;;;;;;;;;;;;;;;:63;;;;38973:9;;38954:15;:28;;38953:86;;39024:15;38953:86;;;38999:9;;38953:86;38922:14;:28;38937:12;:10;:12::i;:::-;38922:28;;;;;;;;;;;;;;;:117;;;;38803:244::o;38231:346::-;38275:16;:14;:16::i;:::-;38304:19;38326:15;:29;38342:12;:10;:12::i;:::-;38326:29;;;;;;;;;;;;;;;;38304:51;;38391:1;38374:14;:18;38366:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;38458:1;38426:15;:29;38442:12;:10;:12::i;:::-;38426:29;;;;;;;;;;;;;;;:33;;;;38470:48;38489:12;:10;:12::i;:::-;38503:14;38470:5;:18;;;;:48;;;;;:::i;:::-;38540:12;:10;:12::i;:::-;38534:35;;;38554:14;38534:35;;;;;;:::i;:::-;;;;;;;;38264:313;38231:346::o;18403:211::-;18520:86;18540:5;18570:23;;;18595:2;18599:5;18547:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18520:19;:86::i;:::-;18403:211;;;:::o;2797:213::-;1854:1;2980:7;:22;;;;2797:213::o;24486:132::-;24561:12;:10;:12::i;:::-;24550:23;;:7;:5;:7::i;:::-;:23;;;24542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24486:132::o;25588:191::-;25662:16;25681:6;;;;;;;;;;;25662:25;;25707:8;25698:6;;:17;;;;;;;;;;;;;;;;;;25762:8;25731:40;;25752:8;25731:40;;;;;;;;;;;;25651:128;25588:191;:::o;18622:248::-;18766:96;18786:5;18816:27;;;18845:4;18851:2;18855:5;18793:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18766:19;:96::i;:::-;18622:248;;;;:::o;37314:767::-;37419:4;37441:10;37468:14;:27;37483:11;37468:27;;;;;;;;;;;;;;;;37454:11;;:41;37441:54;;37506:14;37547:15;37535:9;;:27;37531:343;;;37591:5;:49;;37613:14;:27;37628:11;37613:27;;;;;;;;;;;;;;;;37591:49;;;37599:11;;37591:49;37579:61;;37655:18;37730:9;37712:15;:27;;;;:::i;:::-;37676:15;:64;;;;:::i;:::-;37655:85;;37847:15;37812:13;37794:15;:31;;;;:::i;:::-;37780:10;;:46;;;;:::i;:::-;37779:83;;;;:::i;:::-;37755:107;;;;;;;37531:343;37896:5;:97;;37965:14;:27;37980:11;37965:27;;;;;;;;;;;;;;;;37953:9;;:39;;;;:::i;:::-;37934:15;:59;;;;:::i;:::-;37896:97;;;37917:1;37896:97;37884:109;;38058:15;38044:9;38026:15;:27;;;;:::i;:::-;38012:10;;:42;;;;:::i;:::-;38011:62;;;;:::i;:::-;38004:69;;;;37314:767;;;;:::o;21470:716::-;21894:23;21920:69;21948:4;21920:69;;;;;;;;;;;;;;;;;21928:5;21920:27;;;;:69;;;;;:::i;:::-;21894:95;;22024:1;22004:10;:17;:21;22000:179;;;22101:10;22090:30;;;;;;;;;;;;:::i;:::-;22082:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;22000:179;21540:646;21470:716;;:::o;7007:229::-;7144:12;7176:52;7198:6;7206:4;7212:1;7215:12;7176:21;:52::i;:::-;7169:59;;7007:229;;;;;:::o;8127:455::-;8297:12;8355:5;8330:21;:30;;8322:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;8415:12;8429:23;8456:6;:11;;8475:5;8482:4;8456:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8414:73;;;;8505:69;8532:6;8540:7;8549:10;8561:12;8505:26;:69::i;:::-;8498:76;;;;8127:455;;;;;;:::o;10700:644::-;10885:12;10914:7;10910:427;;;10963:1;10942:10;:17;:22;10938:290;;;11160:18;11171:6;11160:10;:18::i;:::-;11152:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;10938:290;11249:10;11242:17;;;;10910:427;11292:33;11300:10;11312:12;11292:7;:33::i;:::-;10700:644;;;;;;;:::o;4250:326::-;4310:4;4567:1;4545:7;:19;;;:23;4538:30;;4250:326;;;:::o;11886:552::-;12067:1;12047:10;:17;:21;12043:388;;;12279:10;12273:17;12336:15;12323:10;12319:2;12315:19;12308:44;12043:388;12406:12;12399:20;;;;;;;;;;;:::i;:::-;;;;;;;;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:126;806:7;846:42;839:5;835:54;824:65;;769:126;;;:::o;901:96::-;938:7;967:24;985:5;967:24;:::i;:::-;956:35;;901:96;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:329::-;1335:6;1384:2;1372:9;1363:7;1359:23;1355:32;1352:119;;;1390:79;;:::i;:::-;1352:119;1510:1;1535:53;1580:7;1571:6;1560:9;1556:22;1535:53;:::i;:::-;1525:63;;1481:117;1276:329;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:86::-;2254:7;2294:4;2287:5;2283:16;2272:27;;2219:86;;;:::o;2311:112::-;2394:22;2410:5;2394:22;:::i;:::-;2389:3;2382:35;2311:112;;:::o;2429:214::-;2518:4;2556:2;2545:9;2541:18;2533:26;;2569:67;2633:1;2622:9;2618:17;2609:6;2569:67;:::i;:::-;2429:214;;;;:::o;2649:118::-;2736:24;2754:5;2736:24;:::i;:::-;2731:3;2724:37;2649:118;;:::o;2773:222::-;2866:4;2904:2;2893:9;2889:18;2881:26;;2917:71;2985:1;2974:9;2970:17;2961:6;2917:71;:::i;:::-;2773:222;;;;:::o;3001:60::-;3029:3;3050:5;3043:12;;3001:60;;;:::o;3067:142::-;3117:9;3150:53;3168:34;3177:24;3195:5;3177:24;:::i;:::-;3168:34;:::i;:::-;3150:53;:::i;:::-;3137:66;;3067:142;;;:::o;3215:126::-;3265:9;3298:37;3329:5;3298:37;:::i;:::-;3285:50;;3215:126;;;:::o;3347:140::-;3411:9;3444:37;3475:5;3444:37;:::i;:::-;3431:50;;3347:140;;;:::o;3493:159::-;3594:51;3639:5;3594:51;:::i;:::-;3589:3;3582:64;3493:159;;:::o;3658:250::-;3765:4;3803:2;3792:9;3788:18;3780:26;;3816:85;3898:1;3887:9;3883:17;3874:6;3816:85;:::i;:::-;3658:250;;;;:::o;3914:169::-;3998:11;4032:6;4027:3;4020:19;4072:4;4067:3;4063:14;4048:29;;3914:169;;;;:::o;4089:179::-;4229:31;4225:1;4217:6;4213:14;4206:55;4089:179;:::o;4274:366::-;4416:3;4437:67;4501:2;4496:3;4437:67;:::i;:::-;4430:74;;4513:93;4602:3;4513:93;:::i;:::-;4631:2;4626:3;4622:12;4615:19;;4274:366;;;:::o;4646:419::-;4812:4;4850:2;4839:9;4835:18;4827:26;;4899:9;4893:4;4889:20;4885:1;4874:9;4870:17;4863:47;4927:131;5053:4;4927:131;:::i;:::-;4919:139;;4646:419;;;:::o;5071:181::-;5211:33;5207:1;5199:6;5195:14;5188:57;5071:181;:::o;5258:366::-;5400:3;5421:67;5485:2;5480:3;5421:67;:::i;:::-;5414:74;;5497:93;5586:3;5497:93;:::i;:::-;5615:2;5610:3;5606:12;5599:19;;5258:366;;;:::o;5630:419::-;5796:4;5834:2;5823:9;5819:18;5811:26;;5883:9;5877:4;5873:20;5869:1;5858:9;5854:17;5847:47;5911:131;6037:4;5911:131;:::i;:::-;5903:139;;5630:419;;;:::o;6055:180::-;6103:77;6100:1;6093:88;6200:4;6197:1;6190:15;6224:4;6221:1;6214:15;6241:191;6281:4;6301:20;6319:1;6301:20;:::i;:::-;6296:25;;6335:20;6353:1;6335:20;:::i;:::-;6330:25;;6374:1;6371;6368:8;6365:34;;;6379:18;;:::i;:::-;6365:34;6424:1;6421;6417:9;6409:17;;6241:191;;;;:::o;6438:177::-;6578:29;6574:1;6566:6;6562:14;6555:53;6438:177;:::o;6621:366::-;6763:3;6784:67;6848:2;6843:3;6784:67;:::i;:::-;6777:74;;6860:93;6949:3;6860:93;:::i;:::-;6978:2;6973:3;6969:12;6962:19;;6621:366;;;:::o;6993:419::-;7159:4;7197:2;7186:9;7182:18;7174:26;;7246:9;7240:4;7236:20;7232:1;7221:9;7217:17;7210:47;7274:131;7400:4;7274:131;:::i;:::-;7266:139;;6993:419;;;:::o;7418:305::-;7458:3;7477:20;7495:1;7477:20;:::i;:::-;7472:25;;7511:20;7529:1;7511:20;:::i;:::-;7506:25;;7665:1;7597:66;7593:74;7590:1;7587:81;7584:107;;;7671:18;;:::i;:::-;7584:107;7715:1;7712;7708:9;7701:16;;7418:305;;;;:::o;7729:442::-;7878:4;7916:2;7905:9;7901:18;7893:26;;7929:71;7997:1;7986:9;7982:17;7973:6;7929:71;:::i;:::-;8010:72;8078:2;8067:9;8063:18;8054:6;8010:72;:::i;:::-;8092;8160:2;8149:9;8145:18;8136:6;8092:72;:::i;:::-;7729:442;;;;;;:::o;8177:170::-;8317:22;8313:1;8305:6;8301:14;8294:46;8177:170;:::o;8353:366::-;8495:3;8516:67;8580:2;8575:3;8516:67;:::i;:::-;8509:74;;8592:93;8681:3;8592:93;:::i;:::-;8710:2;8705:3;8701:12;8694:19;;8353:366;;;:::o;8725:419::-;8891:4;8929:2;8918:9;8914:18;8906:26;;8978:9;8972:4;8968:20;8964:1;8953:9;8949:17;8942:47;9006:131;9132:4;9006:131;:::i;:::-;8998:139;;8725:419;;;:::o;9150:180::-;9290:32;9286:1;9278:6;9274:14;9267:56;9150:180;:::o;9336:366::-;9478:3;9499:67;9563:2;9558:3;9499:67;:::i;:::-;9492:74;;9575:93;9664:3;9575:93;:::i;:::-;9693:2;9688:3;9684:12;9677:19;;9336:366;;;:::o;9708:419::-;9874:4;9912:2;9901:9;9897:18;9889:26;;9961:9;9955:4;9951:20;9947:1;9936:9;9932:17;9925:47;9989:131;10115:4;9989:131;:::i;:::-;9981:139;;9708:419;;;:::o;10133:225::-;10273:34;10269:1;10261:6;10257:14;10250:58;10342:8;10337:2;10329:6;10325:15;10318:33;10133:225;:::o;10364:366::-;10506:3;10527:67;10591:2;10586:3;10527:67;:::i;:::-;10520:74;;10603:93;10692:3;10603:93;:::i;:::-;10721:2;10716:3;10712:12;10705:19;;10364:366;;;:::o;10736:419::-;10902:4;10940:2;10929:9;10925:18;10917:26;;10989:9;10983:4;10979:20;10975:1;10964:9;10960:17;10953:47;11017:131;11143:4;11017:131;:::i;:::-;11009:139;;10736:419;;;:::o;11161:143::-;11218:5;11249:6;11243:13;11234:22;;11265:33;11292:5;11265:33;:::i;:::-;11161:143;;;;:::o;11310:351::-;11380:6;11429:2;11417:9;11408:7;11404:23;11400:32;11397:119;;;11435:79;;:::i;:::-;11397:119;11555:1;11580:64;11636:7;11627:6;11616:9;11612:22;11580:64;:::i;:::-;11570:74;;11526:128;11310:351;;;;:::o;11667:181::-;11807:33;11803:1;11795:6;11791:14;11784:57;11667:181;:::o;11854:366::-;11996:3;12017:67;12081:2;12076:3;12017:67;:::i;:::-;12010:74;;12093:93;12182:3;12093:93;:::i;:::-;12211:2;12206:3;12202:12;12195:19;;11854:366;;;:::o;12226:419::-;12392:4;12430:2;12419:9;12415:18;12407:26;;12479:9;12473:4;12469:20;12465:1;12454:9;12450:17;12443:47;12507:131;12633:4;12507:131;:::i;:::-;12499:139;;12226:419;;;:::o;12651:348::-;12691:7;12714:20;12732:1;12714:20;:::i;:::-;12709:25;;12748:20;12766:1;12748:20;:::i;:::-;12743:25;;12936:1;12868:66;12864:74;12861:1;12858:81;12853:1;12846:9;12839:17;12835:105;12832:131;;;12943:18;;:::i;:::-;12832:131;12991:1;12988;12984:9;12973:20;;12651:348;;;;:::o;13005:180::-;13053:77;13050:1;13043:88;13150:4;13147:1;13140:15;13174:4;13171:1;13164:15;13191:185;13231:1;13248:20;13266:1;13248:20;:::i;:::-;13243:25;;13282:20;13300:1;13282:20;:::i;:::-;13277:25;;13321:1;13311:35;;13326:18;;:::i;:::-;13311:35;13368:1;13365;13361:9;13356:14;;13191:185;;;;:::o;13382:181::-;13522:33;13518:1;13510:6;13506:14;13499:57;13382:181;:::o;13569:366::-;13711:3;13732:67;13796:2;13791:3;13732:67;:::i;:::-;13725:74;;13808:93;13897:3;13808:93;:::i;:::-;13926:2;13921:3;13917:12;13910:19;;13569:366;;;:::o;13941:419::-;14107:4;14145:2;14134:9;14130:18;14122:26;;14194:9;14188:4;14184:20;14180:1;14169:9;14165:17;14158:47;14222:131;14348:4;14222:131;:::i;:::-;14214:139;;13941:419;;;:::o;14366:166::-;14506:18;14502:1;14494:6;14490:14;14483:42;14366:166;:::o;14538:366::-;14680:3;14701:67;14765:2;14760:3;14701:67;:::i;:::-;14694:74;;14777:93;14866:3;14777:93;:::i;:::-;14895:2;14890:3;14886:12;14879:19;;14538:366;;;:::o;14910:419::-;15076:4;15114:2;15103:9;15099:18;15091:26;;15163:9;15157:4;15153:20;15149:1;15138:9;15134:17;15127:47;15191:131;15317:4;15191:131;:::i;:::-;15183:139;;14910:419;;;:::o;15335:332::-;15456:4;15494:2;15483:9;15479:18;15471:26;;15507:71;15575:1;15564:9;15560:17;15551:6;15507:71;:::i;:::-;15588:72;15656:2;15645:9;15641:18;15632:6;15588:72;:::i;:::-;15335:332;;;;;:::o;15673:182::-;15813:34;15809:1;15801:6;15797:14;15790:58;15673:182;:::o;15861:366::-;16003:3;16024:67;16088:2;16083:3;16024:67;:::i;:::-;16017:74;;16100:93;16189:3;16100:93;:::i;:::-;16218:2;16213:3;16209:12;16202:19;;15861:366;;;:::o;16233:419::-;16399:4;16437:2;16426:9;16422:18;16414:26;;16486:9;16480:4;16476:20;16472:1;16461:9;16457:17;16450:47;16514:131;16640:4;16514:131;:::i;:::-;16506:139;;16233:419;;;:::o;16658:442::-;16807:4;16845:2;16834:9;16830:18;16822:26;;16858:71;16926:1;16915:9;16911:17;16902:6;16858:71;:::i;:::-;16939:72;17007:2;16996:9;16992:18;16983:6;16939:72;:::i;:::-;17021;17089:2;17078:9;17074:18;17065:6;17021:72;:::i;:::-;16658:442;;;;;;:::o;17106:90::-;17140:7;17183:5;17176:13;17169:21;17158:32;;17106:90;;;:::o;17202:116::-;17272:21;17287:5;17272:21;:::i;:::-;17265:5;17262:32;17252:60;;17308:1;17305;17298:12;17252:60;17202:116;:::o;17324:137::-;17378:5;17409:6;17403:13;17394:22;;17425:30;17449:5;17425:30;:::i;:::-;17324:137;;;;:::o;17467:345::-;17534:6;17583:2;17571:9;17562:7;17558:23;17554:32;17551:119;;;17589:79;;:::i;:::-;17551:119;17709:1;17734:61;17787:7;17778:6;17767:9;17763:22;17734:61;:::i;:::-;17724:71;;17680:125;17467:345;;;;:::o;17818:229::-;17958:34;17954:1;17946:6;17942:14;17935:58;18027:12;18022:2;18014:6;18010:15;18003:37;17818:229;:::o;18053:366::-;18195:3;18216:67;18280:2;18275:3;18216:67;:::i;:::-;18209:74;;18292:93;18381:3;18292:93;:::i;:::-;18410:2;18405:3;18401:12;18394:19;;18053:366;;;:::o;18425:419::-;18591:4;18629:2;18618:9;18614:18;18606:26;;18678:9;18672:4;18668:20;18664:1;18653:9;18649:17;18642:47;18706:131;18832:4;18706:131;:::i;:::-;18698:139;;18425:419;;;:::o;18850:225::-;18990:34;18986:1;18978:6;18974:14;18967:58;19059:8;19054:2;19046:6;19042:15;19035:33;18850:225;:::o;19081:366::-;19223:3;19244:67;19308:2;19303:3;19244:67;:::i;:::-;19237:74;;19320:93;19409:3;19320:93;:::i;:::-;19438:2;19433:3;19429:12;19422:19;;19081:366;;;:::o;19453:419::-;19619:4;19657:2;19646:9;19642:18;19634:26;;19706:9;19700:4;19696:20;19692:1;19681:9;19677:17;19670:47;19734:131;19860:4;19734:131;:::i;:::-;19726:139;;19453:419;;;:::o;19878:98::-;19929:6;19963:5;19957:12;19947:22;;19878:98;;;:::o;19982:147::-;20083:11;20120:3;20105:18;;19982:147;;;;:::o;20135:307::-;20203:1;20213:113;20227:6;20224:1;20221:13;20213:113;;;20312:1;20307:3;20303:11;20297:18;20293:1;20288:3;20284:11;20277:39;20249:2;20246:1;20242:10;20237:15;;20213:113;;;20344:6;20341:1;20338:13;20335:101;;;20424:1;20415:6;20410:3;20406:16;20399:27;20335:101;20184:258;20135:307;;;:::o;20448:373::-;20552:3;20580:38;20612:5;20580:38;:::i;:::-;20634:88;20715:6;20710:3;20634:88;:::i;:::-;20627:95;;20731:52;20776:6;20771:3;20764:4;20757:5;20753:16;20731:52;:::i;:::-;20808:6;20803:3;20799:16;20792:23;;20556:265;20448:373;;;;:::o;20827:271::-;20957:3;20979:93;21068:3;21059:6;20979:93;:::i;:::-;20972:100;;21089:3;21082:10;;20827:271;;;;:::o;21104:179::-;21244:31;21240:1;21232:6;21228:14;21221:55;21104:179;:::o;21289:366::-;21431:3;21452:67;21516:2;21511:3;21452:67;:::i;:::-;21445:74;;21528:93;21617:3;21528:93;:::i;:::-;21646:2;21641:3;21637:12;21630:19;;21289:366;;;:::o;21661:419::-;21827:4;21865:2;21854:9;21850:18;21842:26;;21914:9;21908:4;21904:20;21900:1;21889:9;21885:17;21878:47;21942:131;22068:4;21942:131;:::i;:::-;21934:139;;21661:419;;;:::o;22086:99::-;22138:6;22172:5;22166:12;22156:22;;22086:99;;;:::o;22191:102::-;22232:6;22283:2;22279:7;22274:2;22267:5;22263:14;22259:28;22249:38;;22191:102;;;:::o;22299:364::-;22387:3;22415:39;22448:5;22415:39;:::i;:::-;22470:71;22534:6;22529:3;22470:71;:::i;:::-;22463:78;;22550:52;22595:6;22590:3;22583:4;22576:5;22572:16;22550:52;:::i;:::-;22627:29;22649:6;22627:29;:::i;:::-;22622:3;22618:39;22611:46;;22391:272;22299:364;;;;:::o;22669:313::-;22782:4;22820:2;22809:9;22805:18;22797:26;;22869:9;22863:4;22859:20;22855:1;22844:9;22840:17;22833:47;22897:78;22970:4;22961:6;22897:78;:::i;:::-;22889:86;;22669:313;;;;:::o
Swarm Source
ipfs://6b3598f5d3f451e974f8c80054cf545a1509106b4967db45c98c790ed1f0f387
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.