Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 170 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem ERC721 | 21244678 | 4 days ago | IN | 0.01508295 ETH | 0.00110202 | ||||
Redeem ERC721 | 21237153 | 5 days ago | IN | 0.02132845 ETH | 0.00156924 | ||||
Redeem ERC721 | 21225123 | 6 days ago | IN | 0 ETH | 0.00071731 | ||||
Redeem ERC721 | 21216874 | 8 days ago | IN | 0 ETH | 0.0014231 | ||||
Redeem ERC721 | 21150523 | 17 days ago | IN | 0.07406188 ETH | 0.00109479 | ||||
Redeem ERC721 | 21117881 | 21 days ago | IN | 0.02914238 ETH | 0.00043272 | ||||
Redeem ERC721 | 20783402 | 68 days ago | IN | 0 ETH | 0.00143922 | ||||
Redeem ERC721 | 20674939 | 83 days ago | IN | 0 ETH | 0.0000839 | ||||
Redeem ERC721 | 20615824 | 92 days ago | IN | 0.02977298 ETH | 0.00008494 | ||||
Redeem ERC721 | 20570391 | 98 days ago | IN | 0.09560229 ETH | 0.00038799 | ||||
Redeem ERC721 | 20570386 | 98 days ago | IN | 0.09560229 ETH | 0.00034358 | ||||
Redeem ERC721 | 20570370 | 98 days ago | IN | 0 ETH | 0.0003064 | ||||
Redeem ERC721 | 20183017 | 152 days ago | IN | 0.02337131 ETH | 0.00043781 | ||||
Redeem ERC721 | 20179813 | 152 days ago | IN | 0.02375296 ETH | 0.00029051 | ||||
Redeem ERC721 | 20041449 | 172 days ago | IN | 0.02127659 ETH | 0.00135305 | ||||
Redeem ERC721 | 19630614 | 229 days ago | IN | 0.0701459 ETH | 0.00098118 | ||||
Redeem ERC721 | 19611038 | 232 days ago | IN | 0 ETH | 0.00190019 | ||||
Redeem ERC721 | 19575521 | 237 days ago | IN | 0 ETH | 0.00219029 | ||||
Redeem ERC721 | 19571575 | 237 days ago | IN | 0 ETH | 0.00166573 | ||||
Redeem ERC721 | 19564053 | 239 days ago | IN | 0.07120478 ETH | 0.00174108 | ||||
Redeem ERC721 | 19208898 | 288 days ago | IN | 0.03185981 ETH | 0.00189029 | ||||
Redeem ERC721 | 19198380 | 290 days ago | IN | 0.04014452 ETH | 0.00234178 | ||||
Redeem ERC721 | 19197616 | 290 days ago | IN | 0.04027386 ETH | 0.00248551 | ||||
Redeem ERC721 | 19195702 | 290 days ago | IN | 0.01992825 ETH | 0.00309224 | ||||
Redeem ERC721 | 19131418 | 299 days ago | IN | 0.02210433 ETH | 0.00134073 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21244678 | 4 days ago | 0.01508295 ETH | ||||
21237153 | 5 days ago | 0.02132845 ETH | ||||
21150523 | 17 days ago | 0.07406188 ETH | ||||
21117881 | 21 days ago | 0.02914238 ETH | ||||
20615824 | 92 days ago | 0.02977298 ETH | ||||
20570391 | 98 days ago | 0.09560229 ETH | ||||
20570386 | 98 days ago | 0.09560229 ETH | ||||
20183017 | 152 days ago | 0.02337131 ETH | ||||
20179813 | 152 days ago | 0.02375296 ETH | ||||
20041449 | 172 days ago | 0.02127659 ETH | ||||
19630614 | 229 days ago | 0.0701459 ETH | ||||
19564053 | 239 days ago | 0.07120478 ETH | ||||
19208898 | 288 days ago | 0.03185981 ETH | ||||
19198380 | 290 days ago | 0.04014452 ETH | ||||
19197616 | 290 days ago | 0.04027386 ETH | ||||
19195702 | 290 days ago | 0.01992825 ETH | ||||
19131418 | 299 days ago | 0.02210433 ETH | ||||
19128806 | 300 days ago | 0.04349717 ETH | ||||
19127063 | 300 days ago | 0.02166377 ETH | ||||
19124102 | 300 days ago | 0.02134927 ETH | ||||
19123867 | 300 days ago | 0.04280821 ETH | ||||
19122470 | 301 days ago | 0.04219409 ETH | ||||
19122437 | 301 days ago | 0.04199916 ETH | ||||
19116806 | 301 days ago | 0.02164502 ETH | ||||
19088374 | 305 days ago | 0.02250225 ETH |
Loading...
Loading
Contract Name:
ArtforaRedemptionsLogicV2
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-22 */ // SPDX-License-Identifier: MIT // 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; } } // 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); } } // 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. If 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)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 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) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _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) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _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); } } // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } pragma solidity ^0.8.0; abstract contract ERC721 { function ownerOf(uint256 _tokenId) virtual external view returns (address); } pragma solidity ^0.8.0; abstract contract ERC1155 { function balanceOf(address _owner, uint256 _id) virtual external view returns (uint256); } pragma solidity ^0.8.0; abstract contract Storage { function isRedeemed(address _contractAddress, uint256 _tokenId) virtual external view returns (bool); function redeem(address _contractAddress, uint256 _tokenId) virtual external; } pragma solidity ^0.8.0; contract ArtforaRedemptionsLogicV2 is EIP712, Ownable { using Strings for uint256; // events event Redeemed(address from, address contractAddress, uint256 tokenId); // structs struct RedemptionData { address payable artistAddress; address contractAddress; uint256 tokenId; uint256 fundsToArtist; uint256 fundsToArtfora; uint256 expiration; } // public variables Storage public constant storageContract = Storage(0x3Fb1FDc9d48Fb08C20ab415A191E0FB499fea068); //SET CONTRACT ADDRESS HERE address public artforaAddress = payable(0xDff747e2C5e5ACd9479E3dB59C4DC87b1F9AbAA9); //SET ARTFORA ADDRESS HERE // private variables string private constant SIGNING_DOMAIN = "Artfora"; string private constant SIGNATURE_VERSION = "1.0.0"; bytes32 private constant REDEMPTION_DATA_HASH = keccak256("RedemptionData(address artistAddress,address contractAddress,uint256 tokenId,uint256 fundsToArtist,uint256 fundsToArtfora,uint256 expiration)"); address private constant SIGNER = 0x3f93dBe17b6EbEb073759288b52504d92192E105; //SET ARTFORA SIGNER HERE constructor() EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION){} function redeemERC721(RedemptionData calldata _redemptionData, bytes calldata _signature) payable external { address artistAddress = _redemptionData.artistAddress; address contractAddress = _redemptionData.contractAddress; uint256 tokenId = _redemptionData.tokenId; uint256 fundsToArtist = _redemptionData.fundsToArtist; uint256 fundsToArtfora = _redemptionData.fundsToArtfora; // check if redeemed require(!storageContract.isRedeemed(contractAddress, tokenId), "Token already redeemed"); // check price require(msg.value == fundsToArtist + fundsToArtfora, "Incorrect price"); // check expiration require(_redemptionData.expiration > block.timestamp, "Expired"); // check is owner of token require(msg.sender == ERC721(contractAddress).ownerOf(tokenId), "Not owner"); // check signature address signer = _verify(_redemptionData, _signature); require(signer == SIGNER, "Signature invalid or unauthorized"); // flag as redeemed storageContract.redeem(contractAddress, tokenId); // send funds to artist if (fundsToArtist > 0) { (bool success, ) = artistAddress.call{value: fundsToArtist}(""); require(success, "Transfer failed"); } // send funds to artfora if (fundsToArtfora > 0 && artforaAddress != address(0)) { (bool success, ) = artforaAddress.call{value: fundsToArtfora}(""); require(success, "Transfer failed"); } emit Redeemed(msg.sender, contractAddress, tokenId); } function redeemERC1155(RedemptionData calldata _redemptionData, bytes calldata _signature) payable external { address artistAddress = _redemptionData.artistAddress; address contractAddress = _redemptionData.contractAddress; uint256 tokenId = _redemptionData.tokenId; uint256 fundsToArtist = _redemptionData.fundsToArtist; uint256 fundsToArtfora = _redemptionData.fundsToArtfora; // check if redeemed require(!storageContract.isRedeemed(contractAddress, tokenId), "Token already redeemed"); // check price require(msg.value == fundsToArtist + fundsToArtfora, "Incorrect price"); // check expiration require(_redemptionData.expiration > block.timestamp, "Expired"); // check is owner of token require(ERC1155(contractAddress).balanceOf(msg.sender, tokenId) != 0, "Not owner"); // check signature address signer = _verify(_redemptionData, _signature); require(signer == SIGNER, "Signature invalid or unauthorized"); // flag as redeemed storageContract.redeem(contractAddress, tokenId); // send funds to artist if (fundsToArtist > 0) { (bool success, ) = artistAddress.call{value: fundsToArtist}(""); require(success, "Transfer failed"); } // send funds to artfora if (fundsToArtfora > 0 && artforaAddress != address(0)) { (bool success, ) = artforaAddress.call{value: fundsToArtfora}(""); require(success, "Transfer failed"); } emit Redeemed(msg.sender, contractAddress, tokenId); } function _verify(RedemptionData calldata _redemptionData, bytes calldata _signature) internal view returns (address) { bytes32 digest = _hash(_redemptionData); return ECDSA.recover(digest, _signature); } function _hash(RedemptionData calldata _redemptionData) internal view returns (bytes32) { return _hashTypedDataV4(keccak256(abi.encode(REDEMPTION_DATA_HASH, _redemptionData.artistAddress, _redemptionData.contractAddress, _redemptionData.tokenId, _redemptionData.fundsToArtist, _redemptionData.fundsToArtfora, _redemptionData.expiration))); } function withdraw(address _to) external onlyOwner { (bool success, ) = _to.call{value: address(this).balance}(""); require(success, "Transfer failed"); } function updateArtforaAddress(address _to) external onlyOwner { artforaAddress = _to; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Redeemed","type":"event"},{"inputs":[],"name":"artforaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address payable","name":"artistAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"fundsToArtist","type":"uint256"},{"internalType":"uint256","name":"fundsToArtfora","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"internalType":"struct ArtforaRedemptionsLogicV2.RedemptionData","name":"_redemptionData","type":"tuple"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"redeemERC1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address payable","name":"artistAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"fundsToArtist","type":"uint256"},{"internalType":"uint256","name":"fundsToArtfora","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"internalType":"struct ArtforaRedemptionsLogicV2.RedemptionData","name":"_redemptionData","type":"tuple"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"redeemERC721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageContract","outputs":[{"internalType":"contract Storage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"updateArtforaAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61014060405273dff747e2c5e5acd9479e3db59c4dc87b1f9abaa9600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006757600080fd5b506040518060400160405280600781526020017f417274666f7261000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200013d818484620001ac60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050620001a66200019a620001e860201b60201c565b620001f060201b60201c565b6200038c565b60008383834630604051602001620001c99594939291906200032f565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000819050919050565b620002c981620002b4565b82525050565b6000819050919050565b620002e481620002cf565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031782620002ea565b9050919050565b62000329816200030a565b82525050565b600060a082019050620003466000830188620002be565b620003556020830187620002be565b620003646040830186620002be565b620003736060830185620002d9565b6200038260808301846200031e565b9695505050505050565b60805160a05160c05160e0516101005161012051612253620003dc60003960006114480152600061148a015260006114690152600061139e015260006113f40152600061141d01526122536000f3fe6080604052600436106100865760003560e01c8063715018a611610059578063715018a6146101245780637c6250f51461013b5780638da5cb5b146101665780639429cf0e14610191578063f2fde38b146101ad57610086565b806311ce02671461008b5780633ae16aa7146100b657806351cff8d9146100df5780636d63fe9414610108575b600080fd5b34801561009757600080fd5b506100a06101d6565b6040516100ad9190611682565b60405180910390f35b3480156100c257600080fd5b506100dd60048036038101906100d891906116e5565b6101ee565b005b3480156100eb57600080fd5b50610106600480360381019061010191906116e5565b61023a565b005b610122600480360381019061011d919061179b565b6102f2565b005b34801561013057600080fd5b506101396108c8565b005b34801561014757600080fd5b506101506108dc565b60405161015d919061180a565b60405180910390f35b34801561017257600080fd5b5061017b610902565b604051610188919061180a565b60405180910390f35b6101ab60048036038101906101a6919061179b565b61092b565b005b3480156101b957600080fd5b506101d460048036038101906101cf91906116e5565b610ed7565b005b733fb1fdc9d48fb08c20ab415a191e0fb499fea06881565b6101f6610f5a565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610242610f5a565b60008173ffffffffffffffffffffffffffffffffffffffff164760405161026890611856565b60006040518083038185875af1925050503d80600081146102a5576040519150601f19603f3d011682016040523d82523d6000602084013e6102aa565b606091505b50509050806102ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e5906118c8565b60405180910390fd5b5050565b60008360000160208101906103079190611926565b9050600084602001602081019061031e91906116e5565b9050600085604001359050600086606001359050600087608001359050733fb1fdc9d48fb08c20ab415a191e0fb499fea06873ffffffffffffffffffffffffffffffffffffffff1663cb4659af85856040518363ffffffff1660e01b815260040161038a92919061196c565b602060405180830381865afa1580156103a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cb91906119cd565b1561040b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040290611a46565b60405180910390fd5b80826104179190611a95565b3414610458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044f90611b15565b60405180910390fd5b428860a001351161049e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049590611b81565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016104d79190611ba1565b602060405180830381865afa1580156104f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105189190611bd1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c90611c4a565b60405180910390fd5b6000610592898989610fd8565b9050733f93dbe17b6ebeb073759288b52504d92192e10573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90611cdc565b60405180910390fd5b733fb1fdc9d48fb08c20ab415a191e0fb499fea06873ffffffffffffffffffffffffffffffffffffffff16631e9a695086866040518363ffffffff1660e01b815260040161066592919061196c565b600060405180830381600087803b15801561067f57600080fd5b505af1158015610693573d6000803e3d6000fd5b50505050600083111561074e5760008673ffffffffffffffffffffffffffffffffffffffff16846040516106c690611856565b60006040518083038185875af1925050503d8060008114610703576040519150601f19603f3d011682016040523d82523d6000602084013e610708565b606091505b505090508061074c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610743906118c8565b60405180910390fd5b505b6000821180156107ad5750600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610882576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516107fa90611856565b60006040518083038185875af1925050503d8060008114610837576040519150601f19603f3d011682016040523d82523d6000602084013e61083c565b606091505b5050905080610880576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610877906118c8565b60405180910390fd5b505b7f27d4634c833b7622a0acddbf7f746183625f105945e95c723ad1d5a9f2a0b6fc3386866040516108b593929190611cfc565b60405180910390a1505050505050505050565b6108d0610f5a565b6108da600061103e565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008360000160208101906109409190611926565b9050600084602001602081019061095791906116e5565b9050600085604001359050600086606001359050600087608001359050733fb1fdc9d48fb08c20ab415a191e0fb499fea06873ffffffffffffffffffffffffffffffffffffffff1663cb4659af85856040518363ffffffff1660e01b81526004016109c392919061196c565b602060405180830381865afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0491906119cd565b15610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b90611a46565b60405180910390fd5b8082610a509190611a95565b3414610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890611b15565b60405180910390fd5b428860a0013511610ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ace90611b81565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1662fdd58e33866040518363ffffffff1660e01b8152600401610b1392919061196c565b602060405180830381865afa158015610b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b549190611d5f565b03610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90611c4a565b60405180910390fd5b6000610ba1898989610fd8565b9050733f93dbe17b6ebeb073759288b52504d92192e10573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1c90611cdc565b60405180910390fd5b733fb1fdc9d48fb08c20ab415a191e0fb499fea06873ffffffffffffffffffffffffffffffffffffffff16631e9a695086866040518363ffffffff1660e01b8152600401610c7492919061196c565b600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b505050506000831115610d5d5760008673ffffffffffffffffffffffffffffffffffffffff1684604051610cd590611856565b60006040518083038185875af1925050503d8060008114610d12576040519150601f19603f3d011682016040523d82523d6000602084013e610d17565b606091505b5050905080610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906118c8565b60405180910390fd5b505b600082118015610dbc5750600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610e91576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051610e0990611856565b60006040518083038185875af1925050503d8060008114610e46576040519150601f19603f3d011682016040523d82523d6000602084013e610e4b565b606091505b5050905080610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e86906118c8565b60405180910390fd5b505b7f27d4634c833b7622a0acddbf7f746183625f105945e95c723ad1d5a9f2a0b6fc338686604051610ec493929190611cfc565b60405180910390a1505050505050505050565b610edf610f5a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590611dfe565b60405180910390fd5b610f578161103e565b50565b610f62611102565b73ffffffffffffffffffffffffffffffffffffffff16610f80610902565b73ffffffffffffffffffffffffffffffffffffffff1614610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90611e6a565b60405180910390fd5b565b600080610fe48561110a565b90506110348185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506111a2565b9150509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600061119b7fe13f358251e3c909733878acb03949ea67cf6bef15e3866d8c60ef86ba0f9b6f8360000160208101906111439190611926565b84602001602081019061115691906116e5565b8560400135866060013587608001358860a001356040516020016111809796959493929190611eb2565b604051602081830303815290604052805190602001206111c9565b9050919050565b60008060006111b185856111e3565b915091506111be81611234565b819250505092915050565b60006111dc6111d661139a565b836114b4565b9050919050565b60008060418351036112245760008060006020860151925060408601519150606086015160001a9050611218878285856114e7565b9450945050505061122d565b60006002915091505b9250929050565b6000600481111561124857611247611f21565b5b81600481111561125b5761125a611f21565b5b0315611397576001600481111561127557611274611f21565b5b81600481111561128857611287611f21565b5b036112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf90611f9c565b60405180910390fd5b600260048111156112dc576112db611f21565b5b8160048111156112ef576112ee611f21565b5b0361132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690612008565b60405180910390fd5b6003600481111561134357611342611f21565b5b81600481111561135657611355611f21565b5b03611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d9061209a565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561141657507f000000000000000000000000000000000000000000000000000000000000000046145b15611443577f000000000000000000000000000000000000000000000000000000000000000090506114b1565b6114ae7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006115c9565b90505b90565b600082826040516020016114c9929190612132565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156115225760006003915091506115c0565b6000600187878787604051600081526020016040526040516115479493929190612185565b6020604051602081039080840390855afa158015611569573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b7576000600192509250506115c0565b80600092509250505b94509492505050565b600083838346306040516020016115e49594939291906121ca565b6040516020818303038152906040528051906020012090509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061164861164361163e84611603565b611623565b611603565b9050919050565b600061165a8261162d565b9050919050565b600061166c8261164f565b9050919050565b61167c81611661565b82525050565b60006020820190506116976000830184611673565b92915050565b600080fd5b600080fd5b60006116b282611603565b9050919050565b6116c2816116a7565b81146116cd57600080fd5b50565b6000813590506116df816116b9565b92915050565b6000602082840312156116fb576116fa61169d565b5b6000611709848285016116d0565b91505092915050565b600080fd5b600060c0828403121561172d5761172c611712565b5b81905092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261175b5761175a611736565b5b8235905067ffffffffffffffff8111156117785761177761173b565b5b60208301915083600182028301111561179457611793611740565b5b9250929050565b600080600060e084860312156117b4576117b361169d565b5b60006117c286828701611717565b93505060c084013567ffffffffffffffff8111156117e3576117e26116a2565b5b6117ef86828701611745565b92509250509250925092565b611804816116a7565b82525050565b600060208201905061181f60008301846117fb565b92915050565b600081905092915050565b50565b6000611840600083611825565b915061184b82611830565b600082019050919050565b600061186182611833565b9150819050919050565b600082825260208201905092915050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006118b2600f8361186b565b91506118bd8261187c565b602082019050919050565b600060208201905081810360008301526118e1816118a5565b9050919050565b60006118f382611603565b9050919050565b611903816118e8565b811461190e57600080fd5b50565b600081359050611920816118fa565b92915050565b60006020828403121561193c5761193b61169d565b5b600061194a84828501611911565b91505092915050565b6000819050919050565b61196681611953565b82525050565b600060408201905061198160008301856117fb565b61198e602083018461195d565b9392505050565b60008115159050919050565b6119aa81611995565b81146119b557600080fd5b50565b6000815190506119c7816119a1565b92915050565b6000602082840312156119e3576119e261169d565b5b60006119f1848285016119b8565b91505092915050565b7f546f6b656e20616c72656164792072656465656d656400000000000000000000600082015250565b6000611a3060168361186b565b9150611a3b826119fa565b602082019050919050565b60006020820190508181036000830152611a5f81611a23565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611aa082611953565b9150611aab83611953565b9250828201905080821115611ac357611ac2611a66565b5b92915050565b7f496e636f72726563742070726963650000000000000000000000000000000000600082015250565b6000611aff600f8361186b565b9150611b0a82611ac9565b602082019050919050565b60006020820190508181036000830152611b2e81611af2565b9050919050565b7f4578706972656400000000000000000000000000000000000000000000000000600082015250565b6000611b6b60078361186b565b9150611b7682611b35565b602082019050919050565b60006020820190508181036000830152611b9a81611b5e565b9050919050565b6000602082019050611bb6600083018461195d565b92915050565b600081519050611bcb816116b9565b92915050565b600060208284031215611be757611be661169d565b5b6000611bf584828501611bbc565b91505092915050565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000611c3460098361186b565b9150611c3f82611bfe565b602082019050919050565b60006020820190508181036000830152611c6381611c27565b9050919050565b7f5369676e617475726520696e76616c6964206f7220756e617574686f72697a6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cc660218361186b565b9150611cd182611c6a565b604082019050919050565b60006020820190508181036000830152611cf581611cb9565b9050919050565b6000606082019050611d1160008301866117fb565b611d1e60208301856117fb565b611d2b604083018461195d565b949350505050565b611d3c81611953565b8114611d4757600080fd5b50565b600081519050611d5981611d33565b92915050565b600060208284031215611d7557611d7461169d565b5b6000611d8384828501611d4a565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611de860268361186b565b9150611df382611d8c565b604082019050919050565b60006020820190508181036000830152611e1781611ddb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611e5460208361186b565b9150611e5f82611e1e565b602082019050919050565b60006020820190508181036000830152611e8381611e47565b9050919050565b6000819050919050565b611e9d81611e8a565b82525050565b611eac816118e8565b82525050565b600060e082019050611ec7600083018a611e94565b611ed46020830189611ea3565b611ee160408301886117fb565b611eee606083018761195d565b611efb608083018661195d565b611f0860a083018561195d565b611f1560c083018461195d565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611f8660188361186b565b9150611f9182611f50565b602082019050919050565b60006020820190508181036000830152611fb581611f79565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611ff2601f8361186b565b9150611ffd82611fbc565b602082019050919050565b6000602082019050818103600083015261202181611fe5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061208460228361186b565b915061208f82612028565b604082019050919050565b600060208201905081810360008301526120b381612077565b9050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006120fb6002836120ba565b9150612106826120c5565b600282019050919050565b6000819050919050565b61212c61212782611e8a565b612111565b82525050565b600061213d826120ee565b9150612149828561211b565b602082019150612159828461211b565b6020820191508190509392505050565b600060ff82169050919050565b61217f81612169565b82525050565b600060808201905061219a6000830187611e94565b6121a76020830186612176565b6121b46040830185611e94565b6121c16060830184611e94565b95945050505050565b600060a0820190506121df6000830188611e94565b6121ec6020830187611e94565b6121f96040830186611e94565b612206606083018561195d565b61221360808301846117fb565b969550505050505056fea2646970667358221220262cc51da6042cdc7a6e0e63b9c1959f2688f2f00d7fb482782e5299e15cbe5364736f6c63430008100033
Deployed Bytecode
0x6080604052600436106100865760003560e01c8063715018a611610059578063715018a6146101245780637c6250f51461013b5780638da5cb5b146101665780639429cf0e14610191578063f2fde38b146101ad57610086565b806311ce02671461008b5780633ae16aa7146100b657806351cff8d9146100df5780636d63fe9414610108575b600080fd5b34801561009757600080fd5b506100a06101d6565b6040516100ad9190611682565b60405180910390f35b3480156100c257600080fd5b506100dd60048036038101906100d891906116e5565b6101ee565b005b3480156100eb57600080fd5b50610106600480360381019061010191906116e5565b61023a565b005b610122600480360381019061011d919061179b565b6102f2565b005b34801561013057600080fd5b506101396108c8565b005b34801561014757600080fd5b506101506108dc565b60405161015d919061180a565b60405180910390f35b34801561017257600080fd5b5061017b610902565b604051610188919061180a565b60405180910390f35b6101ab60048036038101906101a6919061179b565b61092b565b005b3480156101b957600080fd5b506101d460048036038101906101cf91906116e5565b610ed7565b005b733fb1fdc9d48fb08c20ab415a191e0fb499fea06881565b6101f6610f5a565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610242610f5a565b60008173ffffffffffffffffffffffffffffffffffffffff164760405161026890611856565b60006040518083038185875af1925050503d80600081146102a5576040519150601f19603f3d011682016040523d82523d6000602084013e6102aa565b606091505b50509050806102ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e5906118c8565b60405180910390fd5b5050565b60008360000160208101906103079190611926565b9050600084602001602081019061031e91906116e5565b9050600085604001359050600086606001359050600087608001359050733fb1fdc9d48fb08c20ab415a191e0fb499fea06873ffffffffffffffffffffffffffffffffffffffff1663cb4659af85856040518363ffffffff1660e01b815260040161038a92919061196c565b602060405180830381865afa1580156103a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cb91906119cd565b1561040b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040290611a46565b60405180910390fd5b80826104179190611a95565b3414610458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044f90611b15565b60405180910390fd5b428860a001351161049e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049590611b81565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016104d79190611ba1565b602060405180830381865afa1580156104f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105189190611bd1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c90611c4a565b60405180910390fd5b6000610592898989610fd8565b9050733f93dbe17b6ebeb073759288b52504d92192e10573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90611cdc565b60405180910390fd5b733fb1fdc9d48fb08c20ab415a191e0fb499fea06873ffffffffffffffffffffffffffffffffffffffff16631e9a695086866040518363ffffffff1660e01b815260040161066592919061196c565b600060405180830381600087803b15801561067f57600080fd5b505af1158015610693573d6000803e3d6000fd5b50505050600083111561074e5760008673ffffffffffffffffffffffffffffffffffffffff16846040516106c690611856565b60006040518083038185875af1925050503d8060008114610703576040519150601f19603f3d011682016040523d82523d6000602084013e610708565b606091505b505090508061074c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610743906118c8565b60405180910390fd5b505b6000821180156107ad5750600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610882576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516107fa90611856565b60006040518083038185875af1925050503d8060008114610837576040519150601f19603f3d011682016040523d82523d6000602084013e61083c565b606091505b5050905080610880576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610877906118c8565b60405180910390fd5b505b7f27d4634c833b7622a0acddbf7f746183625f105945e95c723ad1d5a9f2a0b6fc3386866040516108b593929190611cfc565b60405180910390a1505050505050505050565b6108d0610f5a565b6108da600061103e565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008360000160208101906109409190611926565b9050600084602001602081019061095791906116e5565b9050600085604001359050600086606001359050600087608001359050733fb1fdc9d48fb08c20ab415a191e0fb499fea06873ffffffffffffffffffffffffffffffffffffffff1663cb4659af85856040518363ffffffff1660e01b81526004016109c392919061196c565b602060405180830381865afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0491906119cd565b15610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b90611a46565b60405180910390fd5b8082610a509190611a95565b3414610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890611b15565b60405180910390fd5b428860a0013511610ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ace90611b81565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1662fdd58e33866040518363ffffffff1660e01b8152600401610b1392919061196c565b602060405180830381865afa158015610b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b549190611d5f565b03610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90611c4a565b60405180910390fd5b6000610ba1898989610fd8565b9050733f93dbe17b6ebeb073759288b52504d92192e10573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1c90611cdc565b60405180910390fd5b733fb1fdc9d48fb08c20ab415a191e0fb499fea06873ffffffffffffffffffffffffffffffffffffffff16631e9a695086866040518363ffffffff1660e01b8152600401610c7492919061196c565b600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b505050506000831115610d5d5760008673ffffffffffffffffffffffffffffffffffffffff1684604051610cd590611856565b60006040518083038185875af1925050503d8060008114610d12576040519150601f19603f3d011682016040523d82523d6000602084013e610d17565b606091505b5050905080610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906118c8565b60405180910390fd5b505b600082118015610dbc5750600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610e91576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051610e0990611856565b60006040518083038185875af1925050503d8060008114610e46576040519150601f19603f3d011682016040523d82523d6000602084013e610e4b565b606091505b5050905080610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e86906118c8565b60405180910390fd5b505b7f27d4634c833b7622a0acddbf7f746183625f105945e95c723ad1d5a9f2a0b6fc338686604051610ec493929190611cfc565b60405180910390a1505050505050505050565b610edf610f5a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590611dfe565b60405180910390fd5b610f578161103e565b50565b610f62611102565b73ffffffffffffffffffffffffffffffffffffffff16610f80610902565b73ffffffffffffffffffffffffffffffffffffffff1614610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90611e6a565b60405180910390fd5b565b600080610fe48561110a565b90506110348185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506111a2565b9150509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600061119b7fe13f358251e3c909733878acb03949ea67cf6bef15e3866d8c60ef86ba0f9b6f8360000160208101906111439190611926565b84602001602081019061115691906116e5565b8560400135866060013587608001358860a001356040516020016111809796959493929190611eb2565b604051602081830303815290604052805190602001206111c9565b9050919050565b60008060006111b185856111e3565b915091506111be81611234565b819250505092915050565b60006111dc6111d661139a565b836114b4565b9050919050565b60008060418351036112245760008060006020860151925060408601519150606086015160001a9050611218878285856114e7565b9450945050505061122d565b60006002915091505b9250929050565b6000600481111561124857611247611f21565b5b81600481111561125b5761125a611f21565b5b0315611397576001600481111561127557611274611f21565b5b81600481111561128857611287611f21565b5b036112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf90611f9c565b60405180910390fd5b600260048111156112dc576112db611f21565b5b8160048111156112ef576112ee611f21565b5b0361132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690612008565b60405180910390fd5b6003600481111561134357611342611f21565b5b81600481111561135657611355611f21565b5b03611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d9061209a565b60405180910390fd5b5b50565b60007f00000000000000000000000096b8501e98411a502e0d84d9352ce6c78cf55bfd73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561141657507f000000000000000000000000000000000000000000000000000000000000000146145b15611443577fd4846f33ccec0371cf4cf12a7c79f0e84ed9cce89e620848b2a9c996645d847e90506114b1565b6114ae7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f97c55af18c85576a24453e6eaea2e02cb565042b40c201a374ce88222655e61f7f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c6115c9565b90505b90565b600082826040516020016114c9929190612132565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156115225760006003915091506115c0565b6000600187878787604051600081526020016040526040516115479493929190612185565b6020604051602081039080840390855afa158015611569573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b7576000600192509250506115c0565b80600092509250505b94509492505050565b600083838346306040516020016115e49594939291906121ca565b6040516020818303038152906040528051906020012090509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061164861164361163e84611603565b611623565b611603565b9050919050565b600061165a8261162d565b9050919050565b600061166c8261164f565b9050919050565b61167c81611661565b82525050565b60006020820190506116976000830184611673565b92915050565b600080fd5b600080fd5b60006116b282611603565b9050919050565b6116c2816116a7565b81146116cd57600080fd5b50565b6000813590506116df816116b9565b92915050565b6000602082840312156116fb576116fa61169d565b5b6000611709848285016116d0565b91505092915050565b600080fd5b600060c0828403121561172d5761172c611712565b5b81905092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261175b5761175a611736565b5b8235905067ffffffffffffffff8111156117785761177761173b565b5b60208301915083600182028301111561179457611793611740565b5b9250929050565b600080600060e084860312156117b4576117b361169d565b5b60006117c286828701611717565b93505060c084013567ffffffffffffffff8111156117e3576117e26116a2565b5b6117ef86828701611745565b92509250509250925092565b611804816116a7565b82525050565b600060208201905061181f60008301846117fb565b92915050565b600081905092915050565b50565b6000611840600083611825565b915061184b82611830565b600082019050919050565b600061186182611833565b9150819050919050565b600082825260208201905092915050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006118b2600f8361186b565b91506118bd8261187c565b602082019050919050565b600060208201905081810360008301526118e1816118a5565b9050919050565b60006118f382611603565b9050919050565b611903816118e8565b811461190e57600080fd5b50565b600081359050611920816118fa565b92915050565b60006020828403121561193c5761193b61169d565b5b600061194a84828501611911565b91505092915050565b6000819050919050565b61196681611953565b82525050565b600060408201905061198160008301856117fb565b61198e602083018461195d565b9392505050565b60008115159050919050565b6119aa81611995565b81146119b557600080fd5b50565b6000815190506119c7816119a1565b92915050565b6000602082840312156119e3576119e261169d565b5b60006119f1848285016119b8565b91505092915050565b7f546f6b656e20616c72656164792072656465656d656400000000000000000000600082015250565b6000611a3060168361186b565b9150611a3b826119fa565b602082019050919050565b60006020820190508181036000830152611a5f81611a23565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611aa082611953565b9150611aab83611953565b9250828201905080821115611ac357611ac2611a66565b5b92915050565b7f496e636f72726563742070726963650000000000000000000000000000000000600082015250565b6000611aff600f8361186b565b9150611b0a82611ac9565b602082019050919050565b60006020820190508181036000830152611b2e81611af2565b9050919050565b7f4578706972656400000000000000000000000000000000000000000000000000600082015250565b6000611b6b60078361186b565b9150611b7682611b35565b602082019050919050565b60006020820190508181036000830152611b9a81611b5e565b9050919050565b6000602082019050611bb6600083018461195d565b92915050565b600081519050611bcb816116b9565b92915050565b600060208284031215611be757611be661169d565b5b6000611bf584828501611bbc565b91505092915050565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000611c3460098361186b565b9150611c3f82611bfe565b602082019050919050565b60006020820190508181036000830152611c6381611c27565b9050919050565b7f5369676e617475726520696e76616c6964206f7220756e617574686f72697a6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cc660218361186b565b9150611cd182611c6a565b604082019050919050565b60006020820190508181036000830152611cf581611cb9565b9050919050565b6000606082019050611d1160008301866117fb565b611d1e60208301856117fb565b611d2b604083018461195d565b949350505050565b611d3c81611953565b8114611d4757600080fd5b50565b600081519050611d5981611d33565b92915050565b600060208284031215611d7557611d7461169d565b5b6000611d8384828501611d4a565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611de860268361186b565b9150611df382611d8c565b604082019050919050565b60006020820190508181036000830152611e1781611ddb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611e5460208361186b565b9150611e5f82611e1e565b602082019050919050565b60006020820190508181036000830152611e8381611e47565b9050919050565b6000819050919050565b611e9d81611e8a565b82525050565b611eac816118e8565b82525050565b600060e082019050611ec7600083018a611e94565b611ed46020830189611ea3565b611ee160408301886117fb565b611eee606083018761195d565b611efb608083018661195d565b611f0860a083018561195d565b611f1560c083018461195d565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611f8660188361186b565b9150611f9182611f50565b602082019050919050565b60006020820190508181036000830152611fb581611f79565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611ff2601f8361186b565b9150611ffd82611fbc565b602082019050919050565b6000602082019050818103600083015261202181611fe5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061208460228361186b565b915061208f82612028565b604082019050919050565b600060208201905081810360008301526120b381612077565b9050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006120fb6002836120ba565b9150612106826120c5565b600282019050919050565b6000819050919050565b61212c61212782611e8a565b612111565b82525050565b600061213d826120ee565b9150612149828561211b565b602082019150612159828461211b565b6020820191508190509392505050565b600060ff82169050919050565b61217f81612169565b82525050565b600060808201905061219a6000830187611e94565b6121a76020830186612176565b6121b46040830185611e94565b6121c16060830184611e94565b95945050505050565b600060a0820190506121df6000830188611e94565b6121ec6020830187611e94565b6121f96040830186611e94565b612206606083018561195d565b61221360808301846117fb565b969550505050505056fea2646970667358221220262cc51da6042cdc7a6e0e63b9c1959f2688f2f00d7fb482782e5299e15cbe5364736f6c63430008100033
Deployed Bytecode Sourcemap
32345:5512:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32807:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37753:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37569:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33581:1680;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2696:103;;;;;;;;;;;;;:::i;:::-;;32935:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2048:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35269:1687;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2954:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32807:93;32857:42;32807:93;:::o;37753:101::-;1934:13;:11;:13::i;:::-;37843:3:::1;37826:14;;:20;;;;;;;;;;;;;;;;;;37753:101:::0;:::o;37569:176::-;1934:13;:11;:13::i;:::-;37631:12:::1;37649:3;:8;;37665:21;37649:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37630:61;;;37710:7;37702:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;37619:126;37569:176:::0;:::o;33581:1680::-;33699:21;33723:15;:29;;;;;;;;;;:::i;:::-;33699:53;;33763:23;33789:15;:31;;;;;;;;;;:::i;:::-;33763:57;;33831:15;33849;:23;;;33831:41;;33883:21;33907:15;:29;;;33883:53;;33947:22;33972:15;:30;;;33947:55;;32857:42;34062:26;;;34089:15;34106:7;34062:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34061:53;34053:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;34215:14;34199:13;:30;;;;:::i;:::-;34186:9;:43;34178:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34328:15;34299;:26;;;:44;34291:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34433:15;34426:31;;;34458:7;34426:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34412:54;;:10;:54;;;34404:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34521:14;34538:36;34546:15;34563:10;;34538:7;:36::i;:::-;34521:53;;33439:42;34593:16;;:6;:16;;;34585:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32857:42;34689:22;;;34712:15;34729:7;34689:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34803:1;34787:13;:17;34783:163;;;34822:12;34840:13;:18;;34866:13;34840:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34821:63;;;34907:7;34899:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;34806:140;34783:163;35013:1;34996:14;:18;:50;;;;;35044:1;35018:28;;:14;;;;;;;;;;;:28;;;;34996:50;34992:198;;;35064:12;35082:14;;;;;;;;;;;:19;;35109:14;35082:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35063:65;;;35151:7;35143:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;35048:142;34992:198;35207:46;35216:10;35228:15;35245:7;35207:46;;;;;;;;:::i;:::-;;;;;;;;33688:1573;;;;;;33581:1680;;;:::o;2696:103::-;1934:13;:11;:13::i;:::-;2761:30:::1;2788:1;2761:18;:30::i;:::-;2696:103::o:0;32935:83::-;;;;;;;;;;;;;:::o;2048:87::-;2094:7;2121:6;;;;;;;;;;;2114:13;;2048:87;:::o;35269:1687::-;35388:21;35412:15;:29;;;;;;;;;;:::i;:::-;35388:53;;35452:23;35478:15;:31;;;;;;;;;;:::i;:::-;35452:57;;35520:15;35538;:23;;;35520:41;;35572:21;35596:15;:29;;;35572:53;;35636:22;35661:15;:30;;;35636:55;;32857:42;35751:26;;;35778:15;35795:7;35751:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35750:53;35742:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;35904:14;35888:13;:30;;;;:::i;:::-;35875:9;:43;35867:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36017:15;35988;:26;;;:44;35980:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36160:1;36109:15;36101:34;;;36136:10;36148:7;36101:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;36093:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;36216:14;36233:36;36241:15;36258:10;;36233:7;:36::i;:::-;36216:53;;33439:42;36288:16;;:6;:16;;;36280:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32857:42;36384:22;;;36407:15;36424:7;36384:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36498:1;36482:13;:17;36478:163;;;36517:12;36535:13;:18;;36561:13;36535:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36516:63;;;36602:7;36594:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;36501:140;36478:163;36708:1;36691:14;:18;:50;;;;;36739:1;36713:28;;:14;;;;;;;;;;;:28;;;;36691:50;36687:198;;;36759:12;36777:14;;;;;;;;;;;:19;;36804:14;36777:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36758:65;;;36846:7;36838:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;36743:142;36687:198;36902:46;36911:10;36923:15;36940:7;36902:46;;;;;;;;:::i;:::-;;;;;;;;35377:1579;;;;;;35269:1687;;;:::o;2954:201::-;1934:13;:11;:13::i;:::-;3063:1:::1;3043:22;;:8;:22;;::::0;3035:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3119:28;3138:8;3119:18;:28::i;:::-;2954:201:::0;:::o;2213:132::-;2288:12;:10;:12::i;:::-;2277:23;;:7;:5;:7::i;:::-;:23;;;2269:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2213:132::o;36964:226::-;37072:7;37092:14;37109:22;37115:15;37109:5;:22::i;:::-;37092:39;;37149:33;37163:6;37171:10;;37149:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:33::i;:::-;37142:40;;;36964:226;;;;;:::o;3315:191::-;3389:16;3408:6;;;;;;;;;;;3389:25;;3434:8;3425:6;;:17;;;;;;;;;;;;;;;;;;3489:8;3458:40;;3479:8;3458:40;;;;;;;;;;;;3378:128;3315:191;:::o;658:98::-;711:7;738:10;731:17;;658:98;:::o;37198:363::-;37277:7;37304:249;33244:154;37372:15;:29;;;;;;;;;;:::i;:::-;37403:15;:31;;;;;;;;;;:::i;:::-;37436:15;:23;;;37461:15;:29;;;37492:15;:30;;;37524:15;:26;;;37331:220;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37321:231;;;;;;37304:16;:249::i;:::-;37297:256;;37198:363;;;:::o;22284:231::-;22362:7;22383:17;22402:18;22424:27;22435:4;22441:9;22424:10;:27::i;:::-;22382:69;;;;22462:18;22474:5;22462:11;:18::i;:::-;22498:9;22491:16;;;;22284:231;;;;:::o;31596:167::-;31673:7;31700:55;31722:20;:18;:20::i;:::-;31744:10;31700:21;:55::i;:::-;31693:62;;31596:167;;;:::o;20735:747::-;20816:7;20825:12;20874:2;20854:9;:16;:22;20850:625;;20893:9;20917;20941:7;21198:4;21187:9;21183:20;21177:27;21172:32;;21248:4;21237:9;21233:20;21227:27;21222:32;;21306:4;21295:9;21291:20;21285:27;21282:1;21277:36;21272:41;;21349:25;21360:4;21366:1;21369;21372;21349:10;:25::i;:::-;21342:32;;;;;;;;;20850:625;21423:1;21427:35;21407:56;;;;20735:747;;;;;;:::o;19128:521::-;19206:20;19197:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;19193:449;19243:7;19193:449;19304:29;19295:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;19291:351;;19350:34;;;;;;;;;;:::i;:::-;;;;;;;;19291:351;19415:35;19406:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;19402:240;;19467:41;;;;;;;;;;:::i;:::-;;;;;;;;19402:240;19539:30;19530:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;19526:116;;19586:44;;;;;;;;;;:::i;:::-;;;;;;;;19526:116;19128:521;;:::o;30369:314::-;30422:7;30463:12;30446:29;;30454:4;30446:29;;;:66;;;;;30496:16;30479:13;:33;30446:66;30442:234;;;30536:24;30529:31;;;;30442:234;30600:64;30622:10;30634:12;30648:15;30600:21;:64::i;:::-;30593:71;;30369:314;;:::o;27086:196::-;27179:7;27245:15;27262:10;27216:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27206:68;;;;;;27199:75;;27086:196;;;;:::o;23736:1520::-;23867:7;23876:12;24801:66;24796:1;24788:10;;:79;24784:163;;;24900:1;24904:30;24884:51;;;;;;24784:163;25044:14;25061:24;25071:4;25077:1;25080;25083;25061:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25044:41;;25118:1;25100:20;;:6;:20;;;25096:103;;25153:1;25157:29;25137:50;;;;;;;25096:103;25219:6;25227:20;25211:37;;;;;23736:1520;;;;;;;;:::o;30691:263::-;30835:7;30883:8;30893;30903:11;30916:13;30939:4;30872:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30862:84;;;;;;30855:91;;30691:263;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:60::-;167:3;188:5;181:12;;139:60;;;:::o;205:142::-;255:9;288:53;306:34;315:24;333:5;315:24;:::i;:::-;306:34;:::i;:::-;288:53;:::i;:::-;275:66;;205:142;;;:::o;353:126::-;403:9;436:37;467:5;436:37;:::i;:::-;423:50;;353:126;;;:::o;485:142::-;551:9;584:37;615:5;584:37;:::i;:::-;571:50;;485:142;;;:::o;633:163::-;736:53;783:5;736:53;:::i;:::-;731:3;724:66;633:163;;:::o;802:254::-;911:4;949:2;938:9;934:18;926:26;;962:87;1046:1;1035:9;1031:17;1022:6;962:87;:::i;:::-;802:254;;;;:::o;1143:117::-;1252:1;1249;1242:12;1266:117;1375:1;1372;1365:12;1389:96;1426:7;1455:24;1473:5;1455:24;:::i;:::-;1444:35;;1389:96;;;:::o;1491:122::-;1564:24;1582:5;1564:24;:::i;:::-;1557:5;1554:35;1544:63;;1603:1;1600;1593:12;1544:63;1491:122;:::o;1619:139::-;1665:5;1703:6;1690:20;1681:29;;1719:33;1746:5;1719:33;:::i;:::-;1619:139;;;;:::o;1764:329::-;1823:6;1872:2;1860:9;1851:7;1847:23;1843:32;1840:119;;;1878:79;;:::i;:::-;1840:119;1998:1;2023:53;2068:7;2059:6;2048:9;2044:22;2023:53;:::i;:::-;2013:63;;1969:117;1764:329;;;;:::o;2099:117::-;2208:1;2205;2198:12;2277:239;2357:5;2398:3;2389:6;2384:3;2380:16;2376:26;2373:113;;;2405:79;;:::i;:::-;2373:113;2504:6;2495:15;;2277:239;;;;:::o;2522:117::-;2631:1;2628;2621:12;2645:117;2754:1;2751;2744:12;2768:117;2877:1;2874;2867:12;2904:552;2961:8;2971:6;3021:3;3014:4;3006:6;3002:17;2998:27;2988:122;;3029:79;;:::i;:::-;2988:122;3142:6;3129:20;3119:30;;3172:18;3164:6;3161:30;3158:117;;;3194:79;;:::i;:::-;3158:117;3308:4;3300:6;3296:17;3284:29;;3362:3;3354:4;3346:6;3342:17;3332:8;3328:32;3325:41;3322:128;;;3369:79;;:::i;:::-;3322:128;2904:552;;;;;:::o;3462:742::-;3575:6;3583;3591;3640:3;3628:9;3619:7;3615:23;3611:33;3608:120;;;3647:79;;:::i;:::-;3608:120;3767:1;3792:87;3871:7;3862:6;3851:9;3847:22;3792:87;:::i;:::-;3782:97;;3738:151;3956:3;3945:9;3941:19;3928:33;3988:18;3980:6;3977:30;3974:117;;;4010:79;;:::i;:::-;3974:117;4123:64;4179:7;4170:6;4159:9;4155:22;4123:64;:::i;:::-;4105:82;;;;3899:298;3462:742;;;;;:::o;4210:118::-;4297:24;4315:5;4297:24;:::i;:::-;4292:3;4285:37;4210:118;;:::o;4334:222::-;4427:4;4465:2;4454:9;4450:18;4442:26;;4478:71;4546:1;4535:9;4531:17;4522:6;4478:71;:::i;:::-;4334:222;;;;:::o;4562:147::-;4663:11;4700:3;4685:18;;4562:147;;;;:::o;4715:114::-;;:::o;4835:398::-;4994:3;5015:83;5096:1;5091:3;5015:83;:::i;:::-;5008:90;;5107:93;5196:3;5107:93;:::i;:::-;5225:1;5220:3;5216:11;5209:18;;4835:398;;;:::o;5239:379::-;5423:3;5445:147;5588:3;5445:147;:::i;:::-;5438:154;;5609:3;5602:10;;5239:379;;;:::o;5624:169::-;5708:11;5742:6;5737:3;5730:19;5782:4;5777:3;5773:14;5758:29;;5624:169;;;;:::o;5799:165::-;5939:17;5935:1;5927:6;5923:14;5916:41;5799:165;:::o;5970:366::-;6112:3;6133:67;6197:2;6192:3;6133:67;:::i;:::-;6126:74;;6209:93;6298:3;6209:93;:::i;:::-;6327:2;6322:3;6318:12;6311:19;;5970:366;;;:::o;6342:419::-;6508:4;6546:2;6535:9;6531:18;6523:26;;6595:9;6589:4;6585:20;6581:1;6570:9;6566:17;6559:47;6623:131;6749:4;6623:131;:::i;:::-;6615:139;;6342:419;;;:::o;6767:104::-;6812:7;6841:24;6859:5;6841:24;:::i;:::-;6830:35;;6767:104;;;:::o;6877:138::-;6958:32;6984:5;6958:32;:::i;:::-;6951:5;6948:43;6938:71;;7005:1;7002;6995:12;6938:71;6877:138;:::o;7021:155::-;7075:5;7113:6;7100:20;7091:29;;7129:41;7164:5;7129:41;:::i;:::-;7021:155;;;;:::o;7182:345::-;7249:6;7298:2;7286:9;7277:7;7273:23;7269:32;7266:119;;;7304:79;;:::i;:::-;7266:119;7424:1;7449:61;7502:7;7493:6;7482:9;7478:22;7449:61;:::i;:::-;7439:71;;7395:125;7182:345;;;;:::o;7533:77::-;7570:7;7599:5;7588:16;;7533:77;;;:::o;7616:118::-;7703:24;7721:5;7703:24;:::i;:::-;7698:3;7691:37;7616:118;;:::o;7740:332::-;7861:4;7899:2;7888:9;7884:18;7876:26;;7912:71;7980:1;7969:9;7965:17;7956:6;7912:71;:::i;:::-;7993:72;8061:2;8050:9;8046:18;8037:6;7993:72;:::i;:::-;7740:332;;;;;:::o;8078:90::-;8112:7;8155:5;8148:13;8141:21;8130:32;;8078:90;;;:::o;8174:116::-;8244:21;8259:5;8244:21;:::i;:::-;8237:5;8234:32;8224:60;;8280:1;8277;8270:12;8224:60;8174:116;:::o;8296:137::-;8350:5;8381:6;8375:13;8366:22;;8397:30;8421:5;8397:30;:::i;:::-;8296:137;;;;:::o;8439:345::-;8506:6;8555:2;8543:9;8534:7;8530:23;8526:32;8523:119;;;8561:79;;:::i;:::-;8523:119;8681:1;8706:61;8759:7;8750:6;8739:9;8735:22;8706:61;:::i;:::-;8696:71;;8652:125;8439:345;;;;:::o;8790:172::-;8930:24;8926:1;8918:6;8914:14;8907:48;8790:172;:::o;8968:366::-;9110:3;9131:67;9195:2;9190:3;9131:67;:::i;:::-;9124:74;;9207:93;9296:3;9207:93;:::i;:::-;9325:2;9320:3;9316:12;9309:19;;8968:366;;;:::o;9340:419::-;9506:4;9544:2;9533:9;9529:18;9521:26;;9593:9;9587:4;9583:20;9579:1;9568:9;9564:17;9557:47;9621:131;9747:4;9621:131;:::i;:::-;9613:139;;9340:419;;;:::o;9765:180::-;9813:77;9810:1;9803:88;9910:4;9907:1;9900:15;9934:4;9931:1;9924:15;9951:191;9991:3;10010:20;10028:1;10010:20;:::i;:::-;10005:25;;10044:20;10062:1;10044:20;:::i;:::-;10039:25;;10087:1;10084;10080:9;10073:16;;10108:3;10105:1;10102:10;10099:36;;;10115:18;;:::i;:::-;10099:36;9951:191;;;;:::o;10148:165::-;10288:17;10284:1;10276:6;10272:14;10265:41;10148:165;:::o;10319:366::-;10461:3;10482:67;10546:2;10541:3;10482:67;:::i;:::-;10475:74;;10558:93;10647:3;10558:93;:::i;:::-;10676:2;10671:3;10667:12;10660:19;;10319:366;;;:::o;10691:419::-;10857:4;10895:2;10884:9;10880:18;10872:26;;10944:9;10938:4;10934:20;10930:1;10919:9;10915:17;10908:47;10972:131;11098:4;10972:131;:::i;:::-;10964:139;;10691:419;;;:::o;11116:157::-;11256:9;11252:1;11244:6;11240:14;11233:33;11116:157;:::o;11279:365::-;11421:3;11442:66;11506:1;11501:3;11442:66;:::i;:::-;11435:73;;11517:93;11606:3;11517:93;:::i;:::-;11635:2;11630:3;11626:12;11619:19;;11279:365;;;:::o;11650:419::-;11816:4;11854:2;11843:9;11839:18;11831:26;;11903:9;11897:4;11893:20;11889:1;11878:9;11874:17;11867:47;11931:131;12057:4;11931:131;:::i;:::-;11923:139;;11650:419;;;:::o;12075:222::-;12168:4;12206:2;12195:9;12191:18;12183:26;;12219:71;12287:1;12276:9;12272:17;12263:6;12219:71;:::i;:::-;12075:222;;;;:::o;12303:143::-;12360:5;12391:6;12385:13;12376:22;;12407:33;12434:5;12407:33;:::i;:::-;12303:143;;;;:::o;12452:351::-;12522:6;12571:2;12559:9;12550:7;12546:23;12542:32;12539:119;;;12577:79;;:::i;:::-;12539:119;12697:1;12722:64;12778:7;12769:6;12758:9;12754:22;12722:64;:::i;:::-;12712:74;;12668:128;12452:351;;;;:::o;12809:159::-;12949:11;12945:1;12937:6;12933:14;12926:35;12809:159;:::o;12974:365::-;13116:3;13137:66;13201:1;13196:3;13137:66;:::i;:::-;13130:73;;13212:93;13301:3;13212:93;:::i;:::-;13330:2;13325:3;13321:12;13314:19;;12974:365;;;:::o;13345:419::-;13511:4;13549:2;13538:9;13534:18;13526:26;;13598:9;13592:4;13588:20;13584:1;13573:9;13569:17;13562:47;13626:131;13752:4;13626:131;:::i;:::-;13618:139;;13345:419;;;:::o;13770:220::-;13910:34;13906:1;13898:6;13894:14;13887:58;13979:3;13974:2;13966:6;13962:15;13955:28;13770:220;:::o;13996:366::-;14138:3;14159:67;14223:2;14218:3;14159:67;:::i;:::-;14152:74;;14235:93;14324:3;14235:93;:::i;:::-;14353:2;14348:3;14344:12;14337:19;;13996:366;;;:::o;14368:419::-;14534:4;14572:2;14561:9;14557:18;14549:26;;14621:9;14615:4;14611:20;14607:1;14596:9;14592:17;14585:47;14649:131;14775:4;14649:131;:::i;:::-;14641:139;;14368:419;;;:::o;14793:442::-;14942:4;14980:2;14969:9;14965:18;14957:26;;14993:71;15061:1;15050:9;15046:17;15037:6;14993:71;:::i;:::-;15074:72;15142:2;15131:9;15127:18;15118:6;15074:72;:::i;:::-;15156;15224:2;15213:9;15209:18;15200:6;15156:72;:::i;:::-;14793:442;;;;;;:::o;15241:122::-;15314:24;15332:5;15314:24;:::i;:::-;15307:5;15304:35;15294:63;;15353:1;15350;15343:12;15294:63;15241:122;:::o;15369:143::-;15426:5;15457:6;15451:13;15442:22;;15473:33;15500:5;15473:33;:::i;:::-;15369:143;;;;:::o;15518:351::-;15588:6;15637:2;15625:9;15616:7;15612:23;15608:32;15605:119;;;15643:79;;:::i;:::-;15605:119;15763:1;15788:64;15844:7;15835:6;15824:9;15820:22;15788:64;:::i;:::-;15778:74;;15734:128;15518:351;;;;:::o;15875:225::-;16015:34;16011:1;16003:6;15999:14;15992:58;16084:8;16079:2;16071:6;16067:15;16060:33;15875:225;:::o;16106:366::-;16248:3;16269:67;16333:2;16328:3;16269:67;:::i;:::-;16262:74;;16345:93;16434:3;16345:93;:::i;:::-;16463:2;16458:3;16454:12;16447:19;;16106:366;;;:::o;16478:419::-;16644:4;16682:2;16671:9;16667:18;16659:26;;16731:9;16725:4;16721:20;16717:1;16706:9;16702:17;16695:47;16759:131;16885:4;16759:131;:::i;:::-;16751:139;;16478:419;;;:::o;16903:182::-;17043:34;17039:1;17031:6;17027:14;17020:58;16903:182;:::o;17091:366::-;17233:3;17254:67;17318:2;17313:3;17254:67;:::i;:::-;17247:74;;17330:93;17419:3;17330:93;:::i;:::-;17448:2;17443:3;17439:12;17432:19;;17091:366;;;:::o;17463:419::-;17629:4;17667:2;17656:9;17652:18;17644:26;;17716:9;17710:4;17706:20;17702:1;17691:9;17687:17;17680:47;17744:131;17870:4;17744:131;:::i;:::-;17736:139;;17463:419;;;:::o;17888:77::-;17925:7;17954:5;17943:16;;17888:77;;;:::o;17971:118::-;18058:24;18076:5;18058:24;:::i;:::-;18053:3;18046:37;17971:118;;:::o;18095:142::-;18198:32;18224:5;18198:32;:::i;:::-;18193:3;18186:45;18095:142;;:::o;18243:918::-;18520:4;18558:3;18547:9;18543:19;18535:27;;18572:71;18640:1;18629:9;18625:17;18616:6;18572:71;:::i;:::-;18653:88;18737:2;18726:9;18722:18;18713:6;18653:88;:::i;:::-;18751:72;18819:2;18808:9;18804:18;18795:6;18751:72;:::i;:::-;18833;18901:2;18890:9;18886:18;18877:6;18833:72;:::i;:::-;18915:73;18983:3;18972:9;18968:19;18959:6;18915:73;:::i;:::-;18998;19066:3;19055:9;19051:19;19042:6;18998:73;:::i;:::-;19081;19149:3;19138:9;19134:19;19125:6;19081:73;:::i;:::-;18243:918;;;;;;;;;;:::o;19167:180::-;19215:77;19212:1;19205:88;19312:4;19309:1;19302:15;19336:4;19333:1;19326:15;19353:174;19493:26;19489:1;19481:6;19477:14;19470:50;19353:174;:::o;19533:366::-;19675:3;19696:67;19760:2;19755:3;19696:67;:::i;:::-;19689:74;;19772:93;19861:3;19772:93;:::i;:::-;19890:2;19885:3;19881:12;19874:19;;19533:366;;;:::o;19905:419::-;20071:4;20109:2;20098:9;20094:18;20086:26;;20158:9;20152:4;20148:20;20144:1;20133:9;20129:17;20122:47;20186:131;20312:4;20186:131;:::i;:::-;20178:139;;19905:419;;;:::o;20330:181::-;20470:33;20466:1;20458:6;20454:14;20447:57;20330:181;:::o;20517:366::-;20659:3;20680:67;20744:2;20739:3;20680:67;:::i;:::-;20673:74;;20756:93;20845:3;20756:93;:::i;:::-;20874:2;20869:3;20865:12;20858:19;;20517:366;;;:::o;20889:419::-;21055:4;21093:2;21082:9;21078:18;21070:26;;21142:9;21136:4;21132:20;21128:1;21117:9;21113:17;21106:47;21170:131;21296:4;21170:131;:::i;:::-;21162:139;;20889:419;;;:::o;21314:221::-;21454:34;21450:1;21442:6;21438:14;21431:58;21523:4;21518:2;21510:6;21506:15;21499:29;21314:221;:::o;21541:366::-;21683:3;21704:67;21768:2;21763:3;21704:67;:::i;:::-;21697:74;;21780:93;21869:3;21780:93;:::i;:::-;21898:2;21893:3;21889:12;21882:19;;21541:366;;;:::o;21913:419::-;22079:4;22117:2;22106:9;22102:18;22094:26;;22166:9;22160:4;22156:20;22152:1;22141:9;22137:17;22130:47;22194:131;22320:4;22194:131;:::i;:::-;22186:139;;21913:419;;;:::o;22338:148::-;22440:11;22477:3;22462:18;;22338:148;;;;:::o;22492:214::-;22632:66;22628:1;22620:6;22616:14;22609:90;22492:214;:::o;22712:400::-;22872:3;22893:84;22975:1;22970:3;22893:84;:::i;:::-;22886:91;;22986:93;23075:3;22986:93;:::i;:::-;23104:1;23099:3;23095:11;23088:18;;22712:400;;;:::o;23118:79::-;23157:7;23186:5;23175:16;;23118:79;;;:::o;23203:157::-;23308:45;23328:24;23346:5;23328:24;:::i;:::-;23308:45;:::i;:::-;23303:3;23296:58;23203:157;;:::o;23366:663::-;23607:3;23629:148;23773:3;23629:148;:::i;:::-;23622:155;;23787:75;23858:3;23849:6;23787:75;:::i;:::-;23887:2;23882:3;23878:12;23871:19;;23900:75;23971:3;23962:6;23900:75;:::i;:::-;24000:2;23995:3;23991:12;23984:19;;24020:3;24013:10;;23366:663;;;;;:::o;24035:86::-;24070:7;24110:4;24103:5;24099:16;24088:27;;24035:86;;;:::o;24127:112::-;24210:22;24226:5;24210:22;:::i;:::-;24205:3;24198:35;24127:112;;:::o;24245:545::-;24418:4;24456:3;24445:9;24441:19;24433:27;;24470:71;24538:1;24527:9;24523:17;24514:6;24470:71;:::i;:::-;24551:68;24615:2;24604:9;24600:18;24591:6;24551:68;:::i;:::-;24629:72;24697:2;24686:9;24682:18;24673:6;24629:72;:::i;:::-;24711;24779:2;24768:9;24764:18;24755:6;24711:72;:::i;:::-;24245:545;;;;;;;:::o;24796:664::-;25001:4;25039:3;25028:9;25024:19;25016:27;;25053:71;25121:1;25110:9;25106:17;25097:6;25053:71;:::i;:::-;25134:72;25202:2;25191:9;25187:18;25178:6;25134:72;:::i;:::-;25216;25284:2;25273:9;25269:18;25260:6;25216:72;:::i;:::-;25298;25366:2;25355:9;25351:18;25342:6;25298:72;:::i;:::-;25380:73;25448:3;25437:9;25433:19;25424:6;25380:73;:::i;:::-;24796:664;;;;;;;;:::o
Swarm Source
ipfs://262cc51da6042cdc7a6e0e63b9c1959f2688f2f00d7fb482782e5299e15cbe53
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.