Source Code
Overview
ETH Balance
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,450 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 1575829 | 160 days ago | IN | 0 ETH | 0.00000567 | ||||
| Withdraw | 1143619 | 258 days ago | IN | 0 ETH | 0.00000335 | ||||
| Set Approval For... | 759723 | 377 days ago | IN | 0 ETH | 0.00000247 | ||||
| Mint | 736374 | 386 days ago | IN | 0.0005 ETH | 0.00002106 | ||||
| Mint | 702919 | 398 days ago | IN | 0.0005 ETH | 0.00002293 | ||||
| Mint | 684613 | 404 days ago | IN | 0.0005 ETH | 0.00002293 | ||||
| Mint | 598908 | 427 days ago | IN | 0.0005 ETH | 0.00002925 | ||||
| Set Approval For... | 594080 | 429 days ago | IN | 0 ETH | 0.00000764 | ||||
| Mint | 540854 | 443 days ago | IN | 0.0005 ETH | 0.00002754 | ||||
| Mint | 500553 | 452 days ago | IN | 0.0005 ETH | 0.00002317 | ||||
| Mint | 484209 | 457 days ago | IN | 0.0005 ETH | 0.00001764 | ||||
| Mint | 484209 | 457 days ago | IN | 0.0005 ETH | 0.00002106 | ||||
| Mint | 483884 | 457 days ago | IN | 0.0005 ETH | 0.00002446 | ||||
| Mint | 471936 | 462 days ago | IN | 0.0005 ETH | 0.00002106 | ||||
| Mint | 470941 | 462 days ago | IN | 0.0005 ETH | 0.00001503 | ||||
| Set Approval For... | 464418 | 466 days ago | IN | 0 ETH | 0.00000246 | ||||
| Set Approval For... | 464406 | 466 days ago | IN | 0 ETH | 0.00000256 | ||||
| Approve | 460788 | 467 days ago | IN | 0 ETH | 0.00000161 | ||||
| Set Approval For... | 459487 | 468 days ago | IN | 0 ETH | 0.00000246 | ||||
| Set Approval For... | 459434 | 468 days ago | IN | 0 ETH | 0.00000256 | ||||
| Set Approval For... | 457699 | 468 days ago | IN | 0 ETH | 0.00000246 | ||||
| Set Approval For... | 457687 | 468 days ago | IN | 0 ETH | 0.00000256 | ||||
| Mint | 453243 | 470 days ago | IN | 0.0005 ETH | 0.00002106 | ||||
| Mint | 449707 | 472 days ago | IN | 0.0005 ETH | 0.00001158 | ||||
| Mint | 448376 | 472 days ago | IN | 0.0005 ETH | 0.00002106 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NFT
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/**
*Submitted for verification at taikoscan.io on 2024-05-27
*/
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts/utils/math/SignedMath.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
// File: @openzeppelin/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Muldiv operation overflow.
*/
error MathOverflowedMulDiv();
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the 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 towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
return a / b;
}
// (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 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
///////////////////////////////////////////////
// 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.
uint256 twos = denominator & (0 - denominator);
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 (unsignedRoundsUp(rounding) && 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
* towards zero.
*
* 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* 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 256, 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
pragma solidity ^0.8.20;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @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), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @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) {
uint256 localValue = value;
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
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);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.20;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/interfaces/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)
pragma solidity ^0.8.20;
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/interfaces/IERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)
pragma solidity ^0.8.20;
// File: @openzeppelin/contracts/interfaces/IERC4906.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)
pragma solidity ^0.8.20;
/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC165, IERC721 {
/// @dev This event emits when the metadata of a token is changed.
/// So that the third-party platforms such as NFT market could
/// timely update the images and related attributes of the NFT.
event MetadataUpdate(uint256 _tokenId);
/// @dev This event emits when the metadata of a range of tokens is changed.
/// So that the third-party platforms such as NFT market could
/// timely update the images and related attributes of the NFTs.
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.20;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.18;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
mapping(uint256 tokenId => address) private _owners;
mapping(address owner => uint256) private _balances;
mapping(uint256 tokenId => address) private _tokenApprovals;
mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual returns (uint256) {
if (owner == address(0)) {
revert ERC721InvalidOwner(address(0));
}
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual returns (address) {
return _requireOwned(tokenId);
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
_requireOwned(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual {
_approve(to, tokenId, _msgSender());
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual returns (address) {
_requireOwned(tokenId);
return _getApproved(tokenId);
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
// Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
// (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
address previousOwner = _update(to, tokenId, _msgSender());
if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
transferFrom(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*
* IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
* core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
* consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
* `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
*/
function _getApproved(uint256 tokenId) internal view virtual returns (address) {
return _tokenApprovals[tokenId];
}
/**
* @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
* particular (ignoring whether it is owned by `owner`).
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
return
spender != address(0) &&
(owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
}
/**
* @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
* Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
* the `spender` for the specific `tokenId`.
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
if (!_isAuthorized(owner, spender, tokenId)) {
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else {
revert ERC721InsufficientApproval(spender, tokenId);
}
}
}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
* a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
*
* WARNING: Increasing an account's balance using this function tends to be paired with an override of the
* {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
* remain consistent with one another.
*/
function _increaseBalance(address account, uint128 value) internal virtual {
unchecked {
_balances[account] += value;
}
}
/**
* @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
* (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that
* `auth` is either the owner of the token, or approved to operate on the token (by the owner).
*
* Emits a {Transfer} event.
*
* NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
*/
function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
address from = _ownerOf(tokenId);
// Perform (optional) operator check
if (auth != address(0)) {
_checkAuthorized(from, auth, tokenId);
}
// Execute the update
if (from != address(0)) {
// Clear approval. No need to re-authorize or emit the Approval event
_approve(address(0), tokenId, address(0), false);
unchecked {
_balances[from] -= 1;
}
}
if (to != address(0)) {
unchecked {
_balances[to] += 1;
}
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
return from;
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner != address(0)) {
revert ERC721InvalidSender(address(0));
}
}
/**
* @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
_mint(to, tokenId);
_checkOnERC721Received(address(0), to, tokenId, data);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal {
address previousOwner = _update(address(0), tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(address from, address to, uint256 tokenId) internal {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
* are aware of the ERC721 standard to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is like {safeTransferFrom} in the sense that it invokes
* {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `tokenId` token must exist and be owned by `from`.
* - `to` cannot be the zero address.
* - `from` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(address from, address to, uint256 tokenId) internal {
_safeTransfer(from, to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
* either the owner of the token, or approved to operate on all tokens held by this owner.
*
* Emits an {Approval} event.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address to, uint256 tokenId, address auth) internal {
_approve(to, tokenId, auth, true);
}
/**
* @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
* emitted in the context of transfers.
*/
function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
// Avoid reading the owner unless necessary
if (emitEvent || auth != address(0)) {
address owner = _requireOwned(tokenId);
// We do not use _isAuthorized because single-token approvals should not be able to call approve
if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
revert ERC721InvalidApprover(auth);
}
if (emitEvent) {
emit Approval(owner, to, tokenId);
}
}
_tokenApprovals[tokenId] = to;
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Requirements:
* - operator can't be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
if (operator == address(0)) {
revert ERC721InvalidOperator(operator);
}
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
* Returns the owner.
*
* Overrides to ownership logic should be done to {_ownerOf}.
*/
function _requireOwned(uint256 tokenId) internal view returns (address) {
address owner = _ownerOf(tokenId);
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
return owner;
}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
* recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
if (to.code.length > 0) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
if (retval != IERC721Receiver.onERC721Received.selector) {
revert ERC721InvalidReceiver(to);
}
} catch (bytes memory reason) {
if (reason.length == 0) {
revert ERC721InvalidReceiver(to);
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)
pragma solidity ^0.8.20;
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is IERC4906, ERC721 {
using Strings for uint256;
// Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only
// defines events and does not include any external function.
bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);
// Optional mapping for token URIs
mapping(uint256 tokenId => string) private _tokenURIs;
/**
* @dev See {IERC165-supportsInterface}
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {
return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireOwned(tokenId);
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via string.concat).
if (bytes(_tokenURI).length > 0) {
return string.concat(base, _tokenURI);
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Emits {MetadataUpdate}.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
_tokenURIs[tokenId] = _tokenURI;
emit MetadataUpdate(tokenId);
}
}
// File: @openzeppelin/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File: contracts/imaginairy.sol
pragma solidity ^0.8.0;
contract NFT is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
address public owner;
uint256 public cost;
// A mapping to store the tokens owned by a particular address
mapping(address => uint256[]) private _tokensOfOwner;
constructor(
string memory _name,
string memory _symbol,
uint256 _cost
) ERC721(_name, _symbol) {
owner = msg.sender;
cost = _cost;
}
function mint(string memory tokenURI) public payable {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(msg.sender, newItemId);
_setTokenURI(newItemId, tokenURI);
// Update the mapping every time a new token is minted
_tokensOfOwner[msg.sender].push(newItemId);
}
function totalSupply() public view returns (uint256) {
return _tokenIds.current();
}
// A function to get the tokens owned by a particular address
function tokensOfOwner(address _owner) public view returns(uint256[] memory) {
return _tokensOfOwner[_owner];
}
function setCost(uint256 newCost) public {
require(msg.sender == owner, "Only owner can change cost");
cost = newCost;
}
// Function to allow token owner to burn their NFT
function burn(uint256 tokenId) public {
require(ownerOf(tokenId) == msg.sender || getApproved(tokenId) == msg.sender, "Caller is not owner nor approved");
_burn(tokenId);
}
function withdraw() public {
require(msg.sender == owner, "Only owner can withdraw");
payable(owner).transfer(address(this).balance);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801562000010575f80fd5b506040516200309a3803806200309a83398181016040528101906200003691906200026a565b8282815f90816200004891906200052f565b5080600190816200005a91906200052f565b5050503360085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060098190555050505062000613565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200010e82620000c6565b810181811067ffffffffffffffff8211171562000130576200012f620000d6565b5b80604052505050565b5f62000144620000ad565b905062000152828262000103565b919050565b5f67ffffffffffffffff821115620001745762000173620000d6565b5b6200017f82620000c6565b9050602081019050919050565b5f5b83811015620001ab5780820151818401526020810190506200018e565b5f8484015250505050565b5f620001cc620001c68462000157565b62000139565b905082815260208101848484011115620001eb57620001ea620000c2565b5b620001f88482856200018c565b509392505050565b5f82601f830112620002175762000216620000be565b5b815162000229848260208601620001b6565b91505092915050565b5f819050919050565b620002468162000232565b811462000251575f80fd5b50565b5f8151905062000264816200023b565b92915050565b5f805f60608486031215620002845762000283620000b6565b5b5f84015167ffffffffffffffff811115620002a457620002a3620000ba565b5b620002b28682870162000200565b935050602084015167ffffffffffffffff811115620002d657620002d5620000ba565b5b620002e48682870162000200565b9250506040620002f78682870162000254565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200035057607f821691505b6020821081036200036657620003656200030b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620003ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200038d565b620003d686836200038d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000417620004116200040b8462000232565b620003ee565b62000232565b9050919050565b5f819050919050565b6200043283620003f7565b6200044a62000441826200041e565b84845462000399565b825550505050565b5f90565b6200046062000452565b6200046d81848462000427565b505050565b5b818110156200049457620004885f8262000456565b60018101905062000473565b5050565b601f821115620004e357620004ad816200036c565b620004b8846200037e565b81016020851015620004c8578190505b620004e0620004d7856200037e565b83018262000472565b50505b505050565b5f82821c905092915050565b5f620005055f1984600802620004e8565b1980831691505092915050565b5f6200051f8383620004f4565b9150826002028217905092915050565b6200053a8262000301565b67ffffffffffffffff811115620005565762000555620000d6565b5b62000562825462000338565b6200056f82828562000498565b5f60209050601f831160018114620005a5575f841562000590578287015190505b6200059c858262000512565b8655506200060b565b601f198416620005b5866200036c565b5f5b82811015620005de57848901518255600182019150602085019450602081019050620005b7565b86831015620005fe5784890151620005fa601f891682620004f4565b8355505b6001600288020188555050505b505050505050565b612a7980620006215f395ff3fe608060405260043610610129575f3560e01c806344a0d68a116100aa57806395d89b411161006e57806395d89b41146103df578063a22cb46514610409578063b88d4fde14610431578063c87b56dd14610459578063d85d3d2714610495578063e985e9c5146104b157610129565b806344a0d68a146102d95780636352211e1461030157806370a082311461033d5780638462151c146103795780638da5cb5b146103b557610129565b806318160ddd116100f157806318160ddd1461022157806323b872dd1461024b5780633ccfd60b1461027357806342842e0e1461028957806342966c68146102b157610129565b806301ffc9a71461012d57806306fdde0314610169578063081812fc14610193578063095ea7b3146101cf57806313faede6146101f7575b5f80fd5b348015610138575f80fd5b50610153600480360381019061014e9190611daa565b6104ed565b6040516101609190611def565b60405180910390f35b348015610174575f80fd5b5061017d61054d565b60405161018a9190611e92565b60405180910390f35b34801561019e575f80fd5b506101b960048036038101906101b49190611ee5565b6105dc565b6040516101c69190611f4f565b60405180910390f35b3480156101da575f80fd5b506101f560048036038101906101f09190611f92565b6105f7565b005b348015610202575f80fd5b5061020b61060d565b6040516102189190611fdf565b60405180910390f35b34801561022c575f80fd5b50610235610613565b6040516102429190611fdf565b60405180910390f35b348015610256575f80fd5b50610271600480360381019061026c9190611ff8565b610623565b005b34801561027e575f80fd5b50610287610722565b005b348015610294575f80fd5b506102af60048036038101906102aa9190611ff8565b610818565b005b3480156102bc575f80fd5b506102d760048036038101906102d29190611ee5565b610837565b005b3480156102e4575f80fd5b506102ff60048036038101906102fa9190611ee5565b6108f7565b005b34801561030c575f80fd5b5061032760048036038101906103229190611ee5565b610990565b6040516103349190611f4f565b60405180910390f35b348015610348575f80fd5b50610363600480360381019061035e9190612048565b6109a1565b6040516103709190611fdf565b60405180910390f35b348015610384575f80fd5b5061039f600480360381019061039a9190612048565b610a57565b6040516103ac919061212a565b60405180910390f35b3480156103c0575f80fd5b506103c9610aea565b6040516103d69190611f4f565b60405180910390f35b3480156103ea575f80fd5b506103f3610b0f565b6040516104009190611e92565b60405180910390f35b348015610414575f80fd5b5061042f600480360381019061042a9190612174565b610b9f565b005b34801561043c575f80fd5b50610457600480360381019061045291906122de565b610bb5565b005b348015610464575f80fd5b5061047f600480360381019061047a9190611ee5565b610bd2565b60405161048c9190611e92565b60405180910390f35b6104af60048036038101906104aa91906123fc565b610cdd565b005b3480156104bc575f80fd5b506104d760048036038101906104d29190612443565b610d6d565b6040516104e49190611def565b60405180910390f35b5f634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610546575061054582610dfb565b5b9050919050565b60605f805461055b906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610587906124ae565b80156105d25780601f106105a9576101008083540402835291602001916105d2565b820191905f5260205f20905b8154815290600101906020018083116105b557829003601f168201915b5050505050905090565b5f6105e682610edc565b506105f082610f62565b9050919050565b6106098282610604610f9b565b610fa2565b5050565b60095481565b5f61061e6007610fb4565b905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610693575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161068a9190611f4f565b60405180910390fd5b5f6106a683836106a1610f9b565b610fc0565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461071c578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610713939291906124de565b60405180910390fd5b50505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a89061255d565b60405180910390fd5b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610815573d5f803e3d5ffd5b50565b61083283838360405180602001604052805f815250610bb5565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661085782610990565b73ffffffffffffffffffffffffffffffffffffffff1614806108ac57503373ffffffffffffffffffffffffffffffffffffffff16610894826105dc565b73ffffffffffffffffffffffffffffffffffffffff16145b6108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e2906125c5565b60405180910390fd5b6108f4816111cb565b50565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d9061262d565b60405180910390fd5b8060098190555050565b5f61099a82610edc565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a12575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610a099190611f4f565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610ade57602002820191905f5260205f20905b815481526020019060010190808311610aca575b50505050509050919050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610b1e906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4a906124ae565b8015610b955780601f10610b6c57610100808354040283529160200191610b95565b820191905f5260205f20905b815481529060010190602001808311610b7857829003601f168201915b5050505050905090565b610bb1610baa610f9b565b838361124d565b5050565b610bc0848484610623565b610bcc848484846113b6565b50505050565b6060610bdd82610edc565b505f60065f8481526020019081526020015f208054610bfb906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c27906124ae565b8015610c725780601f10610c4957610100808354040283529160200191610c72565b820191905f5260205f20905b815481529060010190602001808311610c5557829003601f168201915b505050505090505f610c82611568565b90505f815103610c96578192505050610cd8565b5f82511115610cca578082604051602001610cb2929190612685565b60405160208183030381529060405292505050610cd8565b610cd38461157e565b925050505b919050565b610ce760076115e4565b5f610cf26007610fb4565b9050610cfe33826115f8565b610d0881836116eb565b600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150555050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ec557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ed55750610ed482611745565b5b9050919050565b5f80610ee7836117ae565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f5957826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610f509190611fdf565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610faf83838360016117e7565b505050565b5f815f01549050919050565b5f80610fcb846117ae565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461100c5761100b8184866119a6565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110975761104b5f855f806117e7565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461111657600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b5f6111d75f835f610fc0565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361124957816040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016112409190611fdf565b60405180910390fd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112bd57816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016112b49190611f4f565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113a99190611def565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115611562578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026113f9610f9b565b8685856040518563ffffffff1660e01b815260040161141b94939291906126fa565b6020604051808303815f875af192505050801561145657506040513d601f19601f820116820180604052508101906114539190612758565b60015b6114d7573d805f8114611484576040519150601f19603f3d011682016040523d82523d5f602084013e611489565b606091505b505f8151036114cf57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016114c69190611f4f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461156057836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016115579190611f4f565b60405180910390fd5b505b50505050565b606060405180602001604052805f815250905090565b606061158982610edc565b505f611593611568565b90505f8151116115b15760405180602001604052805f8152506115dc565b806115bb84611a69565b6040516020016115cc929190612685565b6040516020818303038152906040525b915050919050565b6001815f015f828254019250508190555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611668575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161165f9190611f4f565b60405180910390fd5b5f61167483835f610fc0565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116e6575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016116dd9190611f4f565b60405180910390fd5b505050565b8060065f8481526020019081526020015f2090816117099190612920565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516117399190611fdf565b60405180910390a15050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061181f57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611951575f61182e84610edc565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561189857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156118ab57506118a98184610d6d565b155b156118ed57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016118e49190611f4f565b60405180910390fd5b811561194f57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6119b1838383611b33565b611a64575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a2557806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611a1c9190611fdf565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611a5b9291906129ef565b60405180910390fd5b505050565b60605f6001611a7784611bf3565b0190505f8167ffffffffffffffff811115611a9557611a946121ba565b5b6040519080825280601f01601f191660200182016040528015611ac75781602001600182028036833780820191505090505b5090505f82602001820190505b600115611b28578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611b1d57611b1c612a16565b5b0494505f8503611ad4575b819350505050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611bea57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bab5750611baa8484610d6d565b5b80611be957508273ffffffffffffffffffffffffffffffffffffffff16611bd183610f62565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611c4f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611c4557611c44612a16565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611c8c576d04ee2d6d415b85acef81000000008381611c8257611c81612a16565b5b0492506020810190505b662386f26fc100008310611cbb57662386f26fc100008381611cb157611cb0612a16565b5b0492506010810190505b6305f5e1008310611ce4576305f5e1008381611cda57611cd9612a16565b5b0492506008810190505b6127108310611d09576127108381611cff57611cfe612a16565b5b0492506004810190505b60648310611d2c5760648381611d2257611d21612a16565b5b0492506002810190505b600a8310611d3b576001810190505b80915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8981611d55565b8114611d93575f80fd5b50565b5f81359050611da481611d80565b92915050565b5f60208284031215611dbf57611dbe611d4d565b5b5f611dcc84828501611d96565b91505092915050565b5f8115159050919050565b611de981611dd5565b82525050565b5f602082019050611e025f830184611de0565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611e3f578082015181840152602081019050611e24565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611e6482611e08565b611e6e8185611e12565b9350611e7e818560208601611e22565b611e8781611e4a565b840191505092915050565b5f6020820190508181035f830152611eaa8184611e5a565b905092915050565b5f819050919050565b611ec481611eb2565b8114611ece575f80fd5b50565b5f81359050611edf81611ebb565b92915050565b5f60208284031215611efa57611ef9611d4d565b5b5f611f0784828501611ed1565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f3982611f10565b9050919050565b611f4981611f2f565b82525050565b5f602082019050611f625f830184611f40565b92915050565b611f7181611f2f565b8114611f7b575f80fd5b50565b5f81359050611f8c81611f68565b92915050565b5f8060408385031215611fa857611fa7611d4d565b5b5f611fb585828601611f7e565b9250506020611fc685828601611ed1565b9150509250929050565b611fd981611eb2565b82525050565b5f602082019050611ff25f830184611fd0565b92915050565b5f805f6060848603121561200f5761200e611d4d565b5b5f61201c86828701611f7e565b935050602061202d86828701611f7e565b925050604061203e86828701611ed1565b9150509250925092565b5f6020828403121561205d5761205c611d4d565b5b5f61206a84828501611f7e565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6120a581611eb2565b82525050565b5f6120b6838361209c565b60208301905092915050565b5f602082019050919050565b5f6120d882612073565b6120e2818561207d565b93506120ed8361208d565b805f5b8381101561211d57815161210488826120ab565b975061210f836120c2565b9250506001810190506120f0565b5085935050505092915050565b5f6020820190508181035f83015261214281846120ce565b905092915050565b61215381611dd5565b811461215d575f80fd5b50565b5f8135905061216e8161214a565b92915050565b5f806040838503121561218a57612189611d4d565b5b5f61219785828601611f7e565b92505060206121a885828601612160565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6121f082611e4a565b810181811067ffffffffffffffff8211171561220f5761220e6121ba565b5b80604052505050565b5f612221611d44565b905061222d82826121e7565b919050565b5f67ffffffffffffffff82111561224c5761224b6121ba565b5b61225582611e4a565b9050602081019050919050565b828183375f83830152505050565b5f61228261227d84612232565b612218565b90508281526020810184848401111561229e5761229d6121b6565b5b6122a9848285612262565b509392505050565b5f82601f8301126122c5576122c46121b2565b5b81356122d5848260208601612270565b91505092915050565b5f805f80608085870312156122f6576122f5611d4d565b5b5f61230387828801611f7e565b945050602061231487828801611f7e565b935050604061232587828801611ed1565b925050606085013567ffffffffffffffff81111561234657612345611d51565b5b612352878288016122b1565b91505092959194509250565b5f67ffffffffffffffff821115612378576123776121ba565b5b61238182611e4a565b9050602081019050919050565b5f6123a061239b8461235e565b612218565b9050828152602081018484840111156123bc576123bb6121b6565b5b6123c7848285612262565b509392505050565b5f82601f8301126123e3576123e26121b2565b5b81356123f384826020860161238e565b91505092915050565b5f6020828403121561241157612410611d4d565b5b5f82013567ffffffffffffffff81111561242e5761242d611d51565b5b61243a848285016123cf565b91505092915050565b5f806040838503121561245957612458611d4d565b5b5f61246685828601611f7e565b925050602061247785828601611f7e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806124c557607f821691505b6020821081036124d8576124d7612481565b5b50919050565b5f6060820190506124f15f830186611f40565b6124fe6020830185611fd0565b61250b6040830184611f40565b949350505050565b7f4f6e6c79206f776e65722063616e2077697468647261770000000000000000005f82015250565b5f612547601783611e12565b915061255282612513565b602082019050919050565b5f6020820190508181035f8301526125748161253b565b9050919050565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665645f82015250565b5f6125af602083611e12565b91506125ba8261257b565b602082019050919050565b5f6020820190508181035f8301526125dc816125a3565b9050919050565b7f4f6e6c79206f776e65722063616e206368616e676520636f73740000000000005f82015250565b5f612617601a83611e12565b9150612622826125e3565b602082019050919050565b5f6020820190508181035f8301526126448161260b565b9050919050565b5f81905092915050565b5f61265f82611e08565b612669818561264b565b9350612679818560208601611e22565b80840191505092915050565b5f6126908285612655565b915061269c8284612655565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6126cc826126a8565b6126d681856126b2565b93506126e6818560208601611e22565b6126ef81611e4a565b840191505092915050565b5f60808201905061270d5f830187611f40565b61271a6020830186611f40565b6127276040830185611fd0565b818103606083015261273981846126c2565b905095945050505050565b5f8151905061275281611d80565b92915050565b5f6020828403121561276d5761276c611d4d565b5b5f61277a84828501612744565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026127df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826127a4565b6127e986836127a4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61282461281f61281a84611eb2565b612801565b611eb2565b9050919050565b5f819050919050565b61283d8361280a565b6128516128498261282b565b8484546127b0565b825550505050565b5f90565b612865612859565b612870818484612834565b505050565b5b81811015612893576128885f8261285d565b600181019050612876565b5050565b601f8211156128d8576128a981612783565b6128b284612795565b810160208510156128c1578190505b6128d56128cd85612795565b830182612875565b50505b505050565b5f82821c905092915050565b5f6128f85f19846008026128dd565b1980831691505092915050565b5f61291083836128e9565b9150826002028217905092915050565b61292982611e08565b67ffffffffffffffff811115612942576129416121ba565b5b61294c82546124ae565b612957828285612897565b5f60209050601f831160018114612988575f8415612976578287015190505b6129808582612905565b8655506129e7565b601f19841661299686612783565b5f5b828110156129bd57848901518255600182019150602085019450602081019050612998565b868310156129da57848901516129d6601f8916826128e9565b8355505b6001600288020188555050505b505050505050565b5f604082019050612a025f830185611f40565b612a0f6020830184611fd0565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffdfea26469706673582212203cd9d4b1c14628c0305698f0d05f1826f62dd892e35c02999720b83cdf87360964736f6c63430008180033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000f496d6167696e41497279204e4654730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641494e4654730000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405260043610610129575f3560e01c806344a0d68a116100aa57806395d89b411161006e57806395d89b41146103df578063a22cb46514610409578063b88d4fde14610431578063c87b56dd14610459578063d85d3d2714610495578063e985e9c5146104b157610129565b806344a0d68a146102d95780636352211e1461030157806370a082311461033d5780638462151c146103795780638da5cb5b146103b557610129565b806318160ddd116100f157806318160ddd1461022157806323b872dd1461024b5780633ccfd60b1461027357806342842e0e1461028957806342966c68146102b157610129565b806301ffc9a71461012d57806306fdde0314610169578063081812fc14610193578063095ea7b3146101cf57806313faede6146101f7575b5f80fd5b348015610138575f80fd5b50610153600480360381019061014e9190611daa565b6104ed565b6040516101609190611def565b60405180910390f35b348015610174575f80fd5b5061017d61054d565b60405161018a9190611e92565b60405180910390f35b34801561019e575f80fd5b506101b960048036038101906101b49190611ee5565b6105dc565b6040516101c69190611f4f565b60405180910390f35b3480156101da575f80fd5b506101f560048036038101906101f09190611f92565b6105f7565b005b348015610202575f80fd5b5061020b61060d565b6040516102189190611fdf565b60405180910390f35b34801561022c575f80fd5b50610235610613565b6040516102429190611fdf565b60405180910390f35b348015610256575f80fd5b50610271600480360381019061026c9190611ff8565b610623565b005b34801561027e575f80fd5b50610287610722565b005b348015610294575f80fd5b506102af60048036038101906102aa9190611ff8565b610818565b005b3480156102bc575f80fd5b506102d760048036038101906102d29190611ee5565b610837565b005b3480156102e4575f80fd5b506102ff60048036038101906102fa9190611ee5565b6108f7565b005b34801561030c575f80fd5b5061032760048036038101906103229190611ee5565b610990565b6040516103349190611f4f565b60405180910390f35b348015610348575f80fd5b50610363600480360381019061035e9190612048565b6109a1565b6040516103709190611fdf565b60405180910390f35b348015610384575f80fd5b5061039f600480360381019061039a9190612048565b610a57565b6040516103ac919061212a565b60405180910390f35b3480156103c0575f80fd5b506103c9610aea565b6040516103d69190611f4f565b60405180910390f35b3480156103ea575f80fd5b506103f3610b0f565b6040516104009190611e92565b60405180910390f35b348015610414575f80fd5b5061042f600480360381019061042a9190612174565b610b9f565b005b34801561043c575f80fd5b50610457600480360381019061045291906122de565b610bb5565b005b348015610464575f80fd5b5061047f600480360381019061047a9190611ee5565b610bd2565b60405161048c9190611e92565b60405180910390f35b6104af60048036038101906104aa91906123fc565b610cdd565b005b3480156104bc575f80fd5b506104d760048036038101906104d29190612443565b610d6d565b6040516104e49190611def565b60405180910390f35b5f634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610546575061054582610dfb565b5b9050919050565b60605f805461055b906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610587906124ae565b80156105d25780601f106105a9576101008083540402835291602001916105d2565b820191905f5260205f20905b8154815290600101906020018083116105b557829003601f168201915b5050505050905090565b5f6105e682610edc565b506105f082610f62565b9050919050565b6106098282610604610f9b565b610fa2565b5050565b60095481565b5f61061e6007610fb4565b905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610693575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161068a9190611f4f565b60405180910390fd5b5f6106a683836106a1610f9b565b610fc0565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461071c578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610713939291906124de565b60405180910390fd5b50505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a89061255d565b60405180910390fd5b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610815573d5f803e3d5ffd5b50565b61083283838360405180602001604052805f815250610bb5565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661085782610990565b73ffffffffffffffffffffffffffffffffffffffff1614806108ac57503373ffffffffffffffffffffffffffffffffffffffff16610894826105dc565b73ffffffffffffffffffffffffffffffffffffffff16145b6108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e2906125c5565b60405180910390fd5b6108f4816111cb565b50565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d9061262d565b60405180910390fd5b8060098190555050565b5f61099a82610edc565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a12575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610a099190611f4f565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610ade57602002820191905f5260205f20905b815481526020019060010190808311610aca575b50505050509050919050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610b1e906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4a906124ae565b8015610b955780601f10610b6c57610100808354040283529160200191610b95565b820191905f5260205f20905b815481529060010190602001808311610b7857829003601f168201915b5050505050905090565b610bb1610baa610f9b565b838361124d565b5050565b610bc0848484610623565b610bcc848484846113b6565b50505050565b6060610bdd82610edc565b505f60065f8481526020019081526020015f208054610bfb906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c27906124ae565b8015610c725780601f10610c4957610100808354040283529160200191610c72565b820191905f5260205f20905b815481529060010190602001808311610c5557829003601f168201915b505050505090505f610c82611568565b90505f815103610c96578192505050610cd8565b5f82511115610cca578082604051602001610cb2929190612685565b60405160208183030381529060405292505050610cd8565b610cd38461157e565b925050505b919050565b610ce760076115e4565b5f610cf26007610fb4565b9050610cfe33826115f8565b610d0881836116eb565b600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150555050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ec557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ed55750610ed482611745565b5b9050919050565b5f80610ee7836117ae565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f5957826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610f509190611fdf565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610faf83838360016117e7565b505050565b5f815f01549050919050565b5f80610fcb846117ae565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461100c5761100b8184866119a6565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110975761104b5f855f806117e7565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461111657600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b5f6111d75f835f610fc0565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361124957816040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016112409190611fdf565b60405180910390fd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112bd57816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016112b49190611f4f565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113a99190611def565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115611562578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026113f9610f9b565b8685856040518563ffffffff1660e01b815260040161141b94939291906126fa565b6020604051808303815f875af192505050801561145657506040513d601f19601f820116820180604052508101906114539190612758565b60015b6114d7573d805f8114611484576040519150601f19603f3d011682016040523d82523d5f602084013e611489565b606091505b505f8151036114cf57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016114c69190611f4f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461156057836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016115579190611f4f565b60405180910390fd5b505b50505050565b606060405180602001604052805f815250905090565b606061158982610edc565b505f611593611568565b90505f8151116115b15760405180602001604052805f8152506115dc565b806115bb84611a69565b6040516020016115cc929190612685565b6040516020818303038152906040525b915050919050565b6001815f015f828254019250508190555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611668575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161165f9190611f4f565b60405180910390fd5b5f61167483835f610fc0565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116e6575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016116dd9190611f4f565b60405180910390fd5b505050565b8060065f8481526020019081526020015f2090816117099190612920565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516117399190611fdf565b60405180910390a15050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061181f57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611951575f61182e84610edc565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561189857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156118ab57506118a98184610d6d565b155b156118ed57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016118e49190611f4f565b60405180910390fd5b811561194f57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6119b1838383611b33565b611a64575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a2557806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611a1c9190611fdf565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611a5b9291906129ef565b60405180910390fd5b505050565b60605f6001611a7784611bf3565b0190505f8167ffffffffffffffff811115611a9557611a946121ba565b5b6040519080825280601f01601f191660200182016040528015611ac75781602001600182028036833780820191505090505b5090505f82602001820190505b600115611b28578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611b1d57611b1c612a16565b5b0494505f8503611ad4575b819350505050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611bea57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bab5750611baa8484610d6d565b5b80611be957508273ffffffffffffffffffffffffffffffffffffffff16611bd183610f62565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611c4f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611c4557611c44612a16565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611c8c576d04ee2d6d415b85acef81000000008381611c8257611c81612a16565b5b0492506020810190505b662386f26fc100008310611cbb57662386f26fc100008381611cb157611cb0612a16565b5b0492506010810190505b6305f5e1008310611ce4576305f5e1008381611cda57611cd9612a16565b5b0492506008810190505b6127108310611d09576127108381611cff57611cfe612a16565b5b0492506004810190505b60648310611d2c5760648381611d2257611d21612a16565b5b0492506002810190505b600a8310611d3b576001810190505b80915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8981611d55565b8114611d93575f80fd5b50565b5f81359050611da481611d80565b92915050565b5f60208284031215611dbf57611dbe611d4d565b5b5f611dcc84828501611d96565b91505092915050565b5f8115159050919050565b611de981611dd5565b82525050565b5f602082019050611e025f830184611de0565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611e3f578082015181840152602081019050611e24565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611e6482611e08565b611e6e8185611e12565b9350611e7e818560208601611e22565b611e8781611e4a565b840191505092915050565b5f6020820190508181035f830152611eaa8184611e5a565b905092915050565b5f819050919050565b611ec481611eb2565b8114611ece575f80fd5b50565b5f81359050611edf81611ebb565b92915050565b5f60208284031215611efa57611ef9611d4d565b5b5f611f0784828501611ed1565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f3982611f10565b9050919050565b611f4981611f2f565b82525050565b5f602082019050611f625f830184611f40565b92915050565b611f7181611f2f565b8114611f7b575f80fd5b50565b5f81359050611f8c81611f68565b92915050565b5f8060408385031215611fa857611fa7611d4d565b5b5f611fb585828601611f7e565b9250506020611fc685828601611ed1565b9150509250929050565b611fd981611eb2565b82525050565b5f602082019050611ff25f830184611fd0565b92915050565b5f805f6060848603121561200f5761200e611d4d565b5b5f61201c86828701611f7e565b935050602061202d86828701611f7e565b925050604061203e86828701611ed1565b9150509250925092565b5f6020828403121561205d5761205c611d4d565b5b5f61206a84828501611f7e565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6120a581611eb2565b82525050565b5f6120b6838361209c565b60208301905092915050565b5f602082019050919050565b5f6120d882612073565b6120e2818561207d565b93506120ed8361208d565b805f5b8381101561211d57815161210488826120ab565b975061210f836120c2565b9250506001810190506120f0565b5085935050505092915050565b5f6020820190508181035f83015261214281846120ce565b905092915050565b61215381611dd5565b811461215d575f80fd5b50565b5f8135905061216e8161214a565b92915050565b5f806040838503121561218a57612189611d4d565b5b5f61219785828601611f7e565b92505060206121a885828601612160565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6121f082611e4a565b810181811067ffffffffffffffff8211171561220f5761220e6121ba565b5b80604052505050565b5f612221611d44565b905061222d82826121e7565b919050565b5f67ffffffffffffffff82111561224c5761224b6121ba565b5b61225582611e4a565b9050602081019050919050565b828183375f83830152505050565b5f61228261227d84612232565b612218565b90508281526020810184848401111561229e5761229d6121b6565b5b6122a9848285612262565b509392505050565b5f82601f8301126122c5576122c46121b2565b5b81356122d5848260208601612270565b91505092915050565b5f805f80608085870312156122f6576122f5611d4d565b5b5f61230387828801611f7e565b945050602061231487828801611f7e565b935050604061232587828801611ed1565b925050606085013567ffffffffffffffff81111561234657612345611d51565b5b612352878288016122b1565b91505092959194509250565b5f67ffffffffffffffff821115612378576123776121ba565b5b61238182611e4a565b9050602081019050919050565b5f6123a061239b8461235e565b612218565b9050828152602081018484840111156123bc576123bb6121b6565b5b6123c7848285612262565b509392505050565b5f82601f8301126123e3576123e26121b2565b5b81356123f384826020860161238e565b91505092915050565b5f6020828403121561241157612410611d4d565b5b5f82013567ffffffffffffffff81111561242e5761242d611d51565b5b61243a848285016123cf565b91505092915050565b5f806040838503121561245957612458611d4d565b5b5f61246685828601611f7e565b925050602061247785828601611f7e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806124c557607f821691505b6020821081036124d8576124d7612481565b5b50919050565b5f6060820190506124f15f830186611f40565b6124fe6020830185611fd0565b61250b6040830184611f40565b949350505050565b7f4f6e6c79206f776e65722063616e2077697468647261770000000000000000005f82015250565b5f612547601783611e12565b915061255282612513565b602082019050919050565b5f6020820190508181035f8301526125748161253b565b9050919050565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665645f82015250565b5f6125af602083611e12565b91506125ba8261257b565b602082019050919050565b5f6020820190508181035f8301526125dc816125a3565b9050919050565b7f4f6e6c79206f776e65722063616e206368616e676520636f73740000000000005f82015250565b5f612617601a83611e12565b9150612622826125e3565b602082019050919050565b5f6020820190508181035f8301526126448161260b565b9050919050565b5f81905092915050565b5f61265f82611e08565b612669818561264b565b9350612679818560208601611e22565b80840191505092915050565b5f6126908285612655565b915061269c8284612655565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6126cc826126a8565b6126d681856126b2565b93506126e6818560208601611e22565b6126ef81611e4a565b840191505092915050565b5f60808201905061270d5f830187611f40565b61271a6020830186611f40565b6127276040830185611fd0565b818103606083015261273981846126c2565b905095945050505050565b5f8151905061275281611d80565b92915050565b5f6020828403121561276d5761276c611d4d565b5b5f61277a84828501612744565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026127df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826127a4565b6127e986836127a4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61282461281f61281a84611eb2565b612801565b611eb2565b9050919050565b5f819050919050565b61283d8361280a565b6128516128498261282b565b8484546127b0565b825550505050565b5f90565b612865612859565b612870818484612834565b505050565b5b81811015612893576128885f8261285d565b600181019050612876565b5050565b601f8211156128d8576128a981612783565b6128b284612795565b810160208510156128c1578190505b6128d56128cd85612795565b830182612875565b50505b505050565b5f82821c905092915050565b5f6128f85f19846008026128dd565b1980831691505092915050565b5f61291083836128e9565b9150826002028217905092915050565b61292982611e08565b67ffffffffffffffff811115612942576129416121ba565b5b61294c82546124ae565b612957828285612897565b5f60209050601f831160018114612988575f8415612976578287015190505b6129808582612905565b8655506129e7565b601f19841661299686612783565b5f5b828110156129bd57848901518255600182019150602085019450602081019050612998565b868310156129da57848901516129d6601f8916826128e9565b8355505b6001600288020188555050505b505050505050565b5f604082019050612a025f830185611f40565b612a0f6020830184611fd0565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffdfea26469706673582212203cd9d4b1c14628c0305698f0d05f1826f62dd892e35c02999720b83cdf87360964736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000f496d6167696e41497279204e4654730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641494e4654730000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): ImaginAIry NFTs
Arg [1] : _symbol (string): AINFTs
Arg [2] : _cost (uint256): 1000000000000000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [4] : 496d6167696e41497279204e4654730000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 41494e4654730000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
59079:1735:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56350:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39791:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40963:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40782:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59231:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59943:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41632:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60653:158;;;;;;;;;;;;;:::i;:::-;;42291:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60450:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60243:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39604:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39329:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60114:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59204:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39951:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41193:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42496:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56630:609;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59582:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41410:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56350:209;56452:4;56165:10;56158:18;;56476:35;;;:11;:35;;;;:75;;;;56515:36;56539:11;56515:23;:36::i;:::-;56476:75;56469:82;;56350:209;;;:::o;39791:91::-;39836:13;39869:5;39862:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39791:91;:::o;40963:158::-;41030:7;41050:22;41064:7;41050:13;:22::i;:::-;;41092:21;41105:7;41092:12;:21::i;:::-;41085:28;;40963:158;;;:::o;40782:115::-;40854:35;40863:2;40867:7;40876:12;:10;:12::i;:::-;40854:8;:35::i;:::-;40782:115;;:::o;59231:19::-;;;;:::o;59943:98::-;59987:7;60014:19;:9;:17;:19::i;:::-;60007:26;;59943:98;:::o;41632:588::-;41741:1;41727:16;;:2;:16;;;41723:89;;41797:1;41767:33;;;;;;;;;;;:::i;:::-;;;;;;;;41723:89;42033:21;42057:34;42065:2;42069:7;42078:12;:10;:12::i;:::-;42057:7;:34::i;:::-;42033:58;;42123:4;42106:21;;:13;:21;;;42102:111;;42172:4;42178:7;42187:13;42151:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;42102:111;41712:508;41632:588;;;:::o;60653:158::-;60713:5;;;;;;;;;;;60699:19;;:10;:19;;;60691:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;60765:5;;;;;;;;;;;60757:23;;:46;60781:21;60757:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60653:158::o;42291:134::-;42378:39;42395:4;42401:2;42405:7;42378:39;;;;;;;;;;;;:16;:39::i;:::-;42291:134;;;:::o;60450:195::-;60527:10;60507:30;;:16;60515:7;60507;:16::i;:::-;:30;;;:68;;;;60565:10;60541:34;;:20;60553:7;60541:11;:20::i;:::-;:34;;;60507:68;60499:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;60623:14;60629:7;60623:5;:14::i;:::-;60450:195;:::o;60243:143::-;60317:5;;;;;;;;;;;60303:19;;:10;:19;;;60295:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;60371:7;60364:4;:14;;;;60243:143;:::o;39604:120::-;39667:7;39694:22;39708:7;39694:13;:22::i;:::-;39687:29;;39604:120;;;:::o;39329:213::-;39392:7;39433:1;39416:19;;:5;:19;;;39412:89;;39486:1;39459:30;;;;;;;;;;;:::i;:::-;;;;;;;;39412:89;39518:9;:16;39528:5;39518:16;;;;;;;;;;;;;;;;39511:23;;39329:213;;;:::o;60114:121::-;60173:16;60205:14;:22;60220:6;60205:22;;;;;;;;;;;;;;;60198:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60114:121;;;:::o;59204:20::-;;;;;;;;;;;;;:::o;39951:95::-;39998:13;40031:7;40024:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39951:95;:::o;41193:146::-;41279:52;41298:12;:10;:12::i;:::-;41312:8;41322;41279:18;:52::i;:::-;41193:146;;:::o;42496:211::-;42610:31;42623:4;42629:2;42633:7;42610:12;:31::i;:::-;42652:47;42675:4;42681:2;42685:7;42694:4;42652:22;:47::i;:::-;42496:211;;;;:::o;56630:609::-;56703:13;56729:22;56743:7;56729:13;:22::i;:::-;;56764:23;56790:10;:19;56801:7;56790:19;;;;;;;;;;;56764:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56820:18;56841:10;:8;:10::i;:::-;56820:31;;56949:1;56933:4;56927:18;:23;56923:72;;56974:9;56967:16;;;;;;56923:72;57122:1;57102:9;57096:23;:27;57092:97;;;57161:4;57167:9;57147:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57140:37;;;;;;57092:97;57208:23;57223:7;57208:14;:23::i;:::-;57201:30;;;;56630:609;;;;:::o;59582:353::-;59646:21;:9;:19;:21::i;:::-;59678:17;59698:19;:9;:17;:19::i;:::-;59678:39;;59728:28;59734:10;59746:9;59728:5;:28::i;:::-;59767:33;59780:9;59791:8;59767:12;:33::i;:::-;59885:14;:26;59900:10;59885:26;;;;;;;;;;;;;;;59917:9;59885:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59635:300;59582:353;:::o;41410:155::-;41498:4;41522:18;:25;41541:5;41522:25;;;;;;;;;;;;;;;:35;41548:8;41522:35;;;;;;;;;;;;;;;;;;;;;;;;;41515:42;;41410:155;;;;:::o;38960:305::-;39062:4;39114:25;39099:40;;;:11;:40;;;;:105;;;;39171:33;39156:48;;;:11;:48;;;;39099:105;:158;;;;39221:36;39245:11;39221:23;:36::i;:::-;39099:158;39079:178;;38960:305;;;:::o;53938:247::-;54001:7;54021:13;54037:17;54046:7;54037:8;:17::i;:::-;54021:33;;54086:1;54069:19;;:5;:19;;;54065:90;;54135:7;54112:31;;;;;;;;;;;:::i;:::-;;;;;;;;54065:90;54172:5;54165:12;;;53938:247;;;:::o;43469:129::-;43539:7;43566:15;:24;43582:7;43566:24;;;;;;;;;;;;;;;;;;;;;43559:31;;43469:129;;;:::o;27455:98::-;27508:7;27535:10;27528:17;;27455:98;:::o;52170:122::-;52251:33;52260:2;52264:7;52273:4;52279;52251:8;:33::i;:::-;52170:122;;;:::o;58414:114::-;58479:7;58506;:14;;;58499:21;;58414:114;;;:::o;46431:824::-;46517:7;46537:12;46552:17;46561:7;46552:8;:17::i;:::-;46537:32;;46648:1;46632:18;;:4;:18;;;46628:88;;46667:37;46684:4;46690;46696:7;46667:16;:37::i;:::-;46628:88;46779:1;46763:18;;:4;:18;;;46759:263;;46881:48;46898:1;46902:7;46919:1;46923:5;46881:8;:48::i;:::-;46994:1;46975:9;:15;46985:4;46975:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;46759:263;47052:1;47038:16;;:2;:16;;;47034:111;;47117:1;47100:9;:13;47110:2;47100:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;47034:111;47176:2;47157:7;:16;47165:7;47157:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47215:7;47211:2;47196:27;;47205:4;47196:27;;;;;;;;;;;;47243:4;47236:11;;;46431:824;;;;;:::o;49142:232::-;49194:21;49218:40;49234:1;49238:7;49255:1;49218:7;:40::i;:::-;49194:64;;49298:1;49273:27;;:13;:27;;;49269:98;;49347:7;49324:31;;;;;;;;;;;:::i;:::-;;;;;;;;49269:98;49183:191;49142:232;:::o;53377:318::-;53505:1;53485:22;;:8;:22;;;53481:93;;53553:8;53531:31;;;;;;;;;;;:::i;:::-;;;;;;;;53481:93;53622:8;53584:18;:25;53603:5;53584:25;;;;;;;;;;;;;;;:35;53610:8;53584:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53668:8;53646:41;;53661:5;53646:41;;;53678:8;53646:41;;;;;;:::i;:::-;;;;;;;;53377:318;;;:::o;54735:799::-;54869:1;54852:2;:14;;;:18;54848:679;;;54907:2;54891:36;;;54928:12;:10;:12::i;:::-;54942:4;54948:7;54957:4;54891:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54887:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55222:1;55205:6;:13;:18;55201:300;;55277:2;55255:25;;;;;;;;;;;:::i;:::-;;;;;;;;55201:300;55451:6;55445:13;55436:6;55432:2;55428:15;55421:38;54887:629;55020:41;;;55010:51;;;:6;:51;;;;55006:132;;55115:2;55093:25;;;;;;;;;;;:::i;:::-;;;;;;;;55006:132;54963:190;54848:679;54735:799;;;;:::o;40626:94::-;40677:13;40703:9;;;;;;;;;;;;;;40626:94;:::o;40117:260::-;40181:13;40207:22;40221:7;40207:13;:22::i;:::-;;40242:21;40266:10;:8;:10::i;:::-;40242:34;;40318:1;40300:7;40294:21;:25;:75;;;;;;;;;;;;;;;;;40336:7;40345:18;:7;:16;:18::i;:::-;40322:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40294:75;40287:82;;;40117:260;;;:::o;58536:127::-;58643:1;58625:7;:14;;;:19;;;;;;;;;;;58536:127;:::o;47591:335::-;47673:1;47659:16;;:2;:16;;;47655:89;;47729:1;47699:33;;;;;;;;;;;:::i;:::-;;;;;;;;47655:89;47754:21;47778:32;47786:2;47790:7;47807:1;47778:7;:32::i;:::-;47754:56;;47850:1;47825:27;;:13;:27;;;47821:98;;47904:1;47876:31;;;;;;;;;;;:::i;:::-;;;;;;;;47821:98;47644:282;47591:335;;:::o;57365:170::-;57479:9;57457:10;:19;57468:7;57457:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;57504:23;57519:7;57504:23;;;;;;:::i;:::-;;;;;;;;57365:170;;:::o;30720:148::-;30796:4;30835:25;30820:40;;;:11;:40;;;;30813:47;;30720:148;;;:::o;43231:117::-;43297:7;43324;:16;43332:7;43324:16;;;;;;;;;;;;;;;;;;;;;43317:23;;43231:117;;;:::o;52480:678::-;52642:9;:31;;;;52671:1;52655:18;;:4;:18;;;;52642:31;52638:471;;;52690:13;52706:22;52720:7;52706:13;:22::i;:::-;52690:38;;52875:1;52859:18;;:4;:18;;;;:35;;;;;52890:4;52881:13;;:5;:13;;;;52859:35;:69;;;;;52899:29;52916:5;52923:4;52899:16;:29::i;:::-;52898:30;52859:69;52855:144;;;52978:4;52956:27;;;;;;;;;;;:::i;:::-;;;;;;;;52855:144;53019:9;53015:83;;;53074:7;53070:2;53054:28;;53063:5;53054:28;;;;;;;;;;;;53015:83;52675:434;52638:471;53148:2;53121:15;:24;53137:7;53121:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52480:678;;;;:::o;44638:376::-;44751:38;44765:5;44772:7;44781;44751:13;:38::i;:::-;44746:261;;44827:1;44810:19;;:5;:19;;;44806:190;;44880:7;44857:31;;;;;;;;;;;:::i;:::-;;;;;;;;44806:190;44963:7;44972;44936:44;;;;;;;;;;;;:::i;:::-;;;;;;;;44746:261;44638:376;;;:::o;24225:718::-;24281:13;24332:14;24369:1;24349:17;24360:5;24349:10;:17::i;:::-;:21;24332:38;;24385:20;24419:6;24408:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24385:41;;24441:11;24570:6;24566:2;24562:15;24554:6;24550:28;24543:35;;24607:290;24614:4;24607:290;;;24639:5;;;;;;;;24781:10;24776:2;24769:5;24765:14;24760:32;24755:3;24747:46;24839:2;24830:11;;;;;;:::i;:::-;;;;;24873:1;24864:5;:10;24607:290;24860:21;24607:290;24918:6;24911:13;;;;;24225:718;;;:::o;43918:276::-;44021:4;44077:1;44058:21;;:7;:21;;;;:128;;;;;44106:7;44097:16;;:5;:16;;;:52;;;;44117:32;44134:5;44141:7;44117:16;:32::i;:::-;44097:52;:88;;;;44178:7;44153:32;;:21;44166:7;44153:12;:21::i;:::-;:32;;;44097:88;44058:128;44038:148;;43918:276;;;;;:::o;20629:948::-;20682:7;20702:14;20719:1;20702:18;;20769:8;20760:5;:17;20756:106;;20807:8;20798:17;;;;;;:::i;:::-;;;;;20844:2;20834:12;;;;20756:106;20889:8;20880:5;:17;20876:106;;20927:8;20918:17;;;;;;:::i;:::-;;;;;20964:2;20954:12;;;;20876:106;21009:8;21000:5;:17;20996:106;;21047:8;21038:17;;;;;;:::i;:::-;;;;;21084:2;21074:12;;;;20996:106;21129:7;21120:5;:16;21116:103;;21166:7;21157:16;;;;;;:::i;:::-;;;;;21202:1;21192:11;;;;21116:103;21246:7;21237:5;:16;21233:103;;21283:7;21274:16;;;;;;:::i;:::-;;;;;21319:1;21309:11;;;;21233:103;21363:7;21354:5;:16;21350:103;;21400:7;21391:16;;;;;;:::i;:::-;;;;;21436:1;21426:11;;;;21350:103;21480:7;21471:5;:16;21467:68;;21518:1;21508:11;;;;21467:68;21563:6;21556:13;;;20629:948;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:114::-;6269:6;6303:5;6297:12;6287:22;;6202:114;;;:::o;6322:184::-;6421:11;6455:6;6450:3;6443:19;6495:4;6490:3;6486:14;6471:29;;6322:184;;;;:::o;6512:132::-;6579:4;6602:3;6594:11;;6632:4;6627:3;6623:14;6615:22;;6512:132;;;:::o;6650:108::-;6727:24;6745:5;6727:24;:::i;:::-;6722:3;6715:37;6650:108;;:::o;6764:179::-;6833:10;6854:46;6896:3;6888:6;6854:46;:::i;:::-;6932:4;6927:3;6923:14;6909:28;;6764:179;;;;:::o;6949:113::-;7019:4;7051;7046:3;7042:14;7034:22;;6949:113;;;:::o;7098:732::-;7217:3;7246:54;7294:5;7246:54;:::i;:::-;7316:86;7395:6;7390:3;7316:86;:::i;:::-;7309:93;;7426:56;7476:5;7426:56;:::i;:::-;7505:7;7536:1;7521:284;7546:6;7543:1;7540:13;7521:284;;;7622:6;7616:13;7649:63;7708:3;7693:13;7649:63;:::i;:::-;7642:70;;7735:60;7788:6;7735:60;:::i;:::-;7725:70;;7581:224;7568:1;7565;7561:9;7556:14;;7521:284;;;7525:14;7821:3;7814:10;;7222:608;;;7098:732;;;;:::o;7836:373::-;7979:4;8017:2;8006:9;8002:18;7994:26;;8066:9;8060:4;8056:20;8052:1;8041:9;8037:17;8030:47;8094:108;8197:4;8188:6;8094:108;:::i;:::-;8086:116;;7836:373;;;;:::o;8215:116::-;8285:21;8300:5;8285:21;:::i;:::-;8278:5;8275:32;8265:60;;8321:1;8318;8311:12;8265:60;8215:116;:::o;8337:133::-;8380:5;8418:6;8405:20;8396:29;;8434:30;8458:5;8434:30;:::i;:::-;8337:133;;;;:::o;8476:468::-;8541:6;8549;8598:2;8586:9;8577:7;8573:23;8569:32;8566:119;;;8604:79;;:::i;:::-;8566:119;8724:1;8749:53;8794:7;8785:6;8774:9;8770:22;8749:53;:::i;:::-;8739:63;;8695:117;8851:2;8877:50;8919:7;8910:6;8899:9;8895:22;8877:50;:::i;:::-;8867:60;;8822:115;8476:468;;;;;:::o;8950:117::-;9059:1;9056;9049:12;9073:117;9182:1;9179;9172:12;9196:180;9244:77;9241:1;9234:88;9341:4;9338:1;9331:15;9365:4;9362:1;9355:15;9382:281;9465:27;9487:4;9465:27;:::i;:::-;9457:6;9453:40;9595:6;9583:10;9580:22;9559:18;9547:10;9544:34;9541:62;9538:88;;;9606:18;;:::i;:::-;9538:88;9646:10;9642:2;9635:22;9425:238;9382:281;;:::o;9669:129::-;9703:6;9730:20;;:::i;:::-;9720:30;;9759:33;9787:4;9779:6;9759:33;:::i;:::-;9669:129;;;:::o;9804:307::-;9865:4;9955:18;9947:6;9944:30;9941:56;;;9977:18;;:::i;:::-;9941:56;10015:29;10037:6;10015:29;:::i;:::-;10007:37;;10099:4;10093;10089:15;10081:23;;9804:307;;;:::o;10117:146::-;10214:6;10209:3;10204;10191:30;10255:1;10246:6;10241:3;10237:16;10230:27;10117:146;;;:::o;10269:423::-;10346:5;10371:65;10387:48;10428:6;10387:48;:::i;:::-;10371:65;:::i;:::-;10362:74;;10459:6;10452:5;10445:21;10497:4;10490:5;10486:16;10535:3;10526:6;10521:3;10517:16;10514:25;10511:112;;;10542:79;;:::i;:::-;10511:112;10632:54;10679:6;10674:3;10669;10632:54;:::i;:::-;10352:340;10269:423;;;;;:::o;10711:338::-;10766:5;10815:3;10808:4;10800:6;10796:17;10792:27;10782:122;;10823:79;;:::i;:::-;10782:122;10940:6;10927:20;10965:78;11039:3;11031:6;11024:4;11016:6;11012:17;10965:78;:::i;:::-;10956:87;;10772:277;10711:338;;;;:::o;11055:943::-;11150:6;11158;11166;11174;11223:3;11211:9;11202:7;11198:23;11194:33;11191:120;;;11230:79;;:::i;:::-;11191:120;11350:1;11375:53;11420:7;11411:6;11400:9;11396:22;11375:53;:::i;:::-;11365:63;;11321:117;11477:2;11503:53;11548:7;11539:6;11528:9;11524:22;11503:53;:::i;:::-;11493:63;;11448:118;11605:2;11631:53;11676:7;11667:6;11656:9;11652:22;11631:53;:::i;:::-;11621:63;;11576:118;11761:2;11750:9;11746:18;11733:32;11792:18;11784:6;11781:30;11778:117;;;11814:79;;:::i;:::-;11778:117;11919:62;11973:7;11964:6;11953:9;11949:22;11919:62;:::i;:::-;11909:72;;11704:287;11055:943;;;;;;;:::o;12004:308::-;12066:4;12156:18;12148:6;12145:30;12142:56;;;12178:18;;:::i;:::-;12142:56;12216:29;12238:6;12216:29;:::i;:::-;12208:37;;12300:4;12294;12290:15;12282:23;;12004:308;;;:::o;12318:425::-;12396:5;12421:66;12437:49;12479:6;12437:49;:::i;:::-;12421:66;:::i;:::-;12412:75;;12510:6;12503:5;12496:21;12548:4;12541:5;12537:16;12586:3;12577:6;12572:3;12568:16;12565:25;12562:112;;;12593:79;;:::i;:::-;12562:112;12683:54;12730:6;12725:3;12720;12683:54;:::i;:::-;12402:341;12318:425;;;;;:::o;12763:340::-;12819:5;12868:3;12861:4;12853:6;12849:17;12845:27;12835:122;;12876:79;;:::i;:::-;12835:122;12993:6;12980:20;13018:79;13093:3;13085:6;13078:4;13070:6;13066:17;13018:79;:::i;:::-;13009:88;;12825:278;12763:340;;;;:::o;13109:509::-;13178:6;13227:2;13215:9;13206:7;13202:23;13198:32;13195:119;;;13233:79;;:::i;:::-;13195:119;13381:1;13370:9;13366:17;13353:31;13411:18;13403:6;13400:30;13397:117;;;13433:79;;:::i;:::-;13397:117;13538:63;13593:7;13584:6;13573:9;13569:22;13538:63;:::i;:::-;13528:73;;13324:287;13109:509;;;;:::o;13624:474::-;13692:6;13700;13749:2;13737:9;13728:7;13724:23;13720:32;13717:119;;;13755:79;;:::i;:::-;13717:119;13875:1;13900:53;13945:7;13936:6;13925:9;13921:22;13900:53;:::i;:::-;13890:63;;13846:117;14002:2;14028:53;14073:7;14064:6;14053:9;14049:22;14028:53;:::i;:::-;14018:63;;13973:118;13624:474;;;;;:::o;14104:180::-;14152:77;14149:1;14142:88;14249:4;14246:1;14239:15;14273:4;14270:1;14263:15;14290:320;14334:6;14371:1;14365:4;14361:12;14351:22;;14418:1;14412:4;14408:12;14439:18;14429:81;;14495:4;14487:6;14483:17;14473:27;;14429:81;14557:2;14549:6;14546:14;14526:18;14523:38;14520:84;;14576:18;;:::i;:::-;14520:84;14341:269;14290:320;;;:::o;14616:442::-;14765:4;14803:2;14792:9;14788:18;14780:26;;14816:71;14884:1;14873:9;14869:17;14860:6;14816:71;:::i;:::-;14897:72;14965:2;14954:9;14950:18;14941:6;14897:72;:::i;:::-;14979;15047:2;15036:9;15032:18;15023:6;14979:72;:::i;:::-;14616:442;;;;;;:::o;15064:173::-;15204:25;15200:1;15192:6;15188:14;15181:49;15064:173;:::o;15243:366::-;15385:3;15406:67;15470:2;15465:3;15406:67;:::i;:::-;15399:74;;15482:93;15571:3;15482:93;:::i;:::-;15600:2;15595:3;15591:12;15584:19;;15243:366;;;:::o;15615:419::-;15781:4;15819:2;15808:9;15804:18;15796:26;;15868:9;15862:4;15858:20;15854:1;15843:9;15839:17;15832:47;15896:131;16022:4;15896:131;:::i;:::-;15888:139;;15615:419;;;:::o;16040:182::-;16180:34;16176:1;16168:6;16164:14;16157:58;16040:182;:::o;16228:366::-;16370:3;16391:67;16455:2;16450:3;16391:67;:::i;:::-;16384:74;;16467:93;16556:3;16467:93;:::i;:::-;16585:2;16580:3;16576:12;16569:19;;16228:366;;;:::o;16600:419::-;16766:4;16804:2;16793:9;16789:18;16781:26;;16853:9;16847:4;16843:20;16839:1;16828:9;16824:17;16817:47;16881:131;17007:4;16881:131;:::i;:::-;16873:139;;16600:419;;;:::o;17025:176::-;17165:28;17161:1;17153:6;17149:14;17142:52;17025:176;:::o;17207:366::-;17349:3;17370:67;17434:2;17429:3;17370:67;:::i;:::-;17363:74;;17446:93;17535:3;17446:93;:::i;:::-;17564:2;17559:3;17555:12;17548:19;;17207:366;;;:::o;17579:419::-;17745:4;17783:2;17772:9;17768:18;17760:26;;17832:9;17826:4;17822:20;17818:1;17807:9;17803:17;17796:47;17860:131;17986:4;17860:131;:::i;:::-;17852:139;;17579:419;;;:::o;18004:148::-;18106:11;18143:3;18128:18;;18004:148;;;;:::o;18158:390::-;18264:3;18292:39;18325:5;18292:39;:::i;:::-;18347:89;18429:6;18424:3;18347:89;:::i;:::-;18340:96;;18445:65;18503:6;18498:3;18491:4;18484:5;18480:16;18445:65;:::i;:::-;18535:6;18530:3;18526:16;18519:23;;18268:280;18158:390;;;;:::o;18554:435::-;18734:3;18756:95;18847:3;18838:6;18756:95;:::i;:::-;18749:102;;18868:95;18959:3;18950:6;18868:95;:::i;:::-;18861:102;;18980:3;18973:10;;18554:435;;;;;:::o;18995:98::-;19046:6;19080:5;19074:12;19064:22;;18995:98;;;:::o;19099:168::-;19182:11;19216:6;19211:3;19204:19;19256:4;19251:3;19247:14;19232:29;;19099:168;;;;:::o;19273:373::-;19359:3;19387:38;19419:5;19387:38;:::i;:::-;19441:70;19504:6;19499:3;19441:70;:::i;:::-;19434:77;;19520:65;19578:6;19573:3;19566:4;19559:5;19555:16;19520:65;:::i;:::-;19610:29;19632:6;19610:29;:::i;:::-;19605:3;19601:39;19594:46;;19363:283;19273:373;;;;:::o;19652:640::-;19847:4;19885:3;19874:9;19870:19;19862:27;;19899:71;19967:1;19956:9;19952:17;19943:6;19899:71;:::i;:::-;19980:72;20048:2;20037:9;20033:18;20024:6;19980:72;:::i;:::-;20062;20130:2;20119:9;20115:18;20106:6;20062:72;:::i;:::-;20181:9;20175:4;20171:20;20166:2;20155:9;20151:18;20144:48;20209:76;20280:4;20271:6;20209:76;:::i;:::-;20201:84;;19652:640;;;;;;;:::o;20298:141::-;20354:5;20385:6;20379:13;20370:22;;20401:32;20427:5;20401:32;:::i;:::-;20298:141;;;;:::o;20445:349::-;20514:6;20563:2;20551:9;20542:7;20538:23;20534:32;20531:119;;;20569:79;;:::i;:::-;20531:119;20689:1;20714:63;20769:7;20760:6;20749:9;20745:22;20714:63;:::i;:::-;20704:73;;20660:127;20445:349;;;;:::o;20800:141::-;20849:4;20872:3;20864:11;;20895:3;20892:1;20885:14;20929:4;20926:1;20916:18;20908:26;;20800:141;;;:::o;20947:93::-;20984:6;21031:2;21026;21019:5;21015:14;21011:23;21001:33;;20947:93;;;:::o;21046:107::-;21090:8;21140:5;21134:4;21130:16;21109:37;;21046:107;;;;:::o;21159:393::-;21228:6;21278:1;21266:10;21262:18;21301:97;21331:66;21320:9;21301:97;:::i;:::-;21419:39;21449:8;21438:9;21419:39;:::i;:::-;21407:51;;21491:4;21487:9;21480:5;21476:21;21467:30;;21540:4;21530:8;21526:19;21519:5;21516:30;21506:40;;21235:317;;21159:393;;;;;:::o;21558:60::-;21586:3;21607:5;21600:12;;21558:60;;;:::o;21624:142::-;21674:9;21707:53;21725:34;21734:24;21752:5;21734:24;:::i;:::-;21725:34;:::i;:::-;21707:53;:::i;:::-;21694:66;;21624:142;;;:::o;21772:75::-;21815:3;21836:5;21829:12;;21772:75;;;:::o;21853:269::-;21963:39;21994:7;21963:39;:::i;:::-;22024:91;22073:41;22097:16;22073:41;:::i;:::-;22065:6;22058:4;22052:11;22024:91;:::i;:::-;22018:4;22011:105;21929:193;21853:269;;;:::o;22128:73::-;22173:3;22128:73;:::o;22207:189::-;22284:32;;:::i;:::-;22325:65;22383:6;22375;22369:4;22325:65;:::i;:::-;22260:136;22207:189;;:::o;22402:186::-;22462:120;22479:3;22472:5;22469:14;22462:120;;;22533:39;22570:1;22563:5;22533:39;:::i;:::-;22506:1;22499:5;22495:13;22486:22;;22462:120;;;22402:186;;:::o;22594:543::-;22695:2;22690:3;22687:11;22684:446;;;22729:38;22761:5;22729:38;:::i;:::-;22813:29;22831:10;22813:29;:::i;:::-;22803:8;22799:44;22996:2;22984:10;22981:18;22978:49;;;23017:8;23002:23;;22978:49;23040:80;23096:22;23114:3;23096:22;:::i;:::-;23086:8;23082:37;23069:11;23040:80;:::i;:::-;22699:431;;22684:446;22594:543;;;:::o;23143:117::-;23197:8;23247:5;23241:4;23237:16;23216:37;;23143:117;;;;:::o;23266:169::-;23310:6;23343:51;23391:1;23387:6;23379:5;23376:1;23372:13;23343:51;:::i;:::-;23339:56;23424:4;23418;23414:15;23404:25;;23317:118;23266:169;;;;:::o;23440:295::-;23516:4;23662:29;23687:3;23681:4;23662:29;:::i;:::-;23654:37;;23724:3;23721:1;23717:11;23711:4;23708:21;23700:29;;23440:295;;;;:::o;23740:1395::-;23857:37;23890:3;23857:37;:::i;:::-;23959:18;23951:6;23948:30;23945:56;;;23981:18;;:::i;:::-;23945:56;24025:38;24057:4;24051:11;24025:38;:::i;:::-;24110:67;24170:6;24162;24156:4;24110:67;:::i;:::-;24204:1;24228:4;24215:17;;24260:2;24252:6;24249:14;24277:1;24272:618;;;;24934:1;24951:6;24948:77;;;25000:9;24995:3;24991:19;24985:26;24976:35;;24948:77;25051:67;25111:6;25104:5;25051:67;:::i;:::-;25045:4;25038:81;24907:222;24242:887;;24272:618;24324:4;24320:9;24312:6;24308:22;24358:37;24390:4;24358:37;:::i;:::-;24417:1;24431:208;24445:7;24442:1;24439:14;24431:208;;;24524:9;24519:3;24515:19;24509:26;24501:6;24494:42;24575:1;24567:6;24563:14;24553:24;;24622:2;24611:9;24607:18;24594:31;;24468:4;24465:1;24461:12;24456:17;;24431:208;;;24667:6;24658:7;24655:19;24652:179;;;24725:9;24720:3;24716:19;24710:26;24768:48;24810:4;24802:6;24798:17;24787:9;24768:48;:::i;:::-;24760:6;24753:64;24675:156;24652:179;24877:1;24873;24865:6;24861:14;24857:22;24851:4;24844:36;24279:611;;;24242:887;;23832:1303;;;23740:1395;;:::o;25141:332::-;25262:4;25300:2;25289:9;25285:18;25277:26;;25313:71;25381:1;25370:9;25366:17;25357:6;25313:71;:::i;:::-;25394:72;25462:2;25451:9;25447:18;25438:6;25394:72;:::i;:::-;25141:332;;;;;:::o;25479:180::-;25527:77;25524:1;25517:88;25624:4;25621:1;25614:15;25648:4;25645:1;25638:15
Swarm Source
ipfs://3cd9d4b1c14628c0305698f0d05f1826f62dd892e35c02999720b83cdf873609
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$35.86
Net Worth in ETH
Token Allocations
ETH
98.65%
BNB
1.35%
S
0.00%
Multichain Portfolio | 35 Chains
Loading...
Loading
Loading...
Loading
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.