Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 57 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19206453 | 293 days ago | IN | 0 ETH | 0.00423226 | ||||
Withdraw | 19206004 | 293 days ago | IN | 0 ETH | 0.0083416 | ||||
Deposit | 19206001 | 293 days ago | IN | 0 ETH | 0.00553654 | ||||
Deposit | 19205470 | 293 days ago | IN | 0 ETH | 0.00460519 | ||||
Withdraw | 19205465 | 293 days ago | IN | 0 ETH | 0.02025887 | ||||
Withdraw | 19204767 | 293 days ago | IN | 0 ETH | 0.03294858 | ||||
Withdraw | 19204758 | 293 days ago | IN | 0 ETH | 0.01344994 | ||||
Withdraw | 19204752 | 293 days ago | IN | 0 ETH | 0.00821911 | ||||
Withdraw | 19204748 | 293 days ago | IN | 0 ETH | 0.01204168 | ||||
Withdraw | 19204682 | 293 days ago | IN | 0 ETH | 0.01243279 | ||||
Deposit | 19203919 | 293 days ago | IN | 0 ETH | 0.00318273 | ||||
Deposit | 19203908 | 293 days ago | IN | 0 ETH | 0.00208211 | ||||
Deposit | 19203880 | 293 days ago | IN | 0 ETH | 0.00283239 | ||||
Deposit | 19203878 | 293 days ago | IN | 0 ETH | 0.02736861 | ||||
Withdraw | 19203830 | 293 days ago | IN | 0 ETH | 0.01277887 | ||||
Deposit | 19203813 | 293 days ago | IN | 0 ETH | 0.02006865 | ||||
Deposit | 19203670 | 293 days ago | IN | 0 ETH | 0.01010295 | ||||
Withdraw | 19203659 | 293 days ago | IN | 0 ETH | 0.0067137 | ||||
Deposit | 19203644 | 293 days ago | IN | 0 ETH | 0.00914956 | ||||
Deposit | 19203583 | 293 days ago | IN | 0 ETH | 0.00300643 | ||||
Deposit | 19203574 | 293 days ago | IN | 0 ETH | 0.03898617 | ||||
Deposit | 19203545 | 293 days ago | IN | 0 ETH | 0.00662003 | ||||
Deposit | 19203540 | 293 days ago | IN | 0 ETH | 0.00341488 | ||||
Withdraw | 19203509 | 293 days ago | IN | 0 ETH | 0.00642454 | ||||
Deposit | 19203508 | 293 days ago | IN | 0 ETH | 0.00286234 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
_401k
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-11 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) //SPDX-License-Identifier: UNLICENSED 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; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: masterchef.sol pragma solidity ^0.8.0; interface token is IERC20 { function mint(address recipient, uint256 _amount) external; function burn(uint256 _amount) external ; function claimtokenRebase(address _address, uint256 amount) external; } contract _401k is Ownable(msg.sender),ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; uint256 USDCrewardDebt; // Reward debt. See explanation below. uint256 lastDepositTime; // Timestamp of the last deposit // // We do some fancy math here. Basically, any point in time, the amount of NFTs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accNFTPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accNFTPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 totalToken; uint256 allocPoint; // How many allocation points assigned to this pool. NFTs to distribute per block. uint256 lastRewardTime; // Last block time that NFTs distribution occurs. uint256 accNFTPerShare; // Accumulated NFTs per share, times 1e12. See below. uint256 accUSDCPerShare; // Accumulated NFTs per share, times 1e12. See below. } token public NFT = token(0x0a0Eee2Df7f5C575F353d3117aEf7Dab65757AFC); token public USDC = token(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); // NFT tokens created per block. uint256 public NFTPerSecond; uint256 public USDCPerSecond; uint256 public totalNFTdistributed = 0; uint256 public USDCdistributed = 0; // set a max NFT per second, which can never be higher than 1 per second uint256 public constant maUSDCPerSecond = 1e20; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block time when NFT mining starts. uint256 public immutable startTime; bool public withdrawable = false; uint256 public totalburn = 0; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); constructor( uint256 _NFTPerSecond, uint256 _USDCPerSecond, uint256 _startTime ) { NFTPerSecond = _NFTPerSecond; USDCPerSecond = _USDCPerSecond; startTime = _startTime; } function openWithdraw() external onlyOwner{ withdrawable = true; } function supplyRewards(uint256 _amount) external onlyOwner { totalNFTdistributed = totalNFTdistributed.add(_amount); NFT.transferFrom(msg.sender, address(this), _amount); } function closeWithdraw() external onlyOwner{ withdrawable = false; } // Update the given pool's NFT allocation point. Can only be called by the owner. function increaseAllocation(uint256 _pid, uint256 _allocPoint) internal { massUpdatePools(); totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo[_pid].allocPoint = poolInfo[_pid].allocPoint.add(_allocPoint); } function decreaseAllocation(uint256 _pid, uint256 _allocPoint) internal { massUpdatePools(); totalAllocPoint = totalAllocPoint.sub(_allocPoint); poolInfo[_pid].allocPoint = poolInfo[_pid].allocPoint.sub(_allocPoint); } function poolLength() external view returns (uint256) { return poolInfo.length; } // Changes NFT token reward per second, with a cap of maUSDC per second // Good practice to update pools without messing up the contract function setNFTPerSecond(uint256 _NFTPerSecond) external onlyOwner { require(_NFTPerSecond <= maUSDCPerSecond, "setNFTPerSecond: too many NFTs!"); // This MUST be done or pool rewards will be calculated with new NFT per second // This could unfairly punish small pools that dont have frequent deposits/withdraws/harvests massUpdatePools(); NFTPerSecond = _NFTPerSecond; } function setUSDCPerSecond(uint256 _USDCPerSecond) external onlyOwner { require(_USDCPerSecond <= maUSDCPerSecond, "setNFTPerSecond: too many NFTs!"); // This MUST be done or pool rewards will be calculated with new NFT per second // This could unfairly punish small pools that dont have frequent deposits/withdraws/harvests massUpdatePools(); USDCPerSecond = _USDCPerSecond; } function checkForDuplicate(IERC20 _lpToken) internal view { uint256 length = poolInfo.length; for (uint256 _pid = 0; _pid < length; _pid++) { require(poolInfo[_pid].lpToken != _lpToken, "add: pool already exists!!!!"); } } // Add a new lp to the pool. Can only be called by the owner. function add(uint256 _allocPoint, IERC20 _lpToken) external onlyOwner { checkForDuplicate(_lpToken); // ensure you cant add duplicate pools massUpdatePools(); uint256 lastRewardTime = block.timestamp > startTime ? block.timestamp : startTime; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({ lpToken: _lpToken, totalToken: 0, allocPoint: _allocPoint, lastRewardTime: lastRewardTime, accNFTPerShare: 0, accUSDCPerShare: 0 })); } // Update the given pool's NFT allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint) external onlyOwner { massUpdatePools(); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { _from = _from > startTime ? _from : startTime; if (_to < startTime) { return 0; } return _to - _from; } // View function to see pending NFTs on frontend. function pendingNFT(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accNFTPerShare = pool.accNFTPerShare; uint256 lpSupply = pool.totalToken; if (block.timestamp > pool.lastRewardTime && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp); uint256 NFTReward = multiplier.mul(NFTPerSecond).mul(pool.allocPoint).div(totalAllocPoint); accNFTPerShare = accNFTPerShare.add(NFTReward.mul(1e12).div(lpSupply)); } return user.amount.mul(accNFTPerShare).div(1e12).sub(user.rewardDebt); } function pendingUSDC(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accUSDCPerShare = pool.accUSDCPerShare; uint256 lpSupply = pool.totalToken; if (block.timestamp > pool.lastRewardTime && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp); uint256 USDCReward = multiplier.mul(USDCPerSecond).mul(pool.allocPoint).div(totalAllocPoint); accUSDCPerShare = accUSDCPerShare.add(USDCReward.mul(1e12).div(lpSupply)); } return (user.amount.mul(accUSDCPerShare).div(1e12).sub(user.USDCrewardDebt)).div(1e12); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTime) { return; } uint256 lpSupply = pool.totalToken; if (lpSupply == 0) { pool.lastRewardTime = block.timestamp; return; } uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp); uint256 NFTReward = multiplier.mul(NFTPerSecond).mul(pool.allocPoint).div(totalAllocPoint); uint256 USDCReward = multiplier.mul(USDCPerSecond).mul(pool.allocPoint).div(totalAllocPoint); pool.accNFTPerShare = pool.accNFTPerShare.add(NFTReward.mul(1e12).div(lpSupply)); pool.accUSDCPerShare = pool.accUSDCPerShare.add(USDCReward.mul(1e12).div(lpSupply)); pool.lastRewardTime = block.timestamp; } // Deposit LP tokens to MasterChef for NFT allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); uint256 pending = user.amount.mul(pool.accNFTPerShare).div(1e12).sub(user.rewardDebt); uint256 USDCpending = user.amount.mul(pool.accUSDCPerShare).div(1e12).sub(user.USDCrewardDebt); user.amount = user.amount.add(_amount); user.lastDepositTime = block.timestamp; pool.totalToken = pool.totalToken.add(_amount); user.rewardDebt = user.amount.mul(pool.accNFTPerShare).div(1e12); user.USDCrewardDebt = user.amount.mul(pool.accUSDCPerShare).div(1e12); USDCpending = USDCpending.div(1e12); if(pending > 0 || USDCpending >0) { token(address(pool.lpToken)).mint(address(msg.sender), pending); } if(_amount > 0) { pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); token(address(pool.lpToken)).burn(_amount); } emit Deposit(msg.sender, _pid, _amount); } function checkFeeUser(uint256 _pid) public view returns(uint256) { UserInfo storage user = userInfo[_pid][msg.sender]; if (block.timestamp < user.lastDepositTime + 2 days) { return 10; } else return 0; } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); require(withdrawable, "withdraw not opened"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accNFTPerShare).div(1e12).sub(user.rewardDebt); uint256 USDCpending = user.amount.mul(pool.accUSDCPerShare).div(1e12).sub(user.USDCrewardDebt); USDCpending = USDCpending.div(1e12); user.amount = user.amount.sub(_amount); pool.totalToken = pool.totalToken.sub(_amount); user.rewardDebt = user.amount.mul(pool.accNFTPerShare).div(1e12); user.USDCrewardDebt = user.amount.mul(pool.accUSDCPerShare).div(1e12); uint256 amountOut = _amount; uint256 fee = 0; if (block.timestamp < user.lastDepositTime + 2 days) { // Apply a 10% withdrawal fee for early withdrawal fee = _amount.mul(10).div(100); amountOut = _amount.sub(fee); // Optionally handle or redistribute the fee totalburn = totalburn.add(fee); } else { if(pending > 0 || USDCpending > 0) { NFT.mint(msg.sender, pending); USDC.transfer(msg.sender, USDCpending); } } token(address(pool.lpToken)).mint(address(msg.sender), amountOut); emit Withdraw(msg.sender, _pid, amountOut); } function updateRewards(token _NFT, token _USDC) external onlyOwner { USDC = _USDC; NFT = _NFT; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_NFTPerSecond","type":"uint256"},{"internalType":"uint256","name":"_USDCPerSecond","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"NFT","outputs":[{"internalType":"contract token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"contract token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDCPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDCdistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"checkFeeUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maUSDCPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingUSDC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"totalToken","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accNFTPerShare","type":"uint256"},{"internalType":"uint256","name":"accUSDCPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_NFTPerSecond","type":"uint256"}],"name":"setNFTPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_USDCPerSecond","type":"uint256"}],"name":"setUSDCPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"supplyRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFTdistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalburn","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":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract token","name":"_NFT","type":"address"},{"internalType":"contract token","name":"_USDC","type":"address"}],"name":"updateRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"USDCrewardDebt","type":"uint256"},{"internalType":"uint256","name":"lastDepositTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0604052600280546001600160a01b0319908116730a0eee2df7f5c575f353d3117aef7dab65757afc179091556003805490911673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481790555f60068190556007819055600a819055600b805460ff19169055600c55348015610074575f80fd5b506040516119db3803806119db83398101604081905261009391610126565b33806100b857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100c1816100d7565b5060018055600492909255600555608052610151565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f805f60608486031215610138575f80fd5b8351925060208401519150604084015190509250925092565b60805161184f61018c5f395f81816103500152818161066d0152818161069401528181610e7501528181610e9c0152610ec6015261184f5ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c8063630b5ba1116101145780638dbb1e3a116100a9578063ca6d7b6811610079578063ca6d7b6814610468578063e0dae72f1461047b578063e2bbb1581461048b578063f0fa77f61461049e578063f2fde38b146104a7575f80fd5b80638dbb1e3a146103d057806393f1a40b146103e3578063b143b4ed14610442578063bdfbe74f14610455575f80fd5b80637c0b8de2116100e45780637c0b8de21461037a578063845105e2146103a557806389a30271146103ad5780638da5cb5b146103c0575f80fd5b8063630b5ba11461033b578063715018a61461034357806378e979251461034b5780637b020dad14610372575f80fd5b80632377b2a81161018a578063501883011161015a57806350188301146102e557806351eb05a614610302578063526fb4b4146103155780635ee2d55414610328575f80fd5b80632377b2a8146102a35780632b8bbbe8146102b6578063441a3e70146102c957806346b828cb146102dc575f80fd5b806317caf6f1116101c557806317caf6f1146102755780631ab06ee51461027e5780631b1fdaa1146102915780631ca3127f1461029a575f80fd5b8063081e3eda146101f65780630a78d0391461020d5780630e37d36f146102165780631526fe271461022b575b5f80fd5b6008545b6040519081526020015b60405180910390f35b6101fa60045481565b61022961022436600461169e565b6104ba565b005b61023e6102393660046116d5565b6104f3565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610204565b6101fa600a5481565b61022961028c3660046116ec565b610541565b6101fa600c5481565b6101fa60065481565b6102296102b13660046116d5565b6105bd565b6102296102c436600461170c565b610651565b6102296102d73660046116ec565b610813565b6101fa60055481565b600b546102f29060ff1681565b6040519015158152602001610204565b6102296103103660046116d5565b610ba8565b6101fa61032336600461170c565b610cb1565b6102296103363660046116d5565b610da8565b610229610e16565b610229610e34565b6101fa7f000000000000000000000000000000000000000000000000000000000000000081565b610229610e47565b60025461038d906001600160a01b031681565b6040516001600160a01b039091168152602001610204565b610229610e5b565b60035461038d906001600160a01b031681565b5f546001600160a01b031661038d565b6101fa6103de3660046116ec565b610e72565b6104226103f136600461170c565b600960209081525f928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610204565b6102296104503660046116d5565b610f04565b6101fa61046336600461170c565b610f72565b6101fa6104763660046116d5565b61105e565b6101fa68056bc75e2d6310000081565b6102296104993660046116ec565b6110a0565b6101fa60075481565b6102296104b536600461172f565b6112ed565b6104c261132a565b600380546001600160a01b039283166001600160a01b03199182161790915560028054939092169216919091179055565b60088181548110610502575f80fd5b5f9182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909286565b61054961132a565b610551610e16565b80600883815481106105655761056561174a565b905f5260205f20906006020160020154600a546105829190611772565b61058c9190611785565b600a8190555080600883815481106105a6576105a661174a565b905f5260205f209060060201600201819055505050565b6105c561132a565b6006546105d29082611356565b6006556002546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303815f875af1158015610629573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064d9190611798565b5050565b61065961132a565b61066281611361565b61066a610e16565b5f7f000000000000000000000000000000000000000000000000000000000000000042116106b8577f00000000000000000000000000000000000000000000000000000000000000006106ba565b425b600a549091506106ca9084611356565b600a556040805160c0810182526001600160a01b0393841681525f60208201818152928201958652606082019384526080820181815260a0830182815260088054600181018255935292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600690930292830180546001600160a01b031916919097161790955591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee483015593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee582015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee682015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee782015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee890910155565b61081b6113fe565b5f6008838154811061082f5761082f61174a565b5f918252602080832086845260098252604080852033865290925292208054600690920290920192508311156108a15760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b60448201526064015b60405180910390fd5b600b5460ff166108e95760405162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc81b9bdd081bdc195b9959606a1b6044820152606401610898565b6108f284610ba8565b5f61092a826001015461092464e8d4a5100061091e8760040154875f015461145790919063ffffffff16565b90611462565b9061146d565b90505f610958836002015461092464e8d4a5100061091e8860050154885f015461145790919063ffffffff16565b90506109698164e8d4a51000611462565b8354909150610978908661146d565b83556001840154610989908661146d565b6001850155600484015483546109a99164e8d4a510009161091e91611457565b6001840155600584015483546109c99164e8d4a510009161091e91611457565b6002840155600383015485905f906109e4906202a300611785565b421015610a1f576109fb606461091e89600a611457565b9050610a07878261146d565b600c54909250610a179082611356565b600c55610b04565b5f841180610a2c57505f83115b15610b04576002546040516340c10f1960e01b8152336004820152602481018690526001600160a01b03909116906340c10f19906044015f604051808303815f87803b158015610a7a575f80fd5b505af1158015610a8c573d5f803e3d5ffd5b505060035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b03909116925063a9059cbb91506044016020604051808303815f875af1158015610ade573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b029190611798565b505b85546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f19906044015f604051808303815f87803b158015610b4c575f80fd5b505af1158015610b5e573d5f803e3d5ffd5b50506040518481528a92503391507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a350505050505061064d60018055565b5f60088281548110610bbc57610bbc61174a565b905f5260205f209060060201905080600301544211610bd9575050565b60018101545f819003610bf157504260039091015550565b5f610c00836003015442610e72565b90505f610c2c600a5461091e8660020154610c266004548761145790919063ffffffff16565b90611457565b90505f610c52600a5461091e8760020154610c266005548861145790919063ffffffff16565b9050610c75610c6a8561091e8564e8d4a51000611457565b600487015490611356565b6004860155610c9b610c908561091e8464e8d4a51000611457565b600587015490611356565b6005860155505042600390930192909255505050565b5f8060088481548110610cc657610cc661174a565b5f91825260208083208784526009825260408085206001600160a01b03891686529092529220600460069092029092019081015460018201546003830154929450909142118015610d1657508015155b15610d74575f610d2a856003015442610e72565b90505f610d50600a5461091e8860020154610c266004548761145790919063ffffffff16565b9050610d6f610d688461091e8464e8d4a51000611457565b8590611356565b935050505b610d9b836001015461092464e8d4a5100061091e86885f015461145790919063ffffffff16565b9450505050505b92915050565b610db061132a565b68056bc75e2d63100000811115610e095760405162461bcd60e51b815260206004820152601f60248201527f7365744e46545065725365636f6e643a20746f6f206d616e79204e46547321006044820152606401610898565b610e11610e16565b600555565b6008545f5b8181101561064d57610e2c81610ba8565b600101610e1b565b610e3c61132a565b610e455f611478565b565b610e4f61132a565b600b805460ff19169055565b610e6361132a565b600b805460ff19166001179055565b5f7f00000000000000000000000000000000000000000000000000000000000000008311610ec0577f0000000000000000000000000000000000000000000000000000000000000000610ec2565b825b92507f0000000000000000000000000000000000000000000000000000000000000000821015610ef357505f610da2565b610efd8383611772565b9392505050565b610f0c61132a565b68056bc75e2d63100000811115610f655760405162461bcd60e51b815260206004820152601f60248201527f7365744e46545065725365636f6e643a20746f6f206d616e79204e46547321006044820152606401610898565b610f6d610e16565b600455565b5f8060088481548110610f8757610f8761174a565b5f91825260208083208784526009825260408085206001600160a01b03891686529092529220600560069092029092019081015460018201546003830154929450909142118015610fd757508015155b1561102e575f610feb856003015442610e72565b90505f611011600a5461091e8860020154610c266005548761145790919063ffffffff16565b9050611029610d688461091e8464e8d4a51000611457565b935050505b610d9b64e8d4a5100061091e856002015461092464e8d4a5100061091e888a5f015461145790919063ffffffff16565b5f81815260096020908152604080832033845290915281206003810154611088906202a300611785565b4210156110985750600a92915050565b505f92915050565b6110a86113fe565b5f600883815481106110bc576110bc61174a565b5f91825260208083208684526009825260408085203386529092529220600690910290910191506110ec84610ba8565b5f611118826001015461092464e8d4a5100061091e8760040154875f015461145790919063ffffffff16565b90505f611146836002015461092464e8d4a5100061091e8860050154885f015461145790919063ffffffff16565b83549091506111559086611356565b8355426003840155600184015461116c9086611356565b60018501556004840154835461118c9164e8d4a510009161091e91611457565b6001840155600584015483546111ac9164e8d4a510009161091e91611457565b60028401556111c08164e8d4a51000611462565b90505f8211806111cf57505f81115b156112335783546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f19906044015f604051808303815f87803b15801561121c575f80fd5b505af115801561122e573d5f803e3d5ffd5b505050505b84156112a9578354611250906001600160a01b03163330886114c7565b8354604051630852cd8d60e31b8152600481018790526001600160a01b03909116906342966c68906024015f604051808303815f87803b158015611292575f80fd5b505af11580156112a4573d5f803e3d5ffd5b505050505b604051858152869033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505061064d60018055565b6112f561132a565b6001600160a01b03811661131e57604051631e4fbdf760e01b81525f6004820152602401610898565b61132781611478565b50565b5f546001600160a01b03163314610e455760405163118cdaa760e01b8152336004820152602401610898565b5f610efd8284611785565b6008545f5b818110156113f957826001600160a01b03166008828154811061138b5761138b61174a565b5f9182526020909120600690910201546001600160a01b0316036113f15760405162461bcd60e51b815260206004820152601c60248201527f6164643a20706f6f6c20616c72656164792065786973747321212121000000006044820152606401610898565b600101611366565b505050565b6002600154036114505760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610898565b6002600155565b5f610efd82846117b7565b5f610efd82846117ce565b5f610efd8284611772565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611521908590611527565b50505050565b5f61153b6001600160a01b03841683611588565b905080515f1415801561155f57508080602001905181019061155d9190611798565b155b156113f957604051635274afe760e01b81526001600160a01b0384166004820152602401610898565b6060610efd83835f845f80856001600160a01b031684866040516115ac91906117ed565b5f6040518083038185875af1925050503d805f81146115e6576040519150601f19603f3d011682016040523d82523d5f602084013e6115eb565b606091505b50915091506115fb868383611605565b9695505050505050565b60608261161a5761161582611661565b610efd565b815115801561163157506001600160a01b0384163b155b1561165a57604051639996b31560e01b81526001600160a01b0385166004820152602401610898565b5080610efd565b8051156116715780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114611327575f80fd5b5f80604083850312156116af575f80fd5b82356116ba8161168a565b915060208301356116ca8161168a565b809150509250929050565b5f602082840312156116e5575f80fd5b5035919050565b5f80604083850312156116fd575f80fd5b50508035926020909101359150565b5f806040838503121561171d575f80fd5b8235915060208301356116ca8161168a565b5f6020828403121561173f575f80fd5b8135610efd8161168a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610da257610da261175e565b80820180821115610da257610da261175e565b5f602082840312156117a8575f80fd5b81518015158114610efd575f80fd5b8082028115828204841417610da257610da261175e565b5f826117e857634e487b7160e01b5f52601260045260245ffd5b500490565b5f82515f5b8181101561180c57602081860181015185830152016117f2565b505f92019182525091905056fea264697066735822122031243aa2b5105b5633b2e774707ed6ce54d5fd8d08f16491c5d8417d6db7380b64736f6c63430008170033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101f2575f3560e01c8063630b5ba1116101145780638dbb1e3a116100a9578063ca6d7b6811610079578063ca6d7b6814610468578063e0dae72f1461047b578063e2bbb1581461048b578063f0fa77f61461049e578063f2fde38b146104a7575f80fd5b80638dbb1e3a146103d057806393f1a40b146103e3578063b143b4ed14610442578063bdfbe74f14610455575f80fd5b80637c0b8de2116100e45780637c0b8de21461037a578063845105e2146103a557806389a30271146103ad5780638da5cb5b146103c0575f80fd5b8063630b5ba11461033b578063715018a61461034357806378e979251461034b5780637b020dad14610372575f80fd5b80632377b2a81161018a578063501883011161015a57806350188301146102e557806351eb05a614610302578063526fb4b4146103155780635ee2d55414610328575f80fd5b80632377b2a8146102a35780632b8bbbe8146102b6578063441a3e70146102c957806346b828cb146102dc575f80fd5b806317caf6f1116101c557806317caf6f1146102755780631ab06ee51461027e5780631b1fdaa1146102915780631ca3127f1461029a575f80fd5b8063081e3eda146101f65780630a78d0391461020d5780630e37d36f146102165780631526fe271461022b575b5f80fd5b6008545b6040519081526020015b60405180910390f35b6101fa60045481565b61022961022436600461169e565b6104ba565b005b61023e6102393660046116d5565b6104f3565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610204565b6101fa600a5481565b61022961028c3660046116ec565b610541565b6101fa600c5481565b6101fa60065481565b6102296102b13660046116d5565b6105bd565b6102296102c436600461170c565b610651565b6102296102d73660046116ec565b610813565b6101fa60055481565b600b546102f29060ff1681565b6040519015158152602001610204565b6102296103103660046116d5565b610ba8565b6101fa61032336600461170c565b610cb1565b6102296103363660046116d5565b610da8565b610229610e16565b610229610e34565b6101fa7f000000000000000000000000000000000000000000000000000000000000000081565b610229610e47565b60025461038d906001600160a01b031681565b6040516001600160a01b039091168152602001610204565b610229610e5b565b60035461038d906001600160a01b031681565b5f546001600160a01b031661038d565b6101fa6103de3660046116ec565b610e72565b6104226103f136600461170c565b600960209081525f928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610204565b6102296104503660046116d5565b610f04565b6101fa61046336600461170c565b610f72565b6101fa6104763660046116d5565b61105e565b6101fa68056bc75e2d6310000081565b6102296104993660046116ec565b6110a0565b6101fa60075481565b6102296104b536600461172f565b6112ed565b6104c261132a565b600380546001600160a01b039283166001600160a01b03199182161790915560028054939092169216919091179055565b60088181548110610502575f80fd5b5f9182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909286565b61054961132a565b610551610e16565b80600883815481106105655761056561174a565b905f5260205f20906006020160020154600a546105829190611772565b61058c9190611785565b600a8190555080600883815481106105a6576105a661174a565b905f5260205f209060060201600201819055505050565b6105c561132a565b6006546105d29082611356565b6006556002546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303815f875af1158015610629573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064d9190611798565b5050565b61065961132a565b61066281611361565b61066a610e16565b5f7f000000000000000000000000000000000000000000000000000000000000000042116106b8577f00000000000000000000000000000000000000000000000000000000000000006106ba565b425b600a549091506106ca9084611356565b600a556040805160c0810182526001600160a01b0393841681525f60208201818152928201958652606082019384526080820181815260a0830182815260088054600181018255935292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600690930292830180546001600160a01b031916919097161790955591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee483015593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee582015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee682015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee782015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee890910155565b61081b6113fe565b5f6008838154811061082f5761082f61174a565b5f918252602080832086845260098252604080852033865290925292208054600690920290920192508311156108a15760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b60448201526064015b60405180910390fd5b600b5460ff166108e95760405162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc81b9bdd081bdc195b9959606a1b6044820152606401610898565b6108f284610ba8565b5f61092a826001015461092464e8d4a5100061091e8760040154875f015461145790919063ffffffff16565b90611462565b9061146d565b90505f610958836002015461092464e8d4a5100061091e8860050154885f015461145790919063ffffffff16565b90506109698164e8d4a51000611462565b8354909150610978908661146d565b83556001840154610989908661146d565b6001850155600484015483546109a99164e8d4a510009161091e91611457565b6001840155600584015483546109c99164e8d4a510009161091e91611457565b6002840155600383015485905f906109e4906202a300611785565b421015610a1f576109fb606461091e89600a611457565b9050610a07878261146d565b600c54909250610a179082611356565b600c55610b04565b5f841180610a2c57505f83115b15610b04576002546040516340c10f1960e01b8152336004820152602481018690526001600160a01b03909116906340c10f19906044015f604051808303815f87803b158015610a7a575f80fd5b505af1158015610a8c573d5f803e3d5ffd5b505060035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b03909116925063a9059cbb91506044016020604051808303815f875af1158015610ade573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b029190611798565b505b85546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f19906044015f604051808303815f87803b158015610b4c575f80fd5b505af1158015610b5e573d5f803e3d5ffd5b50506040518481528a92503391507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a350505050505061064d60018055565b5f60088281548110610bbc57610bbc61174a565b905f5260205f209060060201905080600301544211610bd9575050565b60018101545f819003610bf157504260039091015550565b5f610c00836003015442610e72565b90505f610c2c600a5461091e8660020154610c266004548761145790919063ffffffff16565b90611457565b90505f610c52600a5461091e8760020154610c266005548861145790919063ffffffff16565b9050610c75610c6a8561091e8564e8d4a51000611457565b600487015490611356565b6004860155610c9b610c908561091e8464e8d4a51000611457565b600587015490611356565b6005860155505042600390930192909255505050565b5f8060088481548110610cc657610cc661174a565b5f91825260208083208784526009825260408085206001600160a01b03891686529092529220600460069092029092019081015460018201546003830154929450909142118015610d1657508015155b15610d74575f610d2a856003015442610e72565b90505f610d50600a5461091e8860020154610c266004548761145790919063ffffffff16565b9050610d6f610d688461091e8464e8d4a51000611457565b8590611356565b935050505b610d9b836001015461092464e8d4a5100061091e86885f015461145790919063ffffffff16565b9450505050505b92915050565b610db061132a565b68056bc75e2d63100000811115610e095760405162461bcd60e51b815260206004820152601f60248201527f7365744e46545065725365636f6e643a20746f6f206d616e79204e46547321006044820152606401610898565b610e11610e16565b600555565b6008545f5b8181101561064d57610e2c81610ba8565b600101610e1b565b610e3c61132a565b610e455f611478565b565b610e4f61132a565b600b805460ff19169055565b610e6361132a565b600b805460ff19166001179055565b5f7f00000000000000000000000000000000000000000000000000000000000000008311610ec0577f0000000000000000000000000000000000000000000000000000000000000000610ec2565b825b92507f0000000000000000000000000000000000000000000000000000000000000000821015610ef357505f610da2565b610efd8383611772565b9392505050565b610f0c61132a565b68056bc75e2d63100000811115610f655760405162461bcd60e51b815260206004820152601f60248201527f7365744e46545065725365636f6e643a20746f6f206d616e79204e46547321006044820152606401610898565b610f6d610e16565b600455565b5f8060088481548110610f8757610f8761174a565b5f91825260208083208784526009825260408085206001600160a01b03891686529092529220600560069092029092019081015460018201546003830154929450909142118015610fd757508015155b1561102e575f610feb856003015442610e72565b90505f611011600a5461091e8860020154610c266005548761145790919063ffffffff16565b9050611029610d688461091e8464e8d4a51000611457565b935050505b610d9b64e8d4a5100061091e856002015461092464e8d4a5100061091e888a5f015461145790919063ffffffff16565b5f81815260096020908152604080832033845290915281206003810154611088906202a300611785565b4210156110985750600a92915050565b505f92915050565b6110a86113fe565b5f600883815481106110bc576110bc61174a565b5f91825260208083208684526009825260408085203386529092529220600690910290910191506110ec84610ba8565b5f611118826001015461092464e8d4a5100061091e8760040154875f015461145790919063ffffffff16565b90505f611146836002015461092464e8d4a5100061091e8860050154885f015461145790919063ffffffff16565b83549091506111559086611356565b8355426003840155600184015461116c9086611356565b60018501556004840154835461118c9164e8d4a510009161091e91611457565b6001840155600584015483546111ac9164e8d4a510009161091e91611457565b60028401556111c08164e8d4a51000611462565b90505f8211806111cf57505f81115b156112335783546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f19906044015f604051808303815f87803b15801561121c575f80fd5b505af115801561122e573d5f803e3d5ffd5b505050505b84156112a9578354611250906001600160a01b03163330886114c7565b8354604051630852cd8d60e31b8152600481018790526001600160a01b03909116906342966c68906024015f604051808303815f87803b158015611292575f80fd5b505af11580156112a4573d5f803e3d5ffd5b505050505b604051858152869033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505061064d60018055565b6112f561132a565b6001600160a01b03811661131e57604051631e4fbdf760e01b81525f6004820152602401610898565b61132781611478565b50565b5f546001600160a01b03163314610e455760405163118cdaa760e01b8152336004820152602401610898565b5f610efd8284611785565b6008545f5b818110156113f957826001600160a01b03166008828154811061138b5761138b61174a565b5f9182526020909120600690910201546001600160a01b0316036113f15760405162461bcd60e51b815260206004820152601c60248201527f6164643a20706f6f6c20616c72656164792065786973747321212121000000006044820152606401610898565b600101611366565b505050565b6002600154036114505760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610898565b6002600155565b5f610efd82846117b7565b5f610efd82846117ce565b5f610efd8284611772565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611521908590611527565b50505050565b5f61153b6001600160a01b03841683611588565b905080515f1415801561155f57508080602001905181019061155d9190611798565b155b156113f957604051635274afe760e01b81526001600160a01b0384166004820152602401610898565b6060610efd83835f845f80856001600160a01b031684866040516115ac91906117ed565b5f6040518083038185875af1925050503d805f81146115e6576040519150601f19603f3d011682016040523d82523d5f602084013e6115eb565b606091505b50915091506115fb868383611605565b9695505050505050565b60608261161a5761161582611661565b610efd565b815115801561163157506001600160a01b0384163b155b1561165a57604051639996b31560e01b81526001600160a01b0385166004820152602401610898565b5080610efd565b8051156116715780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114611327575f80fd5b5f80604083850312156116af575f80fd5b82356116ba8161168a565b915060208301356116ca8161168a565b809150509250929050565b5f602082840312156116e5575f80fd5b5035919050565b5f80604083850312156116fd575f80fd5b50508035926020909101359150565b5f806040838503121561171d575f80fd5b8235915060208301356116ca8161168a565b5f6020828403121561173f575f80fd5b8135610efd8161168a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610da257610da261175e565b80820180821115610da257610da261175e565b5f602082840312156117a8575f80fd5b81518015158114610efd575f80fd5b8082028115828204841417610da257610da261175e565b5f826117e857634e487b7160e01b5f52601260045260245ffd5b500490565b5f82515f5b8181101561180c57602081860181015185830152016117f2565b505f92019182525091905056fea264697066735822122031243aa2b5105b5633b2e774707ed6ce54d5fd8d08f16491c5d8417d6db7380b64736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _NFTPerSecond (uint256): 0
Arg [1] : _USDCPerSecond (uint256): 0
Arg [2] : _startTime (uint256): 0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
33644:12844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37710:95;37782:8;:15;37710:95;;;160:25:1;;;148:2;133:18;37710:95:0;;;;;;;;35434:27;;;;;;46366:119;;;;;;:::i;:::-;;:::i;:::-;;35753:26;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;1278:32:1;;;1260:51;;1342:2;1327:18;;1320:34;;;;1370:18;;;1363:34;;;;1428:2;1413:18;;1406:34;1471:3;1456:19;;1449:35;1298:3;1500:19;;1493:35;1247:3;1232:19;35753:26:0;959:575:1;35996:34:0;;;;;;39872:243;;;;;;:::i;:::-;;:::i;36166:28::-;;;;;;35505:38;;;;;;36785:195;;;;;;:::i;:::-;;:::i;39179:598::-;;;;;;:::i;:::-;;:::i;44753:1605::-;;;;;;:::i;:::-;;:::i;35468:28::-;;;;;;36127:32;;;;;;;;;;;;2298:14:1;;2291:22;2273:41;;2261:2;2246:18;36127:32:0;2133:187:1;42338:866:0;;;;;;:::i;:::-;;:::i;40500:733::-;;;;;;:::i;:::-;;:::i;38394:431::-;;;;;;:::i;:::-;;:::i;42082:180::-;;;:::i;6531:103::-;;;:::i;36084:34::-;;;;;36992:82;;;:::i;35243:68::-;;;;;-1:-1:-1;;;;;35243:68:0;;;;;;-1:-1:-1;;;;;2830:32:1;;;2812:51;;2800:2;2785:18;35243:68:0;2652:217:1;36697:80:0;;;:::i;35318:69::-;;;;;-1:-1:-1;;;;;35318:69:0;;;5856:87;5902:7;5929:6;-1:-1:-1;;;;;5929:6:0;5856:87;;40197:240;;;;;;:::i;:::-;;:::i;35835:66::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3313:25:1;;;3369:2;3354:18;;3347:34;;;;3397:18;;;3390:34;3455:2;3440:18;;3433:34;3300:3;3285:19;35835:66:0;3082:391:1;37960:426:0;;;;;;:::i;:::-;;:::i;41241:758::-;;;;;;:::i;:::-;;:::i;44430:271::-;;;;;;:::i;:::-;;:::i;35671:46::-;;35713:4;35671:46;;43272:1150;;;;;;:::i;:::-;;:::i;35550:34::-;;;;;;6789:220;;;;;;:::i;:::-;;:::i;46366:119::-;5742:13;:11;:13::i;:::-;46444:4:::1;:12:::0;;-1:-1:-1;;;;;46444:12:0;;::::1;-1:-1:-1::0;;;;;;46444:12:0;;::::1;;::::0;;;46467:3:::1;:10:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;46366:119::o;35753:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35753:26:0;;;;-1:-1:-1;35753:26:0;;;;;:::o;39872:243::-;5742:13;:11;:13::i;:::-;39952:17:::1;:15;:17::i;:::-;40046:11;40018:8;40027:4;40018:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;40000:15;;:43;;;;:::i;:::-;:57;;;;:::i;:::-;39982:15;:75;;;;40096:11;40068:8;40077:4;40068:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;39872:243:::0;;:::o;36785:195::-;5742:13;:11;:13::i;:::-;36877:19:::1;::::0;:32:::1;::::0;36901:7;36877:23:::1;:32::i;:::-;36855:19;:54:::0;36920:3:::1;::::0;:52:::1;::::0;-1:-1:-1;;;36920:52:0;;36937:10:::1;36920:52;::::0;::::1;4504:34:1::0;36957:4:0::1;4554:18:1::0;;;4547:43;4606:18;;;4599:34;;;-1:-1:-1;;;;;36920:3:0;;::::1;::::0;:16:::1;::::0;4439:18:1;;36920:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36785:195:::0;:::o;39179:598::-;5742:13;:11;:13::i;:::-;39262:27:::1;39280:8;39262:17;:27::i;:::-;39341:17;:15;:17::i;:::-;39371:22;39414:9;39396:15;:27;:57;;39444:9;39396:57;;;39426:15;39396:57;39482:15;::::0;39371:82;;-1:-1:-1;39482:32:0::1;::::0;39502:11;39482:19:::1;:32::i;:::-;39464:15;:50:::0;39539:229:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;39539:229:0;;::::1;::::0;;-1:-1:-1;39539:229:0::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;39525:8:::1;:244:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;39525:244:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39179:598::o;44753:1605::-;2382:21;:19;:21::i;:::-;44835::::1;44859:8;44868:4;44859:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;44908;;;:8:::1;:14:::0;;;;;;44923:10:::1;44908:26:::0;;;;;;;44955:11;;44859:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;44955:22:0;-1:-1:-1;44955:22:0::1;44947:53;;;::::0;-1:-1:-1;;;44947:53:0;;5128:2:1;44947:53:0::1;::::0;::::1;5110:21:1::0;5167:2;5147:18;;;5140:30;-1:-1:-1;;;5186:18:1;;;5179:48;5244:18;;44947:53:0::1;;;;;;;;;45019:12;::::0;::::1;;45011:44;;;::::0;-1:-1:-1;;;45011:44:0;;5475:2:1;45011:44:0::1;::::0;::::1;5457:21:1::0;5514:2;5494:18;;;5487:30;-1:-1:-1;;;5533:18:1;;;5526:49;5592:18;;45011:44:0::1;5273:343:1::0;45011:44:0::1;45068:16;45079:4;45068:10;:16::i;:::-;45097:15;45115:67;45166:4;:15;;;45115:46;45156:4;45115:36;45131:4;:19;;;45115:4;:11;;;:15;;:36;;;;:::i;:::-;:40:::0;::::1;:46::i;:::-;:50:::0;::::1;:67::i;:::-;45097:85;;45193:19;45215:72;45267:4;:19;;;45215:47;45257:4;45215:37;45231:4;:20;;;45215:4;:11;;;:15;;:37;;;;:::i;:72::-;45193:94:::0;-1:-1:-1;45312:21:0::1;45193:94:::0;45328:4:::1;45312:15;:21::i;:::-;45360:11:::0;;45298:35;;-1:-1:-1;45360:24:0::1;::::0;45376:7;45360:15:::1;:24::i;:::-;45346:38:::0;;45413:15:::1;::::0;::::1;::::0;:28:::1;::::0;45433:7;45413:19:::1;:28::i;:::-;45395:15;::::0;::::1;:46:::0;45486:19:::1;::::0;::::1;::::0;45470:11;;:46:::1;::::0;45511:4:::1;::::0;45470:36:::1;::::0;:15:::1;:36::i;:46::-;45452:15;::::0;::::1;:64:::0;45565:20:::1;::::0;::::1;::::0;45549:11;;:47:::1;::::0;45591:4:::1;::::0;45549:37:::1;::::0;:15:::1;:37::i;:47::-;45527:19;::::0;::::1;:69:::0;45697:20:::1;::::0;::::1;::::0;45629:7;;45609:17:::1;::::0;45697:29:::1;::::0;45720:6:::1;45697:29;:::i;:::-;45679:15;:47;45675:537;;;45821:24;45841:3;45821:15;:7:::0;45833:2:::1;45821:11;:15::i;:24::-;45815:30:::0;-1:-1:-1;45876:16:0::1;:7:::0;45815:30;45876:11:::1;:16::i;:::-;45985:9;::::0;45864:28;;-1:-1:-1;45985:18:0::1;::::0;45999:3;45985:13:::1;:18::i;:::-;45973:9;:30:::0;45675:537:::1;;;46058:1;46048:7;:11;:30;;;;46077:1;46063:11;:15;46048:30;46045:156;;;46099:3;::::0;:29:::1;::::0;-1:-1:-1;;;46099:29:0;;46108:10:::1;46099:29;::::0;::::1;5795:51:1::0;5862:18;;;5855:34;;;-1:-1:-1;;;;;46099:3:0;;::::1;::::0;:8:::1;::::0;5768:18:1;;46099:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;46147:4:0::1;::::0;:38:::1;::::0;-1:-1:-1;;;46147:38:0;;46161:10:::1;46147:38;::::0;::::1;5795:51:1::0;5862:18;;;5855:34;;;-1:-1:-1;;;;;46147:4:0;;::::1;::::0;-1:-1:-1;46147:13:0::1;::::0;-1:-1:-1;5768:18:1;;46147:38:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46045:156;46236:12:::0;;46222:65:::1;::::0;-1:-1:-1;;;46222:65:0;;46264:10:::1;46222:65;::::0;::::1;5795:51:1::0;5862:18;;;5855:34;;;-1:-1:-1;;;;;46236:12:0;;::::1;::::0;46222:33:::1;::::0;5768:18:1;;46222:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;46313:37:0::1;::::0;160:25:1;;;46334:4:0;;-1:-1:-1;46322:10:0::1;::::0;-1:-1:-1;46313:37:0::1;::::0;148:2:1;133:18;46313:37:0::1;;;;;;;44822:1536;;;;;;2426:20:::0;1820:1;2946:22;;2763:213;42338:866;42390:21;42414:8;42423:4;42414:14;;;;;;;;:::i;:::-;;;;;;;;;;;42390:38;;42462:4;:19;;;42443:15;:38;42439:77;;42498:7;42338:866;:::o;42439:77::-;42545:15;;;;42526:16;42575:13;;;42571:104;;-1:-1:-1;42627:15:0;42605:19;;;;:37;-1:-1:-1;42338:866:0:o;42571:104::-;42685:18;42706:51;42720:4;:19;;;42741:15;42706:13;:51::i;:::-;42685:72;;42768:17;42788:70;42842:15;;42788:49;42821:4;:15;;;42788:28;42803:12;;42788:10;:14;;:28;;;;:::i;:::-;:32;;:49::i;:70::-;42768:90;;42869:18;42890:71;42945:15;;42890:50;42924:4;:15;;;42890:29;42905:13;;42890:10;:14;;:29;;;;:::i;:71::-;42869:92;-1:-1:-1;42996:58:0;43020:33;43044:8;43020:19;:9;43034:4;43020:13;:19::i;:33::-;42996:19;;;;;:23;:58::i;:::-;42974:19;;;:80;43088:60;43113:34;43138:8;43113:20;:10;43128:4;43113:14;:20::i;:34::-;43088:20;;;;;:24;:60::i;:::-;43065:20;;;:83;-1:-1:-1;;43181:15:0;43159:19;;;;:37;;;;-1:-1:-1;;;42338:866:0:o;40500:733::-;40572:7;40592:21;40616:8;40625:4;40616:14;;;;;;;;:::i;:::-;;;;;;;;;40665;;;:8;:14;;;;;;-1:-1:-1;;;;;40665:21:0;;;;;;;;;40722:19;40616:14;;;;;;;40722:19;;;;40771:15;;;;40819:19;;;;40616:14;;-1:-1:-1;40722:19:0;;40801:15;:37;:54;;;;-1:-1:-1;40842:13:0;;;40801:54;40797:349;;;40872:18;40893:51;40907:4;:19;;;40928:15;40893:13;:51::i;:::-;40872:72;;40959:17;40979:70;41033:15;;40979:49;41012:4;:15;;;40979:28;40994:12;;40979:10;:14;;:28;;;;:::i;:70::-;40959:90;-1:-1:-1;41081:53:0;41100:33;41124:8;41100:19;40959:90;41114:4;41100:13;:19::i;:33::-;41081:14;;:18;:53::i;:::-;41064:70;;40857:289;;40797:349;41163:62;41209:4;:15;;;41163:41;41199:4;41163:31;41179:14;41163:4;:11;;;:15;;:31;;;;:::i;:62::-;41156:69;;;;;;40500:733;;;;;:::o;38394:431::-;5742:13;:11;:13::i;:::-;35713:4:::1;38482:14;:33;;38474:77;;;::::0;-1:-1:-1;;;38474:77:0;;6102:2:1;38474:77:0::1;::::0;::::1;6084:21:1::0;6141:2;6121:18;;;6114:30;6180:33;6160:18;;;6153:61;6231:18;;38474:77:0::1;5900:355:1::0;38474:77:0::1;38756:17;:15;:17::i;:::-;38787:13;:30:::0;38394:431::o;42082:180::-;42144:8;:15;42127:14;42170:85;42198:6;42192:3;:12;42170:85;;;42228:15;42239:3;42228:10;:15::i;:::-;42206:5;;42170:85;;6531:103;5742:13;:11;:13::i;:::-;6596:30:::1;6623:1;6596:18;:30::i;:::-;6531:103::o:0;36992:82::-;5742:13;:11;:13::i;:::-;37046:12:::1;:20:::0;;-1:-1:-1;;37046:20:0::1;::::0;;36992:82::o;36697:80::-;5742:13;:11;:13::i;:::-;36750:12:::1;:19:::0;;-1:-1:-1;;36750:19:0::1;36765:4;36750:19;::::0;;36697:80::o;40197:240::-;40269:7;40305:9;40297:5;:17;:37;;40325:9;40297:37;;;40317:5;40297:37;40289:45;;40355:9;40349:3;:15;40345:56;;;-1:-1:-1;40388:1:0;40381:8;;40345:56;40418:11;40424:5;40418:3;:11;:::i;:::-;40411:18;40197:240;-1:-1:-1;;;40197:240:0:o;37960:426::-;5742:13;:11;:13::i;:::-;35713:4:::1;38046:13;:32;;38038:76;;;::::0;-1:-1:-1;;;38038:76:0;;6102:2:1;38038:76:0::1;::::0;::::1;6084:21:1::0;6141:2;6121:18;;;6114:30;6180:33;6160:18;;;6153:61;6231:18;;38038:76:0::1;5900:355:1::0;38038:76:0::1;38319:17;:15;:17::i;:::-;38350:12;:28:::0;37960:426::o;41241:758::-;41314:7;41334:21;41358:8;41367:4;41358:14;;;;;;;;:::i;:::-;;;;;;;;;41407;;;:8;:14;;;;;;-1:-1:-1;;;;;41407:21:0;;;;;;;;;41465:20;41358:14;;;;;;;41465:20;;;;41515:15;;;;41563:19;;;;41358:14;;-1:-1:-1;41465:20:0;;41545:15;:37;:54;;;;-1:-1:-1;41586:13:0;;;41545:54;41541:354;;;41616:18;41637:51;41651:4;:19;;;41672:15;41637:13;:51::i;:::-;41616:72;;41703:18;41724:71;41779:15;;41724:50;41758:4;:15;;;41724:29;41739:13;;41724:10;:14;;:29;;;;:::i;:71::-;41703:92;-1:-1:-1;41828:55:0;41848:34;41873:8;41848:20;41703:92;41863:4;41848:14;:20::i;41828:55::-;41810:73;;41601:294;;41541:354;41912:79;41986:4;41913:67;41960:4;:19;;;41913:42;41950:4;41913:32;41929:15;41913:4;:11;;;:15;;:32;;;;:::i;44430:271::-;44486:7;44530:14;;;:8;:14;;;;;;;;44545:10;44530:26;;;;;;;44589:20;;;;:29;;44612:6;44589:29;:::i;:::-;44571:15;:47;44567:126;;;-1:-1:-1;44646:2:0;;44430:271;-1:-1:-1;;44430:271:0:o;44567:126::-;-1:-1:-1;44692:1:0;;44430:271;-1:-1:-1;;44430:271:0:o;43272:1150::-;2382:21;:19;:21::i;:::-;43353::::1;43377:8;43386:4;43377:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;43426;;;:8:::1;:14:::0;;;;;;43441:10:::1;43426:26:::0;;;;;;;43377:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;43465:16:0::1;43435:4:::0;43465:10:::1;:16::i;:::-;43494:15;43512:67;43563:4;:15;;;43512:46;43553:4;43512:36;43528:4;:19;;;43512:4;:11;;;:15;;:36;;;;:::i;:67::-;43494:85;;43590:19;43612:72;43664:4;:19;;;43612:47;43654:4;43612:37;43628:4;:20;;;43612:4;:11;;;:15;;:37;;;;:::i;:72::-;43711:11:::0;;43590:94;;-1:-1:-1;43711:24:0::1;::::0;43727:7;43711:15:::1;:24::i;:::-;43697:38:::0;;43769:15:::1;43746:20;::::0;::::1;:38:::0;43813:15:::1;::::0;::::1;::::0;:28:::1;::::0;43833:7;43813:19:::1;:28::i;:::-;43795:15;::::0;::::1;:46:::0;43886:19:::1;::::0;::::1;::::0;43870:11;;:46:::1;::::0;43911:4:::1;::::0;43870:36:::1;::::0;:15:::1;:36::i;:46::-;43852:15;::::0;::::1;:64:::0;43965:20:::1;::::0;::::1;::::0;43949:11;;:47:::1;::::0;43991:4:::1;::::0;43949:37:::1;::::0;:15:::1;:37::i;:47::-;43927:19;::::0;::::1;:69:::0;44021:21:::1;:11:::0;44037:4:::1;44021:15;:21::i;:::-;44007:35;;44066:1;44056:7;:11;:29;;;;44084:1;44071:11;:14;44056:29;44053:124;;;44116:12:::0;;44102:63:::1;::::0;-1:-1:-1;;;44102:63:0;;44144:10:::1;44102:63;::::0;::::1;5795:51:1::0;5862:18;;;5855:34;;;-1:-1:-1;;;;;44116:12:0;;::::1;::::0;44102:33:::1;::::0;5768:18:1;;44102:63:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44053:124;44192:11:::0;;44189:174:::1;;44220:12:::0;;:74:::1;::::0;-1:-1:-1;;;;;44220:12:0::1;44258:10;44279:4;44286:7:::0;44220:29:::1;:74::i;:::-;44323:12:::0;;44309:42:::1;::::0;-1:-1:-1;;;44309:42:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;44323:12:0;;::::1;::::0;44309:33:::1;::::0;133:18:1;;44309:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44189:174;44380:34;::::0;160:25:1;;;44400:4:0;;44388:10:::1;::::0;44380:34:::1;::::0;148:2:1;133:18;44380:34:0::1;;;;;;;43340:1082;;;;2426:20:::0;1820:1;2946:22;;2763:213;6789:220;5742:13;:11;:13::i;:::-;-1:-1:-1;;;;;6874:22:0;::::1;6870:93;;6920:31;::::0;-1:-1:-1;;;6920:31:0;;6948:1:::1;6920:31;::::0;::::1;2812:51:1::0;2785:18;;6920:31:0::1;2652:217:1::0;6870:93:0::1;6973:28;6992:8;6973:18;:28::i;:::-;6789:220:::0;:::o;6021:166::-;5902:7;5929:6;-1:-1:-1;;;;;5929:6:0;4052:10;6081:23;6077:103;;6128:40;;-1:-1:-1;;;6128:40:0;;4052:10;6128:40;;;2812:51:1;2785:18;;6128:40:0;2652:217:1;10243:98:0;10301:7;10328:5;10332:1;10328;:5;:::i;38835:269::-;38921:8;:15;38904:14;38947:148;38977:6;38970:4;:13;38947:148;;;39042:8;-1:-1:-1;;;;;39016:34:0;:8;39025:4;39016:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;39016:22:0;:34;39008:75;;;;-1:-1:-1;;;39008:75:0;;6462:2:1;39008:75:0;;;6444:21:1;6501:2;6481:18;;;6474:30;6540;6520:18;;;6513:58;6588:18;;39008:75:0;6260:352:1;39008:75:0;38985:6;;38947:148;;;;38893:211;38835:269;:::o;2462:293::-;1864:1;2596:7;;:19;2588:63;;;;-1:-1:-1;;;2588:63:0;;6819:2:1;2588:63:0;;;6801:21:1;6858:2;6838:18;;;6831:30;6897:33;6877:18;;;6870:61;6948:18;;2588:63:0;6617:355:1;2588:63:0;1864:1;2729:7;:18;2462:293::o;10981:98::-;11039:7;11066:5;11070:1;11066;:5;:::i;11380:98::-;11438:7;11465:5;11469:1;11465;:5;:::i;10624:98::-;10682:7;10709:5;10713:1;10709;:5;:::i;7169:191::-;7243:16;7262:6;;-1:-1:-1;;;;;7279:17:0;;;-1:-1:-1;;;;;;7279:17:0;;;;;;7312:40;;7262:6;;;;;;;7312:40;;7243:16;7312:40;7232:128;7169:191;:::o;29212:190::-;29340:53;;;-1:-1:-1;;;;;4522:15:1;;;29340:53:0;;;4504:34:1;4574:15;;4554:18;;;4547:43;4606:18;;;;4599:34;;;29340:53:0;;;;;;;;;;4439:18:1;;;;29340:53:0;;;;;;;;-1:-1:-1;;;;;29340:53:0;-1:-1:-1;;;29340:53:0;;;29313:81;;29333:5;;29313:19;:81::i;:::-;29212:190;;;;:::o;31616:638::-;32040:23;32066:33;-1:-1:-1;;;;;32066:27:0;;32094:4;32066:27;:33::i;:::-;32040:59;;32114:10;:17;32135:1;32114:22;;:57;;;;;32152:10;32141:30;;;;;;;;;;;;:::i;:::-;32140:31;32114:57;32110:137;;;32195:40;;-1:-1:-1;;;32195:40:0;;-1:-1:-1;;;;;2830:32:1;;32195:40:0;;;2812:51:1;2785:18;;32195:40:0;2652:217:1;17103:153:0;17178:12;17210:38;17232:6;17240:4;17246:1;17178:12;17836;17850:23;17877:6;-1:-1:-1;;;;;17877:11:0;17896:5;17903:4;17877:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17835:73;;;;17926:55;17953:6;17961:7;17970:10;17926:26;:55::i;:::-;17919:62;17591:398;-1:-1:-1;;;;;;17591:398:0:o;19067:597::-;19215:12;19245:7;19240:417;;19269:19;19277:10;19269:7;:19::i;:::-;19240:417;;;19497:17;;:22;:49;;;;-1:-1:-1;;;;;;19523:18:0;;;:23;19497:49;19493:121;;;19574:24;;-1:-1:-1;;;19574:24:0;;-1:-1:-1;;;;;2830:32:1;;19574:24:0;;;2812:51:1;2785:18;;19574:24:0;2652:217:1;19493:121:0;-1:-1:-1;19635:10:0;19628:17;;20217:528;20350:17;;:21;20346:392;;20582:10;20576:17;20639:15;20626:10;20622:2;20618:19;20611:44;20346:392;20709:17;;-1:-1:-1;;;20709:17:0;;;;;;;;;;;196:138:1;-1:-1:-1;;;;;278:31:1;;268:42;;258:70;;324:1;321;314:12;339:430;435:6;443;496:2;484:9;475:7;471:23;467:32;464:52;;;512:1;509;502:12;464:52;551:9;538:23;570:38;602:5;570:38;:::i;:::-;627:5;-1:-1:-1;684:2:1;669:18;;656:32;697:40;656:32;697:40;:::i;:::-;756:7;746:17;;;339:430;;;;;:::o;774:180::-;833:6;886:2;874:9;865:7;861:23;857:32;854:52;;;902:1;899;892:12;854:52;-1:-1:-1;925:23:1;;774:180;-1:-1:-1;774:180:1:o;1539:248::-;1607:6;1615;1668:2;1656:9;1647:7;1643:23;1639:32;1636:52;;;1684:1;1681;1674:12;1636:52;-1:-1:-1;;1707:23:1;;;1777:2;1762:18;;;1749:32;;-1:-1:-1;1539:248:1:o;1792:336::-;1874:6;1882;1935:2;1923:9;1914:7;1910:23;1906:32;1903:52;;;1951:1;1948;1941:12;1903:52;1987:9;1974:23;1964:33;;2047:2;2036:9;2032:18;2019:32;2060:38;2092:5;2060:38;:::i;3478:254::-;3537:6;3590:2;3578:9;3569:7;3565:23;3561:32;3558:52;;;3606:1;3603;3596:12;3558:52;3645:9;3632:23;3664:38;3696:5;3664:38;:::i;3737:127::-;3798:10;3793:3;3789:20;3786:1;3779:31;3829:4;3826:1;3819:15;3853:4;3850:1;3843:15;3869:127;3930:10;3925:3;3921:20;3918:1;3911:31;3961:4;3958:1;3951:15;3985:4;3982:1;3975:15;4001:128;4068:9;;;4089:11;;;4086:37;;;4103:18;;:::i;4134:125::-;4199:9;;;4220:10;;;4217:36;;;4233:18;;:::i;4644:277::-;4711:6;4764:2;4752:9;4743:7;4739:23;4735:32;4732:52;;;4780:1;4777;4770:12;4732:52;4812:9;4806:16;4865:5;4858:13;4851:21;4844:5;4841:32;4831:60;;4887:1;4884;4877:12;6977:168;7050:9;;;7081;;7098:15;;;7092:22;;7078:37;7068:71;;7119:18;;:::i;7150:217::-;7190:1;7216;7206:132;;7260:10;7255:3;7251:20;7248:1;7241:31;7295:4;7292:1;7285:15;7323:4;7320:1;7313:15;7206:132;-1:-1:-1;7352:9:1;;7150:217::o;7372:412::-;7501:3;7539:6;7533:13;7564:1;7574:129;7588:6;7585:1;7582:13;7574:129;;;7686:4;7670:14;;;7666:25;;7660:32;7647:11;;;7640:53;7603:12;7574:129;;;-1:-1:-1;7758:1:1;7722:16;;7747:13;;;-1:-1:-1;7722:16:1;7372:412;-1:-1:-1;7372:412:1:o
Swarm Source
ipfs://31243aa2b5105b5633b2e774707ed6ce54d5fd8d08f16491c5d8417d6db7380b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.