More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 142 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 17849305 | 403 days ago | IN | 0 ETH | 0.0354849 | ||||
Deposit | 17733115 | 420 days ago | IN | 0 ETH | 0.02788635 | ||||
Withdraw | 17727251 | 420 days ago | IN | 0 ETH | 0.01993743 | ||||
Claim Rewards | 17726908 | 420 days ago | IN | 0 ETH | 0.00433832 | ||||
Claim Rewards | 17683453 | 427 days ago | IN | 0 ETH | 0.00601666 | ||||
Claim Rewards | 17581809 | 441 days ago | IN | 0 ETH | 0.00705223 | ||||
Claim Rewards | 17555538 | 445 days ago | IN | 0 ETH | 0.00477571 | ||||
Claim Rewards | 17536356 | 447 days ago | IN | 0 ETH | 0.00596948 | ||||
Claim Rewards | 17534295 | 448 days ago | IN | 0 ETH | 0.00063514 | ||||
Claim Rewards | 17534295 | 448 days ago | IN | 0 ETH | 0.00173355 | ||||
Claim Rewards | 17534295 | 448 days ago | IN | 0 ETH | 0.00199915 | ||||
Deposit | 17431454 | 462 days ago | IN | 0 ETH | 0.00461833 | ||||
Deposit | 17431449 | 462 days ago | IN | 0 ETH | 0.000568 | ||||
Claim Rewards | 17418431 | 464 days ago | IN | 0 ETH | 0.00673495 | ||||
Withdraw | 17400585 | 466 days ago | IN | 0 ETH | 0.03714246 | ||||
Claim Rewards | 17376454 | 470 days ago | IN | 0 ETH | 0.00793734 | ||||
Claim Rewards | 17359900 | 472 days ago | IN | 0 ETH | 0.00927664 | ||||
Claim Rewards | 17350607 | 473 days ago | IN | 0 ETH | 0.00267472 | ||||
Claim Rewards | 17343936 | 474 days ago | IN | 0 ETH | 0.01078935 | ||||
Claim Rewards | 17280403 | 483 days ago | IN | 0 ETH | 0.02176278 | ||||
Claim Rewards | 17221703 | 492 days ago | IN | 0 ETH | 0.01608202 | ||||
Claim Rewards | 17184137 | 497 days ago | IN | 0 ETH | 0.02245001 | ||||
Claim Rewards | 17110591 | 507 days ago | IN | 0 ETH | 0.00417367 | ||||
Claim Rewards | 17096356 | 509 days ago | IN | 0 ETH | 0.01067209 | ||||
Claim Rewards | 17038527 | 517 days ago | IN | 0 ETH | 0.00967268 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFTStaking
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-22 */ // SPDX-License-Identifier: MIT // File: contracts/IToken.sol pragma solidity ^0.8.0; interface IToken { function balanceOf(address owner) external view returns(uint256); function transferFrom(address, address, uint256) external; function allowance(address owner, address spender) external view returns(uint256); function approve(address spender, uint256 amount) external returns(bool); } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`. // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`. // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a // good first aproximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 1; } // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/NFTStaking.sol pragma solidity ^0.8.0; contract NFTStaking is IERC721Receiver, Ownable { using EnumerableSet for EnumerableSet.UintSet; address public ERC721_CONTRACT; uint256 public EXPIRATION; //expiry block number (avg 15s per block) /// owner => #NFTsStaked mapping (address => uint256) public tokensStakedByUser; mapping(address => EnumerableSet.UintSet) private _deposits; mapping(address => mapping(uint256 => uint256)) public depositBlocks; mapping (uint256 => uint256) public tokenRarity; // how many tiers uint256[5] public rewardRate; uint256 public tokensStaked; bool public started = false; IToken private RTOKEN; constructor( address _erc721, uint256 _expiration ) { ERC721_CONTRACT = _erc721; EXPIRATION = block.number + _expiration; RTOKEN = IToken(0x7b190d24E9431bcB8b2c3c36F71c0a79B1ef41Dd); // token contract address // number of tokens Per day // to set rarity for tiers you need to start from 0 // tier0 = 50 , tier1 = 60 .... rewardRate = [25000, 35000, 45000, 55000, 70000]; } function initialize() public onlyOwner { RTOKEN.approve(address(this), 100000000000000000000000000); // amount of tokens you want to send to contracts for rewarad in wei } function setRate(uint256 _rarity, uint256 _rate) public onlyOwner() { rewardRate[_rarity] = _rate; } function settokenaddress(address _newtokenaddress) public onlyOwner() { RTOKEN = IToken(_newtokenaddress); } function setRarity(uint256 _tokenId, uint256 _rarity) public onlyOwner() { tokenRarity[_tokenId] = _rarity; } function setBatchRarity(uint256[] memory _tokenIds, uint256 _rarity) public onlyOwner() { for (uint256 i; i < _tokenIds.length; i++) { uint256 tokenId = _tokenIds[i]; tokenRarity[tokenId] = _rarity; } } function setExpiration(uint256 _expiration) public onlyOwner() { EXPIRATION = _expiration; } function toggleStart(bool _state) public onlyOwner() { started = _state; } function setcollectionaddress(address _collectionAddress) public onlyOwner() { ERC721_CONTRACT = _collectionAddress; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } function depositsOf(address account) external view returns (uint256[] memory) { EnumerableSet.UintSet storage depositSet = _deposits[account]; uint256[] memory tokenIds = new uint256[](depositSet.length()); for (uint256 i; i < depositSet.length(); i++) { tokenIds[i] = depositSet.at(i); } return tokenIds; } function findRate(uint256 tokenId) public view returns (uint256 rate) { uint256 rarity = tokenRarity[tokenId]; uint256 perDay = rewardRate[rarity]; // 6000 blocks per day // perDay / 6000 = reward per block // return reward per block rate = (perDay * 1e7 / 28800); return rate; } function calculateRewards(address account, uint256[] memory tokenIds) public view returns (uint256[] memory rewards) { rewards = new uint256[](tokenIds.length); for (uint256 i; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; uint256 rate = findRate(tokenId); rewards[i] = rate * (_deposits[account].contains(tokenId) ? 1 : 0) * (Math.min(block.number, EXPIRATION) - depositBlocks[account][tokenId]); } } function claimRewards(uint256[] calldata tokenIds) public { uint256 reward; uint256 curblock = Math.min(block.number, EXPIRATION); uint256[] memory rewards = calculateRewards(msg.sender, tokenIds); for (uint256 i; i < tokenIds.length; i++) { reward += rewards[i]; depositBlocks[msg.sender][tokenIds[i]] = curblock; } if (reward > 0) { RTOKEN.transferFrom(address(this), msg.sender, reward); } } function deposit(uint256[] calldata tokenIds) external { require(started, 'Staking contract not started yet'); claimRewards(tokenIds); for (uint256 i; i < tokenIds.length; i++) { IERC721(ERC721_CONTRACT).safeTransferFrom( msg.sender, address(this), tokenIds[i], '' ); _deposits[msg.sender].add(tokenIds[i]); tokensStakedByUser[_msgSender()] += 1; tokensStaked += 1; } } function admin_deposit(uint256[] calldata tokenIds) onlyOwner() external { claimRewards(tokenIds); for (uint256 i; i < tokenIds.length; i++) { IERC721(ERC721_CONTRACT).safeTransferFrom( msg.sender, address(this), tokenIds[i], '' ); _deposits[msg.sender].add(tokenIds[i]); } } function withdraw(uint256[] calldata tokenIds) external { claimRewards(tokenIds); for (uint256 i; i < tokenIds.length; i++) { require( _deposits[msg.sender].contains(tokenIds[i]), 'StakeSeals: Token not deposited' ); _deposits[msg.sender].remove(tokenIds[i]); tokensStakedByUser[_msgSender()] -= 1; tokensStaked -= 1; IERC721(ERC721_CONTRACT).safeTransferFrom( address(this), msg.sender, tokenIds[i], '' ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_erc721","type":"address"},{"internalType":"uint256","name":"_expiration","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ERC721_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXPIRATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"admin_deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"calculateRewards","outputs":[{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"findRate","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_rarity","type":"uint256"}],"name":"setBatchRarity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expiration","type":"uint256"}],"name":"setExpiration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_rarity","type":"uint256"}],"name":"setRarity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rarity","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"}],"name":"setcollectionaddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newtokenaddress","type":"address"}],"name":"settokenaddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensStakedByUser","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":"tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051620028263803806200282683398181016040528101906200005291906200035e565b62000072620000666200018260201b60201c565b6200018a60201b60201c565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508043620000c19190620003d4565b600281905550737b190d24e9431bcb8b2c3c36f71c0a79b1ef41dd600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a001604052806161a862ffffff1681526020016188b862ffffff16815260200161afc862ffffff16815260200161d6d862ffffff1681526020016201117062ffffff168152506007906005620001799291906200024e565b50505062000431565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b826005810192821562000287579160200282015b8281111562000286578251829062ffffff1690559160200191906001019062000262565b5b5090506200029691906200029a565b5090565b5b80821115620002b55760008160009055506001016200029b565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002eb82620002be565b9050919050565b620002fd81620002de565b81146200030957600080fd5b50565b6000815190506200031d81620002f2565b92915050565b6000819050919050565b620003388162000323565b81146200034457600080fd5b50565b60008151905062000358816200032d565b92915050565b60008060408385031215620003785762000377620002b9565b5b600062000388858286016200030c565b92505060206200039b8582860162000347565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003e18262000323565b9150620003ee8362000323565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620004265762000425620003a5565b5b828201905092915050565b6123e580620004416000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80638da5cb5b116100f9578063b97e439a11610097578063cea0196211610071578063cea0196214610490578063e3a9db1a146104c0578063e984d794146104f0578063f2fde38b1461050c576101a9565b8063b97e439a1461043a578063bb4b573414610456578063bd5f451f14610474576101a9565b806399a03316116100d357806399a03316146103b4578063a0802add146103d2578063a2d0e650146103ee578063afb0a3691461040a576101a9565b80638da5cb5b1461034a578063940414ce14610368578063983d95ce14610398576101a9565b8063515a20ba11610166578063715018a611610140578063715018a6146102ea57806372dc7947146102f457806376a22879146103245780638129fc1c14610340576101a9565b8063515a20ba14610296578063598b8e71146102b25780635eac6239146102ce576101a9565b8063068c526f146101ae57806306dfe2d1146101de578063150b7a021461020e57806316c2acb21461023e5780631f2698ab1461025c57806346df2ccb1461027a575b600080fd5b6101c860048036038101906101c39190611916565b610528565b6040516101d59190611a30565b60405180910390f35b6101f860048036038101906101f39190611a52565b6106c7565b6040516102059190611aa1565b60405180910390f35b61022860048036038101906102239190611b17565b6106ec565b6040516102359190611bda565b60405180910390f35b610246610701565b6040516102539190611c04565b60405180910390f35b610264610727565b6040516102719190611c3a565b60405180910390f35b610294600480360381019061028f9190611c55565b61073a565b005b6102b060048036038101906102ab9190611c95565b610760565b005b6102cc60048036038101906102c79190611d18565b610772565b005b6102e860048036038101906102e39190611d18565b61097e565b005b6102f2610b38565b005b61030e60048036038101906103099190611d65565b610b4c565b60405161031b9190611aa1565b60405180910390f35b61033e60048036038101906103399190611dbe565b610b64565b005b610348610b89565b005b610352610c3f565b60405161035f9190611c04565b60405180910390f35b610382600480360381019061037d9190611c95565b610c68565b60405161038f9190611aa1565b60405180910390f35b6103b260048036038101906103ad9190611d18565b610cc0565b005b6103bc610f26565b6040516103c99190611aa1565b60405180910390f35b6103ec60048036038101906103e79190611d65565b610f2c565b005b61040860048036038101906104039190611deb565b610f78565b005b610424600480360381019061041f9190611c95565b610fdc565b6040516104319190611aa1565b60405180910390f35b610454600480360381019061044f9190611d18565b610ff4565b005b61045e611141565b60405161046b9190611aa1565b60405180910390f35b61048e60048036038101906104899190611d65565b611147565b005b6104aa60048036038101906104a59190611c95565b611193565b6040516104b79190611aa1565b60405180910390f35b6104da60048036038101906104d59190611d65565b6111ae565b6040516104e79190611a30565b60405180910390f35b61050a60048036038101906105059190611c55565b6112ab565b005b61052660048036038101906105219190611d65565b6112cf565b005b6060815167ffffffffffffffff8111156105455761054461179d565b5b6040519080825280602002602001820160405280156105735781602001602082028036833780820191505090505b50905060005b82518110156106c057600083828151811061059757610596611e47565b5b6020026020010151905060006105ac82610c68565b9050600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205461060b43600254611352565b6106159190611ea5565b61066683600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136b90919063ffffffff16565b610671576000610674565b60015b60ff16826106829190611ed9565b61068c9190611ed9565b84848151811061069f5761069e611e47565b5b602002602001018181525050505080806106b890611f33565b915050610579565b5092915050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b905095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900460ff1681565b610742611385565b806007836005811061075757610756611e47565b5b01819055505050565b610768611385565b8060028190555050565b600d60009054906101000a900460ff166107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890611fd8565b60405180910390fd5b6107cb828261097e565b60005b8282905081101561097957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde333086868681811061082c5761082b611e47565b5b905060200201356040518463ffffffff1660e01b81526004016108519392919061202f565b600060405180830381600087803b15801561086b57600080fd5b505af115801561087f573d6000803e3d6000fd5b505050506108ed83838381811061089957610898611e47565b5b90506020020135600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061140390919063ffffffff16565b506001600360006108fc61141d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109459190612079565b925050819055506001600c600082825461095f9190612079565b92505081905550808061097190611f33565b9150506107ce565b505050565b60008061098d43600254611352565b905060006109dc33868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610528565b905060005b85859050811015610a95578181815181106109ff576109fe611e47565b5b602002602001015184610a129190612079565b935082600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888885818110610a6957610a68611e47565b5b905060200201358152602001908152602001600020819055508080610a8d90611f33565b9150506109e1565b506000831115610b3157600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033866040518463ffffffff1660e01b8152600401610afe939291906120cf565b600060405180830381600087803b158015610b1857600080fd5b505af1158015610b2c573d6000803e3d6000fd5b505050505b5050505050565b610b40611385565b610b4a6000611425565b565b60036020528060005260406000206000915090505481565b610b6c611385565b80600d60006101000a81548160ff02191690831515021790555050565b610b91611385565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3306a52b7d2dcc80cd2e40000006040518363ffffffff1660e01b8152600401610bf992919061214b565b6020604051808303816000875af1158015610c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3c9190612189565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060066000848152602001908152602001600020549050600060078260058110610c9757610c96611e47565b5b015490506170806298968082610cad9190611ed9565b610cb791906121e5565b92505050919050565b610cca828261097e565b60005b82829050811015610f2157610d42838383818110610cee57610ced611e47565b5b90506020020135600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136b90919063ffffffff16565b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890612262565b60405180910390fd5b610deb838383818110610d9757610d96611e47565b5b90506020020135600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206114e990919063ffffffff16565b50600160036000610dfa61141d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e439190611ea5565b925050819055506001600c6000828254610e5d9190611ea5565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde3033868686818110610eb757610eb6611e47565b5b905060200201356040518463ffffffff1660e01b8152600401610edc9392919061202f565b600060405180830381600087803b158015610ef657600080fd5b505af1158015610f0a573d6000803e3d6000fd5b505050508080610f1990611f33565b915050610ccd565b505050565b600c5481565b610f34611385565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f80611385565b60005b8251811015610fd7576000838281518110610fa157610fa0611e47565b5b60200260200101519050826006600083815260200190815260200160002081905550508080610fcf90611f33565b915050610f83565b505050565b60066020528060005260406000206000915090505481565b610ffc611385565b611006828261097e565b60005b8282905081101561113c57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde333086868681811061106757611066611e47565b5b905060200201356040518463ffffffff1660e01b815260040161108c9392919061202f565b600060405180830381600087803b1580156110a657600080fd5b505af11580156110ba573d6000803e3d6000fd5b505050506111288383838181106110d4576110d3611e47565b5b90506020020135600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061140390919063ffffffff16565b50808061113490611f33565b915050611009565b505050565b60025481565b61114f611385565b80600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600781600581106111a357600080fd5b016000915090505481565b60606000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006111fe82611503565b67ffffffffffffffff8111156112175761121661179d565b5b6040519080825280602002602001820160405280156112455781602001602082028036833780820191505090505b50905060005b61125483611503565b8110156112a05761126e818461151890919063ffffffff16565b82828151811061128157611280611e47565b5b602002602001018181525050808061129890611f33565b91505061124b565b508092505050919050565b6112b3611385565b8060066000848152602001908152602001600020819055505050565b6112d7611385565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d906122f4565b60405180910390fd5b61134f81611425565b50565b60008183106113615781611363565b825b905092915050565b600061137d836000018360001b611532565b905092915050565b61138d61141d565b73ffffffffffffffffffffffffffffffffffffffff166113ab610c3f565b73ffffffffffffffffffffffffffffffffffffffff1614611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890612360565b60405180910390fd5b565b6000611415836000018360001b611555565b905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006114fb836000018360001b6115c5565b905092915050565b6000611511826000016116d9565b9050919050565b600061152783600001836116ea565b60001c905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b60006115618383611532565b6115ba5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506115bf565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146116cd5760006001826115f79190611ea5565b905060006001866000018054905061160f9190611ea5565b905081811461167e5760008660000182815481106116305761162f611e47565b5b906000526020600020015490508087600001848154811061165457611653611e47565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061169257611691612380565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506116d3565b60009150505b92915050565b600081600001805490509050919050565b600082600001828154811061170257611701611e47565b5b9060005260206000200154905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061175482611729565b9050919050565b61176481611749565b811461176f57600080fd5b50565b6000813590506117818161175b565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117d58261178c565b810181811067ffffffffffffffff821117156117f4576117f361179d565b5b80604052505050565b6000611807611715565b905061181382826117cc565b919050565b600067ffffffffffffffff8211156118335761183261179d565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61185c81611849565b811461186757600080fd5b50565b60008135905061187981611853565b92915050565b600061189261188d84611818565b6117fd565b905080838252602082019050602084028301858111156118b5576118b4611844565b5b835b818110156118de57806118ca888261186a565b8452602084019350506020810190506118b7565b5050509392505050565b600082601f8301126118fd576118fc611787565b5b813561190d84826020860161187f565b91505092915050565b6000806040838503121561192d5761192c61171f565b5b600061193b85828601611772565b925050602083013567ffffffffffffffff81111561195c5761195b611724565b5b611968858286016118e8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6119a781611849565b82525050565b60006119b9838361199e565b60208301905092915050565b6000602082019050919050565b60006119dd82611972565b6119e7818561197d565b93506119f28361198e565b8060005b83811015611a23578151611a0a88826119ad565b9750611a15836119c5565b9250506001810190506119f6565b5085935050505092915050565b60006020820190508181036000830152611a4a81846119d2565b905092915050565b60008060408385031215611a6957611a6861171f565b5b6000611a7785828601611772565b9250506020611a888582860161186a565b9150509250929050565b611a9b81611849565b82525050565b6000602082019050611ab66000830184611a92565b92915050565b600080fd5b60008083601f840112611ad757611ad6611787565b5b8235905067ffffffffffffffff811115611af457611af3611abc565b5b602083019150836001820283011115611b1057611b0f611844565b5b9250929050565b600080600080600060808688031215611b3357611b3261171f565b5b6000611b4188828901611772565b9550506020611b5288828901611772565b9450506040611b638882890161186a565b935050606086013567ffffffffffffffff811115611b8457611b83611724565b5b611b9088828901611ac1565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611bd481611b9f565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611749565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008115159050919050565b611c3481611c1f565b82525050565b6000602082019050611c4f6000830184611c2b565b92915050565b60008060408385031215611c6c57611c6b61171f565b5b6000611c7a8582860161186a565b9250506020611c8b8582860161186a565b9150509250929050565b600060208284031215611cab57611caa61171f565b5b6000611cb98482850161186a565b91505092915050565b60008083601f840112611cd857611cd7611787565b5b8235905067ffffffffffffffff811115611cf557611cf4611abc565b5b602083019150836020820283011115611d1157611d10611844565b5b9250929050565b60008060208385031215611d2f57611d2e61171f565b5b600083013567ffffffffffffffff811115611d4d57611d4c611724565b5b611d5985828601611cc2565b92509250509250929050565b600060208284031215611d7b57611d7a61171f565b5b6000611d8984828501611772565b91505092915050565b611d9b81611c1f565b8114611da657600080fd5b50565b600081359050611db881611d92565b92915050565b600060208284031215611dd457611dd361171f565b5b6000611de284828501611da9565b91505092915050565b60008060408385031215611e0257611e0161171f565b5b600083013567ffffffffffffffff811115611e2057611e1f611724565b5b611e2c858286016118e8565b9250506020611e3d8582860161186a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611eb082611849565b9150611ebb83611849565b925082821015611ece57611ecd611e76565b5b828203905092915050565b6000611ee482611849565b9150611eef83611849565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611f2857611f27611e76565b5b828202905092915050565b6000611f3e82611849565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f7057611f6f611e76565b5b600182019050919050565b600082825260208201905092915050565b7f5374616b696e6720636f6e7472616374206e6f74207374617274656420796574600082015250565b6000611fc2602083611f7b565b9150611fcd82611f8c565b602082019050919050565b60006020820190508181036000830152611ff181611fb5565b9050919050565b600082825260208201905092915050565b50565b6000612019600083611ff8565b915061202482612009565b600082019050919050565b60006080820190506120446000830186611bf5565b6120516020830185611bf5565b61205e6040830184611a92565b818103606083015261206f8161200c565b9050949350505050565b600061208482611849565b915061208f83611849565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156120c4576120c3611e76565b5b828201905092915050565b60006060820190506120e46000830186611bf5565b6120f16020830185611bf5565b6120fe6040830184611a92565b949350505050565b6000819050919050565b6000819050919050565b600061213561213061212b84612106565b612110565b611849565b9050919050565b6121458161211a565b82525050565b60006040820190506121606000830185611bf5565b61216d602083018461213c565b9392505050565b60008151905061218381611d92565b92915050565b60006020828403121561219f5761219e61171f565b5b60006121ad84828501612174565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006121f082611849565b91506121fb83611849565b92508261220b5761220a6121b6565b5b828204905092915050565b7f5374616b655365616c733a20546f6b656e206e6f74206465706f736974656400600082015250565b600061224c601f83611f7b565b915061225782612216565b602082019050919050565b6000602082019050818103600083015261227b8161223f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006122de602683611f7b565b91506122e982612282565b604082019050919050565b6000602082019050818103600083015261230d816122d1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061234a602083611f7b565b915061235582612314565b602082019050919050565b600060208201905081810360008301526123798161233d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220206ede74c864c873feb4ccd45ecb03ce32c8d0e761f6e7cc211d8d94d80fbd3d64736f6c634300080e00330000000000000000000000004629530bcce7ae3b20561ca717b9a47e9c244cdb0000000000000000000000000000000000000000204fce5e3e25026110000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80638da5cb5b116100f9578063b97e439a11610097578063cea0196211610071578063cea0196214610490578063e3a9db1a146104c0578063e984d794146104f0578063f2fde38b1461050c576101a9565b8063b97e439a1461043a578063bb4b573414610456578063bd5f451f14610474576101a9565b806399a03316116100d357806399a03316146103b4578063a0802add146103d2578063a2d0e650146103ee578063afb0a3691461040a576101a9565b80638da5cb5b1461034a578063940414ce14610368578063983d95ce14610398576101a9565b8063515a20ba11610166578063715018a611610140578063715018a6146102ea57806372dc7947146102f457806376a22879146103245780638129fc1c14610340576101a9565b8063515a20ba14610296578063598b8e71146102b25780635eac6239146102ce576101a9565b8063068c526f146101ae57806306dfe2d1146101de578063150b7a021461020e57806316c2acb21461023e5780631f2698ab1461025c57806346df2ccb1461027a575b600080fd5b6101c860048036038101906101c39190611916565b610528565b6040516101d59190611a30565b60405180910390f35b6101f860048036038101906101f39190611a52565b6106c7565b6040516102059190611aa1565b60405180910390f35b61022860048036038101906102239190611b17565b6106ec565b6040516102359190611bda565b60405180910390f35b610246610701565b6040516102539190611c04565b60405180910390f35b610264610727565b6040516102719190611c3a565b60405180910390f35b610294600480360381019061028f9190611c55565b61073a565b005b6102b060048036038101906102ab9190611c95565b610760565b005b6102cc60048036038101906102c79190611d18565b610772565b005b6102e860048036038101906102e39190611d18565b61097e565b005b6102f2610b38565b005b61030e60048036038101906103099190611d65565b610b4c565b60405161031b9190611aa1565b60405180910390f35b61033e60048036038101906103399190611dbe565b610b64565b005b610348610b89565b005b610352610c3f565b60405161035f9190611c04565b60405180910390f35b610382600480360381019061037d9190611c95565b610c68565b60405161038f9190611aa1565b60405180910390f35b6103b260048036038101906103ad9190611d18565b610cc0565b005b6103bc610f26565b6040516103c99190611aa1565b60405180910390f35b6103ec60048036038101906103e79190611d65565b610f2c565b005b61040860048036038101906104039190611deb565b610f78565b005b610424600480360381019061041f9190611c95565b610fdc565b6040516104319190611aa1565b60405180910390f35b610454600480360381019061044f9190611d18565b610ff4565b005b61045e611141565b60405161046b9190611aa1565b60405180910390f35b61048e60048036038101906104899190611d65565b611147565b005b6104aa60048036038101906104a59190611c95565b611193565b6040516104b79190611aa1565b60405180910390f35b6104da60048036038101906104d59190611d65565b6111ae565b6040516104e79190611a30565b60405180910390f35b61050a60048036038101906105059190611c55565b6112ab565b005b61052660048036038101906105219190611d65565b6112cf565b005b6060815167ffffffffffffffff8111156105455761054461179d565b5b6040519080825280602002602001820160405280156105735781602001602082028036833780820191505090505b50905060005b82518110156106c057600083828151811061059757610596611e47565b5b6020026020010151905060006105ac82610c68565b9050600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205461060b43600254611352565b6106159190611ea5565b61066683600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136b90919063ffffffff16565b610671576000610674565b60015b60ff16826106829190611ed9565b61068c9190611ed9565b84848151811061069f5761069e611e47565b5b602002602001018181525050505080806106b890611f33565b915050610579565b5092915050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b905095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900460ff1681565b610742611385565b806007836005811061075757610756611e47565b5b01819055505050565b610768611385565b8060028190555050565b600d60009054906101000a900460ff166107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890611fd8565b60405180910390fd5b6107cb828261097e565b60005b8282905081101561097957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde333086868681811061082c5761082b611e47565b5b905060200201356040518463ffffffff1660e01b81526004016108519392919061202f565b600060405180830381600087803b15801561086b57600080fd5b505af115801561087f573d6000803e3d6000fd5b505050506108ed83838381811061089957610898611e47565b5b90506020020135600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061140390919063ffffffff16565b506001600360006108fc61141d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109459190612079565b925050819055506001600c600082825461095f9190612079565b92505081905550808061097190611f33565b9150506107ce565b505050565b60008061098d43600254611352565b905060006109dc33868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610528565b905060005b85859050811015610a95578181815181106109ff576109fe611e47565b5b602002602001015184610a129190612079565b935082600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888885818110610a6957610a68611e47565b5b905060200201358152602001908152602001600020819055508080610a8d90611f33565b9150506109e1565b506000831115610b3157600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033866040518463ffffffff1660e01b8152600401610afe939291906120cf565b600060405180830381600087803b158015610b1857600080fd5b505af1158015610b2c573d6000803e3d6000fd5b505050505b5050505050565b610b40611385565b610b4a6000611425565b565b60036020528060005260406000206000915090505481565b610b6c611385565b80600d60006101000a81548160ff02191690831515021790555050565b610b91611385565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3306a52b7d2dcc80cd2e40000006040518363ffffffff1660e01b8152600401610bf992919061214b565b6020604051808303816000875af1158015610c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3c9190612189565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060066000848152602001908152602001600020549050600060078260058110610c9757610c96611e47565b5b015490506170806298968082610cad9190611ed9565b610cb791906121e5565b92505050919050565b610cca828261097e565b60005b82829050811015610f2157610d42838383818110610cee57610ced611e47565b5b90506020020135600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136b90919063ffffffff16565b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890612262565b60405180910390fd5b610deb838383818110610d9757610d96611e47565b5b90506020020135600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206114e990919063ffffffff16565b50600160036000610dfa61141d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e439190611ea5565b925050819055506001600c6000828254610e5d9190611ea5565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde3033868686818110610eb757610eb6611e47565b5b905060200201356040518463ffffffff1660e01b8152600401610edc9392919061202f565b600060405180830381600087803b158015610ef657600080fd5b505af1158015610f0a573d6000803e3d6000fd5b505050508080610f1990611f33565b915050610ccd565b505050565b600c5481565b610f34611385565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f80611385565b60005b8251811015610fd7576000838281518110610fa157610fa0611e47565b5b60200260200101519050826006600083815260200190815260200160002081905550508080610fcf90611f33565b915050610f83565b505050565b60066020528060005260406000206000915090505481565b610ffc611385565b611006828261097e565b60005b8282905081101561113c57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde333086868681811061106757611066611e47565b5b905060200201356040518463ffffffff1660e01b815260040161108c9392919061202f565b600060405180830381600087803b1580156110a657600080fd5b505af11580156110ba573d6000803e3d6000fd5b505050506111288383838181106110d4576110d3611e47565b5b90506020020135600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061140390919063ffffffff16565b50808061113490611f33565b915050611009565b505050565b60025481565b61114f611385565b80600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600781600581106111a357600080fd5b016000915090505481565b60606000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006111fe82611503565b67ffffffffffffffff8111156112175761121661179d565b5b6040519080825280602002602001820160405280156112455781602001602082028036833780820191505090505b50905060005b61125483611503565b8110156112a05761126e818461151890919063ffffffff16565b82828151811061128157611280611e47565b5b602002602001018181525050808061129890611f33565b91505061124b565b508092505050919050565b6112b3611385565b8060066000848152602001908152602001600020819055505050565b6112d7611385565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d906122f4565b60405180910390fd5b61134f81611425565b50565b60008183106113615781611363565b825b905092915050565b600061137d836000018360001b611532565b905092915050565b61138d61141d565b73ffffffffffffffffffffffffffffffffffffffff166113ab610c3f565b73ffffffffffffffffffffffffffffffffffffffff1614611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890612360565b60405180910390fd5b565b6000611415836000018360001b611555565b905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006114fb836000018360001b6115c5565b905092915050565b6000611511826000016116d9565b9050919050565b600061152783600001836116ea565b60001c905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b60006115618383611532565b6115ba5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506115bf565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146116cd5760006001826115f79190611ea5565b905060006001866000018054905061160f9190611ea5565b905081811461167e5760008660000182815481106116305761162f611e47565b5b906000526020600020015490508087600001848154811061165457611653611e47565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061169257611691612380565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506116d3565b60009150505b92915050565b600081600001805490509050919050565b600082600001828154811061170257611701611e47565b5b9060005260206000200154905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061175482611729565b9050919050565b61176481611749565b811461176f57600080fd5b50565b6000813590506117818161175b565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117d58261178c565b810181811067ffffffffffffffff821117156117f4576117f361179d565b5b80604052505050565b6000611807611715565b905061181382826117cc565b919050565b600067ffffffffffffffff8211156118335761183261179d565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61185c81611849565b811461186757600080fd5b50565b60008135905061187981611853565b92915050565b600061189261188d84611818565b6117fd565b905080838252602082019050602084028301858111156118b5576118b4611844565b5b835b818110156118de57806118ca888261186a565b8452602084019350506020810190506118b7565b5050509392505050565b600082601f8301126118fd576118fc611787565b5b813561190d84826020860161187f565b91505092915050565b6000806040838503121561192d5761192c61171f565b5b600061193b85828601611772565b925050602083013567ffffffffffffffff81111561195c5761195b611724565b5b611968858286016118e8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6119a781611849565b82525050565b60006119b9838361199e565b60208301905092915050565b6000602082019050919050565b60006119dd82611972565b6119e7818561197d565b93506119f28361198e565b8060005b83811015611a23578151611a0a88826119ad565b9750611a15836119c5565b9250506001810190506119f6565b5085935050505092915050565b60006020820190508181036000830152611a4a81846119d2565b905092915050565b60008060408385031215611a6957611a6861171f565b5b6000611a7785828601611772565b9250506020611a888582860161186a565b9150509250929050565b611a9b81611849565b82525050565b6000602082019050611ab66000830184611a92565b92915050565b600080fd5b60008083601f840112611ad757611ad6611787565b5b8235905067ffffffffffffffff811115611af457611af3611abc565b5b602083019150836001820283011115611b1057611b0f611844565b5b9250929050565b600080600080600060808688031215611b3357611b3261171f565b5b6000611b4188828901611772565b9550506020611b5288828901611772565b9450506040611b638882890161186a565b935050606086013567ffffffffffffffff811115611b8457611b83611724565b5b611b9088828901611ac1565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611bd481611b9f565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611749565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008115159050919050565b611c3481611c1f565b82525050565b6000602082019050611c4f6000830184611c2b565b92915050565b60008060408385031215611c6c57611c6b61171f565b5b6000611c7a8582860161186a565b9250506020611c8b8582860161186a565b9150509250929050565b600060208284031215611cab57611caa61171f565b5b6000611cb98482850161186a565b91505092915050565b60008083601f840112611cd857611cd7611787565b5b8235905067ffffffffffffffff811115611cf557611cf4611abc565b5b602083019150836020820283011115611d1157611d10611844565b5b9250929050565b60008060208385031215611d2f57611d2e61171f565b5b600083013567ffffffffffffffff811115611d4d57611d4c611724565b5b611d5985828601611cc2565b92509250509250929050565b600060208284031215611d7b57611d7a61171f565b5b6000611d8984828501611772565b91505092915050565b611d9b81611c1f565b8114611da657600080fd5b50565b600081359050611db881611d92565b92915050565b600060208284031215611dd457611dd361171f565b5b6000611de284828501611da9565b91505092915050565b60008060408385031215611e0257611e0161171f565b5b600083013567ffffffffffffffff811115611e2057611e1f611724565b5b611e2c858286016118e8565b9250506020611e3d8582860161186a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611eb082611849565b9150611ebb83611849565b925082821015611ece57611ecd611e76565b5b828203905092915050565b6000611ee482611849565b9150611eef83611849565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611f2857611f27611e76565b5b828202905092915050565b6000611f3e82611849565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f7057611f6f611e76565b5b600182019050919050565b600082825260208201905092915050565b7f5374616b696e6720636f6e7472616374206e6f74207374617274656420796574600082015250565b6000611fc2602083611f7b565b9150611fcd82611f8c565b602082019050919050565b60006020820190508181036000830152611ff181611fb5565b9050919050565b600082825260208201905092915050565b50565b6000612019600083611ff8565b915061202482612009565b600082019050919050565b60006080820190506120446000830186611bf5565b6120516020830185611bf5565b61205e6040830184611a92565b818103606083015261206f8161200c565b9050949350505050565b600061208482611849565b915061208f83611849565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156120c4576120c3611e76565b5b828201905092915050565b60006060820190506120e46000830186611bf5565b6120f16020830185611bf5565b6120fe6040830184611a92565b949350505050565b6000819050919050565b6000819050919050565b600061213561213061212b84612106565b612110565b611849565b9050919050565b6121458161211a565b82525050565b60006040820190506121606000830185611bf5565b61216d602083018461213c565b9392505050565b60008151905061218381611d92565b92915050565b60006020828403121561219f5761219e61171f565b5b60006121ad84828501612174565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006121f082611849565b91506121fb83611849565b92508261220b5761220a6121b6565b5b828204905092915050565b7f5374616b655365616c733a20546f6b656e206e6f74206465706f736974656400600082015250565b600061224c601f83611f7b565b915061225782612216565b602082019050919050565b6000602082019050818103600083015261227b8161223f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006122de602683611f7b565b91506122e982612282565b604082019050919050565b6000602082019050818103600083015261230d816122d1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061234a602083611f7b565b915061235582612314565b602082019050919050565b600060208201905081810360008301526123798161233d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220206ede74c864c873feb4ccd45ecb03ce32c8d0e761f6e7cc211d8d94d80fbd3d64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004629530bcce7ae3b20561ca717b9a47e9c244cdb0000000000000000000000000000000000000000204fce5e3e25026110000000
-----Decoded View---------------
Arg [0] : _erc721 (address): 0x4629530bCcE7Ae3B20561CA717b9a47E9c244cDb
Arg [1] : _expiration (uint256): 10000000000000000000000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004629530bcce7ae3b20561ca717b9a47e9c244cdb
Arg [1] : 0000000000000000000000000000000000000000204fce5e3e25026110000000
Deployed Bytecode Sourcemap
60587:6156:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63971:591;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60966:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62922:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60696:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61188:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61924:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62562:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65099:558;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64570:521;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27863:103;;;:::i;:::-;;60839:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62682:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61729:185;;;:::i;:::-;;27215:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63563:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66099:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61154:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62782:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62303:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61041:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65665:426;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60733:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62044:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61118:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63149:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62172:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28121:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63971:591;64089:24;64155:8;:15;64141:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64131:40;;64189:9;64184:371;64204:8;:15;64200:1;:19;64184:371;;;64241:15;64259:8;64268:1;64259:11;;;;;;;;:::i;:::-;;;;;;;;64241:29;;64285:12;64300:17;64309:7;64300:8;:17::i;:::-;64285:32;;64511:13;:22;64525:7;64511:22;;;;;;;;;;;;;;;:31;64534:7;64511:31;;;;;;;;;;;;64453:34;64462:12;64476:10;;64453:8;:34::i;:::-;:89;;;;:::i;:::-;64387:36;64415:7;64387:9;:18;64397:7;64387:18;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;:44;;64430:1;64387:44;;;64426:1;64387:44;64362:70;;:4;:70;;;;:::i;:::-;:181;;;;:::i;:::-;64332:7;64340:1;64332:10;;;;;;;;:::i;:::-;;;;;;;:211;;;;;64226:329;;64221:3;;;;;:::i;:::-;;;;64184:371;;;;63971:591;;;;:::o;60966:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62922:219::-;63066:6;63092:41;;;63085:48;;62922:219;;;;;;;:::o;60696:30::-;;;;;;;;;;;;;:::o;61188:27::-;;;;;;;;;;;;;:::o;61924:114::-;27101:13;:11;:13::i;:::-;62025:5:::1;62003:10;62014:7;62003:19;;;;;;;:::i;:::-;;;:27;;;;61924:114:::0;;:::o;62562:106::-;27101:13;:11;:13::i;:::-;62649:11:::1;62636:10;:24;;;;62562:106:::0;:::o;65099:558::-;65173:7;;;;;;;;;;;65165:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;65230:22;65243:8;;65230:12;:22::i;:::-;65280:9;65275:375;65295:8;;:15;;65291:1;:19;65275:375;;;65340:15;;;;;;;;;;;65332:41;;;65392:10;65429:4;65453:8;;65462:1;65453:11;;;;;;;:::i;:::-;;;;;;;;65332:168;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65515:38;65541:8;;65550:1;65541:11;;;;;;;:::i;:::-;;;;;;;;65515:9;:21;65525:10;65515:21;;;;;;;;;;;;;;;:25;;:38;;;;:::i;:::-;;65604:1;65568:18;:32;65587:12;:10;:12::i;:::-;65568:32;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;65637:1;65621:12;;:17;;;;;;;:::i;:::-;;;;;;;;65312:3;;;;;:::i;:::-;;;;65275:375;;;;65099:558;;:::o;64570:521::-;64639:14;64664:16;64683:34;64692:12;64706:10;;64683:8;:34::i;:::-;64664:53;;64728:24;64755:38;64772:10;64784:8;;64755:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:38::i;:::-;64728:65;;64811:9;64806:153;64826:8;;:15;;64822:1;:19;64806:153;;;64873:7;64881:1;64873:10;;;;;;;;:::i;:::-;;;;;;;;64863:20;;;;;:::i;:::-;;;64939:8;64898:13;:25;64912:10;64898:25;;;;;;;;;;;;;;;:38;64924:8;;64933:1;64924:11;;;;;;;:::i;:::-;;;;;;;;64898:38;;;;;;;;;;;:49;;;;64843:3;;;;;:::i;:::-;;;;64806:153;;;;64996:1;64987:6;:10;64983:98;;;65015:6;;;;;;;;;;;:19;;;65043:4;65050:10;65062:6;65015:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64983:98;64628:463;;;64570:521;;:::o;27863:103::-;27101:13;:11;:13::i;:::-;27928:30:::1;27955:1;27928:18;:30::i;:::-;27863:103::o:0;60839:54::-;;;;;;;;;;;;;;;;;:::o;62682:88::-;27101:13;:11;:13::i;:::-;62756:6:::1;62746:7;;:16;;;;;;;;;;;;;;;;;;62682:88:::0;:::o;61729:185::-;27101:13;:11;:13::i;:::-;61779:6:::1;;;;;;;;;;;:14;;;61802:4;61809:27;61779:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61729:185::o:0;27215:87::-;27261:7;27288:6;;;;;;;;;;;27281:13;;27215:87;:::o;63563:400::-;63646:12;63677:14;63694:11;:20;63706:7;63694:20;;;;;;;;;;;;63677:37;;63725:14;63742:10;63753:6;63742:18;;;;;;;:::i;:::-;;;;63725:35;;63917:5;63911:3;63902:6;:12;;;;:::i;:::-;:20;;;;:::i;:::-;63894:29;;63944:11;;63563:400;;;:::o;66099:641::-;66166:22;66179:8;;66166:12;:22::i;:::-;66206:9;66201:532;66221:8;;:15;;66217:1;:19;66201:532;;;66284:43;66315:8;;66324:1;66315:11;;;;;;;:::i;:::-;;;;;;;;66284:9;:21;66294:10;66284:21;;;;;;;;;;;;;;;:30;;:43;;;;:::i;:::-;66258:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;66411:41;66440:8;;66449:1;66440:11;;;;;;;:::i;:::-;;;;;;;;66411:9;:21;66421:10;66411:21;;;;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;;66503:1;66467:18;:32;66486:12;:10;:12::i;:::-;66467:32;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;66535:1;66519:12;;:17;;;;;;;:::i;:::-;;;;;;;;66561:15;;;;;;;;;;;66553:41;;;66621:4;66645:10;66674:8;;66683:1;66674:11;;;;;;;:::i;:::-;;;;;;;;66553:168;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66238:3;;;;;:::i;:::-;;;;66201:532;;;;66099:641;;:::o;61154:27::-;;;;:::o;62782:132::-;27101:13;:11;:13::i;:::-;62888:18:::1;62870:15;;:36;;;;;;;;;;;;;;;;;;62782:132:::0;:::o;62303:251::-;27101:13;:11;:13::i;:::-;62407:9:::1;62402:145;62422:9;:16;62418:1;:20;62402:145;;;62460:15;62478:9;62488:1;62478:12;;;;;;;;:::i;:::-;;;;;;;;62460:30;;62528:7;62505:11;:20;62517:7;62505:20;;;;;;;;;;;:30;;;;62445:102;62440:3;;;;;:::i;:::-;;;;62402:145;;;;62303:251:::0;;:::o;61041:47::-;;;;;;;;;;;;;;;;;:::o;65665:426::-;27101:13;:11;:13::i;:::-;65749:22:::1;65762:8;;65749:12;:22::i;:::-;65799:9;65794:290;65814:8;;:15;;65810:1;:19;65794:290;;;65859:15;;;;;;;;;;;65851:41;;;65911:10;65948:4;65972:8;;65981:1;65972:11;;;;;;;:::i;:::-;;;;;;;;65851:168;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66034:38;66060:8;;66069:1;66060:11;;;;;;;:::i;:::-;;;;;;;;66034:9;:21;66044:10;66034:21;;;;;;;;;;;;;;;:25;;:38;;;;:::i;:::-;;65831:3;;;;;:::i;:::-;;;;65794:290;;;;65665:426:::0;;:::o;60733:25::-;;;;:::o;62044:122::-;27101:13;:11;:13::i;:::-;62141:16:::1;62125:6;;:33;;;;;;;;;;;;;;;;;;62044:122:::0;:::o;61118:28::-;;;;;;;;;;;;;;;;;;;;:::o;63149:406::-;63236:16;63270:40;63313:9;:18;63323:7;63313:18;;;;;;;;;;;;;;;63270:61;;63342:25;63384:19;:10;:17;:19::i;:::-;63370:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63342:62;;63422:9;63417:103;63437:19;:10;:17;:19::i;:::-;63433:1;:23;63417:103;;;63492:16;63506:1;63492:10;:13;;:16;;;;:::i;:::-;63478:8;63487:1;63478:11;;;;;;;;:::i;:::-;;;;;;;:30;;;;;63458:3;;;;;:::i;:::-;;;;63417:103;;;;63539:8;63532:15;;;;63149:406;;;:::o;62172:123::-;27101:13;:11;:13::i;:::-;62280:7:::1;62256:11;:21;62268:8;62256:21;;;;;;;;;;;:31;;;;62172:123:::0;;:::o;28121:201::-;27101:13;:11;:13::i;:::-;28230:1:::1;28210:22;;:8;:22;;::::0;28202:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28286:28;28305:8;28286:18;:28::i;:::-;28121:201:::0;:::o;1060:106::-;1118:7;1149:1;1145;:5;:13;;1157:1;1145:13;;;1153:1;1145:13;1138:20;;1060:106;;;;:::o;20889:146::-;20966:4;20990:37;21000:3;:10;;21020:5;21012:14;;20990:9;:37::i;:::-;20983:44;;20889:146;;;;:::o;27380:132::-;27455:12;:10;:12::i;:::-;27444:23;;:7;:5;:7::i;:::-;:23;;;27436:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27380:132::o;20359:131::-;20426:4;20450:32;20455:3;:10;;20475:5;20467:14;;20450:4;:32::i;:::-;20443:39;;20359:131;;;;:::o;25766:98::-;25819:7;25846:10;25839:17;;25766:98;:::o;28482:191::-;28556:16;28575:6;;;;;;;;;;;28556:25;;28601:8;28592:6;;:17;;;;;;;;;;;;;;;;;;28656:8;28625:40;;28646:8;28625:40;;;;;;;;;;;;28545:128;28482:191;:::o;20666:137::-;20736:4;20760:35;20768:3;:10;;20788:5;20780:14;;20760:7;:35::i;:::-;20753:42;;20666:137;;;;:::o;21121:114::-;21181:7;21208:19;21216:3;:10;;21208:7;:19::i;:::-;21201:26;;21121:114;;;:::o;21589:137::-;21660:7;21695:22;21699:3;:10;;21711:5;21695:3;:22::i;:::-;21687:31;;21680:38;;21589:137;;;;:::o;13808:129::-;13881:4;13928:1;13905:3;:12;;:19;13918:5;13905:19;;;;;;;;;;;;:24;;13898:31;;13808:129;;;;:::o;11712:414::-;11775:4;11797:21;11807:3;11812:5;11797:9;:21::i;:::-;11792:327;;11835:3;:11;;11852:5;11835:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12018:3;:11;;:18;;;;11996:3;:12;;:19;12009:5;11996:19;;;;;;;;;;;:40;;;;12058:4;12051:11;;;;11792:327;12102:5;12095:12;;11712:414;;;;;:::o;12302:1420::-;12368:4;12486:18;12507:3;:12;;:19;12520:5;12507:19;;;;;;;;;;;;12486:40;;12557:1;12543:10;:15;12539:1176;;12918:21;12955:1;12942:10;:14;;;;:::i;:::-;12918:38;;12971:17;13012:1;12991:3;:11;;:18;;;;:22;;;;:::i;:::-;12971:42;;13047:13;13034:9;:26;13030:405;;13081:17;13101:3;:11;;13113:9;13101:22;;;;;;;;:::i;:::-;;;;;;;;;;13081:42;;13255:9;13226:3;:11;;13238:13;13226:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;13366:10;13340:3;:12;;:23;13353:9;13340:23;;;;;;;;;;;:36;;;;13062:373;13030:405;13516:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13611:3;:12;;:19;13624:5;13611:19;;;;;;;;;;;13604:26;;;13654:4;13647:11;;;;;;;12539:1176;13698:5;13691:12;;;12302:1420;;;;;:::o;14023:109::-;14079:7;14106:3;:11;;:18;;;;14099:25;;14023:109;;;:::o;14486:120::-;14553:7;14580:3;:11;;14592:5;14580:18;;;;;;;;:::i;:::-;;;;;;;;;;14573:25;;14486:120;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:117::-;950:1;947;940:12;964:102;1005:6;1056:2;1052:7;1047:2;1040:5;1036:14;1032:28;1022:38;;964:102;;;:::o;1072:180::-;1120:77;1117:1;1110:88;1217:4;1214:1;1207:15;1241:4;1238:1;1231:15;1258:281;1341:27;1363:4;1341:27;:::i;:::-;1333:6;1329:40;1471:6;1459:10;1456:22;1435:18;1423:10;1420:34;1417:62;1414:88;;;1482:18;;:::i;:::-;1414:88;1522:10;1518:2;1511:22;1301:238;1258:281;;:::o;1545:129::-;1579:6;1606:20;;:::i;:::-;1596:30;;1635:33;1663:4;1655:6;1635:33;:::i;:::-;1545:129;;;:::o;1680:311::-;1757:4;1847:18;1839:6;1836:30;1833:56;;;1869:18;;:::i;:::-;1833:56;1919:4;1911:6;1907:17;1899:25;;1979:4;1973;1969:15;1961:23;;1680:311;;;:::o;1997:117::-;2106:1;2103;2096:12;2120:77;2157:7;2186:5;2175:16;;2120:77;;;:::o;2203:122::-;2276:24;2294:5;2276:24;:::i;:::-;2269:5;2266:35;2256:63;;2315:1;2312;2305:12;2256:63;2203:122;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:710::-;2589:5;2614:81;2630:64;2687:6;2630:64;:::i;:::-;2614:81;:::i;:::-;2605:90;;2715:5;2744:6;2737:5;2730:21;2778:4;2771:5;2767:16;2760:23;;2831:4;2823:6;2819:17;2811:6;2807:30;2860:3;2852:6;2849:15;2846:122;;;2879:79;;:::i;:::-;2846:122;2994:6;2977:220;3011:6;3006:3;3003:15;2977:220;;;3086:3;3115:37;3148:3;3136:10;3115:37;:::i;:::-;3110:3;3103:50;3182:4;3177:3;3173:14;3166:21;;3053:144;3037:4;3032:3;3028:14;3021:21;;2977:220;;;2981:21;2595:608;;2493:710;;;;;:::o;3226:370::-;3297:5;3346:3;3339:4;3331:6;3327:17;3323:27;3313:122;;3354:79;;:::i;:::-;3313:122;3471:6;3458:20;3496:94;3586:3;3578:6;3571:4;3563:6;3559:17;3496:94;:::i;:::-;3487:103;;3303:293;3226:370;;;;:::o;3602:684::-;3695:6;3703;3752:2;3740:9;3731:7;3727:23;3723:32;3720:119;;;3758:79;;:::i;:::-;3720:119;3878:1;3903:53;3948:7;3939:6;3928:9;3924:22;3903:53;:::i;:::-;3893:63;;3849:117;4033:2;4022:9;4018:18;4005:32;4064:18;4056:6;4053:30;4050:117;;;4086:79;;:::i;:::-;4050:117;4191:78;4261:7;4252:6;4241:9;4237:22;4191:78;:::i;:::-;4181:88;;3976:303;3602:684;;;;;:::o;4292:114::-;4359:6;4393:5;4387:12;4377:22;;4292:114;;;:::o;4412:184::-;4511:11;4545:6;4540:3;4533:19;4585:4;4580:3;4576:14;4561:29;;4412:184;;;;:::o;4602:132::-;4669:4;4692:3;4684:11;;4722:4;4717:3;4713:14;4705:22;;4602:132;;;:::o;4740:108::-;4817:24;4835:5;4817:24;:::i;:::-;4812:3;4805:37;4740:108;;:::o;4854:179::-;4923:10;4944:46;4986:3;4978:6;4944:46;:::i;:::-;5022:4;5017:3;5013:14;4999:28;;4854:179;;;;:::o;5039:113::-;5109:4;5141;5136:3;5132:14;5124:22;;5039:113;;;:::o;5188:732::-;5307:3;5336:54;5384:5;5336:54;:::i;:::-;5406:86;5485:6;5480:3;5406:86;:::i;:::-;5399:93;;5516:56;5566:5;5516:56;:::i;:::-;5595:7;5626:1;5611:284;5636:6;5633:1;5630:13;5611:284;;;5712:6;5706:13;5739:63;5798:3;5783:13;5739:63;:::i;:::-;5732:70;;5825:60;5878:6;5825:60;:::i;:::-;5815:70;;5671:224;5658:1;5655;5651:9;5646:14;;5611:284;;;5615:14;5911:3;5904:10;;5312:608;;;5188:732;;;;:::o;5926:373::-;6069:4;6107:2;6096:9;6092:18;6084:26;;6156:9;6150:4;6146:20;6142:1;6131:9;6127:17;6120:47;6184:108;6287:4;6278:6;6184:108;:::i;:::-;6176:116;;5926:373;;;;:::o;6305:474::-;6373:6;6381;6430:2;6418:9;6409:7;6405:23;6401:32;6398:119;;;6436:79;;:::i;:::-;6398:119;6556:1;6581:53;6626:7;6617:6;6606:9;6602:22;6581:53;:::i;:::-;6571:63;;6527:117;6683:2;6709:53;6754:7;6745:6;6734:9;6730:22;6709:53;:::i;:::-;6699:63;;6654:118;6305:474;;;;;:::o;6785:118::-;6872:24;6890:5;6872:24;:::i;:::-;6867:3;6860:37;6785:118;;:::o;6909:222::-;7002:4;7040:2;7029:9;7025:18;7017:26;;7053:71;7121:1;7110:9;7106:17;7097:6;7053:71;:::i;:::-;6909:222;;;;:::o;7137:117::-;7246:1;7243;7236:12;7273:552;7330:8;7340:6;7390:3;7383:4;7375:6;7371:17;7367:27;7357:122;;7398:79;;:::i;:::-;7357:122;7511:6;7498:20;7488:30;;7541:18;7533:6;7530:30;7527:117;;;7563:79;;:::i;:::-;7527:117;7677:4;7669:6;7665:17;7653:29;;7731:3;7723:4;7715:6;7711:17;7701:8;7697:32;7694:41;7691:128;;;7738:79;;:::i;:::-;7691:128;7273:552;;;;;:::o;7831:963::-;7928:6;7936;7944;7952;7960;8009:3;7997:9;7988:7;7984:23;7980:33;7977:120;;;8016:79;;:::i;:::-;7977:120;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;8547:2;8536:9;8532:18;8519:32;8578:18;8570:6;8567:30;8564:117;;;8600:79;;:::i;:::-;8564:117;8713:64;8769:7;8760:6;8749:9;8745:22;8713:64;:::i;:::-;8695:82;;;;8490:297;7831:963;;;;;;;;:::o;8800:149::-;8836:7;8876:66;8869:5;8865:78;8854:89;;8800:149;;;:::o;8955:115::-;9040:23;9057:5;9040:23;:::i;:::-;9035:3;9028:36;8955:115;;:::o;9076:218::-;9167:4;9205:2;9194:9;9190:18;9182:26;;9218:69;9284:1;9273:9;9269:17;9260:6;9218:69;:::i;:::-;9076:218;;;;:::o;9300:118::-;9387:24;9405:5;9387:24;:::i;:::-;9382:3;9375:37;9300:118;;:::o;9424:222::-;9517:4;9555:2;9544:9;9540:18;9532:26;;9568:71;9636:1;9625:9;9621:17;9612:6;9568:71;:::i;:::-;9424:222;;;;:::o;9652:90::-;9686:7;9729:5;9722:13;9715:21;9704:32;;9652:90;;;:::o;9748:109::-;9829:21;9844:5;9829:21;:::i;:::-;9824:3;9817:34;9748:109;;:::o;9863:210::-;9950:4;9988:2;9977:9;9973:18;9965:26;;10001:65;10063:1;10052:9;10048:17;10039:6;10001:65;:::i;:::-;9863:210;;;;:::o;10079:474::-;10147:6;10155;10204:2;10192:9;10183:7;10179:23;10175:32;10172:119;;;10210:79;;:::i;:::-;10172:119;10330:1;10355:53;10400:7;10391:6;10380:9;10376:22;10355:53;:::i;:::-;10345:63;;10301:117;10457:2;10483:53;10528:7;10519:6;10508:9;10504:22;10483:53;:::i;:::-;10473:63;;10428:118;10079:474;;;;;:::o;10559:329::-;10618:6;10667:2;10655:9;10646:7;10642:23;10638:32;10635:119;;;10673:79;;:::i;:::-;10635:119;10793:1;10818:53;10863:7;10854:6;10843:9;10839:22;10818:53;:::i;:::-;10808:63;;10764:117;10559:329;;;;:::o;10911:568::-;10984:8;10994:6;11044:3;11037:4;11029:6;11025:17;11021:27;11011:122;;11052:79;;:::i;:::-;11011:122;11165:6;11152:20;11142:30;;11195:18;11187:6;11184:30;11181:117;;;11217:79;;:::i;:::-;11181:117;11331:4;11323:6;11319:17;11307:29;;11385:3;11377:4;11369:6;11365:17;11355:8;11351:32;11348:41;11345:128;;;11392:79;;:::i;:::-;11345:128;10911:568;;;;;:::o;11485:559::-;11571:6;11579;11628:2;11616:9;11607:7;11603:23;11599:32;11596:119;;;11634:79;;:::i;:::-;11596:119;11782:1;11771:9;11767:17;11754:31;11812:18;11804:6;11801:30;11798:117;;;11834:79;;:::i;:::-;11798:117;11947:80;12019:7;12010:6;11999:9;11995:22;11947:80;:::i;:::-;11929:98;;;;11725:312;11485:559;;;;;:::o;12050:329::-;12109:6;12158:2;12146:9;12137:7;12133:23;12129:32;12126:119;;;12164:79;;:::i;:::-;12126:119;12284:1;12309:53;12354:7;12345:6;12334:9;12330:22;12309:53;:::i;:::-;12299:63;;12255:117;12050:329;;;;:::o;12385:116::-;12455:21;12470:5;12455:21;:::i;:::-;12448:5;12445:32;12435:60;;12491:1;12488;12481:12;12435:60;12385:116;:::o;12507:133::-;12550:5;12588:6;12575:20;12566:29;;12604:30;12628:5;12604:30;:::i;:::-;12507:133;;;;:::o;12646:323::-;12702:6;12751:2;12739:9;12730:7;12726:23;12722:32;12719:119;;;12757:79;;:::i;:::-;12719:119;12877:1;12902:50;12944:7;12935:6;12924:9;12920:22;12902:50;:::i;:::-;12892:60;;12848:114;12646:323;;;;:::o;12975:684::-;13068:6;13076;13125:2;13113:9;13104:7;13100:23;13096:32;13093:119;;;13131:79;;:::i;:::-;13093:119;13279:1;13268:9;13264:17;13251:31;13309:18;13301:6;13298:30;13295:117;;;13331:79;;:::i;:::-;13295:117;13436:78;13506:7;13497:6;13486:9;13482:22;13436:78;:::i;:::-;13426:88;;13222:302;13563:2;13589:53;13634:7;13625:6;13614:9;13610:22;13589:53;:::i;:::-;13579:63;;13534:118;12975:684;;;;;:::o;13665:180::-;13713:77;13710:1;13703:88;13810:4;13807:1;13800:15;13834:4;13831:1;13824:15;13851:180;13899:77;13896:1;13889:88;13996:4;13993:1;13986:15;14020:4;14017:1;14010:15;14037:191;14077:4;14097:20;14115:1;14097:20;:::i;:::-;14092:25;;14131:20;14149:1;14131:20;:::i;:::-;14126:25;;14170:1;14167;14164:8;14161:34;;;14175:18;;:::i;:::-;14161:34;14220:1;14217;14213:9;14205:17;;14037:191;;;;:::o;14234:348::-;14274:7;14297:20;14315:1;14297:20;:::i;:::-;14292:25;;14331:20;14349:1;14331:20;:::i;:::-;14326:25;;14519:1;14451:66;14447:74;14444:1;14441:81;14436:1;14429:9;14422:17;14418:105;14415:131;;;14526:18;;:::i;:::-;14415:131;14574:1;14571;14567:9;14556:20;;14234:348;;;;:::o;14588:233::-;14627:3;14650:24;14668:5;14650:24;:::i;:::-;14641:33;;14696:66;14689:5;14686:77;14683:103;;14766:18;;:::i;:::-;14683:103;14813:1;14806:5;14802:13;14795:20;;14588:233;;;:::o;14827:169::-;14911:11;14945:6;14940:3;14933:19;14985:4;14980:3;14976:14;14961:29;;14827:169;;;;:::o;15002:182::-;15142:34;15138:1;15130:6;15126:14;15119:58;15002:182;:::o;15190:366::-;15332:3;15353:67;15417:2;15412:3;15353:67;:::i;:::-;15346:74;;15429:93;15518:3;15429:93;:::i;:::-;15547:2;15542:3;15538:12;15531:19;;15190:366;;;:::o;15562:419::-;15728:4;15766:2;15755:9;15751:18;15743:26;;15815:9;15809:4;15805:20;15801:1;15790:9;15786:17;15779:47;15843:131;15969:4;15843:131;:::i;:::-;15835:139;;15562:419;;;:::o;15987:168::-;16070:11;16104:6;16099:3;16092:19;16144:4;16139:3;16135:14;16120:29;;15987:168;;;;:::o;16161:114::-;;:::o;16281:362::-;16422:3;16443:65;16506:1;16501:3;16443:65;:::i;:::-;16436:72;;16517:93;16606:3;16517:93;:::i;:::-;16635:1;16630:3;16626:11;16619:18;;16281:362;;;:::o;16649:748::-;16898:4;16936:3;16925:9;16921:19;16913:27;;16950:71;17018:1;17007:9;17003:17;16994:6;16950:71;:::i;:::-;17031:72;17099:2;17088:9;17084:18;17075:6;17031:72;:::i;:::-;17113;17181:2;17170:9;17166:18;17157:6;17113:72;:::i;:::-;17232:9;17226:4;17222:20;17217:2;17206:9;17202:18;17195:48;17260:130;17385:4;17260:130;:::i;:::-;17252:138;;16649:748;;;;;;:::o;17403:305::-;17443:3;17462:20;17480:1;17462:20;:::i;:::-;17457:25;;17496:20;17514:1;17496:20;:::i;:::-;17491:25;;17650:1;17582:66;17578:74;17575:1;17572:81;17569:107;;;17656:18;;:::i;:::-;17569:107;17700:1;17697;17693:9;17686:16;;17403:305;;;;:::o;17714:442::-;17863:4;17901:2;17890:9;17886:18;17878:26;;17914:71;17982:1;17971:9;17967:17;17958:6;17914:71;:::i;:::-;17995:72;18063:2;18052:9;18048:18;18039:6;17995:72;:::i;:::-;18077;18145:2;18134:9;18130:18;18121:6;18077:72;:::i;:::-;17714:442;;;;;;:::o;18162:111::-;18233:7;18262:5;18251:16;;18162:111;;;:::o;18279:60::-;18307:3;18328:5;18321:12;;18279:60;;;:::o;18345:210::-;18429:9;18462:87;18480:68;18489:58;18541:5;18489:58;:::i;:::-;18480:68;:::i;:::-;18462:87;:::i;:::-;18449:100;;18345:210;;;:::o;18561:199::-;18682:71;18747:5;18682:71;:::i;:::-;18677:3;18670:84;18561:199;;:::o;18766:400::-;18921:4;18959:2;18948:9;18944:18;18936:26;;18972:71;19040:1;19029:9;19025:17;19016:6;18972:71;:::i;:::-;19053:106;19155:2;19144:9;19140:18;19131:6;19053:106;:::i;:::-;18766:400;;;;;:::o;19172:137::-;19226:5;19257:6;19251:13;19242:22;;19273:30;19297:5;19273:30;:::i;:::-;19172:137;;;;:::o;19315:345::-;19382:6;19431:2;19419:9;19410:7;19406:23;19402:32;19399:119;;;19437:79;;:::i;:::-;19399:119;19557:1;19582:61;19635:7;19626:6;19615:9;19611:22;19582:61;:::i;:::-;19572:71;;19528:125;19315:345;;;;:::o;19666:180::-;19714:77;19711:1;19704:88;19811:4;19808:1;19801:15;19835:4;19832:1;19825:15;19852:185;19892:1;19909:20;19927:1;19909:20;:::i;:::-;19904:25;;19943:20;19961:1;19943:20;:::i;:::-;19938:25;;19982:1;19972:35;;19987:18;;:::i;:::-;19972:35;20029:1;20026;20022:9;20017:14;;19852:185;;;;:::o;20043:181::-;20183:33;20179:1;20171:6;20167:14;20160:57;20043:181;:::o;20230:366::-;20372:3;20393:67;20457:2;20452:3;20393:67;:::i;:::-;20386:74;;20469:93;20558:3;20469:93;:::i;:::-;20587:2;20582:3;20578:12;20571:19;;20230:366;;;:::o;20602:419::-;20768:4;20806:2;20795:9;20791:18;20783:26;;20855:9;20849:4;20845:20;20841:1;20830:9;20826:17;20819:47;20883:131;21009:4;20883:131;:::i;:::-;20875:139;;20602:419;;;:::o;21027:225::-;21167:34;21163:1;21155:6;21151:14;21144:58;21236:8;21231:2;21223:6;21219:15;21212:33;21027:225;:::o;21258:366::-;21400:3;21421:67;21485:2;21480:3;21421:67;:::i;:::-;21414:74;;21497:93;21586:3;21497:93;:::i;:::-;21615:2;21610:3;21606:12;21599:19;;21258:366;;;:::o;21630:419::-;21796:4;21834:2;21823:9;21819:18;21811:26;;21883:9;21877:4;21873:20;21869:1;21858:9;21854:17;21847:47;21911:131;22037:4;21911:131;:::i;:::-;21903:139;;21630:419;;;:::o;22055:182::-;22195:34;22191:1;22183:6;22179:14;22172:58;22055:182;:::o;22243:366::-;22385:3;22406:67;22470:2;22465:3;22406:67;:::i;:::-;22399:74;;22482:93;22571:3;22482:93;:::i;:::-;22600:2;22595:3;22591:12;22584:19;;22243:366;;;:::o;22615:419::-;22781:4;22819:2;22808:9;22804:18;22796:26;;22868:9;22862:4;22858:20;22854:1;22843:9;22839:17;22832:47;22896:131;23022:4;22896:131;:::i;:::-;22888:139;;22615:419;;;:::o;23040:180::-;23088:77;23085:1;23078:88;23185:4;23182:1;23175:15;23209:4;23206:1;23199:15
Swarm Source
ipfs://206ede74c864c873feb4ccd45ecb03ce32c8d0e761f6e7cc211d8d94d80fbd3d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.