More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 112 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw All | 16473773 | 584 days ago | IN | 0 ETH | 0.0009029 | ||||
Withdraw All | 16434525 | 590 days ago | IN | 0 ETH | 0.0014205 | ||||
Withdraw All | 16425276 | 591 days ago | IN | 0 ETH | 0.00096904 | ||||
Withdraw All | 16386672 | 596 days ago | IN | 0 ETH | 0.00150307 | ||||
Withdraw All | 16372312 | 598 days ago | IN | 0 ETH | 0.0017858 | ||||
Withdraw All | 16360994 | 600 days ago | IN | 0 ETH | 0.00100025 | ||||
Withdraw All | 16357419 | 600 days ago | IN | 0 ETH | 0.00124283 | ||||
Withdraw All | 16339680 | 603 days ago | IN | 0 ETH | 0.0010693 | ||||
Withdraw All | 16301264 | 608 days ago | IN | 0 ETH | 0.00173147 | ||||
Withdraw All | 16301263 | 608 days ago | IN | 0 ETH | 0.00175751 | ||||
Withdraw All | 16269791 | 613 days ago | IN | 0 ETH | 0.00073981 | ||||
Withdraw All | 16252345 | 615 days ago | IN | 0 ETH | 0.00098235 | ||||
Withdraw All | 16236500 | 617 days ago | IN | 0 ETH | 0.00109345 | ||||
Withdraw All | 16233804 | 618 days ago | IN | 0 ETH | 0.00131235 | ||||
Withdraw All | 16233410 | 618 days ago | IN | 0 ETH | 0.00158582 | ||||
Withdraw All | 16233229 | 618 days ago | IN | 0 ETH | 0.0011706 | ||||
Withdraw All | 16232177 | 618 days ago | IN | 0 ETH | 0.00087332 | ||||
Withdraw All | 16232158 | 618 days ago | IN | 0 ETH | 0.00112723 | ||||
Withdraw All | 16229582 | 618 days ago | IN | 0 ETH | 0.00110321 | ||||
Withdraw All | 16228821 | 618 days ago | IN | 0 ETH | 0.00107434 | ||||
Withdraw All | 16228613 | 618 days ago | IN | 0 ETH | 0.00130648 | ||||
Withdraw All | 16228402 | 618 days ago | IN | 0 ETH | 0.00145623 | ||||
Withdraw All | 16228337 | 618 days ago | IN | 0 ETH | 0.00185012 | ||||
Withdraw All | 16228279 | 618 days ago | IN | 0 ETH | 0.00197308 | ||||
Deposit | 16228264 | 618 days ago | IN | 0 ETH | 0.00207406 |
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 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
610120604052620f42406006553480156200001957600080fd5b50604051620014de380380620014de8339810160408190526200003c91620000df565b62000047336200008f565b600180556200005a836201518062000147565b60c0526200006c826201518062000147565b60e0526001600160a01b03909416608052505060ff1660a0526101005262000175565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600060a08688031215620000f857600080fd5b85516001600160a01b03811681146200011057600080fd5b602087015190955060ff811681146200012857600080fd5b6040870151606088015160809098015196999198509695945092505050565b60008160001904831182151516156200017057634e487b7160e01b600052601160045260246000fd5b500290565b60805160a05160c05160e051610100516112d06200020e600039600081816102bf01526107200152600081816101410152818161055001526105b30152600081816102060152818161057d01528181610e0901528181610e3101528181610eab0152610edb0152600081816101b40152610ad3015260008181610301015281816104680152818161085d015261095c01526112d06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063853828b6116100b8578063ef40a6701161007c578063ef40a67014610291578063f0316bc8146102ba578063f2fde38b146102e1578063fb468ac3146102f4578063fc0c546a146102fc578063ff50abdc1461032357600080fd5b8063853828b6146102285780638da5cb5b1461023057806398807d8414610255578063b6b55f2514610275578063ee947a7c1461028857600080fd5b806348c9eaaf116100ff57806348c9eaaf146101af5780635faa65ff146101e8578063715018a6146101f157806371b0cbfa146101f95780638005a7de1461020157600080fd5b80631ada70a81461013c5780631d62ebd9146101765780632e1a7d4d1461018957806330bfb9bb1461019e578063372500ab146101a7575b600080fd5b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b610163610184366004611115565b61032b565b61019c610197366004611145565b61033c565b005b61016360025481565b61019c6104d0565b6101d67f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161016d565b61016360045481565b61019c6104da565b61019c6104ec565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b61019c61060c565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161016d565b610163610263366004611115565b60076020526000908152604090205481565b61019c610283366004611145565b6106cb565b61016360035481565b61016361029f366004611115565b6001600160a01b031660009081526007602052604090205490565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b61019c6102ef366004611115565b6108c6565b61019c61093c565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b600554610163565b600061033682610a4c565b92915050565b610344610b17565b600081116103995760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e203000000060448201526064015b60405180910390fd5b336000908152600760205260409020548111156103f85760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e7420686967686572207468616e207374616b6564416d6f756e74006044820152606401610390565b610400610b71565b336000908152600860205260409020541561041d5761041d610bb0565b806005600082825461042f9190611174565b90915550503360009081526007602052604081208054839290610453908490611174565b9091555061048f9050335b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083610c53565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a26104cd60018055565b50565b6104d8610bb0565b565b6104e2610cbb565b6104d86000610d15565b6104f4610cbb565b600254156105445760405162461bcd60e51b815260206004820152601b60248201527f5374616b696e672068617320616c7265616479207374617274656400000000006044820152606401610390565b426002819055610575907f00000000000000000000000000000000000000000000000000000000000000009061118b565b6003556105a27f00000000000000000000000000000000000000000000000000000000000000004261118b565b6004819055600254604080519182527f000000000000000000000000000000000000000000000000000000000000000060208301528101919091527f0cdba3fb0a2020e0c9dc500b2679007a9c91cfcf35acab0eb46766c1200b42cd9060600160405180910390a1565b610614610b17565b61061c610b71565b336000908152600860205260409020541561063957610639610bb0565b33600090815260096020908152604080832083905560079091528120546005805491929091610669908490611174565b909155505033600081815260076020526040812080549190559061068c9061045e565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2506104d860018055565b60045415806106db575042600454115b61071e5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99c81c195c9a5bd908195b99195960621b6044820152606401610390565b7f00000000000000000000000000000000000000000000000000000000000000008160055461074d919061118b565b111561079b5760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74207374616b65642065786365656473204d61785374616b6500006044820152606401610390565b600081116107eb5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610390565b33600090815260096020526040902054610812573360009081526009602052604090204290555b61081a610b71565b336000908152600760205260408120805483929061083990849061118b565b925050819055508060056000828254610852919061118b565b9091555061088d90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316333084610d65565b60405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020015b60405180910390a250565b6108ce610cbb565b6001600160a01b0381166109335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610390565b6104cd81610d15565b610944610cbb565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf91906111a3565b90506000600554826109e19190611174565b905060008111610a335760405162461bcd60e51b815260206004820152601f60248201527f4e6f20726573696475616c2042616c616e636520746f207769746864726177006044820152606401610390565b610a4861045e6000546001600160a01b031690565b5050565b600060025460001480610a7557506001600160a01b038216600090815260076020526040902054155b15610a8257506000919050565b6001600160a01b038216600090815260086020526040902054600654610aa99060646111bc565b610ab284610da3565b6001600160a01b038516600090815260076020526040902054610af99060ff7f000000000000000000000000000000000000000000000000000000000000000016906111bc565b610b0391906111bc565b610b0d91906111db565b610336919061118b565b60026001541415610b6a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610390565b6002600155565b610b7a33610a4c565b33600090815260086020526040902055600454421015610b9a5742610b9e565b6004545b33600090815260096020526040902055565b610bb8610b71565b3360009081526008602052604090205480610c085760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610390565b33600081815260086020526040812055610c219061045e565b60405181815233907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4906020016108bb565b6040516001600160a01b038316602482015260448101829052610cb690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610f23565b505050565b6000546001600160a01b031633146104d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610d9d9085906323b872dd60e01b90608401610c7f565b50505050565b6001600160a01b0381166000908152600960205260408120546002546004549110908290421015610e7a5781610df1576001600160a01b038416600090815260096020526040902054610df5565b6002545b90506000610e038242611174565b610e2d907f0000000000000000000000000000000000000000000000000000000000000000611174565b90507f0000000000000000000000000000000000000000000000000000000000000000610e5a8282611174565b600654610e6791906111bc565b610e7191906111db565b95945050505050565b81610ed4576001600160a01b038416600090815260096020526040902054600454610ea59190611174565b610ecf907f0000000000000000000000000000000000000000000000000000000000000000611174565b610ed7565b60005b90507f0000000000000000000000000000000000000000000000000000000000000000610f048282611174565b600654610f1191906111bc565b610f1b91906111db565b949350505050565b6000610f78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610ff59092919063ffffffff16565b805190915015610cb65780806020019051810190610f9691906111fd565b610cb65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610390565b6060610f1b848460008585600080866001600160a01b0316858760405161101c919061124b565b60006040518083038185875af1925050503d8060008114611059576040519150601f19603f3d011682016040523d82523d6000602084013e61105e565b606091505b509150915061106f8783838761107a565b979650505050505050565b606083156110e65782516110df576001600160a01b0385163b6110df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610390565b5081610f1b565b610f1b83838151156110fb5781518083602001fd5b8060405162461bcd60e51b81526004016103909190611267565b60006020828403121561112757600080fd5b81356001600160a01b038116811461113e57600080fd5b9392505050565b60006020828403121561115757600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156111865761118661115e565b500390565b6000821982111561119e5761119e61115e565b500190565b6000602082840312156111b557600080fd5b5051919050565b60008160001904831182151516156111d6576111d661115e565b500290565b6000826111f857634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561120f57600080fd5b8151801515811461113e57600080fd5b60005b8381101561123a578181015183820152602001611222565b83811115610d9d5750506000910152565b6000825161125d81846020870161121f565b9190910192915050565b602081526000825180602084015261128681604085016020870161121f565b601f01601f1916919091016040019291505056fea2646970667358221220b008a844b4c9a98605a27834722de7d14828fabe606e00555334001f9a0fb81764736f6c634300080a00330000000000000000000000006a6aa13393b7d1100c00a57c76c39e8b6c8350410000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011c37937e08000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c8063853828b6116100b8578063ef40a6701161007c578063ef40a67014610291578063f0316bc8146102ba578063f2fde38b146102e1578063fb468ac3146102f4578063fc0c546a146102fc578063ff50abdc1461032357600080fd5b8063853828b6146102285780638da5cb5b1461023057806398807d8414610255578063b6b55f2514610275578063ee947a7c1461028857600080fd5b806348c9eaaf116100ff57806348c9eaaf146101af5780635faa65ff146101e8578063715018a6146101f157806371b0cbfa146101f95780638005a7de1461020157600080fd5b80631ada70a81461013c5780631d62ebd9146101765780632e1a7d4d1461018957806330bfb9bb1461019e578063372500ab146101a7575b600080fd5b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b610163610184366004611115565b61032b565b61019c610197366004611145565b61033c565b005b61016360025481565b61019c6104d0565b6101d67f000000000000000000000000000000000000000000000000000000000000006481565b60405160ff909116815260200161016d565b61016360045481565b61019c6104da565b61019c6104ec565b6101637f00000000000000000000000000000000000000000000000000000000004f1a0081565b61019c61060c565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161016d565b610163610263366004611115565b60076020526000908152604090205481565b61019c610283366004611145565b6106cb565b61016360035481565b61016361029f366004611115565b6001600160a01b031660009081526007602052604090205490565b6101637f0000000000000000000000000000000000000000000000000011c37937e0800081565b61019c6102ef366004611115565b6108c6565b61019c61093c565b61023d7f0000000000000000000000006a6aa13393b7d1100c00a57c76c39e8b6c83504181565b600554610163565b600061033682610a4c565b92915050565b610344610b17565b600081116103995760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e203000000060448201526064015b60405180910390fd5b336000908152600760205260409020548111156103f85760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e7420686967686572207468616e207374616b6564416d6f756e74006044820152606401610390565b610400610b71565b336000908152600860205260409020541561041d5761041d610bb0565b806005600082825461042f9190611174565b90915550503360009081526007602052604081208054839290610453908490611174565b9091555061048f9050335b6001600160a01b037f0000000000000000000000006a6aa13393b7d1100c00a57c76c39e8b6c835041169083610c53565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a26104cd60018055565b50565b6104d8610bb0565b565b6104e2610cbb565b6104d86000610d15565b6104f4610cbb565b600254156105445760405162461bcd60e51b815260206004820152601b60248201527f5374616b696e672068617320616c7265616479207374617274656400000000006044820152606401610390565b426002819055610575907f00000000000000000000000000000000000000000000000000000000000000009061118b565b6003556105a27f00000000000000000000000000000000000000000000000000000000004f1a004261118b565b6004819055600254604080519182527f000000000000000000000000000000000000000000000000000000000000000060208301528101919091527f0cdba3fb0a2020e0c9dc500b2679007a9c91cfcf35acab0eb46766c1200b42cd9060600160405180910390a1565b610614610b17565b61061c610b71565b336000908152600860205260409020541561063957610639610bb0565b33600090815260096020908152604080832083905560079091528120546005805491929091610669908490611174565b909155505033600081815260076020526040812080549190559061068c9061045e565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2506104d860018055565b60045415806106db575042600454115b61071e5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99c81c195c9a5bd908195b99195960621b6044820152606401610390565b7f0000000000000000000000000000000000000000000000000011c37937e080008160055461074d919061118b565b111561079b5760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74207374616b65642065786365656473204d61785374616b6500006044820152606401610390565b600081116107eb5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610390565b33600090815260096020526040902054610812573360009081526009602052604090204290555b61081a610b71565b336000908152600760205260408120805483929061083990849061118b565b925050819055508060056000828254610852919061118b565b9091555061088d90507f0000000000000000000000006a6aa13393b7d1100c00a57c76c39e8b6c8350416001600160a01b0316333084610d65565b60405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020015b60405180910390a250565b6108ce610cbb565b6001600160a01b0381166109335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610390565b6104cd81610d15565b610944610cbb565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000006a6aa13393b7d1100c00a57c76c39e8b6c8350416001600160a01b0316906370a0823190602401602060405180830381865afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf91906111a3565b90506000600554826109e19190611174565b905060008111610a335760405162461bcd60e51b815260206004820152601f60248201527f4e6f20726573696475616c2042616c616e636520746f207769746864726177006044820152606401610390565b610a4861045e6000546001600160a01b031690565b5050565b600060025460001480610a7557506001600160a01b038216600090815260076020526040902054155b15610a8257506000919050565b6001600160a01b038216600090815260086020526040902054600654610aa99060646111bc565b610ab284610da3565b6001600160a01b038516600090815260076020526040902054610af99060ff7f000000000000000000000000000000000000000000000000000000000000006416906111bc565b610b0391906111bc565b610b0d91906111db565b610336919061118b565b60026001541415610b6a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610390565b6002600155565b610b7a33610a4c565b33600090815260086020526040902055600454421015610b9a5742610b9e565b6004545b33600090815260096020526040902055565b610bb8610b71565b3360009081526008602052604090205480610c085760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610390565b33600081815260086020526040812055610c219061045e565b60405181815233907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4906020016108bb565b6040516001600160a01b038316602482015260448101829052610cb690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610f23565b505050565b6000546001600160a01b031633146104d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610d9d9085906323b872dd60e01b90608401610c7f565b50505050565b6001600160a01b0381166000908152600960205260408120546002546004549110908290421015610e7a5781610df1576001600160a01b038416600090815260096020526040902054610df5565b6002545b90506000610e038242611174565b610e2d907f00000000000000000000000000000000000000000000000000000000004f1a00611174565b90507f00000000000000000000000000000000000000000000000000000000004f1a00610e5a8282611174565b600654610e6791906111bc565b610e7191906111db565b95945050505050565b81610ed4576001600160a01b038416600090815260096020526040902054600454610ea59190611174565b610ecf907f00000000000000000000000000000000000000000000000000000000004f1a00611174565b610ed7565b60005b90507f00000000000000000000000000000000000000000000000000000000004f1a00610f048282611174565b600654610f1191906111bc565b610f1b91906111db565b949350505050565b6000610f78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610ff59092919063ffffffff16565b805190915015610cb65780806020019051810190610f9691906111fd565b610cb65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610390565b6060610f1b848460008585600080866001600160a01b0316858760405161101c919061124b565b60006040518083038185875af1925050503d8060008114611059576040519150601f19603f3d011682016040523d82523d6000602084013e61105e565b606091505b509150915061106f8783838761107a565b979650505050505050565b606083156110e65782516110df576001600160a01b0385163b6110df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610390565b5081610f1b565b610f1b83838151156110fb5781518083602001fd5b8060405162461bcd60e51b81526004016103909190611267565b60006020828403121561112757600080fd5b81356001600160a01b038116811461113e57600080fd5b9392505050565b60006020828403121561115757600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156111865761118661115e565b500390565b6000821982111561119e5761119e61115e565b500190565b6000602082840312156111b557600080fd5b5051919050565b60008160001904831182151516156111d6576111d661115e565b500290565b6000826111f857634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561120f57600080fd5b8151801515811461113e57600080fd5b60005b8381101561123a578181015183820152602001611222565b83811115610d9d5750506000910152565b6000825161125d81846020870161121f565b9190910192915050565b602081526000825180602084015261128681604085016020870161121f565b601f01601f1916919091016040019291505056fea2646970667358221220b008a844b4c9a98605a27834722de7d14828fabe606e00555334001f9a0fb81764736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006a6aa13393b7d1100c00a57c76c39e8b6c8350410000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011c37937e08000
-----Decoded View---------------
Arg [0] : _token (address): 0x6A6AA13393B7d1100c00a57c76c39e8B6C835041
Arg [1] : _fixedAPY (uint8): 100
Arg [2] : _durationInDays (uint256): 60
Arg [3] : _lockDurationInDays (uint256): 0
Arg [4] : _maxAmountStaked (uint256): 5000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000006a6aa13393b7d1100c00a57c76c39e8b6c835041
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [2] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000011c37937e08000
Deployed Bytecode Sourcemap
29485:9494:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29704:36;;;;;;;;160:25:1;;;148:2;133:18;29704:36:0;;;;;;;;35782:174;;;;;;:::i;:::-;;:::i;32908:550::-;;;;;;:::i;:::-;;:::i;:::-;;29788:23;;;;;;36097:76;;;:::i;29620:31::-;;;;;;;;844:4:1;832:17;;;814:36;;802:2;787:18;29620:31:0;672:184:1;29849:21:0;;;;;;24898:103;;;:::i;30921:349::-;;;:::i;29660:37::-;;;;;33758:474;;;:::i;24250:87::-;24296:7;24323:6;-1:-1:-1;;;;;24323:6:0;24250:87;;;-1:-1:-1;;;;;1025:32:1;;;1007:51;;995:2;980:18;24250:87:0;861:203:1;29950:38:0;;;;;;:::i;:::-;;;;;;;;;;;;;;31821:715;;;;;;:::i;:::-;;:::i;29818:24::-;;;;;;35082:167;;;;;;:::i;:::-;-1:-1:-1;;;;;35222:19:0;35193:4;35222:19;;;:6;:19;;;;;;;35082:167;29747:32;;;;;25156:201;;;;;;:::i;:::-;;:::i;34520:307::-;;;:::i;29582:29::-;;;;;35435:102;35517:12;;35435:102;;35782:174;35889:4;35918:30;35936:11;35918:17;:30::i;:::-;35911:37;35782:174;-1:-1:-1;;35782:174:0:o;32908:550::-;2345:21;:19;:21::i;:::-;33000:1:::1;32991:6;:10;32983:52;;;::::0;-1:-1:-1;;;32983:52:0;;1493:2:1;32983:52:0::1;::::0;::::1;1475:21:1::0;1532:2;1512:18;;;1505:30;1571:31;1551:18;;;1544:59;1620:18;;32983:52:0::1;;;;;;;;;22881:10:::0;33078:20:::1;::::0;;;:6:::1;:20;::::0;;;;;33068:30;::::1;;33046:111;;;::::0;-1:-1:-1;;;33046:111:0;;1851:2:1;33046:111:0::1;::::0;::::1;1833:21:1::0;1890:2;1870:18;;;1863:30;1929:33;1909:18;;;1902:61;1980:18;;33046:111:0::1;1649:355:1::0;33046:111:0::1;33170:16;:14;:16::i;:::-;22881:10:::0;33233:1:::1;33201:29:::0;;;:15:::1;:29;::::0;;;;;:33;33197:81:::1;;33251:15;:13;:15::i;:::-;33304:6;33288:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;22881:10:0;33321:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;;33345:6;;33321:20;:30:::1;::::0;33345:6;;33321:30:::1;:::i;:::-;::::0;;;-1:-1:-1;33362:40:0::1;::::0;-1:-1:-1;22881:10:0;33381:12:::1;-1:-1:-1::0;;;;;33362:5:0::1;:18;::::0;33395:6;33362:18:::1;:40::i;:::-;33420:30;::::0;160:25:1;;;22881:10:0;;33420:30:::1;::::0;148:2:1;133:18;33420:30:0::1;;;;;;;2389:20:::0;1783:1;2909:22;;2726:213;2389:20;32908:550;:::o;36097:76::-;36150:15;:13;:15::i;:::-;36097:76::o;24898:103::-;24136:13;:11;:13::i;:::-;24963:30:::1;24990:1;24963:18;:30::i;30921:349::-:0;24136:13;:11;:13::i;:::-;30992:11:::1;::::0;:16;30984:56:::1;;;::::0;-1:-1:-1;;;30984:56:0;;2473:2:1;30984:56:0::1;::::0;::::1;2455:21:1::0;2512:2;2492:18;;;2485:30;2551:29;2531:18;;;2524:57;2598:18;;30984:56:0::1;2271:351:1::0;30984:56:0::1;31065:15;31051:11;:29:::0;;;31106:32:::1;::::0;31124:14:::1;::::0;31106:32:::1;:::i;:::-;31091:12;:47:::0;31161:33:::1;31179:15;31161;:33;:::i;:::-;31149:9;:45:::0;;;31223:11:::1;::::0;31210:52:::1;::::0;;2962:25:1;;;31236:14:0::1;3018:2:1::0;3003:18;;2996:34;3046:18;;3039:34;;;;31210:52:0::1;::::0;2950:2:1;2935:18;31210:52:0::1;;;;;;;30921:349::o:0;33758:474::-;2345:21;:19;:21::i;:::-;33825:16:::1;:14;:16::i;:::-;22881:10:::0;33888:1:::1;33856:29:::0;;;:15:::1;:29;::::0;;;;;:33;33852:81:::1;;33906:15;:13;:15::i;:::-;22881:10:::0;33976:1:::1;33945:28:::0;;;:14:::1;:28;::::0;;;;;;;:32;;;34004:6:::1;:20:::0;;;;;;33988:12:::1;:36:::0;;34004:20;;33988:12;;:36:::1;::::0;34004:20;;33988:36:::1;:::i;:::-;::::0;;;-1:-1:-1;;22881:10:0;34035:18:::1;34056:20:::0;;;:6:::1;:20;::::0;;;;;;34087:24;;;34056:20;34122:47:::1;::::0;34141:12:::1;22801:98:::0;34122:47:::1;34187:37;::::0;160:25:1;;;22881:10:0;;34187:37:::1;::::0;148:2:1;133:18;34187:37:0::1;;;;;;;33812:420;2389:20:::0;1783:1;2909:22;;2726:213;31821:715;31902:9;;:14;;:45;;;31932:15;31920:9;;:27;31902:45;31880:115;;;;-1:-1:-1;;;31880:115:0;;3286:2:1;31880:115:0;;;3268:21:1;3325:2;3305:18;;;3298:30;-1:-1:-1;;;3344:18:1;;;3337:50;3404:18;;31880:115:0;3084:344:1;31880:115:0;32053:10;32043:6;32028:12;;:21;;;;:::i;:::-;:35;;32006:115;;;;-1:-1:-1;;;32006:115:0;;3635:2:1;32006:115:0;;;3617:21:1;3674:2;3654:18;;;3647:30;3713:32;3693:18;;;3686:60;3763:18;;32006:115:0;3433:354:1;32006:115:0;32149:1;32140:6;:10;32132:52;;;;-1:-1:-1;;;32132:52:0;;1493:2:1;32132:52:0;;;1475:21:1;1532:2;1512:18;;;1505:30;1571:31;1551:18;;;1544:59;1620:18;;32132:52:0;1291:353:1;32132:52:0;22881:10;32201:28;;;;:14;:28;;;;;;32197:112;;22881:10;32251:28;;;;:14;:28;;;;;32282:15;32251:46;;32197:112;32321:16;:14;:16::i;:::-;22881:10;32350:20;;;;:6;:20;;;;;:30;;32374:6;;32350:20;:30;;32374:6;;32350:30;:::i;:::-;;;;;;;;32407:6;32391:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;32424:59:0;;-1:-1:-1;32424:5:0;-1:-1:-1;;;;;32424:22:0;22881:10;32469:4;32476:6;32424:22;:59::i;:::-;32499:29;;160:25:1;;;22881:10:0;;32499:29;;148:2:1;133:18;32499:29:0;;;;;;;;31821:715;:::o;25156:201::-;24136:13;:11;:13::i;:::-;-1:-1:-1;;;;;25245:22:0;::::1;25237:73;;;::::0;-1:-1:-1;;;25237:73:0;;3994:2:1;25237:73:0::1;::::0;::::1;3976:21:1::0;4033:2;4013:18;;;4006:30;4072:34;4052:18;;;4045:62;-1:-1:-1;;;4123:18:1;;;4116:36;4169:19;;25237:73:0::1;3792:402:1::0;25237:73:0::1;25321:28;25340:8;25321:18;:28::i;34520:307::-:0;24136:13;:11;:13::i;:::-;34602:30:::1;::::0;-1:-1:-1;;;34602:30:0;;34626:4:::1;34602:30;::::0;::::1;1007:51:1::0;34587:12:0::1;::::0;34602:5:::1;-1:-1:-1::0;;;;;34602:15:0::1;::::0;::::1;::::0;980:18:1;;34602:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34587:45;;34643:20;34677:12;;34666:7;:24;;;;:::i;:::-;34643:47;;34727:1;34709:15;:19;34701:63;;;::::0;-1:-1:-1;;;34701:63:0;;4590:2:1;34701:63:0::1;::::0;::::1;4572:21:1::0;4629:2;4609:18;;;4602:30;4668:33;4648:18;;;4641:61;4719:18;;34701:63:0::1;4388:355:1::0;34701:63:0::1;34775:44;34794:7;24296::::0;24323:6;-1:-1:-1;;;;;24323:6:0;;24250:87;34775:44:::1;34574:253;;34520:307::o:0;36511:403::-;36609:4;36635:11;;36650:1;36635:16;:44;;;-1:-1:-1;;;;;;36655:19:0;;;;;;:6;:19;;;;;;:24;36635:44;36631:85;;;-1:-1:-1;36703:1:0;;36511:403;-1:-1:-1;36511:403:0:o;36631:85::-;-1:-1:-1;;;;;36878:28:0;;;;;;:15;:28;;;;;;36844:10;;:16;;36857:3;36844:16;:::i;:::-;36802:37;36827:11;36802:24;:37::i;:::-;-1:-1:-1;;;;;36751:19:0;;;;;;:6;:19;;;;;;:30;;;36773:8;36751:30;;;:::i;:::-;36750:89;;;;:::i;:::-;36749:112;;;;:::i;:::-;36748:158;;;;:::i;2425:293::-;1827:1;2559:7;;:19;;2551:63;;;;-1:-1:-1;;;2551:63:0;;5345:2:1;2551:63:0;;;5327:21:1;5384:2;5364:18;;;5357:30;5423:33;5403:18;;;5396:61;5474:18;;2551:63:0;5143:355:1;2551:63:0;1827:1;2692:7;:18;2425:293::o;38732:244::-;38809:31;22881:10;38809:17;:31::i;:::-;22881:10;38777:29;;;;:15;:29;;;;;:63;38902:9;;38883:15;:28;;38882:86;;38953:15;38882:86;;;38928:9;;38882:86;22881:10;38851:28;;;;:14;:28;;;;;:117;38732:244::o;38160:346::-;38204:16;:14;:16::i;:::-;22881:10;38233:19;38255:29;;;:15;:29;;;;;;38303:18;38295:47;;;;-1:-1:-1;;;38295:47:0;;5705:2:1;38295:47:0;;;5687:21:1;5744:2;5724:18;;;5717:30;-1:-1:-1;;;5763:18:1;;;5756:46;5819:18;;38295:47:0;5503:340:1;38295:47:0;22881:10;38387:1;38355:29;;;:15;:29;;;;;:33;38399:48;;38418:12;22801:98;38399:48;38463:35;;160:25:1;;;22881:10:0;;38463:35;;148:2:1;133:18;38463:35:0;14:177:1;18332:211:0;18476:58;;-1:-1:-1;;;;;6040:32:1;;18476:58:0;;;6022:51:1;6089:18;;;6082:34;;;18449:86:0;;18469:5;;-1:-1:-1;;;18499:23:0;5995:18:1;;18476:58:0;;;;-1:-1:-1;;18476:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18476:58:0;-1:-1:-1;;;;;;18476:58:0;;;;;;;;;;18449:19;:86::i;:::-;18332:211;;;:::o;24415:132::-;24296:7;24323:6;-1:-1:-1;;;;;24323:6:0;22881:10;24479:23;24471:68;;;;-1:-1:-1;;;24471:68:0;;6329:2:1;24471:68:0;;;6311:21:1;;;6348:18;;;6341:30;6407:34;6387:18;;;6380:62;6459:18;;24471:68:0;6127:356:1;25517:191:0;25591:16;25610:6;;-1:-1:-1;;;;;25627:17:0;;;-1:-1:-1;;;;;;25627:17:0;;;;;;25660:40;;25610:6;;;;;;;25660:40;;25591:16;25660:40;25580:128;25517:191;:::o;18551:248::-;18722:68;;-1:-1:-1;;;;;6746:15:1;;;18722:68:0;;;6728:34:1;6798:15;;6778:18;;;6771:43;6830:18;;;6823:34;;;18695:96:0;;18715:5;;-1:-1:-1;;;18745:27:0;6663:18:1;;18722:68:0;6488:375:1;18695:96:0;18551:248;;;;:::o;37243:767::-;-1:-1:-1;;;;;37397:27:0;;37348:4;37397:27;;;:14;:27;;;;;;37383:11;;37464:9;;37383:41;-1:-1:-1;37383:41:0;37348:4;;37476:15;-1:-1:-1;37460:343:0;;;37520:5;:49;;-1:-1:-1;;;;;37542:27:0;;;;;;:14;:27;;;;;;37520:49;;;37528:11;;37520:49;37508:61;-1:-1:-1;37584:18:0;37641:27;37508:61;37641:15;:27;:::i;:::-;37605:64;;:15;:64;:::i;:::-;37584:85;-1:-1:-1;37776:15:0;37723:31;37584:85;37776:15;37723:31;:::i;:::-;37709:10;;:46;;;;:::i;:::-;37708:83;;;;:::i;:::-;37684:107;37243:767;-1:-1:-1;;;;;37243:767:0:o;37460:343::-;37825:5;:97;;-1:-1:-1;;;;;37894:27:0;;;;;;:14;:27;;;;;;37882:9;;:39;;37894:27;37882:39;:::i;:::-;37863:59;;:15;:59;:::i;:::-;37825:97;;;37846:1;37825:97;37813:109;-1:-1:-1;37987:15:0;37955:27;37813:109;37987:15;37955:27;:::i;:::-;37941:10;;:42;;;;:::i;:::-;37940:62;;;;:::i;:::-;37933:69;37243:767;-1:-1:-1;;;;37243:767:0:o;21399:716::-;21823:23;21849:69;21877:4;21849:69;;;;;;;;;;;;;;;;;21857:5;-1:-1:-1;;;;;21849:27:0;;;:69;;;;;:::i;:::-;21933:17;;21823:95;;-1:-1:-1;21933:21:0;21929:179;;22030:10;22019:30;;;;;;;;;;;;:::i;:::-;22011:85;;;;-1:-1:-1;;;22011:85:0;;7352:2:1;22011:85:0;;;7334:21:1;7391:2;7371:18;;;7364:30;7430:34;7410:18;;;7403:62;-1:-1:-1;;;7481:18:1;;;7474:40;7531:19;;22011:85:0;7150:406:1;6936:229:0;7073:12;7105:52;7127:6;7135:4;7141:1;7144:12;7073;8344;8358:23;8385:6;-1:-1:-1;;;;;8385:11:0;8404:5;8411:4;8385:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8343:73;;;;8434:69;8461:6;8469:7;8478:10;8490:12;8434:26;:69::i;:::-;8427:76;8056:455;-1:-1:-1;;;;;;;8056:455:0:o;10629:644::-;10814:12;10843:7;10839:427;;;10871:17;;10867:290;;-1:-1:-1;;;;;4474:19:0;;;11081:60;;;;-1:-1:-1;;;11081:60:0;;8712:2:1;11081:60:0;;;8694:21:1;8751:2;8731:18;;;8724:30;8790:31;8770:18;;;8763:59;8839:18;;11081:60:0;8510:353:1;11081:60:0;-1:-1:-1;11178:10:0;11171:17;;10839:427;11221:33;11229:10;11241:12;11976:17;;:21;11972:388;;12208:10;12202:17;12265:15;12252:10;12248:2;12244:19;12237:44;11972:388;12335:12;12328:20;;-1:-1:-1;;;12328:20:0;;;;;;;;:::i;196:286:1:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;350:23;;-1:-1:-1;;;;;402:31:1;;392:42;;382:70;;448:1;445;438:12;382:70;471:5;196:286;-1:-1:-1;;;196:286:1:o;487:180::-;546:6;599:2;587:9;578:7;574:23;570:32;567:52;;;615:1;612;605:12;567:52;-1:-1:-1;638:23:1;;487:180;-1:-1:-1;487:180:1:o;2009:127::-;2070:10;2065:3;2061:20;2058:1;2051:31;2101:4;2098:1;2091:15;2125:4;2122:1;2115:15;2141:125;2181:4;2209:1;2206;2203:8;2200:34;;;2214:18;;:::i;:::-;-1:-1:-1;2251:9:1;;2141:125::o;2627:128::-;2667:3;2698:1;2694:6;2691:1;2688:13;2685:39;;;2704:18;;:::i;:::-;-1:-1:-1;2740:9:1;;2627:128::o;4199:184::-;4269:6;4322:2;4310:9;4301:7;4297:23;4293:32;4290:52;;;4338:1;4335;4328:12;4290:52;-1:-1:-1;4361:16:1;;4199:184;-1:-1:-1;4199:184:1:o;4748:168::-;4788:7;4854:1;4850;4846:6;4842:14;4839:1;4836:21;4831:1;4824:9;4817:17;4813:45;4810:71;;;4861:18;;:::i;:::-;-1:-1:-1;4901:9:1;;4748:168::o;4921:217::-;4961:1;4987;4977:132;;5031:10;5026:3;5022:20;5019:1;5012:31;5066:4;5063:1;5056:15;5094:4;5091:1;5084:15;4977:132;-1:-1:-1;5123:9:1;;4921:217::o;6868:277::-;6935:6;6988:2;6976:9;6967:7;6963:23;6959:32;6956:52;;;7004:1;7001;6994:12;6956:52;7036:9;7030:16;7089:5;7082:13;7075:21;7068:5;7065:32;7055:60;;7111:1;7108;7101:12;7968:258;8040:1;8050:113;8064:6;8061:1;8058:13;8050:113;;;8140:11;;;8134:18;8121:11;;;8114:39;8086:2;8079:10;8050:113;;;8181:6;8178:1;8175:13;8172:48;;;-1:-1:-1;;8216:1:1;8198:16;;8191:27;7968:258::o;8231:274::-;8360:3;8398:6;8392:13;8414:53;8460:6;8455:3;8448:4;8440:6;8436:17;8414:53;:::i;:::-;8483:16;;;;;8231:274;-1:-1:-1;;8231:274:1:o;8868:383::-;9017:2;9006:9;8999:21;8980:4;9049:6;9043:13;9092:6;9087:2;9076:9;9072:18;9065:34;9108:66;9167:6;9162:2;9151:9;9147:18;9142:2;9134:6;9130:15;9108:66;:::i;:::-;9235:2;9214:15;-1:-1:-1;;9210:29:1;9195:45;;;;9242:2;9191:54;;8868:383;-1:-1:-1;;8868:383:1:o
Swarm Source
ipfs://b008a844b4c9a98605a27834722de7d14828fabe606e00555334001f9a0fb817
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.004374 | 81,272.0039 | $355.52 |
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.