Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 18059107 | 369 days ago | IN | 0 ETH | 0.064527 |
Loading...
Loading
Contract Name:
PixelPioneerMetadata
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; // Local References import './PixelPioneerMetadataBase.sol'; /** * @title PixelPioneerMetadata. * .+. * -: .: :+. * -- :=. :+ -= . .. .:-: * .+. -- :+ =- .:. :++-. .++=: .. :==:-++==: * =- .=: := +. -=::.:. -. .==..+=-+= =+:+-.=====: -+: =+:.-+. * =-:=- :. ==----+ :+ =+:.-+- .. ++..++++: =++=-+: -+: .++=--=++=-++. * -=--==-. :. +-::.=- +- .=-+:=::+. -+= .:-. =+. .+= :+=.=+: -+: +=:::=+..-+: * -- .-- .+. .+: ==-=: -+: ===:.======-::+- =+. :+: =+:-+- :+= .+= .+--+-. * .- .+. :+. :. :+. .- . .-=-. =+. :==-=+=:. * +: .+ :- .. .. * * On-Chain Metadata */ contract PixelPioneerMetadata is PixelPioneerMetadataBase { address private constant COMPANION_ART_CONTRACT = 0x8abC21a84992b8C50c086D5133D6B428b8FC7439; // PixelPioneerArtwork V1 string private constant GENERIC_TOKEN_DESCRIPTION = 'Keith Haring: Pixel Pioneer series one of five unique digital drawings created on an Amiga computer in the mid-1980s. To accurately preserve the natively digital material created on a now-vintage computer system the Keith Haring Foundation has minted these five Amiga artworks - previously only viewable via floppy disks - on the Ethereum blockchain. [Keith Haring Foundation](https://www.haring.com/) | [NFT Ownership License](https://www.haring.com/!/nft-ownership-license)'; string private constant TOKEN_EXTERNAL_URL = 'https://www.haring.com/'; string private constant VIEWER_URL = 'https://nftc-media.mypinata.cloud/ipfs/QmTUQZD3wxNZ23mQ9k69mWQU3eNmMg3Kf3d1djCiw45UUe'; uint256 private constant NUMBER_OF_TOKEN_TYPES_ALLOWED = 5; // Max of 5 tokens. constructor() SimpleChainNativeArtConsumer(COMPANION_ART_CONTRACT) TokenMetadataManager(NUMBER_OF_TOKEN_TYPES_ALLOWED) CollectionMetadataManager('', TOKEN_EXTERNAL_URL) { // Implementation version: v1.0.0 } /** * struct DynamicAttributes { * uint256 tokenType; * bool isSerialized; * bool isAnimated; * bool hasTokenDescription; * string title; * string tokenDescription; * string[] attributeNames; * string[] attributeValues; * } */ function _getInitialDefinitions() internal pure override returns (DynamicAttributesV1[] memory) { string[] memory attributeFieldNames = new string[](4); attributeFieldNames[0] = 'ARTIST'; attributeFieldNames[1] = 'LOCATION'; attributeFieldNames[2] = 'YEAR'; attributeFieldNames[3] = 'FILE FORMATS'; string[] memory tokenOneValues = new string[](4); tokenOneValues[0] = 'Keith Haring'; tokenOneValues[1] = 'New York City, New York'; tokenOneValues[2] = '1987'; tokenOneValues[3] = 'PICT, PNG, SVG'; string[] memory tokenTwoValues = new string[](4); tokenTwoValues[0] = 'Keith Haring'; tokenTwoValues[1] = 'New York City, New York'; tokenTwoValues[2] = '1987'; tokenTwoValues[3] = 'PICT, PNG, SVG'; string[] memory tokenThreeValues = new string[](4); tokenThreeValues[0] = 'Keith Haring'; tokenThreeValues[1] = 'New York City, New York'; tokenThreeValues[2] = '1987'; tokenThreeValues[3] = 'PICT, PNG, SVG'; string[] memory tokenFourValues = new string[](4); tokenFourValues[0] = 'Keith Haring'; tokenFourValues[1] = 'New York City, New York'; tokenFourValues[2] = '1987'; tokenFourValues[3] = 'PICT, PNG, SVG'; string[] memory tokenFiveValues = new string[](4); tokenFiveValues[0] = 'Keith Haring'; tokenFiveValues[1] = 'New York City, New York'; tokenFiveValues[2] = '1987'; tokenFiveValues[3] = 'PICT, PNG, SVG'; DynamicAttributesV1[] memory initialAttributesDefinitions = new DynamicAttributesV1[](5); initialAttributesDefinitions[0] = DynamicAttributesV1( 1, false, false, true, 'Untitled (April 14, 1987)', string.concat(GENERIC_TOKEN_DESCRIPTION, ' | [View Full Screen](', VIEWER_URL, '?tokenType=1)'), attributeFieldNames, tokenOneValues ); initialAttributesDefinitions[1] = DynamicAttributesV1( 2, false, false, true, 'Untitled #1 (April 16, 1987)', string.concat(GENERIC_TOKEN_DESCRIPTION, ' | [View Full Screen](', VIEWER_URL, '?tokenType=2)'), attributeFieldNames, tokenTwoValues ); initialAttributesDefinitions[2] = DynamicAttributesV1( 3, false, false, true, 'Untitled #2 (April 16, 1987)', string.concat(GENERIC_TOKEN_DESCRIPTION, ' | [View Full Screen](', VIEWER_URL, '?tokenType=3)'), attributeFieldNames, tokenThreeValues ); initialAttributesDefinitions[3] = DynamicAttributesV1( 4, false, false, true, 'Untitled (Feb 2, 1987)', string.concat(GENERIC_TOKEN_DESCRIPTION, ' | [View Full Screen](', VIEWER_URL, '?tokenType=4)'), attributeFieldNames, tokenFourValues ); initialAttributesDefinitions[4] = DynamicAttributesV1( 5, false, false, true, 'Untitled (Feb 3, 1987)', string.concat(GENERIC_TOKEN_DESCRIPTION, ' | [View Full Screen](', VIEWER_URL, '?tokenType=5)'), attributeFieldNames, tokenFiveValues ); return initialAttributesDefinitions; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /** * @title OwnableDeferral * @author @NiftyMike | @NFTCulture * @dev Implements checks for contract admin operations. Will be Backed by * OZ Ownable. * * This contract is helpful when a contract tree gets complicated, * and multiple contracts need to leverage Ownable. * * Sample Implementation: * * modifier isOwner() override(...) { * _isOwner(); * _; * } * * function _isOwner() internal view override(...) { * _checkOwner(); * } */ abstract contract OwnableDeferral { modifier isOwner() virtual; function _isOwner() internal view virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; // OZ Libraries import '@openzeppelin/contracts/access/Ownable.sol'; // Local References import './OwnableDeferral.sol'; // Error Codes error CallerIsNotOwner(); /** * @title OwnableDeferralResolution * @author @NiftyMike | @NFTCulture * @dev Implements checks for contract admin (Owner) operations. Backed by OZ Ownable. * * Ownership is assigned to contract deployer wallet by default. * * NOTE: IMPORTANT - This resolution will work great in a simple inheritance situation, * however, if multiple inheritance is involved, it might not adequately satisfy * override (...) conditions. In those scenarios, this code should be used as a * starting point and then adjusted appropriately. */ contract OwnableDeferralResolution is Ownable, OwnableDeferral { modifier isOwner() override { _isOwner(); _; } function _isOwner() internal view override { // Same as _checkOwner() but using error code instead of a require statement. if (owner() != _msgSender()) revert CallerIsNotOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; // OZ Libraries import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/utils/Base64.sol'; // Local References import '../../access/v2/OwnableDeferral.sol'; import './TokenMetadataManager.sol'; /** * @title CollectionMetadataManager * @author @NiftyMike | @NFTCulture * @dev This contract builds on TokenMetadataManager to provide functionality that enables on-chain * storage of NFT metadata for an entire NFT collection. */ abstract contract CollectionMetadataManager is TokenMetadataManager, OwnableDeferral { using Strings for uint256; string private _description; string private _external_url; constructor(string memory __description, string memory __external_url) { _description = __description; _external_url = __external_url; } function _getImageFieldValue(uint256 tokenType) internal view virtual returns (string memory); function _getAnimationFieldValue(uint256 tokenType) internal view virtual returns (string memory); function _convertJsonToEncodedString(string memory metadata) internal pure returns (string memory) { return string.concat('data:application/json;base64,', Base64.encode(bytes(metadata))); } function _getMetadataJson(uint256 tokenId, uint256 tokenType) internal view returns (string memory) { return _constructMetadataAsJson(tokenId, tokenType); } function _constructMetadataAsJson(uint256 tokenId, uint256 tokenType) internal view returns (string memory) { DynamicAttributesV1 memory tokenAttributes = _getTokenAttributesDefinition(tokenType); // Token types are 1-index based. require(tokenAttributes.tokenType > 0, 'Invalid token type'); string memory imageFieldValue = _getImageFieldValue(tokenType); string memory animationFieldValue = _getAnimationFieldValue(tokenType); return string.concat( '{"name":"', tokenAttributes.title, tokenAttributes.isSerialized ? tokenId.toString() : '', '","description":"', tokenAttributes.hasTokenDescription ? tokenAttributes.tokenDescription : _description, '","image":"', imageFieldValue, tokenAttributes.isAnimated ? '","animation_url":"' : '', tokenAttributes.isAnimated ? animationFieldValue : '', '","attributes":', _getNftAttributeArray(tokenAttributes), ',"external_url":"', _external_url, '"}' ); } function _getNftAttributeArray(DynamicAttributesV1 memory tokenAttributes) internal pure returns (string memory) { string memory attributeArrayAsString = '['; uint256 tokenAttrIdx; for (tokenAttrIdx; tokenAttrIdx < tokenAttributes.attributeNames.length; tokenAttrIdx++) { attributeArrayAsString = string.concat( attributeArrayAsString, tokenAttrIdx == 0 ? '' : ',', '{"trait_type":"', tokenAttributes.attributeNames[tokenAttrIdx], '","value":"', tokenAttributes.attributeValues[tokenAttrIdx], '"}' ); } return string.concat(attributeArrayAsString, ']'); } function modifyCollectionMetadata(string calldata __description, string calldata __external_url) external isOwner { if (bytes(__description).length > 0) { _description = __description; } if (bytes(__external_url).length > 0) { _external_url = __external_url; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /** * @title IChainNativeArtProducer * @author @NiftyMike | @NFTCulture * @dev Super thin interface definition for a contract that * produces art in a chain native way. */ interface IChainNativeArtProducer { /** * Given a token type, return a string that can be directly inserted into an * NFT metadata attribute such as image. * * @param tokenType type of the art piece */ function getArtAsString(uint256 tokenType) external view returns (string memory); /** * Given a token type, return a string that can be directly inserted into an * NFT metadata attribute such as animation_url. * * @param tokenType type of the art piece */ function getAnimationAsString(uint256 tokenType) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /** * @title IChainNativeMetadataProducer * @author @NiftyMike | @NFTCulture * @dev Super thin interface definition for a contract that * produces metadata in a chain native way. */ interface IChainNativeMetadataProducer { function getTokenTypeForToken(uint256 tokenId) external view returns (uint256); function getJsonAsString(uint256 tokenId, uint256 tokenType) external view returns (string memory); function getJsonAsEncodedString(uint256 tokenId, uint256 tokenType) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /** * @title IDynamicAttributesV1 * @author @NFTMike | @NFTCulture * @dev Interface for defining the structure of DynamicAttributes objects. * * This interface should capture all of the data relevant to a group of tokens being * stored entirely on-chain. * * The interface is designed to allow the metadata to be modified and updated as needed. * * Besides the 'isAnimated' attribute, the interface is designed to be decoupled from * the artwork scheme implemented for the related tokens. 'isAnimated' is just used * as a cleaner and more deliberate approach than checking string length of an animation. */ interface IDynamicAttributesV1 { struct DynamicAttributesV1 { uint256 tokenType; bool isSerialized; bool isAnimated; bool hasTokenDescription; string title; string tokenDescription; string[] attributeNames; string[] attributeValues; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; // Local References import '../../access/v2/OwnableDeferral.sol'; import './interfaces/IChainNativeArtProducer.sol'; /** * @title SimpleChainNativeArtConsumer * @author @NiftyMike | @NFTCulture * @dev Basic implementation to manage connections to an external source for NFT art. */ abstract contract SimpleChainNativeArtConsumer is OwnableDeferral { // External contract that manages the collection's art in a chain-native way. IChainNativeArtProducer private _artProducer; constructor(address __artProducer) { _setProducer(__artProducer); } /** * @notice Set the on-chain art producer contract. * Can only be called if caller is owner. * * @param __artProducer address of the producer contract. */ function setProducer(address __artProducer) external isOwner { _setProducer(__artProducer); } function _setProducer(address __artProducer) internal { if (__artProducer != address(0)) { _artProducer = IChainNativeArtProducer(__artProducer); } } function _getProducer() internal view virtual returns (IChainNativeArtProducer) { return _artProducer; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; // Local References import './interfaces/IDynamicAttributes.sol'; // Error Codes error NullTokenType(); error TokenAttributesDefinitionDoesNotExist(); error TokenTypeAlreadyCreated(); error TokenTypeCountExceeded(); /** * @title TokenMetadataManager * @author @NiftyMike | @NFTCulture * @dev This contract manages Non-Fungible Token Metadata fully on-chain and * in a generic fashion. * * All metadata is contained within a map called _tokenAttributesDefinitions. * * In its basic implementation, the TokenMetadataManager does not allow for * expansion of the token types. However, this could be added on by a subclass * of this contract. */ abstract contract TokenMetadataManager is IDynamicAttributesV1 { // Storage for Token Attribute Definitions mapping(uint256 => DynamicAttributesV1) private _tokenAttributesDefinitions; uint64[] private _tokenTypeIds; uint256 private immutable _maxNumberOfTypes; constructor(uint256 __maxNumberOfTypes) { _maxNumberOfTypes = __maxNumberOfTypes; _injectDefinitions(_getInitialDefinitions()); } function _injectDefinitions(DynamicAttributesV1[] memory __tokenAttributesDefinition) internal virtual { uint256 idx; for (idx; idx < __tokenAttributesDefinition.length; ) { DynamicAttributesV1 memory current = __tokenAttributesDefinition[idx]; _createTokenType(current); unchecked { ++idx; } } } function _getInitialDefinitions() internal virtual returns (DynamicAttributesV1[] memory); function getTokenAttributesDefinition(uint256 tokenType) external view returns (DynamicAttributesV1 memory) { return _getTokenAttributesDefinition(tokenType); } function _getTokenAttributesDefinition(uint256 tokenType) internal view returns (DynamicAttributesV1 memory) { return _tokenAttributesDefinitions[tokenType]; } function getTokenTypeIds() external view returns (uint64[] memory) { return _getTokenTypeIds(); } function _getTokenTypeIds() internal view returns (uint64[] memory) { return _tokenTypeIds; } function _createTokenType(DynamicAttributesV1 memory tokenAttributes) internal { uint256 tokenType = tokenAttributes.tokenType; if (tokenType == 0) revert NullTokenType(); if (_tokenAttributesDefinitions[tokenType].tokenType > 0) revert TokenTypeAlreadyCreated(); if (_maxNumberOfTypes > 0 && _tokenTypeIds.length + 1 > _maxNumberOfTypes) revert TokenTypeCountExceeded(); _tokenAttributesDefinitions[tokenType] = tokenAttributes; _tokenTypeIds.push(uint64(tokenType)); } function _updateTokenType(DynamicAttributesV1 memory tokenAttributes) internal { if (_tokenAttributesDefinitions[tokenAttributes.tokenType].tokenType == 0) revert TokenAttributesDefinitionDoesNotExist(); _tokenAttributesDefinitions[tokenAttributes.tokenType] = tokenAttributes; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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) { // 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. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 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 + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @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); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(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) { 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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; // NFTC Prerelease Contracts import '@nftculture/nftc-contracts-private/contracts/access/v2/OwnableDeferralResolution.sol'; import '@nftculture/nftc-contracts-private/contracts/metadata/v1/interfaces/IChainNativeMetadataProducer.sol'; import '@nftculture/nftc-contracts-private/contracts/metadata/v1/SimpleChainNativeArtConsumer.sol'; import '@nftculture/nftc-contracts-private/contracts/metadata/v1/CollectionMetadataManager.sol'; /** * @title PixelPioneerMetadataBase * @author @NiftyMike | @NFTCulture * @dev Basic On-Chain Metadata Implementation. */ abstract contract PixelPioneerMetadataBase is CollectionMetadataManager, SimpleChainNativeArtConsumer, IChainNativeMetadataProducer, OwnableDeferralResolution { function getTokenTypeForToken(uint256 tokenId) external pure override returns (uint256) { return tokenId + 1; // Token types are 1-index based. } function getJsonAsString(uint256 tokenId, uint256 tokenType) external view override returns (string memory) { return _getMetadataJson(tokenId, tokenType); } function getJsonAsEncodedString(uint256 tokenId, uint256 tokenType) external view override returns (string memory) { return _convertJsonToEncodedString(_getMetadataJson(tokenId, tokenType)); } function _getImageFieldValue(uint256 tokenType) internal view override returns (string memory) { return _getProducer().getArtAsString(tokenType); } function _getAnimationFieldValue(uint256 tokenType) internal view override returns (string memory) { return _getProducer().getAnimationAsString(tokenType); } }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CallerIsNotOwner","type":"error"},{"inputs":[],"name":"NullTokenType","type":"error"},{"inputs":[],"name":"TokenTypeAlreadyCreated","type":"error"},{"inputs":[],"name":"TokenTypeCountExceeded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getJsonAsEncodedString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getJsonAsString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getTokenAttributesDefinition","outputs":[{"components":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"bool","name":"isSerialized","type":"bool"},{"internalType":"bool","name":"isAnimated","type":"bool"},{"internalType":"bool","name":"hasTokenDescription","type":"bool"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"tokenDescription","type":"string"},{"internalType":"string[]","name":"attributeNames","type":"string[]"},{"internalType":"string[]","name":"attributeValues","type":"string[]"}],"internalType":"struct IDynamicAttributesV1.DynamicAttributesV1","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTypeForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getTokenTypeIds","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"__description","type":"string"},{"internalType":"string","name":"__external_url","type":"string"}],"name":"modifyCollectionMetadata","outputs":[],"stateMutability":"nonpayable","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":"address","name":"__artProducer","type":"address"}],"name":"setProducer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040805160208082018352600082528251808401909352601783527f68747470733a2f2f7777772e686172696e672e636f6d2f0000000000000000009083015260056080819052738abc21a84992b8c50c086d5133d6b428b8fc74399290620000846200007e620000c8565b62000d8e565b50620000903362000ddb565b60036200009e838262001195565b506004620000ad828262001195565b505050620000c18162000e2d60201b60201c565b5062001457565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081620000e4579050509050604051806040016040528060068152602001651054951254d560d21b8152508160008151811062000131576200013162001261565b6020026020010181905250604051806040016040528060088152602001672627a1a0aa24a7a760c11b8152508160018151811062000173576200017362001261565b6020026020010181905250604051806040016040528060048152602001632ca2a0a960e11b81525081600281518110620001b157620001b162001261565b60200260200101819052506040518060400160405280600c81526020016b46494c4520464f524d41545360a01b81525081600381518110620001f757620001f762001261565b602090810291909101015260408051600480825260a08201909252600091816020015b60608152602001906001900390816200021a5790505090506040518060400160405280600c81526020016b4b6569746820486172696e6760a01b815250816000815181106200026d576200026d62001261565b602002602001018190525060405180604001604052806017815260200160008051602062002f7483398151915281525081600181518110620002b357620002b362001261565b6020026020010181905250604051806040016040528060048152602001633139383760e01b81525081600281518110620002f157620002f162001261565b60200260200101819052506040518060400160405280600e81526020016d504943542c20504e472c2053564760901b8152508160038151811062000339576200033962001261565b602090810291909101015260408051600480825260a08201909252600091816020015b60608152602001906001900390816200035c5790505090506040518060400160405280600c81526020016b4b6569746820486172696e6760a01b81525081600081518110620003af57620003af62001261565b602002602001018190525060405180604001604052806017815260200160008051602062002f7483398151915281525081600181518110620003f557620003f562001261565b6020026020010181905250604051806040016040528060048152602001633139383760e01b8152508160028151811062000433576200043362001261565b60200260200101819052506040518060400160405280600e81526020016d504943542c20504e472c2053564760901b815250816003815181106200047b576200047b62001261565b602090810291909101015260408051600480825260a08201909252600091816020015b60608152602001906001900390816200049e5790505090506040518060400160405280600c81526020016b4b6569746820486172696e6760a01b81525081600081518110620004f157620004f162001261565b602002602001018190525060405180604001604052806017815260200160008051602062002f748339815191528152508160018151811062000537576200053762001261565b6020026020010181905250604051806040016040528060048152602001633139383760e01b8152508160028151811062000575576200057562001261565b60200260200101819052506040518060400160405280600e81526020016d504943542c20504e472c2053564760901b81525081600381518110620005bd57620005bd62001261565b602090810291909101015260408051600480825260a08201909252600091816020015b6060815260200190600190039081620005e05790505090506040518060400160405280600c81526020016b4b6569746820486172696e6760a01b8152508160008151811062000633576200063362001261565b602002602001018190525060405180604001604052806017815260200160008051602062002f748339815191528152508160018151811062000679576200067962001261565b6020026020010181905250604051806040016040528060048152602001633139383760e01b81525081600281518110620006b757620006b762001261565b60200260200101819052506040518060400160405280600e81526020016d504943542c20504e472c2053564760901b81525081600381518110620006ff57620006ff62001261565b602090810291909101015260408051600480825260a08201909252600091816020015b6060815260200190600190039081620007225790505090506040518060400160405280600c81526020016b4b6569746820486172696e6760a01b8152508160008151811062000775576200077562001261565b602002602001018190525060405180604001604052806017815260200160008051602062002f7483398151915281525081600181518110620007bb57620007bb62001261565b6020026020010181905250604051806040016040528060048152602001633139383760e01b81525081600281518110620007f957620007f962001261565b60200260200101819052506040518060400160405280600e81526020016d504943542c20504e472c2053564760901b8152508160038151811062000841576200084162001261565b602090810291909101015260408051600580825260c08201909252600091816020015b620008b360405180610100016040528060008152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908162000864579050509050604051806101000160405280600181526020016000151581526020016000151581526020016001151581526020016040518060400160405280601981526020017f556e7469746c65642028417072696c2031342c2031393837290000000000000081525081526020016040518061020001604052806101db815260200162002d246101db913960405180608001604052806055815260200162002f1f605591396040516020016200097c929190620012a9565b60405160208183030381529060405281526020018881526020018781525081600081518110620009b057620009b062001261565b6020026020010181905250604051806101000160405280600281526020016000151581526020016000151581526020016001151581526020016040518060400160405280601c81526020017f556e7469746c65642023312028417072696c2031362c2031393837290000000081525081526020016040518061020001604052806101db815260200162002d246101db913960405180608001604052806055815260200162002f1f6055913960405160200162000a6e929190620012f7565b6040516020818303038152906040528152602001888152602001868152508160018151811062000aa25762000aa262001261565b6020026020010181905250604051806101000160405280600381526020016000151581526020016000151581526020016001151581526020016040518060400160405280601c81526020017f556e7469746c65642023322028417072696c2031362c2031393837290000000081525081526020016040518061020001604052806101db815260200162002d246101db913960405180608001604052806055815260200162002f1f6055913960405160200162000b6092919062001345565b6040516020818303038152906040528152602001888152602001858152508160028151811062000b945762000b9462001261565b6020026020010181905250604051806101000160405280600481526020016000151581526020016000151581526020016001151581526020016040518060400160405280601681526020017f556e7469746c6564202846656220322c2031393837290000000000000000000081525081526020016040518061020001604052806101db815260200162002d246101db913960405180608001604052806055815260200162002f1f6055913960405160200162000c5292919062001393565b6040516020818303038152906040528152602001888152602001848152508160038151811062000c865762000c8662001261565b6020026020010181905250604051806101000160405280600581526020016000151581526020016000151581526020016001151581526020016040518060400160405280601681526020017f556e7469746c6564202846656220332c2031393837290000000000000000000081525081526020016040518061020001604052806101db815260200162002d246101db913960405180608001604052806055815260200162002f1f6055913960405160200162000d44929190620013e1565b6040516020818303038152906040528152602001888152602001838152508160048151811062000d785762000d7862001261565b6020908102919091010152979650505050505050565b60005b815181101562000dd757600082828151811062000db25762000db262001261565b6020026020010151905062000dcd8162000e5c60201b60201c565b5060010162000d91565b5050565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0381161562000e5957600580546001600160a01b0319166001600160a01b0383161790555b50565b8051600081900362000e815760405163cc4ccb6b60e01b815260040160405180910390fd5b6000818152602081905260409020541562000eaf5760405163858c1d2960e01b815260040160405180910390fd5b600060805111801562000ed157506080516001805462000ecf916200142f565b115b1562000ef0576040516327998acb60e11b815260040160405180910390fd5b6000818152602081815260409182902084518155908401516001820180549386015160608701511515620100000262ff0000199115156101000261ff00199415159490941661ffff19909616959095179290921791909116929092179091556080830151839190600282019062000f68908262001195565b5060a0820151600382019062000f7f908262001195565b5060c0820151805162000f9d91600484019160209091019062001022565b5060e0820151805162000fbb91600584019160209091019062001022565b50506001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf66004820401805460039092166008026101000a6001600160401b03818102199093169490921691909102929092179091555050565b8280548282559060005260206000209081019282156200106d579160200282015b828111156200106d57825182906200105c908262001195565b509160200191906001019062001043565b506200107b9291506200107f565b5090565b808211156200107b576000620010968282620010a0565b506001016200107f565b508054620010ae9062001106565b6000825580601f10620010bf575050565b601f01602090049060005260206000209081019062000e5991905b808211156200107b5760008155600101620010da565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200111b57607f821691505b6020821081036200113c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200119057600081815260208120601f850160051c810160208610156200116b5750805b601f850160051c820191505b818110156200118c5782815560010162001177565b5050505b505050565b81516001600160401b03811115620011b157620011b1620010f0565b620011c981620011c2845462001106565b8462001142565b602080601f831160018114620012015760008415620011e85750858301515b600019600386901b1c1916600185901b1785556200118c565b600085815260208120601f198616915b82811015620012325788860151825594840194600190910190840162001211565b5085821015620012515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b6000815160005b818110156200129a57602081850181015186830152016200127e565b50600093019283525090919050565b6000620012b7828562001277565b60008051602062002eff8339815191528152620012d8601682018562001277565b6c3f746f6b656e547970653d312960981b8152600d0195945050505050565b600062001305828562001277565b60008051602062002eff833981519152815262001326601682018562001277565b6c3f746f6b656e547970653d322960981b8152600d0195945050505050565b600062001353828562001277565b60008051602062002eff833981519152815262001374601682018562001277565b6c3f746f6b656e547970653d332960981b8152600d0195945050505050565b6000620013a1828562001277565b60008051602062002eff8339815191528152620013c2601682018562001277565b6c3f746f6b656e547970653d342960981b8152600d0195945050505050565b6000620013ef828562001277565b60008051602062002eff833981519152815262001410601682018562001277565b6c3f746f6b656e547970653d352960981b8152600d0195945050505050565b808201808211156200145157634e487b7160e01b600052601160045260246000fd5b92915050565b6080516118b462001470600039600050506118b46000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806385e936fd11610076578063d9ca83081161005b578063d9ca83081461016c578063df9329ad1461017f578063f2fde38b146101a057600080fd5b806385e936fd1461013e5780638da5cb5b1461015157600080fd5b806334143d28116100a757806334143d28146101015780636325520614610116578063715018a61461013657600080fd5b80630c418e4d146100c35780632b38bafc146100ec575b600080fd5b6100d66100d1366004610f8d565b6101b3565b6040516100e3919061104e565b60405180910390f35b6100ff6100fa366004611109565b610210565b005b610109610224565b6040516100e39190611132565b610129610124366004611180565b610233565b6040516100e391906111a2565b6100ff61024e565b6100ff61014c3660046111fe565b610262565b6002546040516001600160a01b0390911681526020016100e3565b61012961017a366004611180565b61029a565b61019261018d366004610f8d565b6102a6565b6040519081526020016100e3565b6100ff6101ae366004611109565b6102b3565b61020160405180610100016040528060008152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b61020a82610345565b92915050565b6102186106c4565b61022181610708565b50565b606061022e610744565b905090565b606061024761024284846107d0565b6107dc565b9392505050565b61025661080d565b6102606000610867565b565b61026a6106c4565b821561027f57600361027d848683611309565b505b8015610294576004610292828483611309565b505b50505050565b606061024783836107d0565b600061020a8260016113df565b6102bb61080d565b6001600160a01b03811661033c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61022181610867565b61039360405180610100016040528060008152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b600082815260208181526040918290208251610100808201855282548252600183015460ff808216151595840195909552908104841615159482019490945262010000909304909116151560608301526002810180546080840191906103f890611280565b80601f016020809104026020016040519081016040528092919081815260200182805461042490611280565b80156104715780601f1061044657610100808354040283529160200191610471565b820191906000526020600020905b81548152906001019060200180831161045457829003601f168201915b5050505050815260200160038201805461048a90611280565b80601f01602080910402602001604051908101604052809291908181526020018280546104b690611280565b80156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156105dd57838290600052602060002001805461055090611280565b80601f016020809104026020016040519081016040528092919081815260200182805461057c90611280565b80156105c95780601f1061059e576101008083540402835291602001916105c9565b820191906000526020600020905b8154815290600101906020018083116105ac57829003601f168201915b505050505081526020019060010190610531565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156106b657838290600052602060002001805461062990611280565b80601f016020809104026020016040519081016040528092919081815260200182805461065590611280565b80156106a25780601f10610677576101008083540402835291602001916106a2565b820191906000526020600020905b81548152906001019060200180831161068557829003601f168201915b50505050508152602001906001019061060a565b505050915250909392505050565b6002546001600160a01b03163314610260576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381161561022157600580546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b606060018054806020026020016040519081016040528092919081815260200182805480156107c657602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116107815790505b5050505050905090565b606061024783836108c6565b60606107e782610abb565b6040516020016107f7919061140e565b6040516020818303038152906040529050919050565b6002546001600160a01b031633146102605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610333565b600280546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060006108d383610345565b80519091506109245760405162461bcd60e51b815260206004820152601260248201527f496e76616c696420746f6b656e207479706500000000000000000000000000006044820152606401610333565b600061092f84610c0e565b9050600061093c85610c94565b905082608001518360200151610961576040518060200160405280600081525061096a565b61096a87610cd5565b8460600151610a03576003805461098090611280565b80601f01602080910402602001604051908101604052809291908181526020018280546109ac90611280565b80156109f95780601f106109ce576101008083540402835291602001916109f9565b820191906000526020600020905b8154815290600101906020018083116109dc57829003601f168201915b5050505050610a09565b8460a001515b848660400151610a285760405180602001604052806000815250610a5f565b6040518060400160405280601381526020017f222c22616e696d6174696f6e5f75726c223a22000000000000000000000000008152505b8760400151610a7d5760405180602001604052806000815250610a7f565b855b610a8889610d75565b6004604051602001610aa19897969594939291906114c6565b604051602081830303815290604052935050505092915050565b60608151600003610ada57505060408051602081019091526000815290565b600060405180606001604052806040815260200161183f6040913990506000600384516002610b0991906113df565b610b13919061162e565b610b1e906004611650565b67ffffffffffffffff811115610b3657610b3661126a565b6040519080825280601f01601f191660200182016040528015610b60576020820181803683370190505b509050600182016020820185865187015b80821015610bcc576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250610b71565b5050600386510660018114610be85760028114610bfb57610c03565b603d6001830353603d6002830353610c03565b603d60018303535b509195945050505050565b6060610c226005546001600160a01b031690565b6001600160a01b031663e440e154836040518263ffffffff1660e01b8152600401610c4f91815260200190565b600060405180830381865afa158015610c6c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261020a9190810190611667565b6060610ca86005546001600160a01b031690565b6001600160a01b0316631b4bcfca836040518263ffffffff1660e01b8152600401610c4f91815260200190565b60606000610ce283610eab565b600101905060008167ffffffffffffffff811115610d0257610d0261126a565b6040519080825280601f01601f191660200182016040528015610d2c576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610d3657509392505050565b60408051808201909152600181527f5b00000000000000000000000000000000000000000000000000000000000000602082015260609060005b8360c0015151811015610e8257818115610dfe576040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250610e0f565b604051806020016040528060008152505b8560c001518381518110610e2557610e25611714565b60200260200101518660e001518481518110610e4357610e43611714565b6020026020010151604051602001610e5e949392919061172a565b60405160208183030381529060405291508080610e7a906117e4565b915050610daf565b81604051602001610e9391906117fd565b60405160208183030381529060405292505050919050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610ef4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310610f20576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610f3e57662386f26fc10000830492506010015b6305f5e1008310610f56576305f5e100830492506008015b6127108310610f6a57612710830492506004015b60648310610f7c576064830492506002015b600a831061020a5760010192915050565b600060208284031215610f9f57600080fd5b5035919050565b60005b83811015610fc1578181015183820152602001610fa9565b50506000910152565b60008151808452610fe2816020860160208601610fa6565b601f01601f19169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b8481101561104157601f1986840301895261102f838351610fca565b98840198925090830190600101611013565b5090979650505050505050565b60208152815160208201526000602083015161106e604084018215159052565b506040830151801515606084015250606083015180151560808401525060808301516101008060a08501526110a7610120850183610fca565b915060a0850151601f19808685030160c08701526110c58483610fca565b935060c08701519150808685030160e08701526110e28483610ff6565b935060e08701519150808685030183870152506110ff8382610ff6565b9695505050505050565b60006020828403121561111b57600080fd5b81356001600160a01b038116811461024757600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561117457835167ffffffffffffffff168352928401929184019160010161114e565b50909695505050505050565b6000806040838503121561119357600080fd5b50508035926020909101359150565b6020815260006102476020830184610fca565b60008083601f8401126111c757600080fd5b50813567ffffffffffffffff8111156111df57600080fd5b6020830191508360208285010111156111f757600080fd5b9250929050565b6000806000806040858703121561121457600080fd5b843567ffffffffffffffff8082111561122c57600080fd5b611238888389016111b5565b9096509450602087013591508082111561125157600080fd5b5061125e878288016111b5565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061129457607f821691505b6020821081036112b457634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561130457600081815260208120601f850160051c810160208610156112e15750805b601f850160051c820191505b81811015611300578281556001016112ed565b5050505b505050565b67ffffffffffffffff8311156113215761132161126a565b6113358361132f8354611280565b836112ba565b6000601f84116001811461136957600085156113515750838201355b600019600387901b1c1916600186901b178355610292565b600083815260209020601f19861690835b8281101561139a578685013582556020948501946001909201910161137a565b50868210156113b75760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561020a5761020a6113c9565b60008151611404818560208601610fa6565b9290920192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161144681601d850160208701610fa6565b91909101601d0192915050565b6000815461146081611280565b60018281168015611478576001811461148d576114bc565b60ff19841687528215158302870194506114bc565b8560005260208060002060005b858110156114b35781548a82015290840190820161149a565b50505082870194505b5050505092915050565b7f7b226e616d65223a2200000000000000000000000000000000000000000000008152600089516114fe816009850160208e01610fa6565b895190830190611515816009840160208e01610fa6565b7f222c226465736372697074696f6e223a2200000000000000000000000000000060099290910191820152885161155381601a840160208d01610fa6565b7f222c22696d616765223a22000000000000000000000000000000000000000000601a92909101918201528751611591816025840160208c01610fa6565b6115a96115a36025838501018a6113f2565b886113f2565b9150506115d5817f222c2261747472696275746573223a00000000000000000000000000000000009052565b6115e2600f8201866113f2565b7f2c2265787465726e616c5f75726c223a22000000000000000000000000000000815290506116146011820185611453565b61227d60f01b81526002019b9a5050505050505050505050565b60008261164b57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761020a5761020a6113c9565b60006020828403121561167957600080fd5b815167ffffffffffffffff8082111561169157600080fd5b818401915084601f8301126116a557600080fd5b8151818111156116b7576116b761126a565b604051601f8201601f19908116603f011681019083821181831017156116df576116df61126a565b816040528281528760208487010111156116f857600080fd5b611709836020830160208801610fa6565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b6000855161173c818460208a01610fa6565b855190830190611750818360208a01610fa6565b7f7b2274726169745f74797065223a2200000000000000000000000000000000009101908152845161178981600f840160208901610fa6565b7f222c2276616c7565223a22000000000000000000000000000000000000000000600f929091019182015283516117c781601a840160208801610fa6565b61227d60f01b601a9290910191820152601c019695505050505050565b6000600182016117f6576117f66113c9565b5060010190565b6000825161180f818460208701610fa6565b7f5d0000000000000000000000000000000000000000000000000000000000000092019182525060010191905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212204987f49982f4817c67d7e0f26e8a6fc6383e049b42cebcfbc234d5d7c5f74e7b64736f6c634300081300334b6569746820486172696e673a20506978656c2050696f6e65657220736572696573206f6e65206f66206669766520756e69717565206469676974616c2064726177696e67732063726561746564206f6e20616e20416d69676120636f6d707574657220696e20746865206d69642d31393830732e20546f2061636375726174656c7920707265736572766520746865206e61746976656c79206469676974616c206d6174657269616c2063726561746564206f6e2061206e6f772d76696e7461676520636f6d70757465722073797374656d20746865204b6569746820486172696e6720466f756e646174696f6e20686173206d696e746564207468657365206669766520416d69676120617274776f726b73202d2070726576696f75736c79206f6e6c79207669657761626c652076696120666c6f707079206469736b73202d206f6e2074686520457468657265756d20626c6f636b636861696e2e205b4b6569746820486172696e6720466f756e646174696f6e5d2868747470733a2f2f7777772e686172696e672e636f6d2f29207c205b4e4654204f776e657273686970204c6963656e73655d2868747470733a2f2f7777772e686172696e672e636f6d2f212f6e66742d6f776e6572736869702d6c6963656e736529207c205b566965772046756c6c2053637265656e5d280000000000000000000068747470733a2f2f6e6674632d6d656469612e6d7970696e6174612e636c6f75642f697066732f516d5455515a443377784e5a32336d51396b36396d57515533654e6d4d67334b66336431646a43697734355555654e657720596f726b20436974792c204e657720596f726b000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100be5760003560e01c806385e936fd11610076578063d9ca83081161005b578063d9ca83081461016c578063df9329ad1461017f578063f2fde38b146101a057600080fd5b806385e936fd1461013e5780638da5cb5b1461015157600080fd5b806334143d28116100a757806334143d28146101015780636325520614610116578063715018a61461013657600080fd5b80630c418e4d146100c35780632b38bafc146100ec575b600080fd5b6100d66100d1366004610f8d565b6101b3565b6040516100e3919061104e565b60405180910390f35b6100ff6100fa366004611109565b610210565b005b610109610224565b6040516100e39190611132565b610129610124366004611180565b610233565b6040516100e391906111a2565b6100ff61024e565b6100ff61014c3660046111fe565b610262565b6002546040516001600160a01b0390911681526020016100e3565b61012961017a366004611180565b61029a565b61019261018d366004610f8d565b6102a6565b6040519081526020016100e3565b6100ff6101ae366004611109565b6102b3565b61020160405180610100016040528060008152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b61020a82610345565b92915050565b6102186106c4565b61022181610708565b50565b606061022e610744565b905090565b606061024761024284846107d0565b6107dc565b9392505050565b61025661080d565b6102606000610867565b565b61026a6106c4565b821561027f57600361027d848683611309565b505b8015610294576004610292828483611309565b505b50505050565b606061024783836107d0565b600061020a8260016113df565b6102bb61080d565b6001600160a01b03811661033c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61022181610867565b61039360405180610100016040528060008152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b600082815260208181526040918290208251610100808201855282548252600183015460ff808216151595840195909552908104841615159482019490945262010000909304909116151560608301526002810180546080840191906103f890611280565b80601f016020809104026020016040519081016040528092919081815260200182805461042490611280565b80156104715780601f1061044657610100808354040283529160200191610471565b820191906000526020600020905b81548152906001019060200180831161045457829003601f168201915b5050505050815260200160038201805461048a90611280565b80601f01602080910402602001604051908101604052809291908181526020018280546104b690611280565b80156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156105dd57838290600052602060002001805461055090611280565b80601f016020809104026020016040519081016040528092919081815260200182805461057c90611280565b80156105c95780601f1061059e576101008083540402835291602001916105c9565b820191906000526020600020905b8154815290600101906020018083116105ac57829003601f168201915b505050505081526020019060010190610531565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156106b657838290600052602060002001805461062990611280565b80601f016020809104026020016040519081016040528092919081815260200182805461065590611280565b80156106a25780601f10610677576101008083540402835291602001916106a2565b820191906000526020600020905b81548152906001019060200180831161068557829003601f168201915b50505050508152602001906001019061060a565b505050915250909392505050565b6002546001600160a01b03163314610260576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381161561022157600580546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b606060018054806020026020016040519081016040528092919081815260200182805480156107c657602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116107815790505b5050505050905090565b606061024783836108c6565b60606107e782610abb565b6040516020016107f7919061140e565b6040516020818303038152906040529050919050565b6002546001600160a01b031633146102605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610333565b600280546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060006108d383610345565b80519091506109245760405162461bcd60e51b815260206004820152601260248201527f496e76616c696420746f6b656e207479706500000000000000000000000000006044820152606401610333565b600061092f84610c0e565b9050600061093c85610c94565b905082608001518360200151610961576040518060200160405280600081525061096a565b61096a87610cd5565b8460600151610a03576003805461098090611280565b80601f01602080910402602001604051908101604052809291908181526020018280546109ac90611280565b80156109f95780601f106109ce576101008083540402835291602001916109f9565b820191906000526020600020905b8154815290600101906020018083116109dc57829003601f168201915b5050505050610a09565b8460a001515b848660400151610a285760405180602001604052806000815250610a5f565b6040518060400160405280601381526020017f222c22616e696d6174696f6e5f75726c223a22000000000000000000000000008152505b8760400151610a7d5760405180602001604052806000815250610a7f565b855b610a8889610d75565b6004604051602001610aa19897969594939291906114c6565b604051602081830303815290604052935050505092915050565b60608151600003610ada57505060408051602081019091526000815290565b600060405180606001604052806040815260200161183f6040913990506000600384516002610b0991906113df565b610b13919061162e565b610b1e906004611650565b67ffffffffffffffff811115610b3657610b3661126a565b6040519080825280601f01601f191660200182016040528015610b60576020820181803683370190505b509050600182016020820185865187015b80821015610bcc576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250610b71565b5050600386510660018114610be85760028114610bfb57610c03565b603d6001830353603d6002830353610c03565b603d60018303535b509195945050505050565b6060610c226005546001600160a01b031690565b6001600160a01b031663e440e154836040518263ffffffff1660e01b8152600401610c4f91815260200190565b600060405180830381865afa158015610c6c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261020a9190810190611667565b6060610ca86005546001600160a01b031690565b6001600160a01b0316631b4bcfca836040518263ffffffff1660e01b8152600401610c4f91815260200190565b60606000610ce283610eab565b600101905060008167ffffffffffffffff811115610d0257610d0261126a565b6040519080825280601f01601f191660200182016040528015610d2c576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610d3657509392505050565b60408051808201909152600181527f5b00000000000000000000000000000000000000000000000000000000000000602082015260609060005b8360c0015151811015610e8257818115610dfe576040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250610e0f565b604051806020016040528060008152505b8560c001518381518110610e2557610e25611714565b60200260200101518660e001518481518110610e4357610e43611714565b6020026020010151604051602001610e5e949392919061172a565b60405160208183030381529060405291508080610e7a906117e4565b915050610daf565b81604051602001610e9391906117fd565b60405160208183030381529060405292505050919050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610ef4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310610f20576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610f3e57662386f26fc10000830492506010015b6305f5e1008310610f56576305f5e100830492506008015b6127108310610f6a57612710830492506004015b60648310610f7c576064830492506002015b600a831061020a5760010192915050565b600060208284031215610f9f57600080fd5b5035919050565b60005b83811015610fc1578181015183820152602001610fa9565b50506000910152565b60008151808452610fe2816020860160208601610fa6565b601f01601f19169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b8481101561104157601f1986840301895261102f838351610fca565b98840198925090830190600101611013565b5090979650505050505050565b60208152815160208201526000602083015161106e604084018215159052565b506040830151801515606084015250606083015180151560808401525060808301516101008060a08501526110a7610120850183610fca565b915060a0850151601f19808685030160c08701526110c58483610fca565b935060c08701519150808685030160e08701526110e28483610ff6565b935060e08701519150808685030183870152506110ff8382610ff6565b9695505050505050565b60006020828403121561111b57600080fd5b81356001600160a01b038116811461024757600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561117457835167ffffffffffffffff168352928401929184019160010161114e565b50909695505050505050565b6000806040838503121561119357600080fd5b50508035926020909101359150565b6020815260006102476020830184610fca565b60008083601f8401126111c757600080fd5b50813567ffffffffffffffff8111156111df57600080fd5b6020830191508360208285010111156111f757600080fd5b9250929050565b6000806000806040858703121561121457600080fd5b843567ffffffffffffffff8082111561122c57600080fd5b611238888389016111b5565b9096509450602087013591508082111561125157600080fd5b5061125e878288016111b5565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061129457607f821691505b6020821081036112b457634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561130457600081815260208120601f850160051c810160208610156112e15750805b601f850160051c820191505b81811015611300578281556001016112ed565b5050505b505050565b67ffffffffffffffff8311156113215761132161126a565b6113358361132f8354611280565b836112ba565b6000601f84116001811461136957600085156113515750838201355b600019600387901b1c1916600186901b178355610292565b600083815260209020601f19861690835b8281101561139a578685013582556020948501946001909201910161137a565b50868210156113b75760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561020a5761020a6113c9565b60008151611404818560208601610fa6565b9290920192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161144681601d850160208701610fa6565b91909101601d0192915050565b6000815461146081611280565b60018281168015611478576001811461148d576114bc565b60ff19841687528215158302870194506114bc565b8560005260208060002060005b858110156114b35781548a82015290840190820161149a565b50505082870194505b5050505092915050565b7f7b226e616d65223a2200000000000000000000000000000000000000000000008152600089516114fe816009850160208e01610fa6565b895190830190611515816009840160208e01610fa6565b7f222c226465736372697074696f6e223a2200000000000000000000000000000060099290910191820152885161155381601a840160208d01610fa6565b7f222c22696d616765223a22000000000000000000000000000000000000000000601a92909101918201528751611591816025840160208c01610fa6565b6115a96115a36025838501018a6113f2565b886113f2565b9150506115d5817f222c2261747472696275746573223a00000000000000000000000000000000009052565b6115e2600f8201866113f2565b7f2c2265787465726e616c5f75726c223a22000000000000000000000000000000815290506116146011820185611453565b61227d60f01b81526002019b9a5050505050505050505050565b60008261164b57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761020a5761020a6113c9565b60006020828403121561167957600080fd5b815167ffffffffffffffff8082111561169157600080fd5b818401915084601f8301126116a557600080fd5b8151818111156116b7576116b761126a565b604051601f8201601f19908116603f011681019083821181831017156116df576116df61126a565b816040528281528760208487010111156116f857600080fd5b611709836020830160208801610fa6565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b6000855161173c818460208a01610fa6565b855190830190611750818360208a01610fa6565b7f7b2274726169745f74797065223a2200000000000000000000000000000000009101908152845161178981600f840160208901610fa6565b7f222c2276616c7565223a22000000000000000000000000000000000000000000600f929091019182015283516117c781601a840160208801610fa6565b61227d60f01b601a9290910191820152601c019695505050505050565b6000600182016117f6576117f66113c9565b5060010190565b6000825161180f818460208701610fa6565b7f5d0000000000000000000000000000000000000000000000000000000000000092019182525060010191905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212204987f49982f4817c67d7e0f26e8a6fc6383e049b42cebcfbc234d5d7c5f74e7b64736f6c63430008130033
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.