Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Forge_Metadata
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-31 */ /** *Submitted for verification at polygonscan.com on 2023-04-26 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Base64.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Forge Token/Forge_Metadata.sol // Contract based on https://docs.openzeppelin.com/contracts/4.x/erc721 interface ForgeToken { struct TokenAttributes { uint16 xp; bool isSpecialVariant; } function tokenAttributes(uint _tokenId) external view returns(TokenAttributes memory); } interface BurnStatus { function currentSeason() external view returns(uint); function isBurned(uint _currentSeason, uint _tokenId) external view returns(bool); } //===================================================================================================================== /// @title Forge_Metadata /// @dev Implementation of the tokenURI function. /// - This implementation was created to support returning metadata as data to remove the requirement of hosting a /// JSON object on a web2 endpoint, and to make metadata immediately queryable upon mint. /// - This is implemented as an independent smart contract to enable future modification of returned information. //===================================================================================================================== contract Forge_Metadata is Ownable { // Contracts for attributes reference ForgeToken public forgeTokenContract; BurnStatus public burnStatusContract; // base URI for images/mp4 string public baseURI = "https://forge.gg/nft/images/"; string public defaultURI = "hot"; string public specialVariantURI = "cold"; // extensions for images/mp4 string public imageExtension = ".png"; string public animationExtension = ".mp4"; // token names string public defaultName = "Forge Day 0 Badge"; string public specialVariantName = "Forge Day 0 Cold Fire Badge"; // token trait name and values string public xpTraitName = "XP"; string public mintNumberTraitName = "Limited Edition Number"; string public variantTraitName = "Heat"; string public defaultTraitValue = "Fire"; string public specialVariantTraitValue = "Cold Fire"; string public burnStatusTraitName = "Burn Status"; string public burnedTraitValue = "Burned"; string public notBurnedTraitValue = "Not Burned"; // token description string public defaultDescription = "The Forge Day 0 badge is a symbol of your early commitment to the Forge community and unlocks unique perks on the Forge platform."; string public specialVariantDescription = "The Forge Day 0 badge is a symbol of your early commitment to the Forge community and unlocks unique perks on the Forge platform."; // display types string public xpDisplayType = "boost_number"; string public mintNumberDisplayType = "number"; //----------------------------------------------------------------------------------------------------------------- // SETTERS //----------------------------------------------------------------------------------------------------------------- function setExternalContracts(address _forgeTokenAddress, address _burnStatusAddress) external onlyOwner { forgeTokenContract = ForgeToken(_forgeTokenAddress); burnStatusContract = BurnStatus(_burnStatusAddress); } function setURI(string calldata _baseURI, string calldata _default, string calldata _specialVariant) external onlyOwner { baseURI = _baseURI; defaultURI = _default; specialVariantURI = _specialVariant; } function setImageExtension(string calldata _extension) external onlyOwner { imageExtension = _extension; } function setAnimationExtension(string calldata _extension) external onlyOwner { animationExtension = _extension; } function setNames(string calldata _defaultName, string calldata _specialVariantName) external onlyOwner { defaultName = _defaultName; specialVariantName = _specialVariantName; } function editTrait_XP(string calldata _xpTraitName, string calldata _xpDisplayType) external onlyOwner { xpTraitName = _xpTraitName; xpDisplayType = _xpDisplayType; } function editTrait_MintNumber(string calldata _mintNumberTraitName, string calldata _mintNumberDisplayType) external onlyOwner { mintNumberTraitName = _mintNumberTraitName; mintNumberDisplayType = _mintNumberDisplayType; } function editTrait_Variant( string calldata _variantTraitName, string calldata _defaultVariantValue, string calldata _specialVariantValue ) external onlyOwner { variantTraitName = _variantTraitName; defaultTraitValue = _defaultVariantValue; specialVariantTraitValue = _specialVariantValue; } function editTrait_BurnStatus( string calldata _burnStatusName, string calldata _burnedValue, string calldata _notBurnedValue ) external onlyOwner { burnStatusTraitName = _burnStatusName; burnedTraitValue = _burnedValue; notBurnedTraitValue = _notBurnedValue; } function setDescription_Default(string calldata _defaultDescription) external onlyOwner { defaultDescription = _defaultDescription; } function setDescription_SpecialVariant(string calldata _specialVariantDescription) external onlyOwner { specialVariantDescription = _specialVariantDescription; } //----------------------------------------------------------------------------------------------------------------- // PUBLIC VIEW FUNCTION //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- /// @notice Generates a URL containing metadata as data /// @dev This is an extremely costly function. Never call this as part of a transaction. //----------------------------------------------------------------------------------------------------------------- function tokenURI(uint _tokenId) public view returns (string memory) { bytes memory dataURI = generateMetadata(_tokenId); return string( abi.encodePacked( "data:application/json;base64,", Base64.encode(dataURI) ) ); } //----------------------------------------------------------------------------------------------------------------- // PRIVATE VIEW FUNCTIONS //----------------------------------------------------------------------------------------------------------------- function generateMetadata(uint _tokenId) private view returns (bytes memory){ ForgeToken.TokenAttributes memory tokenData = forgeTokenContract.tokenAttributes(_tokenId); string memory tokenId = Strings.toString(_tokenId); string memory imgUrl = generateImgUrl(tokenData.isSpecialVariant); string memory animationURL = generateAnimationUrl(tokenData.isSpecialVariant); bool isBurned = burnStatusContract.isBurned(burnStatusContract.currentSeason(), _tokenId); string memory attributes = generateAttributes(tokenData, tokenId, isBurned); return abi.encodePacked( "{\n", "\t\"name\": \"", tokenData.isSpecialVariant ? specialVariantName : defaultName, " #", tokenId, "\",\n", "\t\"description\": \"", tokenData.isSpecialVariant ? specialVariantDescription : defaultDescription, "\",\n", "\t\"image\": \"", imgUrl, "\",\n", "\t\"animation_url\": \"", animationURL, "\",\n", "\t\"attributes\": [\n", attributes, "\t]\n", "}" ); } //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- function generateImgUrl(bool _isSpecialVariant) private view returns (string memory) { return string(abi.encodePacked(baseURI, _isSpecialVariant ? specialVariantURI : defaultURI, imageExtension)); } //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- function generateAnimationUrl(bool _isSpecialVariant) private view returns (string memory) { return string(abi.encodePacked(baseURI, _isSpecialVariant ? specialVariantURI : defaultURI, animationExtension)); } //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- function generateAttributes(ForgeToken.TokenAttributes memory _tokenData, string memory _tokenId, bool _isBurned) private view returns (string memory) { string memory burnStatusAttribute = ""; string memory mintAttribute = generateMintNumberAttribute(_tokenId); if (_tokenData.isSpecialVariant) { burnStatusAttribute = generateBurnStatusAttribute(_isBurned); mintAttribute = string(abi.encodePacked(mintAttribute, ",")); } else{ mintAttribute = mintAttribute; } return string( abi.encodePacked( generateSpecialVariantAttribute(_tokenData), generateXpAttribute(_tokenData), mintAttribute, burnStatusAttribute ) ); } //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- function generateSpecialVariantAttribute(ForgeToken.TokenAttributes memory _tokenData) private view returns(string memory) { return string( abi.encodePacked( "\t\t{\n", "\t\t\t\"trait_type\": \"", variantTraitName, "\",\n", "\t\t\t\"value\":\"", _tokenData.isSpecialVariant ? specialVariantTraitValue : defaultTraitValue, "\"\n", "\t\t}," ) ); } //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- function generateXpAttribute(ForgeToken.TokenAttributes memory _tokenData) private view returns(string memory) { return string( abi.encodePacked( "\t\t{\n", "\t\t\t\"display_type\": \"", xpDisplayType, "\",\n", "\t\t\t\"trait_type\": \"", xpTraitName, "\",\n", "\t\t\t\"max_value\": 32760,\n", "\t\t\t\"value\":", Strings.toString(_tokenData.xp), "\n", "\t\t}," ) ); } //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- function generateMintNumberAttribute(string memory _tokenId) private view returns(string memory) { return string( abi.encodePacked( "\t\t{\n", "\t\t\t\"display_type\": \"", mintNumberDisplayType, "\",\n", "\t\t\t\"trait_type\": \"", mintNumberTraitName, "\",\n", "\t\t\t\"value\":", _tokenId, "\n", "\t\t}" ) ); } //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- function generateBurnStatusAttribute(bool _isBurned) private view returns(string memory) { return string( abi.encodePacked( "\t\t{\n", "\t\t\t\"trait_type\": \"", burnStatusTraitName, "\",\n", "\t\t\t\"value\":\"", _isBurned ? burnedTraitValue : notBurnedTraitValue, "\"\n", "\t\t}\n" ) ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"animationExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnStatusContract","outputs":[{"internalType":"contract BurnStatus","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnStatusTraitName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedTraitValue","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTraitValue","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_burnStatusName","type":"string"},{"internalType":"string","name":"_burnedValue","type":"string"},{"internalType":"string","name":"_notBurnedValue","type":"string"}],"name":"editTrait_BurnStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_mintNumberTraitName","type":"string"},{"internalType":"string","name":"_mintNumberDisplayType","type":"string"}],"name":"editTrait_MintNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_variantTraitName","type":"string"},{"internalType":"string","name":"_defaultVariantValue","type":"string"},{"internalType":"string","name":"_specialVariantValue","type":"string"}],"name":"editTrait_Variant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_xpTraitName","type":"string"},{"internalType":"string","name":"_xpDisplayType","type":"string"}],"name":"editTrait_XP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forgeTokenContract","outputs":[{"internalType":"contract ForgeToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imageExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintNumberDisplayType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintNumberTraitName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notBurnedTraitValue","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_extension","type":"string"}],"name":"setAnimationExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_defaultDescription","type":"string"}],"name":"setDescription_Default","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_specialVariantDescription","type":"string"}],"name":"setDescription_SpecialVariant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forgeTokenAddress","type":"address"},{"internalType":"address","name":"_burnStatusAddress","type":"address"}],"name":"setExternalContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_extension","type":"string"}],"name":"setImageExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_defaultName","type":"string"},{"internalType":"string","name":"_specialVariantName","type":"string"}],"name":"setNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"string","name":"_default","type":"string"},{"internalType":"string","name":"_specialVariant","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"specialVariantDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"specialVariantName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"specialVariantTraitValue","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"specialVariantURI","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"variantTraitName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xpDisplayType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xpTraitName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c0604052601c60809081527f68747470733a2f2f666f7267652e67672f6e66742f696d616765732f0000000060a0526003906200003e9082620004a8565b506040805180820190915260038152621a1bdd60ea1b6020820152600490620000689082620004a8565b5060408051808201909152600481526318dbdb1960e21b6020820152600590620000939082620004a8565b506040805180820190915260048152632e706e6760e01b6020820152600690620000be9082620004a8565b506040805180820190915260048152630b9b5c0d60e21b6020820152600790620000e99082620004a8565b50604080518082019091526011815270466f72676520446179203020426164676560781b6020820152600890620001219082620004a8565b5060408051808201909152601b81527f466f72676520446179203020436f6c64204669726520426164676500000000006020820152600990620001659082620004a8565b50604080518082019091526002815261058560f41b6020820152600a906200018e9082620004a8565b5060408051808201909152601681527f4c696d697465642045646974696f6e204e756d626572000000000000000000006020820152600b90620001d29082620004a8565b506040805180820190915260048152631219585d60e21b6020820152600c90620001fd9082620004a8565b506040805180820190915260048152634669726560e01b6020820152600d90620002289082620004a8565b50604080518082019091526009815268436f6c64204669726560b81b6020820152600e90620002589082620004a8565b5060408051808201909152600b81526a4275726e2053746174757360a81b6020820152600f906200028a9082620004a8565b50604080518082019091526006815265109d5c9b995960d21b6020820152601090620002b79082620004a8565b5060408051808201909152600a815269139bdd08109d5c9b995960b21b6020820152601190620002e89082620004a8565b506040518060c001604052806081815260200162001eb460819139601290620003129082620004a8565b506040518060c001604052806081815260200162001eb4608191396013906200033c9082620004a8565b5060408051808201909152600c81526b3137b7b9ba2fb73ab6b132b960a11b60208201526014906200036f9082620004a8565b50604080518082019091526006815265373ab6b132b960d11b60208201526015906200039c9082620004a8565b50348015620003a9575f80fd5b50620003b533620003bb565b62000574565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200043357607f821691505b6020821081036200045257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620004a357805f5260205f20601f840160051c810160208510156200047f5750805b601f840160051c820191505b81811015620004a0575f81556001016200048b565b50505b505050565b81516001600160401b03811115620004c457620004c46200040a565b620004dc81620004d584546200041e565b8462000458565b602080601f83116001811462000512575f8415620004fa5750858301515b5f19600386901b1c1916600185901b1785556200056c565b5f85815260208120601f198616915b82811015620005425788860151825594840194600190910190840162000521565b50858210156200056057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b61193280620005825f395ff3fe608060405234801561000f575f80fd5b5060043610610213575f3560e01c80636c0360eb1161011f578063c200100e116100a9578063d3e6960411610079578063d3e69604146103d6578063d7dbc43e146103e9578063e3d96948146103f1578063e9210f9c146103f9578063f2fde38b14610401575f80fd5b8063c200100e146103a0578063c87b56dd146103a8578063d11e4c75146103bb578063d26d02a9146103ce575f80fd5b80638da5cb5b116100ef5780638da5cb5b14610365578063a9ed716714610375578063a9ef3aeb1461037d578063af5ad09414610385578063b1ef6d511461038d575f80fd5b80636c0360eb1461032f5780636ed1cf2d14610337578063715018a61461034a57806372866c2914610352575f80fd5b80633a367a67116101a05780635bba7f5a116101705780635bba7f5a146102f15780635cc0d93d146103045780635cdac74e1461030c5780636040ae6c1461031f57806364548d2e14610327575f80fd5b80633a367a67146102c65780634e499ddb146102ce5780634fceba4d146102d657806350bc2c9c146102e9575f80fd5b80631ebbd86a116101e65780631ebbd86a1461025a57806328af20791461026d5780632fe54d731461028057806337871c601461028857806339e3aa7e146102b3575f80fd5b806301836bea146102175780630be354f41461022c5780630fcdf6741461024a57806310ca847f14610252575b5f80fd5b61022a610225366004610f05565b610414565b005b61023461042e565b6040516102419190610f66565b60405180910390f35b6102346104ba565b6102346104c7565b61022a610268366004610f98565b6104d4565b61022a61027b366004610fff565b6104fe565b610234610538565b60025461029b906001600160a01b031681565b6040516001600160a01b039091168152602001610241565b61022a6102c1366004610f05565b610545565b61023461055a565b610234610567565b61022a6102e4366004610f98565b610574565b610234610597565b61022a6102ff3660046110ad565b6105a4565b6102346105da565b61022a61031a366004610fff565b6105e7565b610234610618565b610234610625565b610234610632565b61022a610345366004610f98565b61063f565b61022a610662565b61022a610360366004610f05565b610675565b5f546001600160a01b031661029b565b61023461068a565b610234610697565b6102346106a4565b61022a61039b366004610fff565b6106b1565b6102346106e2565b6102346103b63660046110de565b6106ef565b61022a6103c9366004610f05565b61072d565b610234610742565b60015461029b906001600160a01b031681565b61023461074f565b61023461075c565b610234610769565b61022a61040f3660046110f5565b610776565b61041c6107f4565b60136104298284836111a5565b505050565b6015805461043b90611129565b80601f016020809104026020016040519081016040528092919081815260200182805461046790611129565b80156104b25780601f10610489576101008083540402835291602001916104b2565b820191905f5260205f20905b81548152906001019060200180831161049557829003601f168201915b505050505081565b6010805461043b90611129565b600d805461043b90611129565b6104dc6107f4565b600b6104e98486836111a5565b5060156104f78284836111a5565b5050505050565b6105066107f4565b600c6105138688836111a5565b50600d6105218486836111a5565b50600e61052f8284836111a5565b50505050505050565b6009805461043b90611129565b61054d6107f4565b60066104298284836111a5565b6004805461043b90611129565b6011805461043b90611129565b61057c6107f4565b60086105898486836111a5565b5060096104f78284836111a5565b600e805461043b90611129565b6105ac6107f4565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b600b805461043b90611129565b6105ef6107f4565b600f6105fc8688836111a5565b50601061060a8486836111a5565b50601161052f8284836111a5565b6013805461043b90611129565b6007805461043b90611129565b6003805461043b90611129565b6106476107f4565b600a6106548486836111a5565b5060146104f78284836111a5565b61066a6107f4565b6106735f61084d565b565b61067d6107f4565b60076104298284836111a5565b600f805461043b90611129565b6006805461043b90611129565b6014805461043b90611129565b6106b96107f4565b60036106c68688836111a5565b5060046106d48486836111a5565b50600561052f8284836111a5565b600c805461043b90611129565b60605f6106fb8361089c565b905061070681610a81565b604051602001610716919061127a565b604051602081830303815290604052915050919050565b6107356107f4565b60126104298284836111a5565b6008805461043b90611129565b6012805461043b90611129565b600a805461043b90611129565b6005805461043b90611129565b61077e6107f4565b6001600160a01b0381166107e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6107f18161084d565b50565b5f546001600160a01b031633146106735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60015460405163f2824b5360e01b8152600481018390526060915f916001600160a01b039091169063f2824b53906024016040805180830381865afa1580156108e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090b91906112cd565b90505f61091784610bd0565b90505f6109278360200151610c60565b90505f6109378460200151610c9d565b6002546040805163bcb3962160e01b815290519293505f926001600160a01b039092169163ba03755691839163bcb39621916004808201926020929091908290030181865afa15801561098c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b0919061132e565b896040518363ffffffff1660e01b81526004016109d7929190918252602082015260400190565b602060405180830381865afa1580156109f2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a169190611345565b90505f610a24868684610cc4565b90508560200151610a36576008610a39565b60095b858760200151610a4a576012610a4d565b60135b868685604051602001610a65969594939291906113cd565b6040516020818303038152906040529650505050505050919050565b606081515f03610a9e57505060408051602081019091525f815290565b5f6040518060600160405280604081526020016118bd6040913990505f600384516002610acb9190611538565b610ad5919061154b565b610ae090600461156a565b67ffffffffffffffff811115610af857610af8611115565b6040519080825280601f01601f191660200182016040528015610b22576020820181803683370190505b509050600182016020820185865187015b80821015610b8e576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250610b33565b5050600386510660018114610baa5760028114610bbd57610bc5565b603d6001830353603d6002830353610bc5565b603d60018303535b509195945050505050565b60605f610bdc83610d5b565b60010190505f8167ffffffffffffffff811115610bfb57610bfb611115565b6040519080825280601f01601f191660200182016040528015610c25576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610c2f57509392505050565b6060600382610c70576004610c73565b60055b6006604051602001610c8793929190611581565b6040516020818303038152906040529050919050565b6060600382610cad576004610cb0565b60055b6007604051602001610c8793929190611581565b60408051602081019091525f80825260609190610ce085610e33565b9050856020015115610d1a57610cf584610e4c565b915080604051602001610d0891906115a7565b60405160208183030381529060405290505b610d2386610e70565b610d2c87610e98565b8284604051602001610d4194939291906115cb565b604051602081830303815290604052925050509392505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610d995772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610dc5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610de357662386f26fc10000830492506010015b6305f5e1008310610dfb576305f5e100830492506008015b6127108310610e0f57612710830492506004015b60648310610e21576064830492506002015b600a8310610e2d576001015b92915050565b60606015600b83604051602001610c8793929190611621565b6060600f82610e5c576011610e5f565b60105b604051602001610c879291906116dc565b6060600c8260200151610e8457600d610e87565b600e5b604051602001610c8792919061175b565b60606014600a610eae845f015161ffff16610bd0565b604051602001610c87939291906117da565b5f8083601f840112610ed0575f80fd5b50813567ffffffffffffffff811115610ee7575f80fd5b602083019150836020828501011115610efe575f80fd5b9250929050565b5f8060208385031215610f16575f80fd5b823567ffffffffffffffff811115610f2c575f80fd5b610f3885828601610ec0565b90969095509350505050565b5f5b83811015610f5e578181015183820152602001610f46565b50505f910152565b602081525f8251806020840152610f84816040850160208701610f44565b601f01601f19169190910160400192915050565b5f805f8060408587031215610fab575f80fd5b843567ffffffffffffffff80821115610fc2575f80fd5b610fce88838901610ec0565b90965094506020870135915080821115610fe6575f80fd5b50610ff387828801610ec0565b95989497509550505050565b5f805f805f8060608789031215611014575f80fd5b863567ffffffffffffffff8082111561102b575f80fd5b6110378a838b01610ec0565b9098509650602089013591508082111561104f575f80fd5b61105b8a838b01610ec0565b90965094506040890135915080821115611073575f80fd5b5061108089828a01610ec0565b979a9699509497509295939492505050565b80356001600160a01b03811681146110a8575f80fd5b919050565b5f80604083850312156110be575f80fd5b6110c783611092565b91506110d560208401611092565b90509250929050565b5f602082840312156110ee575f80fd5b5035919050565b5f60208284031215611105575f80fd5b61110e82611092565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061113d57607f821691505b60208210810361115b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561042957805f5260205f20601f840160051c810160208510156111865750805b601f840160051c820191505b818110156104f7575f8155600101611192565b67ffffffffffffffff8311156111bd576111bd611115565b6111d1836111cb8354611129565b83611161565b5f601f841160018114611202575f85156111eb5750838201355b5f19600387901b1c1916600186901b1783556104f7565b5f83815260208120601f198716915b828110156112315786850135825560209485019460019092019101611211565b508682101561124d575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8151611270818560208601610f44565b9290920192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f82516112b181601d850160208701610f44565b91909101601d0192915050565b805180151581146110a8575f80fd5b5f604082840312156112dd575f80fd5b6040516040810181811067ffffffffffffffff8211171561130057611300611115565b604052825161ffff81168114611314575f80fd5b8152611322602084016112be565b60208201529392505050565b5f6020828403121561133e575f80fd5b5051919050565b5f60208284031215611355575f80fd5b61110e826112be565b5f815461136a81611129565b600182811680156113825760018114611397576113c3565b60ff19841687528215158302870194506113c3565b855f526020805f205f5b858110156113ba5781548a8201529084019082016113a1565b50505082870194505b5050505092915050565b613d8560f11b81526904913730b6b2911d101160b11b60028201525f6113f6600c83018961135e565b61202360f01b81528751611411816002840160208c01610f44565b6211160560e91b9101600281018290527004913232b9b1b934b83a34b7b7111d101160791b600582015290611449601683018961135e565b9081526a049134b6b0b3b2911d101160a91b6003820152865190915061147681600e840160208a01610f44565b6115166115096114fa6114f46114d76114c86114c26114a3600e898b01016211160560e91b815260030190565b72049130b734b6b0ba34b7b72fbab936111d101160691b815260130190565b8c61125f565b6211160560e91b815260030190565b70049130ba3a3934b13aba32b9911d102d8560791b815260110190565b8861125f565b6204ae8560e91b815260030190565b607d60f81b815260010190565b9a9950505050505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e2d57610e2d611524565b5f8261156557634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610e2d57610e2d611524565b5f61159e611598611592848861135e565b8661135e565b8461135e565b95945050505050565b5f82516115b8818460208701610f44565b600b60fa1b920191825250600101919050565b5f85516115dc818460208a01610f44565b8551908301906115f0818360208a01610f44565b8551910190611603818360208901610f44565b8451910190611616818360208801610f44565b019695505050505050565b630484bd8560e11b815273048484913234b9b83630bcafba3cb832911d101160611b60048201525f611656601883018661135e565b6211160560e91b80825271048484913a3930b4ba2fba3cb832911d101160711b6003830152611688601583018761135e565b9081526a048484913b30b63ab2911d60a91b600382015284519091506116b581600e840160208801610f44565b600560f91b600e92909101918201526209097d60e81b600f82015260120195945050505050565b630484bd8560e11b815271048484913a3930b4ba2fba3cb832911d101160711b60048201525f61170f601683018561135e565b6211160560e91b81526b048484913b30b63ab2911d1160a11b600382015261173a600f82018561135e565b61110560f11b8152630484be8560e11b600282015260060195945050505050565b630484bd8560e11b815271048484913a3930b4ba2fba3cb832911d101160711b60048201525f61178e601683018561135e565b6211160560e91b81526b048484913b30b63ab2911d1160a11b60038201526117b9600f82018561135e565b61110560f11b81526302425f4b60e21b600282015260060195945050505050565b630484bd8560e11b815273048484913234b9b83630bcafba3cb832911d101160611b60048201525f61180f601883018661135e565b6211160560e91b80825271048484913a3930b4ba2fba3cb832911d101160711b6003830152611841601583018761135e565b9081527f090909226d61785f76616c7565223a2033323736302c0a00000000000000000060038201526a048484913b30b63ab2911d60a91b601a8201528451909150611894816025840160208801610f44565b600560f91b602592909101918201526302425f4b60e21b6026820152602a019594505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208f1b345ae974a4bdf5a69cd2bf9e3c9e34cda6204832a018c219b75c6e97101b64736f6c6343000817003354686520466f72676520446179203020626164676520697320612073796d626f6c206f6620796f7572206561726c7920636f6d6d69746d656e7420746f2074686520466f72676520636f6d6d756e69747920616e6420756e6c6f636b7320756e69717565207065726b73206f6e2074686520466f72676520706c6174666f726d2e
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610213575f3560e01c80636c0360eb1161011f578063c200100e116100a9578063d3e6960411610079578063d3e69604146103d6578063d7dbc43e146103e9578063e3d96948146103f1578063e9210f9c146103f9578063f2fde38b14610401575f80fd5b8063c200100e146103a0578063c87b56dd146103a8578063d11e4c75146103bb578063d26d02a9146103ce575f80fd5b80638da5cb5b116100ef5780638da5cb5b14610365578063a9ed716714610375578063a9ef3aeb1461037d578063af5ad09414610385578063b1ef6d511461038d575f80fd5b80636c0360eb1461032f5780636ed1cf2d14610337578063715018a61461034a57806372866c2914610352575f80fd5b80633a367a67116101a05780635bba7f5a116101705780635bba7f5a146102f15780635cc0d93d146103045780635cdac74e1461030c5780636040ae6c1461031f57806364548d2e14610327575f80fd5b80633a367a67146102c65780634e499ddb146102ce5780634fceba4d146102d657806350bc2c9c146102e9575f80fd5b80631ebbd86a116101e65780631ebbd86a1461025a57806328af20791461026d5780632fe54d731461028057806337871c601461028857806339e3aa7e146102b3575f80fd5b806301836bea146102175780630be354f41461022c5780630fcdf6741461024a57806310ca847f14610252575b5f80fd5b61022a610225366004610f05565b610414565b005b61023461042e565b6040516102419190610f66565b60405180910390f35b6102346104ba565b6102346104c7565b61022a610268366004610f98565b6104d4565b61022a61027b366004610fff565b6104fe565b610234610538565b60025461029b906001600160a01b031681565b6040516001600160a01b039091168152602001610241565b61022a6102c1366004610f05565b610545565b61023461055a565b610234610567565b61022a6102e4366004610f98565b610574565b610234610597565b61022a6102ff3660046110ad565b6105a4565b6102346105da565b61022a61031a366004610fff565b6105e7565b610234610618565b610234610625565b610234610632565b61022a610345366004610f98565b61063f565b61022a610662565b61022a610360366004610f05565b610675565b5f546001600160a01b031661029b565b61023461068a565b610234610697565b6102346106a4565b61022a61039b366004610fff565b6106b1565b6102346106e2565b6102346103b63660046110de565b6106ef565b61022a6103c9366004610f05565b61072d565b610234610742565b60015461029b906001600160a01b031681565b61023461074f565b61023461075c565b610234610769565b61022a61040f3660046110f5565b610776565b61041c6107f4565b60136104298284836111a5565b505050565b6015805461043b90611129565b80601f016020809104026020016040519081016040528092919081815260200182805461046790611129565b80156104b25780601f10610489576101008083540402835291602001916104b2565b820191905f5260205f20905b81548152906001019060200180831161049557829003601f168201915b505050505081565b6010805461043b90611129565b600d805461043b90611129565b6104dc6107f4565b600b6104e98486836111a5565b5060156104f78284836111a5565b5050505050565b6105066107f4565b600c6105138688836111a5565b50600d6105218486836111a5565b50600e61052f8284836111a5565b50505050505050565b6009805461043b90611129565b61054d6107f4565b60066104298284836111a5565b6004805461043b90611129565b6011805461043b90611129565b61057c6107f4565b60086105898486836111a5565b5060096104f78284836111a5565b600e805461043b90611129565b6105ac6107f4565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b600b805461043b90611129565b6105ef6107f4565b600f6105fc8688836111a5565b50601061060a8486836111a5565b50601161052f8284836111a5565b6013805461043b90611129565b6007805461043b90611129565b6003805461043b90611129565b6106476107f4565b600a6106548486836111a5565b5060146104f78284836111a5565b61066a6107f4565b6106735f61084d565b565b61067d6107f4565b60076104298284836111a5565b600f805461043b90611129565b6006805461043b90611129565b6014805461043b90611129565b6106b96107f4565b60036106c68688836111a5565b5060046106d48486836111a5565b50600561052f8284836111a5565b600c805461043b90611129565b60605f6106fb8361089c565b905061070681610a81565b604051602001610716919061127a565b604051602081830303815290604052915050919050565b6107356107f4565b60126104298284836111a5565b6008805461043b90611129565b6012805461043b90611129565b600a805461043b90611129565b6005805461043b90611129565b61077e6107f4565b6001600160a01b0381166107e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6107f18161084d565b50565b5f546001600160a01b031633146106735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60015460405163f2824b5360e01b8152600481018390526060915f916001600160a01b039091169063f2824b53906024016040805180830381865afa1580156108e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090b91906112cd565b90505f61091784610bd0565b90505f6109278360200151610c60565b90505f6109378460200151610c9d565b6002546040805163bcb3962160e01b815290519293505f926001600160a01b039092169163ba03755691839163bcb39621916004808201926020929091908290030181865afa15801561098c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b0919061132e565b896040518363ffffffff1660e01b81526004016109d7929190918252602082015260400190565b602060405180830381865afa1580156109f2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a169190611345565b90505f610a24868684610cc4565b90508560200151610a36576008610a39565b60095b858760200151610a4a576012610a4d565b60135b868685604051602001610a65969594939291906113cd565b6040516020818303038152906040529650505050505050919050565b606081515f03610a9e57505060408051602081019091525f815290565b5f6040518060600160405280604081526020016118bd6040913990505f600384516002610acb9190611538565b610ad5919061154b565b610ae090600461156a565b67ffffffffffffffff811115610af857610af8611115565b6040519080825280601f01601f191660200182016040528015610b22576020820181803683370190505b509050600182016020820185865187015b80821015610b8e576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250610b33565b5050600386510660018114610baa5760028114610bbd57610bc5565b603d6001830353603d6002830353610bc5565b603d60018303535b509195945050505050565b60605f610bdc83610d5b565b60010190505f8167ffffffffffffffff811115610bfb57610bfb611115565b6040519080825280601f01601f191660200182016040528015610c25576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610c2f57509392505050565b6060600382610c70576004610c73565b60055b6006604051602001610c8793929190611581565b6040516020818303038152906040529050919050565b6060600382610cad576004610cb0565b60055b6007604051602001610c8793929190611581565b60408051602081019091525f80825260609190610ce085610e33565b9050856020015115610d1a57610cf584610e4c565b915080604051602001610d0891906115a7565b60405160208183030381529060405290505b610d2386610e70565b610d2c87610e98565b8284604051602001610d4194939291906115cb565b604051602081830303815290604052925050509392505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610d995772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610dc5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610de357662386f26fc10000830492506010015b6305f5e1008310610dfb576305f5e100830492506008015b6127108310610e0f57612710830492506004015b60648310610e21576064830492506002015b600a8310610e2d576001015b92915050565b60606015600b83604051602001610c8793929190611621565b6060600f82610e5c576011610e5f565b60105b604051602001610c879291906116dc565b6060600c8260200151610e8457600d610e87565b600e5b604051602001610c8792919061175b565b60606014600a610eae845f015161ffff16610bd0565b604051602001610c87939291906117da565b5f8083601f840112610ed0575f80fd5b50813567ffffffffffffffff811115610ee7575f80fd5b602083019150836020828501011115610efe575f80fd5b9250929050565b5f8060208385031215610f16575f80fd5b823567ffffffffffffffff811115610f2c575f80fd5b610f3885828601610ec0565b90969095509350505050565b5f5b83811015610f5e578181015183820152602001610f46565b50505f910152565b602081525f8251806020840152610f84816040850160208701610f44565b601f01601f19169190910160400192915050565b5f805f8060408587031215610fab575f80fd5b843567ffffffffffffffff80821115610fc2575f80fd5b610fce88838901610ec0565b90965094506020870135915080821115610fe6575f80fd5b50610ff387828801610ec0565b95989497509550505050565b5f805f805f8060608789031215611014575f80fd5b863567ffffffffffffffff8082111561102b575f80fd5b6110378a838b01610ec0565b9098509650602089013591508082111561104f575f80fd5b61105b8a838b01610ec0565b90965094506040890135915080821115611073575f80fd5b5061108089828a01610ec0565b979a9699509497509295939492505050565b80356001600160a01b03811681146110a8575f80fd5b919050565b5f80604083850312156110be575f80fd5b6110c783611092565b91506110d560208401611092565b90509250929050565b5f602082840312156110ee575f80fd5b5035919050565b5f60208284031215611105575f80fd5b61110e82611092565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061113d57607f821691505b60208210810361115b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561042957805f5260205f20601f840160051c810160208510156111865750805b601f840160051c820191505b818110156104f7575f8155600101611192565b67ffffffffffffffff8311156111bd576111bd611115565b6111d1836111cb8354611129565b83611161565b5f601f841160018114611202575f85156111eb5750838201355b5f19600387901b1c1916600186901b1783556104f7565b5f83815260208120601f198716915b828110156112315786850135825560209485019460019092019101611211565b508682101561124d575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8151611270818560208601610f44565b9290920192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f82516112b181601d850160208701610f44565b91909101601d0192915050565b805180151581146110a8575f80fd5b5f604082840312156112dd575f80fd5b6040516040810181811067ffffffffffffffff8211171561130057611300611115565b604052825161ffff81168114611314575f80fd5b8152611322602084016112be565b60208201529392505050565b5f6020828403121561133e575f80fd5b5051919050565b5f60208284031215611355575f80fd5b61110e826112be565b5f815461136a81611129565b600182811680156113825760018114611397576113c3565b60ff19841687528215158302870194506113c3565b855f526020805f205f5b858110156113ba5781548a8201529084019082016113a1565b50505082870194505b5050505092915050565b613d8560f11b81526904913730b6b2911d101160b11b60028201525f6113f6600c83018961135e565b61202360f01b81528751611411816002840160208c01610f44565b6211160560e91b9101600281018290527004913232b9b1b934b83a34b7b7111d101160791b600582015290611449601683018961135e565b9081526a049134b6b0b3b2911d101160a91b6003820152865190915061147681600e840160208a01610f44565b6115166115096114fa6114f46114d76114c86114c26114a3600e898b01016211160560e91b815260030190565b72049130b734b6b0ba34b7b72fbab936111d101160691b815260130190565b8c61125f565b6211160560e91b815260030190565b70049130ba3a3934b13aba32b9911d102d8560791b815260110190565b8861125f565b6204ae8560e91b815260030190565b607d60f81b815260010190565b9a9950505050505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e2d57610e2d611524565b5f8261156557634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610e2d57610e2d611524565b5f61159e611598611592848861135e565b8661135e565b8461135e565b95945050505050565b5f82516115b8818460208701610f44565b600b60fa1b920191825250600101919050565b5f85516115dc818460208a01610f44565b8551908301906115f0818360208a01610f44565b8551910190611603818360208901610f44565b8451910190611616818360208801610f44565b019695505050505050565b630484bd8560e11b815273048484913234b9b83630bcafba3cb832911d101160611b60048201525f611656601883018661135e565b6211160560e91b80825271048484913a3930b4ba2fba3cb832911d101160711b6003830152611688601583018761135e565b9081526a048484913b30b63ab2911d60a91b600382015284519091506116b581600e840160208801610f44565b600560f91b600e92909101918201526209097d60e81b600f82015260120195945050505050565b630484bd8560e11b815271048484913a3930b4ba2fba3cb832911d101160711b60048201525f61170f601683018561135e565b6211160560e91b81526b048484913b30b63ab2911d1160a11b600382015261173a600f82018561135e565b61110560f11b8152630484be8560e11b600282015260060195945050505050565b630484bd8560e11b815271048484913a3930b4ba2fba3cb832911d101160711b60048201525f61178e601683018561135e565b6211160560e91b81526b048484913b30b63ab2911d1160a11b60038201526117b9600f82018561135e565b61110560f11b81526302425f4b60e21b600282015260060195945050505050565b630484bd8560e11b815273048484913234b9b83630bcafba3cb832911d101160611b60048201525f61180f601883018661135e565b6211160560e91b80825271048484913a3930b4ba2fba3cb832911d101160711b6003830152611841601583018761135e565b9081527f090909226d61785f76616c7565223a2033323736302c0a00000000000000000060038201526a048484913b30b63ab2911d60a91b601a8201528451909150611894816025840160208801610f44565b600560f91b602592909101918201526302425f4b60e21b6026820152602a019594505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208f1b345ae974a4bdf5a69cd2bf9e3c9e34cda6204832a018c219b75c6e97101b64736f6c63430008170033
Deployed Bytecode Sourcemap
23573:11639:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27744:175;;;;;;:::i;:::-;;:::i;:::-;;25101:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24546:41;;;:::i;24384:40::-;;;:::i;26594:268::-;;;;;;:::i;:::-;;:::i;26870:378::-;;;;;;:::i;:::-;;:::i;24125:64::-;;;:::i;23703:36::-;;;;;-1:-1:-1;;;;;23703:36:0;;;;;;-1:-1:-1;;;;;3363:32:1;;;3345:51;;3333:2;3318:18;23703:36:0;3180:222:1;25925:120:0;;;;;;:::i;:::-;;:::i;23839:32::-;;;:::i;24594:48::-;;;:::i;26189:200::-;;;;;;:::i;:::-;;:::i;24431:52::-;;;:::i;25414:237::-;;;;;;:::i;:::-;;:::i;24271:60::-;;;:::i;27256:325::-;;;;;;:::i;:::-;;:::i;24848:173::-;;;:::i;24003:41::-;;;:::i;23778:54::-;;;:::i;26397:189::-;;;;;;:::i;:::-;;:::i;21622:103::-;;;:::i;26053:128::-;;;;;;:::i;:::-;;:::i;20974:87::-;21020:7;21047:6;-1:-1:-1;;;;;21047:6:0;20974:87;;24490:49;;;:::i;23959:37::-;;;:::i;25050:44::-;;;:::i;25659:258::-;;;;;;:::i;:::-;;:::i;24338:39::-;;;:::i;28595:311::-;;;;;;:::i;:::-;;:::i;27589:147::-;;;;;;:::i;:::-;;:::i;24071:47::-;;;:::i;23660:36::-;;;;;-1:-1:-1;;;;;23660:36:0;;;24675:166;;;:::i;24232:32::-;;;:::i;23878:40::-;;;:::i;21880:201::-;;;;;;:::i;:::-;;:::i;27744:175::-;20860:13;:11;:13::i;:::-;27857:25:::1;:54;27885:26:::0;;27857:25;:54:::1;:::i;:::-;;27744:175:::0;;:::o;25101:46::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24546:41::-;;;;;;;:::i;24384:40::-;;;;;;;:::i;26594:268::-;20860:13;:11;:13::i;:::-;26755:19:::1;:42;26777:20:::0;;26755:19;:42:::1;:::i;:::-;-1:-1:-1::0;26808:21:0::1;:46;26832:22:::0;;26808:21;:46:::1;:::i;:::-;;26594:268:::0;;;;:::o;26870:378::-;20860:13;:11;:13::i;:::-;27095:16:::1;:36;27114:17:::0;;27095:16;:36:::1;:::i;:::-;-1:-1:-1::0;27142:17:0::1;:40;27162:20:::0;;27142:17;:40:::1;:::i;:::-;-1:-1:-1::0;27193:24:0::1;:47;27220:20:::0;;27193:24;:47:::1;:::i;:::-;;26870:378:::0;;;;;;:::o;24125:64::-;;;;;;;:::i;25925:120::-;20860:13;:11;:13::i;:::-;26010:14:::1;:27;26027:10:::0;;26010:14;:27:::1;:::i;23839:32::-:0;;;;;;;:::i;24594:48::-;;;;;;;:::i;26189:200::-;20860:13;:11;:13::i;:::-;26304:11:::1;:26;26318:12:::0;;26304:11;:26:::1;:::i;:::-;-1:-1:-1::0;26341:18:0::1;:40;26362:19:::0;;26341:18;:40:::1;:::i;24431:52::-:0;;;;;;;:::i;25414:237::-;20860:13;:11;:13::i;:::-;25530:18:::1;:51:::0;;-1:-1:-1;;;;;25530:51:0;;::::1;-1:-1:-1::0;;;;;;25530:51:0;;::::1;;::::0;;;25592:18:::1;:51:::0;;;;;::::1;::::0;::::1;;::::0;;25414:237::o;24271:60::-;;;;;;;:::i;27256:325::-;20860:13;:11;:13::i;:::-;27446:19:::1;:37;27468:15:::0;;27446:19;:37:::1;:::i;:::-;-1:-1:-1::0;27494:16:0::1;:31;27513:12:::0;;27494:16;:31:::1;:::i;:::-;-1:-1:-1::0;27536:19:0::1;:37;27558:15:::0;;27536:19;:37:::1;:::i;24848:173::-:0;;;;;;;:::i;24003:41::-;;;;;;;:::i;23778:54::-;;;;;;;:::i;26397:189::-;20860:13;:11;:13::i;:::-;26511:11:::1;:26;26525:12:::0;;26511:11;:26:::1;:::i;:::-;-1:-1:-1::0;26548:13:0::1;:30;26564:14:::0;;26548:13;:30:::1;:::i;21622:103::-:0;20860:13;:11;:13::i;:::-;21687:30:::1;21714:1;21687:18;:30::i;:::-;21622:103::o:0;26053:128::-;20860:13;:11;:13::i;:::-;26142:18:::1;:31;26163:10:::0;;26142:18;:31:::1;:::i;24490:49::-:0;;;;;;;:::i;23959:37::-;;;;;;;:::i;25050:44::-;;;;;;;:::i;25659:258::-;20860:13;:11;:13::i;:::-;25813:7:::1;:18;25823:8:::0;;25813:7;:18:::1;:::i;:::-;-1:-1:-1::0;25842:10:0::1;:21;25855:8:::0;;25842:10;:21:::1;:::i;:::-;-1:-1:-1::0;25874:17:0::1;:35;25894:15:::0;;25874:17;:35:::1;:::i;24338:39::-:0;;;;;;;:::i;28595:311::-;28649:13;28675:20;28698:26;28715:8;28698:16;:26::i;:::-;28675:49;;28850:22;28864:7;28850:13;:22::i;:::-;28765:122;;;;;;;;:::i;:::-;;;;;;;;;;;;;28737:161;;;28595:311;;;:::o;27589:147::-;20860:13;:11;:13::i;:::-;27688:18:::1;:40;27709:19:::0;;27688:18;:40:::1;:::i;24071:47::-:0;;;;;;;:::i;24675:166::-;;;;;;;:::i;24232:32::-;;;;;;;:::i;23878:40::-;;;;;;;:::i;21880:201::-;20860:13;:11;:13::i;:::-;-1:-1:-1;;;;;21969:22:0;::::1;21961:73;;;::::0;-1:-1:-1;;;21961:73:0;;8072:2:1;21961:73:0::1;::::0;::::1;8054:21:1::0;8111:2;8091:18;;;8084:30;8150:34;8130:18;;;8123:62;-1:-1:-1;;;8201:18:1;;;8194:36;8247:19;;21961:73:0::1;;;;;;;;;22045:28;22064:8;22045:18;:28::i;:::-;21880:201:::0;:::o;21139:132::-;21020:7;21047:6;-1:-1:-1;;;;;21047:6:0;19632:10;21203:23;21195:68;;;;-1:-1:-1;;;21195:68:0;;8479:2:1;21195:68:0;;;8461:21:1;;;8498:18;;;8491:30;8557:34;8537:18;;;8530:62;8609:18;;21195:68:0;8277:356:1;22241:191:0;22315:16;22334:6;;-1:-1:-1;;;;;22351:17:0;;;-1:-1:-1;;;;;;22351:17:0;;;;;;22384:40;;22334:6;;;;;;;22384:40;;22315:16;22384:40;22304:128;22241:191;:::o;29187:1114::-;29320:18;;:44;;-1:-1:-1;;;29320:44:0;;;;;8784:25:1;;;29250:12:0;;29274:43;;-1:-1:-1;;;;;29320:18:0;;;;:34;;8757:18:1;;29320:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29274:90;;29385:21;29409:26;29426:8;29409:16;:26::i;:::-;29385:50;;29446:20;29469:42;29484:9;:26;;;29469:14;:42::i;:::-;29446:65;;29522:26;29551:48;29572:9;:26;;;29551:20;:48::i;:::-;29636:18;;29664:34;;;-1:-1:-1;;;29664:34:0;;;;29522:77;;-1:-1:-1;29620:13:0;;-1:-1:-1;;;;;29636:18:0;;;;:27;;:18;;29664:32;;:34;;;;;;;;;;;;;;;29636:18;29664:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29700:8;29636:73;;;;;;;;;;;;;;;9980:25:1;;;10036:2;10021:18;;10014:34;9968:2;9953:18;;9806:248;29636:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29620:89;;29720:24;29747:48;29766:9;29777:7;29786:8;29747:18;:48::i;:::-;29720:75;;29884:9;:26;;;:61;;29934:11;29884:61;;;29913:18;29884:61;29953:7;30009:9;:26;;;:75;;30066:18;30009:75;;;30038:25;30009:75;30127:6;30184:12;30245:10;29815:478;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29808:485;;;;;;;;29187:1114;;;:::o;15796:3097::-;15854:13;16091:4;:11;16106:1;16091:16;16087:31;;-1:-1:-1;;16109:9:0;;;;;;;;;-1:-1:-1;16109:9:0;;;15796:3097::o;16087:31::-;16171:19;16193:6;;;;;;;;;;;;;;;;;16171:28;;16610:20;16669:1;16650:4;:11;16664:1;16650:15;;;;:::i;:::-;16649:21;;;;:::i;:::-;16644:27;;:1;:27;:::i;:::-;16633:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16633:39:0;;16610:62;;16852:1;16845:5;16841:13;16956:2;16948:6;16944:15;17067:4;17119;17113:11;17107:4;17103:22;17029:1432;17153:6;17144:7;17141:19;17029:1432;;;17259:1;17250:7;17246:15;17235:26;;17298:7;17292:14;17951:4;17943:5;17939:2;17935:14;17931:25;17921:8;17917:40;17911:47;17900:9;17892:67;18005:1;17994:9;17990:17;17977:30;;18097:4;18089:5;18085:2;18081:14;18077:25;18067:8;18063:40;18057:47;18046:9;18038:67;18151:1;18140:9;18136:17;18123:30;;18242:4;18234:5;18231:1;18227:13;18223:24;18213:8;18209:39;18203:46;18192:9;18184:66;18296:1;18285:9;18281:17;18268:30;;18379:4;18372:5;18368:16;18358:8;18354:31;18348:38;18337:9;18329:58;;18433:1;18422:9;18418:17;18405:30;;17029:1432;;;17033:107;;18623:1;18616:4;18610:11;18606:19;18644:1;18639:123;;;;18781:1;18776:73;;;;18599:250;;18639:123;18692:4;18688:1;18677:9;18673:17;18665:32;18742:4;18738:1;18727:9;18723:17;18715:32;18639:123;;18776:73;18829:4;18825:1;18814:9;18810:17;18802:32;18599:250;-1:-1:-1;18879:6:0;;15796:3097;-1:-1:-1;;;;;15796:3097:0:o;13383:716::-;13439:13;13490:14;13507:17;13518:5;13507:10;:17::i;:::-;13527:1;13507:21;13490:38;;13543:20;13577:6;13566:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13566:18:0;-1:-1:-1;13543:41:0;-1:-1:-1;13708:28:0;;;13724:2;13708:28;13765:288;-1:-1:-1;;13797:5:0;-1:-1:-1;;;13934:2:0;13923:14;;13918:30;13797:5;13905:44;13995:2;13986:11;;;-1:-1:-1;14016:21:0;13765:288;14016:21;-1:-1:-1;14074:6:0;13383:716;-1:-1:-1;;;13383:716:0:o;30551:212::-;30621:13;30678:7;30687:17;:50;;30727:10;30687:50;;;30707:17;30687:50;30739:14;30661:93;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30647:108;;30551:212;;;:::o;31013:222::-;31089:13;31146:7;31155:17;:50;;31195:10;31155:50;;;31175:17;31155:50;31207:18;31129:97;;;;;;;;;;:::i;31485:856::-;31679:38;;;;;;;;;:33;:38;;;31648:13;;31679:38;31758:37;31786:8;31758:27;:37::i;:::-;31728:67;;31810:10;:27;;;31806:265;;;31876:38;31904:9;31876:27;:38::i;:::-;31854:60;;31969:13;31952:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;31929:60;;31806:265;32144:43;32176:10;32144:31;:43::i;:::-;32206:31;32226:10;32206:19;:31::i;:::-;32256:13;32288:19;32109:213;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32081:252;;;;31485:856;;;;;:::o;10278:922::-;10331:7;;-1:-1:-1;;;10409:15:0;;10405:102;;-1:-1:-1;;;10445:15:0;;;-1:-1:-1;10489:2:0;10479:12;10405:102;10534:6;10525:5;:15;10521:102;;10570:6;10561:15;;;-1:-1:-1;10605:2:0;10595:12;10521:102;10650:6;10641:5;:15;10637:102;;10686:6;10677:15;;;-1:-1:-1;10721:2:0;10711:12;10637:102;10766:5;10757;:14;10753:99;;10801:5;10792:14;;;-1:-1:-1;10835:1:0;10825:11;10753:99;10879:5;10870;:14;10866:99;;10914:5;10905:14;;;-1:-1:-1;10948:1:0;10938:11;10866:99;10992:5;10983;:14;10979:99;;11027:5;11018:14;;;-1:-1:-1;11061:1:0;11051:11;10979:99;11105:5;11096;:14;11092:66;;11141:1;11131:11;11092:66;11186:6;10278:922;-1:-1:-1;;10278:922:0:o;34104:447::-;34186:13;34333:21;34410:19;34477:8;34240:292;;;;;;;;;;:::i;34801:408::-;34875:13;35020:19;35089:9;:50;;35120:19;35089:50;;;35101:16;35089:50;34929:261;;;;;;;;;:::i;32591:494::-;32726:13;32876:16;32942:10;:27;;;:74;;32999:17;32942:74;;;32972:24;32942:74;32785:281;;;;;;;;;:::i;33335:519::-;33431:13;33578;33647:11;33756:31;33773:10;:13;;;33756:31;;:16;:31::i;:::-;33485:350;;;;;;;;;;:::i;14:348:1:-;66:8;76:6;130:3;123:4;115:6;111:17;107:27;97:55;;148:1;145;138:12;97:55;-1:-1:-1;171:20:1;;214:18;203:30;;200:50;;;246:1;243;236:12;200:50;283:4;275:6;271:17;259:29;;335:3;328:4;319:6;311;307:19;303:30;300:39;297:59;;;352:1;349;342:12;297:59;14:348;;;;;:::o;367:411::-;438:6;446;499:2;487:9;478:7;474:23;470:32;467:52;;;515:1;512;505:12;467:52;555:9;542:23;588:18;580:6;577:30;574:50;;;620:1;617;610:12;574:50;659:59;710:7;701:6;690:9;686:22;659:59;:::i;:::-;737:8;;633:85;;-1:-1:-1;367:411:1;-1:-1:-1;;;;367:411:1:o;783:250::-;868:1;878:113;892:6;889:1;886:13;878:113;;;968:11;;;962:18;949:11;;;942:39;914:2;907:10;878:113;;;-1:-1:-1;;1025:1:1;1007:16;;1000:27;783:250::o;1038:396::-;1187:2;1176:9;1169:21;1150:4;1219:6;1213:13;1262:6;1257:2;1246:9;1242:18;1235:34;1278:79;1350:6;1345:2;1334:9;1330:18;1325:2;1317:6;1313:15;1278:79;:::i;:::-;1418:2;1397:15;-1:-1:-1;;1393:29:1;1378:45;;;;1425:2;1374:54;;1038:396;-1:-1:-1;;1038:396:1:o;1439:721::-;1531:6;1539;1547;1555;1608:2;1596:9;1587:7;1583:23;1579:32;1576:52;;;1624:1;1621;1614:12;1576:52;1664:9;1651:23;1693:18;1734:2;1726:6;1723:14;1720:34;;;1750:1;1747;1740:12;1720:34;1789:59;1840:7;1831:6;1820:9;1816:22;1789:59;:::i;:::-;1867:8;;-1:-1:-1;1763:85:1;-1:-1:-1;1955:2:1;1940:18;;1927:32;;-1:-1:-1;1971:16:1;;;1968:36;;;2000:1;1997;1990:12;1968:36;;2039:61;2092:7;2081:8;2070:9;2066:24;2039:61;:::i;:::-;1439:721;;;;-1:-1:-1;2119:8:1;-1:-1:-1;;;;1439:721:1:o;2165:1010::-;2278:6;2286;2294;2302;2310;2318;2371:2;2359:9;2350:7;2346:23;2342:32;2339:52;;;2387:1;2384;2377:12;2339:52;2427:9;2414:23;2456:18;2497:2;2489:6;2486:14;2483:34;;;2513:1;2510;2503:12;2483:34;2552:59;2603:7;2594:6;2583:9;2579:22;2552:59;:::i;:::-;2630:8;;-1:-1:-1;2526:85:1;-1:-1:-1;2718:2:1;2703:18;;2690:32;;-1:-1:-1;2734:16:1;;;2731:36;;;2763:1;2760;2753:12;2731:36;2802:61;2855:7;2844:8;2833:9;2829:24;2802:61;:::i;:::-;2882:8;;-1:-1:-1;2776:87:1;-1:-1:-1;2970:2:1;2955:18;;2942:32;;-1:-1:-1;2986:16:1;;;2983:36;;;3015:1;3012;3005:12;2983:36;;3054:61;3107:7;3096:8;3085:9;3081:24;3054:61;:::i;:::-;2165:1010;;;;-1:-1:-1;2165:1010:1;;-1:-1:-1;2165:1010:1;;3134:8;;2165:1010;-1:-1:-1;;;2165:1010:1:o;3407:173::-;3475:20;;-1:-1:-1;;;;;3524:31:1;;3514:42;;3504:70;;3570:1;3567;3560:12;3504:70;3407:173;;;:::o;3585:260::-;3653:6;3661;3714:2;3702:9;3693:7;3689:23;3685:32;3682:52;;;3730:1;3727;3720:12;3682:52;3753:29;3772:9;3753:29;:::i;:::-;3743:39;;3801:38;3835:2;3824:9;3820:18;3801:38;:::i;:::-;3791:48;;3585:260;;;;;:::o;4058:180::-;4117:6;4170:2;4158:9;4149:7;4145:23;4141:32;4138:52;;;4186:1;4183;4176:12;4138:52;-1:-1:-1;4209:23:1;;4058:180;-1:-1:-1;4058:180:1:o;4470:186::-;4529:6;4582:2;4570:9;4561:7;4557:23;4553:32;4550:52;;;4598:1;4595;4588:12;4550:52;4621:29;4640:9;4621:29;:::i;:::-;4611:39;4470:186;-1:-1:-1;;;4470:186:1:o;4661:127::-;4722:10;4717:3;4713:20;4710:1;4703:31;4753:4;4750:1;4743:15;4777:4;4774:1;4767:15;4793:380;4872:1;4868:12;;;;4915;;;4936:61;;4990:4;4982:6;4978:17;4968:27;;4936:61;5043:2;5035:6;5032:14;5012:18;5009:38;5006:161;;5089:10;5084:3;5080:20;5077:1;5070:31;5124:4;5121:1;5114:15;5152:4;5149:1;5142:15;5006:161;;4793:380;;;:::o;5304:518::-;5406:2;5401:3;5398:11;5395:421;;;5442:5;5439:1;5432:16;5486:4;5483:1;5473:18;5556:2;5544:10;5540:19;5537:1;5533:27;5527:4;5523:38;5592:4;5580:10;5577:20;5574:47;;;-1:-1:-1;5615:4:1;5574:47;5670:2;5665:3;5661:12;5658:1;5654:20;5648:4;5644:31;5634:41;;5725:81;5743:2;5736:5;5733:13;5725:81;;;5802:1;5788:16;;5769:1;5758:13;5725:81;;5998:1198;6122:18;6117:3;6114:27;6111:53;;;6144:18;;:::i;:::-;6173:94;6263:3;6223:38;6255:4;6249:11;6223:38;:::i;:::-;6217:4;6173:94;:::i;:::-;6293:1;6318:2;6313:3;6310:11;6335:1;6330:608;;;;6982:1;6999:3;6996:93;;;-1:-1:-1;7055:19:1;;;7042:33;6996:93;-1:-1:-1;;5955:1:1;5951:11;;;5947:24;5943:29;5933:40;5979:1;5975:11;;;5930:57;7102:78;;6303:887;;6330:608;5251:1;5244:14;;;5288:4;5275:18;;-1:-1:-1;;6366:17:1;;;6481:229;6495:7;6492:1;6489:14;6481:229;;;6584:19;;;6571:33;6556:49;;6691:4;6676:20;;;;6644:1;6632:14;;;;6511:12;6481:229;;;6485:3;6738;6729:7;6726:16;6723:159;;;6862:1;6858:6;6852:3;6846;6843:1;6839:11;6835:21;6831:34;6827:39;6814:9;6809:3;6805:19;6792:33;6788:79;6780:6;6773:95;6723:159;;;6925:1;6919:3;6916:1;6912:11;6908:19;6902:4;6895:33;6303:887;;5998:1198;;;:::o;7201:198::-;7243:3;7281:5;7275:12;7296:65;7354:6;7349:3;7342:4;7335:5;7331:16;7296:65;:::i;:::-;7377:16;;;;;7201:198;-1:-1:-1;;7201:198:1:o;7404:461::-;7666:31;7661:3;7654:44;7636:3;7727:6;7721:13;7743:75;7811:6;7806:2;7801:3;7797:12;7790:4;7782:6;7778:17;7743:75;:::i;:::-;7838:16;;;;7856:2;7834:25;;7404:461;-1:-1:-1;;7404:461:1:o;8820:164::-;8896:13;;8945;;8938:21;8928:32;;8918:60;;8974:1;8971;8964:12;8989:623;9092:6;9145:2;9133:9;9124:7;9120:23;9116:32;9113:52;;;9161:1;9158;9151:12;9113:52;9194:2;9188:9;9236:2;9228:6;9224:15;9305:6;9293:10;9290:22;9269:18;9257:10;9254:34;9251:62;9248:88;;;9316:18;;:::i;:::-;9352:2;9345:22;9389:16;;9445:6;9434:18;;9424:29;;9414:57;;9467:1;9464;9457:12;9414:57;9480:21;;9534:46;9576:2;9561:18;;9534:46;:::i;:::-;9529:2;9517:15;;9510:71;9521:6;8989:623;-1:-1:-1;;;8989:623:1:o;9617:184::-;9687:6;9740:2;9728:9;9719:7;9715:23;9711:32;9708:52;;;9756:1;9753;9746:12;9708:52;-1:-1:-1;9779:16:1;;9617:184;-1:-1:-1;9617:184:1:o;10059:202::-;10126:6;10179:2;10167:9;10158:7;10154:23;10150:32;10147:52;;;10195:1;10192;10185:12;10147:52;10218:37;10245:9;10218:37;:::i;10266:727::-;10320:3;10361:5;10355:12;10390:36;10416:9;10390:36;:::i;:::-;10445:1;10462:17;;;10488:133;;;;10635:1;10630:357;;;;10455:532;;10488:133;-1:-1:-1;;10521:24:1;;10509:37;;10594:14;;10587:22;10575:35;;10566:45;;;-1:-1:-1;10488:133:1;;10630:357;10661:5;10658:1;10651:16;10690:4;10735;10732:1;10722:18;10762:1;10776:165;10790:6;10787:1;10784:13;10776:165;;;10868:14;;10855:11;;;10848:35;10911:16;;;;10805:10;;10776:165;;;10780:3;;;10970:6;10965:3;10961:16;10954:23;;10455:532;;;;;10266:727;;;;:::o;11707:2744::-;-1:-1:-1;;;13411:28:1;;-1:-1:-1;;;13464:1:1;13455:11;;13448:53;-1:-1:-1;13520:51:1;13567:2;13558:12;;13550:6;13520:51;:::i;:::-;-1:-1:-1;;;13587:2:1;13580:16;13625:6;13619:13;13641:73;13707:6;13703:1;13699:2;13695:10;13688:4;13680:6;13676:17;13641:73;:::i;:::-;-1:-1:-1;;;13733:15:1;;13808:1;13800:10;;13793:22;;;-1:-1:-1;;;13839:1:1;13831:10;;13824:66;13733:15;13909:50;13955:2;13947:11;;13939:6;13909:50;:::i;:::-;13968:14;;;-1:-1:-1;;;14006:1:1;13998:10;;13991:54;14070:13;;13899:60;;-1:-1:-1;14092:76:1;14070:13;14154:2;14146:11;;14139:4;14127:17;;14092:76;:::i;:::-;14184:261;14214:230;14244:199;14270:172;14300:141;14330:110;14356:83;14381:57;14434:2;14423:8;14419:2;14415:17;14411:26;-1:-1:-1;;;11063:30:1;;11118:1;11109:11;;10998:128;14381:57;-1:-1:-1;;;11191:63:1;;11279:2;11270:12;;11131:157;14356:83;14348:6;14330:110;:::i;:::-;-1:-1:-1;;;11063:30:1;;11118:1;11109:11;;10998:128;14300:141;-1:-1:-1;;;11358:59:1;;11442:2;11433:12;;11293:158;14270:172;14262:6;14244:199;:::i;:::-;-1:-1:-1;;;11521:29:1;;11575:1;11566:11;;11456:127;14214:230;-1:-1:-1;;;11653:16:1;;11694:1;11685:11;;11588:114;14184:261;14177:268;11707:2744;-1:-1:-1;;;;;;;;;;11707:2744:1:o;14456:127::-;14517:10;14512:3;14508:20;14505:1;14498:31;14548:4;14545:1;14538:15;14572:4;14569:1;14562:15;14588:125;14653:9;;;14674:10;;;14671:36;;;14687:18;;:::i;14850:217::-;14890:1;14916;14906:132;;14960:10;14955:3;14951:20;14948:1;14941:31;14995:4;14992:1;14985:15;15023:4;15020:1;15013:15;14906:132;-1:-1:-1;15052:9:1;;14850:217::o;15072:168::-;15145:9;;;15176;;15193:15;;;15187:22;;15173:37;15163:71;;15214:18;;:::i;15245:373::-;15467:3;15492:120;15530:81;15568:42;15606:3;15598:6;15568:42;:::i;:::-;15560:6;15530:81;:::i;:::-;15522:6;15492:120;:::i;:::-;15485:127;15245:373;-1:-1:-1;;;;;15245:373:1:o;15623:452::-;15855:3;15893:6;15887:13;15909:66;15968:6;15963:3;15956:4;15948:6;15944:17;15909:66;:::i;:::-;-1:-1:-1;;;15997:16:1;;16022:18;;;-1:-1:-1;16067:1:1;16056:13;;15623:452;-1:-1:-1;15623:452:1:o;16080:910::-;16355:3;16393:6;16387:13;16409:66;16468:6;16463:3;16456:4;16448:6;16444:17;16409:66;:::i;:::-;16538:13;;16497:16;;;;16560:70;16538:13;16497:16;16607:4;16595:17;;16560:70;:::i;:::-;16697:13;;16652:20;;;16719:70;16697:13;16652:20;16766:4;16754:17;;16719:70;:::i;:::-;16856:13;;16811:20;;;16878:70;16856:13;16811:20;16925:4;16913:17;;16878:70;:::i;:::-;16964:20;;16080:910;-1:-1:-1;;;;;;16080:910:1:o;16995:1795::-;-1:-1:-1;;;18042:33:1;;-1:-1:-1;;;18100:1:1;18091:11;;18084:72;-1:-1:-1;18175:51:1;18222:2;18213:12;;18205:6;18175:51;:::i;:::-;-1:-1:-1;;;18271:14:1;;;-1:-1:-1;;;18309:1:1;18301:10;;18294:68;18381:50;18427:2;18419:11;;18411:6;18381:50;:::i;:::-;18440:14;;;-1:-1:-1;;;18478:1:1;18470:10;;18463:54;18540:13;;18371:60;;-1:-1:-1;18562:74:1;18540:13;18624:2;18616:11;;18609:4;18597:17;;18562:74;:::i;:::-;-1:-1:-1;;;18694:2:1;18655:15;;;;18686:11;;;18679:32;-1:-1:-1;;;18735:2:1;18727:11;;18720:37;18781:2;18773:11;;16995:1795;-1:-1:-1;;;;;16995:1795:1:o;18795:1270::-;-1:-1:-1;;;19596:33:1;;-1:-1:-1;;;19654:1:1;19645:11;;19638:69;-1:-1:-1;19726:51:1;19773:2;19764:12;;19756:6;19726:51;:::i;:::-;-1:-1:-1;;;19786:29:1;;-1:-1:-1;;;19839:1:1;19831:10;;19824:56;19899:50;19945:2;19937:11;;19929:6;19899:50;:::i;:::-;-1:-1:-1;;;19958:26:1;;-1:-1:-1;;;20008:1:1;20000:10;;19993:40;20057:1;20049:10;;18795:1270;-1:-1:-1;;;;;18795:1270:1:o;20070:::-;-1:-1:-1;;;20871:33:1;;-1:-1:-1;;;20929:1:1;20920:11;;20913:69;-1:-1:-1;21001:51:1;21048:2;21039:12;;21031:6;21001:51;:::i;:::-;-1:-1:-1;;;21061:29:1;;-1:-1:-1;;;21114:1:1;21106:10;;21099:56;21174:50;21220:2;21212:11;;21204:6;21174:50;:::i;:::-;-1:-1:-1;;;21233:26:1;;-1:-1:-1;;;21283:1:1;21275:10;;21268:40;21332:1;21324:10;;20070:1270;-1:-1:-1;;;;;20070:1270:1:o;21345:1996::-;-1:-1:-1;;;22493:33:1;;-1:-1:-1;;;22551:1:1;22542:11;;22535:72;-1:-1:-1;22626:51:1;22673:2;22664:12;;22656:6;22626:51;:::i;:::-;-1:-1:-1;;;22722:14:1;;;-1:-1:-1;;;22760:1:1;22752:10;;22745:68;22832:50;22878:2;22870:11;;22862:6;22832:50;:::i;:::-;22891:14;;;22933:66;22929:1;22921:10;;22914:86;-1:-1:-1;;;23024:2:1;23016:11;;23009:55;23087:13;;22822:60;;-1:-1:-1;23109:74:1;23087:13;23171:2;23163:11;;23156:4;23144:17;;23109:74;:::i;:::-;-1:-1:-1;;;23241:2:1;23202:15;;;;23233:11;;;23226:32;-1:-1:-1;;;23282:2:1;23274:11;;23267:41;23332:2;23324:11;;21345:1996;-1:-1:-1;;;;;21345:1996:1:o
Swarm Source
ipfs://8f1b345ae974a4bdf5a69cd2bf9e3c9e34cda6204832a018c219b75c6e97101b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.