Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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 | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.