Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 8 from a total of 8 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Svg Renderer | 18094311 | 882 days ago | IN | 0 ETH | 0.00040236 | ||||
| Set Archival Met... | 18045717 | 889 days ago | IN | 0 ETH | 0.00758733 | ||||
| Create Art Piece | 18045704 | 889 days ago | IN | 0 ETH | 0.03962789 | ||||
| Create Art Piece | 18045703 | 889 days ago | IN | 0 ETH | 0.03268898 | ||||
| Create Art Piece | 18045702 | 889 days ago | IN | 0 ETH | 0.02994135 | ||||
| Create Art Piece | 18045701 | 889 days ago | IN | 0 ETH | 0.05089811 | ||||
| Create Art Piece | 18045700 | 889 days ago | IN | 0 ETH | 0.05760827 | ||||
| Set Svg Renderer | 18045685 | 889 days ago | IN | 0 ETH | 0.00045226 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PixelPioneerArtwork
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 './PixelPioneerArtworkBase.sol';
/**
* @title PixelPioneerArtwork .
* .+.
* -: .: :+.
* -- :=. :+ -= . .. .:-:
* .+. -- :+ =- .:. :++-. .++=: .. :==:-++==:
* =- .=: := +. -=::.:. -. .==..+=-+= =+:+-.=====: -+: =+:.-+.
* =-:=- :. ==----+ :+ =+:.-+- .. ++..++++: =++=-+: -+: .++=--=++=-++.
* -=--==-. :. +-::.=- +- .=-+:=::+. -+= .:-. =+. .+= :+=.=+: -+: +=:::=+..-+:
* -- .-- .+. .+: ==-=: -+: ===:.======-::+- =+. :+: =+:-+- :+= .+= .+--+-.
* .- .+. :+. :. :+. .- . .-=-. =+. :==-=+=:.
* +: .+ :- .. ..
*
* On-Chain Artwork
*/
contract PixelPioneerArtwork is PixelPioneerArtworkBase {
uint256 private constant maxNumberOfArtPieces = 5; // Capped at 5 total pieces.
constructor() ArtDatastoreManager(maxNumberOfArtPieces) {
// Implementation version: v1.0.0
}
}// 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;
// Local References
import '../../access/v2/OwnableDeferral.sol';
import './interfaces/IDynamicArt.sol';
// Error Codes
error ArtPieceCountExceeded();
error ArtPieceDoesNotExist();
error ArtPieceAlreadyCreated();
error NullTokenType();
/**
* @title ArtDatastoreManager
* @author @NiftyMike | @NFTCulture
* @dev A class for managing the datastore that holds Art pieces as either strings or bytes.
*/
abstract contract ArtDatastoreManager is IDynamicArtV1, OwnableDeferral {
// Storage for Token Attribute Definitions
mapping(uint256 => DynamicArtV1) private _artObjects;
uint64[] private _artPieceTokenTypes;
uint256 private immutable _maxNumberOfArtPieces;
constructor(uint256 __maxNumberOfArtPieces) {
_maxNumberOfArtPieces = __maxNumberOfArtPieces;
}
function createArtPieces(
uint256[] calldata tokenTypes,
string[] calldata stringAssets,
string[] calldata backgrounds,
bytes[] calldata bytesAssets
) external isOwner {
require(
tokenTypes.length == stringAssets.length &&
tokenTypes.length == backgrounds.length &&
tokenTypes.length == bytesAssets.length,
'Invalid number of assets'
);
uint256 idx;
for (idx = 0; idx < tokenTypes.length; idx++) {
_createArtPiece(tokenTypes[idx], stringAssets[idx], backgrounds[idx], bytesAssets[idx]);
}
}
function createArtPiece(
uint256 tokenType,
string calldata stringAsset,
string calldata backgroundColor,
bytes calldata bytesAsset
) external isOwner {
_createArtPiece(tokenType, stringAsset, backgroundColor, bytesAsset);
}
function updateArtPiece(
uint256 tokenType,
string calldata stringAsset,
string calldata backgroundColor,
bytes calldata bytesAsset
) external isOwner {
if (tokenType == 0) revert NullTokenType();
DynamicArtV1 memory current = _artObjects[tokenType];
if (current.tokenType == 0) revert ArtPieceDoesNotExist();
current.tokenType = tokenType;
if (bytes(stringAsset).length > 0) {
current.encodedArt = stringAsset;
}
if (bytes(backgroundColor).length > 0) {
current.backgroundColor = backgroundColor;
}
if (bytesAsset.length > 0) {
current.encodedArtBytes = bytesAsset;
}
_artObjects[tokenType] = current;
}
function _createArtPiece(
uint256 tokenType,
string calldata stringAsset,
string calldata backgroundColor,
bytes calldata bytesAsset
) internal {
if (tokenType == 0) revert NullTokenType();
if (_maxNumberOfArtPieces > 0 && _artPieceTokenTypes.length + 1 > _maxNumberOfArtPieces)
revert ArtPieceCountExceeded();
if (_artObjects[tokenType].tokenType > 0) revert ArtPieceAlreadyCreated();
DynamicArtV1 memory current;
current.tokenType = tokenType;
current.encodedArt = stringAsset;
current.backgroundColor = backgroundColor;
current.encodedArtBytes = bytesAsset;
_artObjects[tokenType] = current;
_artPieceTokenTypes.push(uint64(tokenType));
}
function getArtObject(uint256 tokenType) external view returns (DynamicArtV1 memory) {
return _getArtObject(tokenType);
}
function _getArtObject(uint256 tokenType) internal view returns (DynamicArtV1 memory) {
return _artObjects[tokenType];
}
function getArtPieceTokenTypes() external view returns (uint64[] memory) {
return _getArtPieceTokenTypes();
}
function _getArtPieceTokenTypes() internal view returns (uint64[] memory) {
return _artPieceTokenTypes;
}
}// 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 IDynamicArtV1
* @author @NFTMike | @NFTCulture
* @dev Interface that defines the datastructure of on-chain artwork.
*/
interface IDynamicArtV1 {
struct DynamicArtV1 {
uint256 tokenType;
string encodedArt;
string backgroundColor;
bytes encodedArtBytes;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
///////////////////////////////////////////////////////////
// ░██████╗░█████╗░██████╗░██╗██████╗░████████╗██╗░░░██╗ //
// ██╔════╝██╔══██╗██╔══██╗██║██╔══██╗╚══██╔══╝╚██╗░██╔╝ //
// ╚█████╗░██║░░╚═╝██████╔╝██║██████╔╝░░░██║░░░░╚████╔╝░ //
// ░╚═══██╗██║░░██╗██╔══██╗██║██╔═══╝░░░░██║░░░░░╚██╔╝░░ //
// ██████╔╝╚█████╔╝██║░░██║██║██║░░░░░░░░██║░░░░░░██║░░░ //
// ╚═════╝░░╚════╝░╚═╝░░╚═╝╚═╝╚═╝░░░░░░░░╚═╝░░░░░░╚═╝░░░ //
///////////////////////////////////////////////////////////
/**
* @title IScriptyStorageProvider
* @author @NiftyMike | @NFTCulture
* @dev An interface wrapper for a ScriptStorage contract, when we only need to read data from it.
* @dev Special thanks to @0xthedude and @xtremetom for providing this library.
* See: https://github.com/intartnft/scripty.sol
*/
interface IScriptyStorageProvider {
/**
* @notice Get the full script
* @param name - Name given to the script. Eg: threejs.min.js_r148
* @param data - Arbitrary data. Not used by this contract.
* @return script - Full script from merged chunks
*/
function getScript(string memory name, bytes memory data) external view returns (bytes memory script);
/**
* @notice Get script's chunk pointer list
* @param name - Name given to the script. Eg: threejs.min.js_r148
* @return pointers - List of pointers
*/
function getScriptChunkPointers(string memory name) external view returns (address[] memory pointers);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
/**
* @title ISVGConstructor
* @author @NiftyMike | @NFTCulture
* @dev A simple interface for rendering an SVG.
*/
interface ISVGConstructor {
function constructFromPNG(
bool hasBackground,
string memory backgroundColor,
string memory pngDataURI
) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
// OZ Libraries
import '@openzeppelin/contracts/utils/Base64.sol';
// Local References
import './ArtDatastoreManager.sol';
import './interfaces/ISVGConstructor.sol';
/**
* @title PNGBackedSVGArt
* @author @NiftyMike | @NFTCulture
* @dev An on-chain contract that constructs a PNG backed SVG object.
*/
abstract contract PNGBackedSVGArt is ArtDatastoreManager {
function _getSvgConstructor(uint256 tokenType) internal view virtual returns (ISVGConstructor svgConstructor);
function _getSvgDataURI(uint256 tokenType) internal view returns (string memory) {
DynamicArtV1 memory artObject = _getArtObject(tokenType);
bool hasBackground = bytes(artObject.backgroundColor).length > 0;
string memory onChainEncodedArt = _getArtObject(tokenType).encodedArt;
string memory svg = _constructSvg(
tokenType,
hasBackground,
artObject.backgroundColor,
_convertBase64PngToDataURI(onChainEncodedArt)
);
return _convertSvgToDataURI(svg);
}
function _getPngDataUri(uint256 tokenType) internal view returns (string memory) {
string memory onChainEncodedArt = _getArtObject(tokenType).encodedArt;
return _convertBase64PngToDataURI(onChainEncodedArt);
}
function _convertBase64PngToDataURI(string memory base64Png) internal pure returns (string memory) {
return string.concat('data:image/png;base64,', base64Png);
}
function _convertSvgToDataURI(string memory svg) internal pure returns (string memory) {
return string.concat('data:image/svg+xml;base64,', Base64.encode(bytes(svg)));
}
function _convertBytesToDataURI(
bytes memory artBytes,
string memory mimeType
) internal pure returns (string memory) {
return string.concat('data:', mimeType, ';base64,', Base64.encode(artBytes));
}
function _constructSvg(
uint256 tokenType,
bool hasBackground,
string memory backgroundColor,
string memory pngDataURI
) internal view virtual returns (string memory) {
return _getSvgConstructor(tokenType).constructFromPNG(hasBackground, backgroundColor, pngDataURI);
}
}// 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
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/IChainNativeArtProducer.sol';
import '@nftculture/nftc-contracts-private/contracts/metadata/v1/interfaces/IScriptyStorageProvider.sol';
import '@nftculture/nftc-contracts-private/contracts/metadata/v1/PNGBackedSVGArt.sol';
// Error Codes
error UnrecognizedExtension();
/**
* @title PixelPioneerArtworkBase
* @author @NiftyMike | @NFTCulture
* @dev This contract implements the NFTC IChainNativeArtProducer API, which means
* it contains logic to return the contents of an NFT image / animation_url field
* for a given NFT token type.
*
* In this particular implementation, the image approach is fully on-chain. The returned
* value represents a SVG that is base64 encoded. The string representation can be copy
* and pasted into a new browser tab to display the image.
*
* The SVGs constructed by this contract are backed by bitmaps stored as base64 encoded
* PNG files. The PNG files are via transactions that are sent after the contract is
* deployed. The maximum base64 string size is about 34KB, and is limited by the max block
* size of the block chain, which is around 30M gas.
*
* In theory, this same exact approach could be used with larger backing PNGs (ignoring
* cost implications), if the base64 string was chunked across multiple transactions, but
* we have no need to do that with this project.
*/
abstract contract PixelPioneerArtworkBase is PNGBackedSVGArt, IChainNativeArtProducer, OwnableDeferralResolution {
string private constant extension_iff = 'iff';
string private constant extension_pict = 'pct';
address private _svgRenderer;
struct ArchivalMetadata {
address scriptyStorageProvider;
uint256 tokenType;
string scriptName;
string extension;
}
// File extension -> tokenType (but zero indexed)
mapping(string => ArchivalMetadata[]) private _metadata;
function getArtAsString(uint256 tokenType) external view returns (string memory) {
// This project returns the SVG data as the art string.
return _getSvgDataURI(tokenType);
}
function getAnimationAsString(uint256) external pure returns (string memory) {
// This art is not animated.
return '';
}
/**
* @notice Get the Art Asset for a TokenType as an SVG encoded into a data URI.
*
* @param tokenType the token type of the art piece.
*/
function getSvgArt(uint256 tokenType) external view returns (string memory) {
return _getSvgDataURI(tokenType);
}
/**
* @notice Get the Art Asset for a TokenType as a PNG encoded into a data URI.
*
* @param tokenType the token type of the art piece.
*/
function getPngArt(uint256 tokenType) external view returns (string memory) {
return _getPngDataUri(tokenType);
}
/**
* @notice Get the Art Asset for a TokenType as a PICT data URI.
*
* Important: This will only function if the PICT files have been recovered.
*
* @param tokenType the token type of the art piece.
*/
function getPICTArt(uint256 tokenType) external view returns (string memory) {
return _getPICTDataUri(tokenType);
}
/**
* @notice Get the Art Asset for a TokenType as an IFF data URI.
*
* Important: This will only function if the IFF files have been recovered.
*
* @param tokenType the token type of the art piece.
*/
function getIFFArt(uint256 tokenType) external view returns (string memory) {
return _getIFFDataUri(tokenType);
}
/**
* @notice Get the closest source archival asset for a token.
*
* @param extension the file extension of the archival asset.
* @param tokenType the token type of the art piece.
*/
function getRawArchivalArt(string calldata extension, uint256 tokenType) external view returns (bytes memory) {
if (keccak256(abi.encodePacked(extension)) == keccak256(abi.encodePacked(extension_iff))) {
return _getIFFBytes(tokenType);
}
if (keccak256(abi.encodePacked(extension)) == keccak256(abi.encodePacked(extension_pict))) {
return _getPICTBytes(tokenType);
}
revert UnrecognizedExtension();
}
/**
* @notice Get the metadata of the source archival asset for a token.
*
* @param extension the file extension of the archival asset.
* @param tokenType the token type of the art piece.
*/
function getArchivalMetadata(
string calldata extension,
uint256 tokenType
) external view returns (ArchivalMetadata memory) {
return _metadata[extension][tokenType - 1];
}
/**
* @notice Admin function to configure the archival metadata for all tokens for a particular file extension.
*
* @param provider address of the archival data store.
* @param scriptNames the filenames that will be saved in the data store.
* @param extension the native os extension of the files that will be saved.
*/
function setArchivalMetadata(
address provider,
string[] calldata scriptNames,
string calldata extension
) external isOwner {
uint256 idx; // note, zero indexed.
for (idx; idx < scriptNames.length; idx++) {
// this is implicitly assuming tokenTypes are 1-5.
ArchivalMetadata memory metadata = ArchivalMetadata(provider, idx + 1, scriptNames[idx], extension);
_metadata[extension].push(metadata);
}
}
/**
* @notice Admin function to update the archival metadata details for a single file.
*
* @param provider address of the archival data store.
* @param tokenType the tokenType of the file.
* @param scriptName the filename that will be saved in the data store.
* @param extension the native os extension of the files that will be saved.
*/
function updateArchivalMetadata(
address provider,
uint256 tokenType,
string calldata scriptName,
string calldata extension
) external isOwner {
uint256 idx = tokenType - 1;
ArchivalMetadata memory metadata = _metadata[extension][idx];
require(metadata.tokenType == tokenType, 'invalid addressing');
_metadata[extension][idx].scriptyStorageProvider = provider;
_metadata[extension][idx].scriptName = scriptName;
_metadata[extension][idx].extension = extension;
}
/**
* @notice Admin function to clear out the entire Metadata Archive for a file extension.
*
* Important: This has no impact on the underlying datastore.
*
* @param extension the native os extension of the files that will be saved.
*/
function clearArchivalMetadata(string calldata extension) external isOwner {
ArchivalMetadata[] memory allMetadataForExtension = _metadata[extension];
require(allMetadataForExtension.length > 0, 'array is empty');
delete _metadata[extension];
}
function setSvgRenderer(address svgRenderer) external isOwner {
_svgRenderer = svgRenderer;
}
function getSvgRenderer() external view returns (address) {
return _svgRenderer;
}
function _getSvgConstructor(uint256) internal view override returns (ISVGConstructor svgConstructor) {
return ISVGConstructor(_svgRenderer);
}
function _getIFFDataUri(uint256 tokenType) internal view returns (string memory) {
bytes memory artBytes = _getIFFBytes(tokenType);
return _convertBytesToDataURI(artBytes, 'image/x-iff');
}
function _getIFFBytes(uint256 tokenType) internal view returns (bytes memory) {
uint256 idx = tokenType - 1;
ArchivalMetadata memory metadata = _metadata[extension_iff][idx];
require(metadata.tokenType == tokenType, 'IFF not configured');
IScriptyStorageProvider provider = IScriptyStorageProvider(metadata.scriptyStorageProvider);
return provider.getScript(metadata.scriptName, '');
}
function _getPICTDataUri(uint256 tokenType) internal view returns (string memory) {
bytes memory artBytes = _getPICTBytes(tokenType);
return _convertBytesToDataURI(artBytes, 'image/x-pict');
}
function _getPICTBytes(uint256 tokenType) internal view returns (bytes memory) {
uint256 idx = tokenType - 1;
ArchivalMetadata memory metadata = _metadata[extension_pict][idx];
require(metadata.tokenType == tokenType, 'PICT not configured');
IScriptyStorageProvider provider = IScriptyStorageProvider(metadata.scriptyStorageProvider);
return provider.getScript(metadata.scriptName, '');
}
}{
"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":"ArtPieceAlreadyCreated","type":"error"},{"inputs":[],"name":"ArtPieceCountExceeded","type":"error"},{"inputs":[],"name":"ArtPieceDoesNotExist","type":"error"},{"inputs":[],"name":"CallerIsNotOwner","type":"error"},{"inputs":[],"name":"NullTokenType","type":"error"},{"inputs":[],"name":"UnrecognizedExtension","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":"string","name":"extension","type":"string"}],"name":"clearArchivalMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"string","name":"stringAsset","type":"string"},{"internalType":"string","name":"backgroundColor","type":"string"},{"internalType":"bytes","name":"bytesAsset","type":"bytes"}],"name":"createArtPiece","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenTypes","type":"uint256[]"},{"internalType":"string[]","name":"stringAssets","type":"string[]"},{"internalType":"string[]","name":"backgrounds","type":"string[]"},{"internalType":"bytes[]","name":"bytesAssets","type":"bytes[]"}],"name":"createArtPieces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAnimationAsString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"extension","type":"string"},{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getArchivalMetadata","outputs":[{"components":[{"internalType":"address","name":"scriptyStorageProvider","type":"address"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"string","name":"scriptName","type":"string"},{"internalType":"string","name":"extension","type":"string"}],"internalType":"struct PixelPioneerArtworkBase.ArchivalMetadata","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getArtAsString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getArtObject","outputs":[{"components":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"string","name":"encodedArt","type":"string"},{"internalType":"string","name":"backgroundColor","type":"string"},{"internalType":"bytes","name":"encodedArtBytes","type":"bytes"}],"internalType":"struct IDynamicArtV1.DynamicArtV1","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getArtPieceTokenTypes","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getIFFArt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getPICTArt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getPngArt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"extension","type":"string"},{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getRawArchivalArt","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"getSvgArt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSvgRenderer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"string[]","name":"scriptNames","type":"string[]"},{"internalType":"string","name":"extension","type":"string"}],"name":"setArchivalMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"svgRenderer","type":"address"}],"name":"setSvgRenderer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"string","name":"scriptName","type":"string"},{"internalType":"string","name":"extension","type":"string"}],"name":"updateArchivalMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"string","name":"stringAsset","type":"string"},{"internalType":"string","name":"backgroundColor","type":"string"},{"internalType":"bytes","name":"bytesAsset","type":"bytes"}],"name":"updateArtPiece","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a060405234801561001057600080fd5b50600561001c33610024565b608052610074565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b608051612d51620000976000396000818161144b01526114770152612d516000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80639363f314116100d8578063e440e1541161008c578063f3317c5111610066578063f3317c5114610306578063f68ce88c14610319578063fd4bec851461032c57600080fd5b8063e440e1541461022b578063e49a1076146102e2578063f2fde38b146102f357600080fd5b8063ab9f973c116100bd578063ab9f973c146102a9578063b01781da146102bc578063cc7b4fc7146102cf57600080fd5b80639363f31414610276578063a096299c1461028957600080fd5b80635f1e575a1161012f57806373f246c91161011457806373f246c91461022b578063801b848d1461023e5780638da5cb5b1461025157600080fd5b80635f1e575a14610210578063715018a61461022357600080fd5b80631cb73660116101605780631cb73660146101c85780632f156613146101dd5780633a4c3937146101fd57600080fd5b806316c3d2cb1461017c5780631b4bcfca1461019a575b600080fd5b61018461033f565b604051610191919061223e565b60405180910390f35b6101bb6101a836600461228c565b5060408051602081019091526000815290565b60405161019191906122f5565b6101db6101d6366004612354565b61034e565b005b6101f06101eb36600461228c565b610475565b6040516101919190612418565b6101db61020b3660046124bc565b6104af565b6101bb61021e36600461228c565b610819565b6101db610824565b6101bb61023936600461228c565b610838565b6101bb61024c36600461228c565b610843565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610191565b6101db6102843660046124bc565b61084e565b61029c610297366004612560565b61086e565b60405161019191906125ac565b6101db6102b736600461261e565b610a5e565b6101bb6102ca366004612560565b610a95565b6101bb6102dd36600461228c565b610bc2565b6003546001600160a01b031661025e565b6101db61030136600461261e565b610bcd565b6101db610314366004612639565b610c5d565b6101db61032736600461267b565b610ea5565b6101db61033a3660046126fc565b611037565b6060610349611356565b905090565b6103566113e2565b868514801561036457508683145b801561036f57508681145b6103c05760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206e756d626572206f6620617373657473000000000000000060448201526064015b60405180910390fd5b60005b8781101561046a576104588989838181106103e0576103e0612786565b905060200201358888848181106103f9576103f9612786565b905060200281019061040b919061279c565b88888681811061041d5761041d612786565b905060200281019061042f919061279c565b88888881811061044157610441612786565b9050602002810190610453919061279c565b611426565b80610462816127f9565b9150506103c3565b505050505050505050565b6104a06040518060800160405280600081526020016060815260200160608152602001606081525090565b6104a9826116c0565b92915050565b6104b76113e2565b866000036104d85760405163cc4ccb6b60e01b815260040160405180910390fd5b600087815260016020818152604080842081516080810190925280548252928301805491939284019161050a90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461053690612812565b80156105835780601f1061055857610100808354040283529160200191610583565b820191906000526020600020905b81548152906001019060200180831161056657829003601f168201915b5050505050815260200160028201805461059c90612812565b80601f01602080910402602001604051908101604052809291908181526020018280546105c890612812565b80156106155780601f106105ea57610100808354040283529160200191610615565b820191906000526020600020905b8154815290600101906020018083116105f857829003601f168201915b5050505050815260200160038201805461062e90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461065a90612812565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b505050505081525050905080600001516000036106f0576040517fac3891e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87815285156107355786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208201525b83156107775784848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408201525b81156107b95782828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060608201525b600088815260016020818152604090922083518155918301518392918201906107e290826128a8565b50604082015160028201906107f790826128a8565b506060820151600382019061080c90826128a8565b5050505050505050505050565b60606104a9826118c9565b61082c611917565b6108366000611971565b565b60606104a9826119ce565b60606104a982611a26565b6108566113e2565b61086587878787878787611426565b50505050505050565b6108a2604051806080016040528060006001600160a01b031681526020016000815260200160608152602001606081525090565b600484846040516108b4929190612968565b9081526040519081900360200190206108ce600184612978565b815481106108de576108de612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805461094090612812565b80601f016020809104026020016040519081016040528092919081815260200182805461096c90612812565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081526020016003820180546109d290612812565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90612812565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b50505050508152505090505b9392505050565b610a666113e2565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60606040518060400160405280600381526020016234b33360e91b815250604051602001610ac3919061298b565b604051602081830303815290604052805190602001208484604051602001610aec929190612968565b6040516020818303038152906040528051906020012003610b1757610b1082611a42565b9050610a57565b604051806040016040528060038152602001621c18dd60ea1b815250604051602001610b43919061298b565b604051602081830303815290604052805190602001208484604051602001610b6c929190612968565b6040516020818303038152906040528051906020012003610b9057610b1082611d03565b6040517f70ad5b7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606104a982611f2b565b610bd5611917565b6001600160a01b038116610c515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103b7565b610c5a81611971565b50565b610c656113e2565b600060048383604051610c79929190612968565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015610e1d576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610cfa90612812565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690612812565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b50505050508152602001600382018054610d8c90612812565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890612812565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b50505050508152505081526020019060010190610ca7565b5050505090506000815111610e745760405162461bcd60e51b815260206004820152600e60248201527f617272617920697320656d70747900000000000000000000000000000000000060448201526064016103b7565b60048383604051610e86929190612968565b90815260200160405180910390206000610ea09190612183565b505050565b610ead6113e2565b60005b8381101561102f5760006040518060800160405280886001600160a01b03168152602001836001610ee191906129a7565b8152602001878785818110610ef857610ef8612786565b9050602002810190610f0a919061279c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050915250604051909150600490610f919086908690612968565b90815260408051602092819003830190208054600180820183556000928352918490208551600490920201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911781559284015190830155820151829190600282019061100390826128a8565b506060820151600382019061101890826128a8565b505050508080611027906127f9565b915050610eb0565b505050505050565b61103f6113e2565b600061104c600187612978565b9050600060048484604051611062929190612968565b9081526020016040518091039020828154811061108157611081612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820180546110e390612812565b80601f016020809104026020016040519081016040528092919081815260200182805461110f90612812565b801561115c5780601f106111315761010080835404028352916020019161115c565b820191906000526020600020905b81548152906001019060200180831161113f57829003601f168201915b5050505050815260200160038201805461117590612812565b80601f01602080910402602001604051908101604052809291908181526020018280546111a190612812565b80156111ee5780601f106111c3576101008083540402835291602001916111ee565b820191906000526020600020905b8154815290600101906020018083116111d157829003601f168201915b50505050508152505090508681602001511461124c5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642061646472657373696e67000000000000000000000000000060448201526064016103b7565b876004858560405161125f929190612968565b9081526020016040518091039020838154811061127e5761127e612786565b906000526020600020906004020160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508585600486866040516112c7929190612968565b908152602001604051809103902084815481106112e6576112e6612786565b906000526020600020906004020160020191826113049291906129ba565b50838360048686604051611319929190612968565b9081526020016040518091039020848154811061133857611338612786565b9060005260206000209060040201600301918261046a9291906129ba565b606060028054806020026020016040519081016040528092919081815260200182805480156113d857602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116113935790505b5050505050905090565b6000546001600160a01b03163314610836576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866000036114475760405163cc4ccb6b60e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000001180156114a457506002547f0000000000000000000000000000000000000000000000000000000000000000906114a29060016129a7565b115b156114db576040517f444920b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008781526001602052604090205415611521576040517fb4a85a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61154c6040518060800160405280600081526020016060815260200160608152602001606081525090565b878152604080516020601f890181900481028201810190925287815290889088908190840183828082843760009201919091525050505060208083019190915260408051601f870183900483028101830190915285815290869086908190840183828082843760009201919091525050505060408083019190915280516020601f850181900481028201810190925283815290849084908190840183828082843760009201829052506060860194909452505050888152600160208181526040909220835181559183015183929182019061162790826128a8565b506040820151600282019061163c90826128a8565b506060820151600382019061165190826128a8565b5050600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6004820401805460039092166008026101000a67ffffffffffffffff818102199093169b90921691909102999099179098555050505050505050565b6116eb6040518060800160405280600081526020016060815260200160608152602001606081525090565b6000828152600160208181526040928390208351608081019094528054845291820180549184019161171c90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461174890612812565b80156117955780601f1061176a57610100808354040283529160200191611795565b820191906000526020600020905b81548152906001019060200180831161177857829003601f168201915b505050505081526020016002820180546117ae90612812565b80601f01602080910402602001604051908101604052809291908181526020018280546117da90612812565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b5050505050815260200160038201805461184090612812565b80601f016020809104026020016040519081016040528092919081815260200182805461186c90612812565b80156118b95780601f1061188e576101008083540402835291602001916118b9565b820191906000526020600020905b81548152906001019060200180831161189c57829003601f168201915b5050505050815250509050919050565b606060006118d683611a42565b9050610a57816040518060400160405280600b81526020017f696d6167652f782d696666000000000000000000000000000000000000000000815250611f75565b6000546001600160a01b031633146108365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b7565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060006119db836116c0565b604081015151909150151560006119f1856116c0565b6020015190506000611a1186848660400151611a0c86611fa9565b611fd2565b9050611a1c81612015565b9695505050505050565b60606000611a33836116c0565b602001519050610a5781611fa9565b60606000611a51600184612978565b9050600060046040518060400160405280600381526020016234b33360e91b815250604051611a80919061298b565b90815260200160405180910390208281548110611a9f57611a9f612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282018054611b0190612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2d90612812565b8015611b7a5780601f10611b4f57610100808354040283529160200191611b7a565b820191906000526020600020905b815481529060010190602001808311611b5d57829003601f168201915b50505050508152602001600382018054611b9390612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbf90612812565b8015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b505050505081525050905083816020015114611c6a5760405162461bcd60e51b815260206004820152601260248201527f494646206e6f7420636f6e66696775726564000000000000000000000000000060448201526064016103b7565b805160408083015190517ff96355940000000000000000000000000000000000000000000000000000000081526001600160a01b0383169163f963559491611cb59190600401612a7b565b600060405180830381865afa158015611cd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cfa9190810190612b19565b95945050505050565b60606000611d12600184612978565b905060006004604051806040016040528060038152602001621c18dd60ea1b815250604051611d41919061298b565b90815260200160405180910390208281548110611d6057611d60612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282018054611dc290612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611dee90612812565b8015611e3b5780601f10611e1057610100808354040283529160200191611e3b565b820191906000526020600020905b815481529060010190602001808311611e1e57829003601f168201915b50505050508152602001600382018054611e5490612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8090612812565b8015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b505050505081525050905083816020015114611c6a5760405162461bcd60e51b815260206004820152601360248201527f50494354206e6f7420636f6e666967757265640000000000000000000000000060448201526064016103b7565b60606000611f3883611d03565b9050610a57816040518060400160405280600c81526020017f696d6167652f782d7069637400000000000000000000000000000000000000008152505b606081611f8184612030565b604051602001611f92929190612b6a565b604051602081830303815290604052905092915050565b606081604051602001611fbc9190612beb565b6040516020818303038152906040529050919050565b6060611fe66003546001600160a01b031690565b6001600160a01b031663645b305a8585856040518463ffffffff1660e01b8152600401611cb593929190612c30565b606061202082612030565b604051602001611fbc9190612c5d565b6060815160000361204f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612cdc604091399050600060038451600261207e91906129a7565b6120889190612ca2565b612093906004612cc4565b67ffffffffffffffff8111156120ab576120ab61284c565b6040519080825280601f01601f1916602001820160405280156120d5576020820181803683370190505b509050600182016020820185865187015b80821015612141576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506120e6565b505060038651066001811461215d576002811461217057612178565b603d6001830353603d6002830353612178565b603d60018303535b509195945050505050565b5080546000825560040290600052602060002090810190610c5a91905b808211156121f057805473ffffffffffffffffffffffffffffffffffffffff191681556000600182018190556121d960028301826121f4565b6121e76003830160006121f4565b506004016121a0565b5090565b50805461220090612812565b6000825580601f10612210575050565b601f016020900490600052602060002090810190610c5a91905b808211156121f0576000815560010161222a565b6020808252825182820181905260009190848201906040850190845b8181101561228057835167ffffffffffffffff168352928401929184019160010161225a565b50909695505050505050565b60006020828403121561229e57600080fd5b5035919050565b60005b838110156122c05781810151838201526020016122a8565b50506000910152565b600081518084526122e18160208601602086016122a5565b601f01601f19169290920160200192915050565b602081526000610a5760208301846122c9565b60008083601f84011261231a57600080fd5b50813567ffffffffffffffff81111561233257600080fd5b6020830191508360208260051b850101111561234d57600080fd5b9250929050565b6000806000806000806000806080898b03121561237057600080fd5b883567ffffffffffffffff8082111561238857600080fd5b6123948c838d01612308565b909a50985060208b01359150808211156123ad57600080fd5b6123b98c838d01612308565b909850965060408b01359150808211156123d257600080fd5b6123de8c838d01612308565b909650945060608b01359150808211156123f757600080fd5b506124048b828c01612308565b999c989b5096995094979396929594505050565b6020815281516020820152600060208301516080604084015261243e60a08401826122c9565b90506040840151601f198085840301606086015261245c83836122c9565b9250606086015191508085840301608086015250611cfa82826122c9565b60008083601f84011261248c57600080fd5b50813567ffffffffffffffff8111156124a457600080fd5b60208301915083602082850101111561234d57600080fd5b60008060008060008060006080888a0312156124d757600080fd5b87359650602088013567ffffffffffffffff808211156124f657600080fd5b6125028b838c0161247a565b909850965060408a013591508082111561251b57600080fd5b6125278b838c0161247a565b909650945060608a013591508082111561254057600080fd5b5061254d8a828b0161247a565b989b979a50959850939692959293505050565b60008060006040848603121561257557600080fd5b833567ffffffffffffffff81111561258c57600080fd5b6125988682870161247a565b909790965060209590950135949350505050565b602081526001600160a01b0382511660208201526020820151604082015260006040830151608060608401526125e560a08401826122c9565b90506060840151601f19848303016080850152611cfa82826122c9565b80356001600160a01b038116811461261957600080fd5b919050565b60006020828403121561263057600080fd5b610a5782612602565b6000806020838503121561264c57600080fd5b823567ffffffffffffffff81111561266357600080fd5b61266f8582860161247a565b90969095509350505050565b60008060008060006060868803121561269357600080fd5b61269c86612602565b9450602086013567ffffffffffffffff808211156126b957600080fd5b6126c589838a01612308565b909650945060408801359150808211156126de57600080fd5b506126eb8882890161247a565b969995985093965092949392505050565b6000806000806000806080878903121561271557600080fd5b61271e87612602565b955060208701359450604087013567ffffffffffffffff8082111561274257600080fd5b61274e8a838b0161247a565b9096509450606089013591508082111561276757600080fd5b5061277489828a0161247a565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126127b357600080fd5b83018035915067ffffffffffffffff8211156127ce57600080fd5b60200191503681900382131561234d57600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161280b5761280b6127e3565b5060010190565b600181811c9082168061282657607f821691505b60208210810361284657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f821115610ea057600081815260208120601f850160051c810160208610156128895750805b601f850160051c820191505b8181101561102f57828155600101612895565b815167ffffffffffffffff8111156128c2576128c261284c565b6128d6816128d08454612812565b84612862565b602080601f83116001811461290b57600084156128f35750858301515b600019600386901b1c1916600185901b17855561102f565b600085815260208120601f198616915b8281101561293a5788860151825594840194600190910190840161291b565b50858210156129585787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b818103818111156104a9576104a96127e3565b6000825161299d8184602087016122a5565b9190910192915050565b808201808211156104a9576104a96127e3565b67ffffffffffffffff8311156129d2576129d261284c565b6129e6836129e08354612812565b83612862565b6000601f841160018114612a1a5760008515612a025750838201355b600019600387901b1c1916600186901b178355612a74565b600083815260209020601f19861690835b82811015612a4b5786850135825560209485019460019092019101612a2b565b5086821015612a685760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b604081526000612a8e60408301846122c9565b828103602093840152600081529190910192915050565b600067ffffffffffffffff80841115612ac057612ac061284c565b604051601f8501601f19908116603f01168101908282118183101715612ae857612ae861284c565b81604052809350858152868686011115612b0157600080fd5b612b0f8660208301876122a5565b5050509392505050565b600060208284031215612b2b57600080fd5b815167ffffffffffffffff811115612b4257600080fd5b8201601f81018413612b5357600080fd5b612b6284825160208401612aa5565b949350505050565b7f646174613a000000000000000000000000000000000000000000000000000000815260008351612ba28160058501602088016122a5565b7f3b6261736536342c0000000000000000000000000000000000000000000000006005918401918201528351612bdf81600d8401602088016122a5565b01600d01949350505050565b7f646174613a696d6167652f706e673b6261736536342c00000000000000000000815260008251612c238160168501602087016122a5565b9190910160160192915050565b8315158152606060208201526000612c4b60608301856122c9565b8281036040840152611a1c81856122c9565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612c9581601a8501602087016122a5565b91909101601a0192915050565b600082612cbf57634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176104a9576104a96127e356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c7e3e74d18c8ebc83762189f63d73ca1ba1d30f3d72b2db4956283fe777016b364736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101775760003560e01c80639363f314116100d8578063e440e1541161008c578063f3317c5111610066578063f3317c5114610306578063f68ce88c14610319578063fd4bec851461032c57600080fd5b8063e440e1541461022b578063e49a1076146102e2578063f2fde38b146102f357600080fd5b8063ab9f973c116100bd578063ab9f973c146102a9578063b01781da146102bc578063cc7b4fc7146102cf57600080fd5b80639363f31414610276578063a096299c1461028957600080fd5b80635f1e575a1161012f57806373f246c91161011457806373f246c91461022b578063801b848d1461023e5780638da5cb5b1461025157600080fd5b80635f1e575a14610210578063715018a61461022357600080fd5b80631cb73660116101605780631cb73660146101c85780632f156613146101dd5780633a4c3937146101fd57600080fd5b806316c3d2cb1461017c5780631b4bcfca1461019a575b600080fd5b61018461033f565b604051610191919061223e565b60405180910390f35b6101bb6101a836600461228c565b5060408051602081019091526000815290565b60405161019191906122f5565b6101db6101d6366004612354565b61034e565b005b6101f06101eb36600461228c565b610475565b6040516101919190612418565b6101db61020b3660046124bc565b6104af565b6101bb61021e36600461228c565b610819565b6101db610824565b6101bb61023936600461228c565b610838565b6101bb61024c36600461228c565b610843565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610191565b6101db6102843660046124bc565b61084e565b61029c610297366004612560565b61086e565b60405161019191906125ac565b6101db6102b736600461261e565b610a5e565b6101bb6102ca366004612560565b610a95565b6101bb6102dd36600461228c565b610bc2565b6003546001600160a01b031661025e565b6101db61030136600461261e565b610bcd565b6101db610314366004612639565b610c5d565b6101db61032736600461267b565b610ea5565b6101db61033a3660046126fc565b611037565b6060610349611356565b905090565b6103566113e2565b868514801561036457508683145b801561036f57508681145b6103c05760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206e756d626572206f6620617373657473000000000000000060448201526064015b60405180910390fd5b60005b8781101561046a576104588989838181106103e0576103e0612786565b905060200201358888848181106103f9576103f9612786565b905060200281019061040b919061279c565b88888681811061041d5761041d612786565b905060200281019061042f919061279c565b88888881811061044157610441612786565b9050602002810190610453919061279c565b611426565b80610462816127f9565b9150506103c3565b505050505050505050565b6104a06040518060800160405280600081526020016060815260200160608152602001606081525090565b6104a9826116c0565b92915050565b6104b76113e2565b866000036104d85760405163cc4ccb6b60e01b815260040160405180910390fd5b600087815260016020818152604080842081516080810190925280548252928301805491939284019161050a90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461053690612812565b80156105835780601f1061055857610100808354040283529160200191610583565b820191906000526020600020905b81548152906001019060200180831161056657829003601f168201915b5050505050815260200160028201805461059c90612812565b80601f01602080910402602001604051908101604052809291908181526020018280546105c890612812565b80156106155780601f106105ea57610100808354040283529160200191610615565b820191906000526020600020905b8154815290600101906020018083116105f857829003601f168201915b5050505050815260200160038201805461062e90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461065a90612812565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b505050505081525050905080600001516000036106f0576040517fac3891e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87815285156107355786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208201525b83156107775784848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408201525b81156107b95782828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060608201525b600088815260016020818152604090922083518155918301518392918201906107e290826128a8565b50604082015160028201906107f790826128a8565b506060820151600382019061080c90826128a8565b5050505050505050505050565b60606104a9826118c9565b61082c611917565b6108366000611971565b565b60606104a9826119ce565b60606104a982611a26565b6108566113e2565b61086587878787878787611426565b50505050505050565b6108a2604051806080016040528060006001600160a01b031681526020016000815260200160608152602001606081525090565b600484846040516108b4929190612968565b9081526040519081900360200190206108ce600184612978565b815481106108de576108de612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805461094090612812565b80601f016020809104026020016040519081016040528092919081815260200182805461096c90612812565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081526020016003820180546109d290612812565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90612812565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b50505050508152505090505b9392505050565b610a666113e2565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60606040518060400160405280600381526020016234b33360e91b815250604051602001610ac3919061298b565b604051602081830303815290604052805190602001208484604051602001610aec929190612968565b6040516020818303038152906040528051906020012003610b1757610b1082611a42565b9050610a57565b604051806040016040528060038152602001621c18dd60ea1b815250604051602001610b43919061298b565b604051602081830303815290604052805190602001208484604051602001610b6c929190612968565b6040516020818303038152906040528051906020012003610b9057610b1082611d03565b6040517f70ad5b7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606104a982611f2b565b610bd5611917565b6001600160a01b038116610c515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103b7565b610c5a81611971565b50565b610c656113e2565b600060048383604051610c79929190612968565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015610e1d576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610cfa90612812565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690612812565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b50505050508152602001600382018054610d8c90612812565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890612812565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b50505050508152505081526020019060010190610ca7565b5050505090506000815111610e745760405162461bcd60e51b815260206004820152600e60248201527f617272617920697320656d70747900000000000000000000000000000000000060448201526064016103b7565b60048383604051610e86929190612968565b90815260200160405180910390206000610ea09190612183565b505050565b610ead6113e2565b60005b8381101561102f5760006040518060800160405280886001600160a01b03168152602001836001610ee191906129a7565b8152602001878785818110610ef857610ef8612786565b9050602002810190610f0a919061279c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050915250604051909150600490610f919086908690612968565b90815260408051602092819003830190208054600180820183556000928352918490208551600490920201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911781559284015190830155820151829190600282019061100390826128a8565b506060820151600382019061101890826128a8565b505050508080611027906127f9565b915050610eb0565b505050505050565b61103f6113e2565b600061104c600187612978565b9050600060048484604051611062929190612968565b9081526020016040518091039020828154811061108157611081612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820180546110e390612812565b80601f016020809104026020016040519081016040528092919081815260200182805461110f90612812565b801561115c5780601f106111315761010080835404028352916020019161115c565b820191906000526020600020905b81548152906001019060200180831161113f57829003601f168201915b5050505050815260200160038201805461117590612812565b80601f01602080910402602001604051908101604052809291908181526020018280546111a190612812565b80156111ee5780601f106111c3576101008083540402835291602001916111ee565b820191906000526020600020905b8154815290600101906020018083116111d157829003601f168201915b50505050508152505090508681602001511461124c5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642061646472657373696e67000000000000000000000000000060448201526064016103b7565b876004858560405161125f929190612968565b9081526020016040518091039020838154811061127e5761127e612786565b906000526020600020906004020160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508585600486866040516112c7929190612968565b908152602001604051809103902084815481106112e6576112e6612786565b906000526020600020906004020160020191826113049291906129ba565b50838360048686604051611319929190612968565b9081526020016040518091039020848154811061133857611338612786565b9060005260206000209060040201600301918261046a9291906129ba565b606060028054806020026020016040519081016040528092919081815260200182805480156113d857602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116113935790505b5050505050905090565b6000546001600160a01b03163314610836576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866000036114475760405163cc4ccb6b60e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000051180156114a457506002547f0000000000000000000000000000000000000000000000000000000000000005906114a29060016129a7565b115b156114db576040517f444920b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008781526001602052604090205415611521576040517fb4a85a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61154c6040518060800160405280600081526020016060815260200160608152602001606081525090565b878152604080516020601f890181900481028201810190925287815290889088908190840183828082843760009201919091525050505060208083019190915260408051601f870183900483028101830190915285815290869086908190840183828082843760009201919091525050505060408083019190915280516020601f850181900481028201810190925283815290849084908190840183828082843760009201829052506060860194909452505050888152600160208181526040909220835181559183015183929182019061162790826128a8565b506040820151600282019061163c90826128a8565b506060820151600382019061165190826128a8565b5050600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6004820401805460039092166008026101000a67ffffffffffffffff818102199093169b90921691909102999099179098555050505050505050565b6116eb6040518060800160405280600081526020016060815260200160608152602001606081525090565b6000828152600160208181526040928390208351608081019094528054845291820180549184019161171c90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461174890612812565b80156117955780601f1061176a57610100808354040283529160200191611795565b820191906000526020600020905b81548152906001019060200180831161177857829003601f168201915b505050505081526020016002820180546117ae90612812565b80601f01602080910402602001604051908101604052809291908181526020018280546117da90612812565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b5050505050815260200160038201805461184090612812565b80601f016020809104026020016040519081016040528092919081815260200182805461186c90612812565b80156118b95780601f1061188e576101008083540402835291602001916118b9565b820191906000526020600020905b81548152906001019060200180831161189c57829003601f168201915b5050505050815250509050919050565b606060006118d683611a42565b9050610a57816040518060400160405280600b81526020017f696d6167652f782d696666000000000000000000000000000000000000000000815250611f75565b6000546001600160a01b031633146108365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b7565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060006119db836116c0565b604081015151909150151560006119f1856116c0565b6020015190506000611a1186848660400151611a0c86611fa9565b611fd2565b9050611a1c81612015565b9695505050505050565b60606000611a33836116c0565b602001519050610a5781611fa9565b60606000611a51600184612978565b9050600060046040518060400160405280600381526020016234b33360e91b815250604051611a80919061298b565b90815260200160405180910390208281548110611a9f57611a9f612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282018054611b0190612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2d90612812565b8015611b7a5780601f10611b4f57610100808354040283529160200191611b7a565b820191906000526020600020905b815481529060010190602001808311611b5d57829003601f168201915b50505050508152602001600382018054611b9390612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbf90612812565b8015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b505050505081525050905083816020015114611c6a5760405162461bcd60e51b815260206004820152601260248201527f494646206e6f7420636f6e66696775726564000000000000000000000000000060448201526064016103b7565b805160408083015190517ff96355940000000000000000000000000000000000000000000000000000000081526001600160a01b0383169163f963559491611cb59190600401612a7b565b600060405180830381865afa158015611cd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cfa9190810190612b19565b95945050505050565b60606000611d12600184612978565b905060006004604051806040016040528060038152602001621c18dd60ea1b815250604051611d41919061298b565b90815260200160405180910390208281548110611d6057611d60612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282018054611dc290612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611dee90612812565b8015611e3b5780601f10611e1057610100808354040283529160200191611e3b565b820191906000526020600020905b815481529060010190602001808311611e1e57829003601f168201915b50505050508152602001600382018054611e5490612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8090612812565b8015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b505050505081525050905083816020015114611c6a5760405162461bcd60e51b815260206004820152601360248201527f50494354206e6f7420636f6e666967757265640000000000000000000000000060448201526064016103b7565b60606000611f3883611d03565b9050610a57816040518060400160405280600c81526020017f696d6167652f782d7069637400000000000000000000000000000000000000008152505b606081611f8184612030565b604051602001611f92929190612b6a565b604051602081830303815290604052905092915050565b606081604051602001611fbc9190612beb565b6040516020818303038152906040529050919050565b6060611fe66003546001600160a01b031690565b6001600160a01b031663645b305a8585856040518463ffffffff1660e01b8152600401611cb593929190612c30565b606061202082612030565b604051602001611fbc9190612c5d565b6060815160000361204f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612cdc604091399050600060038451600261207e91906129a7565b6120889190612ca2565b612093906004612cc4565b67ffffffffffffffff8111156120ab576120ab61284c565b6040519080825280601f01601f1916602001820160405280156120d5576020820181803683370190505b509050600182016020820185865187015b80821015612141576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506120e6565b505060038651066001811461215d576002811461217057612178565b603d6001830353603d6002830353612178565b603d60018303535b509195945050505050565b5080546000825560040290600052602060002090810190610c5a91905b808211156121f057805473ffffffffffffffffffffffffffffffffffffffff191681556000600182018190556121d960028301826121f4565b6121e76003830160006121f4565b506004016121a0565b5090565b50805461220090612812565b6000825580601f10612210575050565b601f016020900490600052602060002090810190610c5a91905b808211156121f0576000815560010161222a565b6020808252825182820181905260009190848201906040850190845b8181101561228057835167ffffffffffffffff168352928401929184019160010161225a565b50909695505050505050565b60006020828403121561229e57600080fd5b5035919050565b60005b838110156122c05781810151838201526020016122a8565b50506000910152565b600081518084526122e18160208601602086016122a5565b601f01601f19169290920160200192915050565b602081526000610a5760208301846122c9565b60008083601f84011261231a57600080fd5b50813567ffffffffffffffff81111561233257600080fd5b6020830191508360208260051b850101111561234d57600080fd5b9250929050565b6000806000806000806000806080898b03121561237057600080fd5b883567ffffffffffffffff8082111561238857600080fd5b6123948c838d01612308565b909a50985060208b01359150808211156123ad57600080fd5b6123b98c838d01612308565b909850965060408b01359150808211156123d257600080fd5b6123de8c838d01612308565b909650945060608b01359150808211156123f757600080fd5b506124048b828c01612308565b999c989b5096995094979396929594505050565b6020815281516020820152600060208301516080604084015261243e60a08401826122c9565b90506040840151601f198085840301606086015261245c83836122c9565b9250606086015191508085840301608086015250611cfa82826122c9565b60008083601f84011261248c57600080fd5b50813567ffffffffffffffff8111156124a457600080fd5b60208301915083602082850101111561234d57600080fd5b60008060008060008060006080888a0312156124d757600080fd5b87359650602088013567ffffffffffffffff808211156124f657600080fd5b6125028b838c0161247a565b909850965060408a013591508082111561251b57600080fd5b6125278b838c0161247a565b909650945060608a013591508082111561254057600080fd5b5061254d8a828b0161247a565b989b979a50959850939692959293505050565b60008060006040848603121561257557600080fd5b833567ffffffffffffffff81111561258c57600080fd5b6125988682870161247a565b909790965060209590950135949350505050565b602081526001600160a01b0382511660208201526020820151604082015260006040830151608060608401526125e560a08401826122c9565b90506060840151601f19848303016080850152611cfa82826122c9565b80356001600160a01b038116811461261957600080fd5b919050565b60006020828403121561263057600080fd5b610a5782612602565b6000806020838503121561264c57600080fd5b823567ffffffffffffffff81111561266357600080fd5b61266f8582860161247a565b90969095509350505050565b60008060008060006060868803121561269357600080fd5b61269c86612602565b9450602086013567ffffffffffffffff808211156126b957600080fd5b6126c589838a01612308565b909650945060408801359150808211156126de57600080fd5b506126eb8882890161247a565b969995985093965092949392505050565b6000806000806000806080878903121561271557600080fd5b61271e87612602565b955060208701359450604087013567ffffffffffffffff8082111561274257600080fd5b61274e8a838b0161247a565b9096509450606089013591508082111561276757600080fd5b5061277489828a0161247a565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126127b357600080fd5b83018035915067ffffffffffffffff8211156127ce57600080fd5b60200191503681900382131561234d57600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161280b5761280b6127e3565b5060010190565b600181811c9082168061282657607f821691505b60208210810361284657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f821115610ea057600081815260208120601f850160051c810160208610156128895750805b601f850160051c820191505b8181101561102f57828155600101612895565b815167ffffffffffffffff8111156128c2576128c261284c565b6128d6816128d08454612812565b84612862565b602080601f83116001811461290b57600084156128f35750858301515b600019600386901b1c1916600185901b17855561102f565b600085815260208120601f198616915b8281101561293a5788860151825594840194600190910190840161291b565b50858210156129585787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b818103818111156104a9576104a96127e3565b6000825161299d8184602087016122a5565b9190910192915050565b808201808211156104a9576104a96127e3565b67ffffffffffffffff8311156129d2576129d261284c565b6129e6836129e08354612812565b83612862565b6000601f841160018114612a1a5760008515612a025750838201355b600019600387901b1c1916600186901b178355612a74565b600083815260209020601f19861690835b82811015612a4b5786850135825560209485019460019092019101612a2b565b5086821015612a685760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b604081526000612a8e60408301846122c9565b828103602093840152600081529190910192915050565b600067ffffffffffffffff80841115612ac057612ac061284c565b604051601f8501601f19908116603f01168101908282118183101715612ae857612ae861284c565b81604052809350858152868686011115612b0157600080fd5b612b0f8660208301876122a5565b5050509392505050565b600060208284031215612b2b57600080fd5b815167ffffffffffffffff811115612b4257600080fd5b8201601f81018413612b5357600080fd5b612b6284825160208401612aa5565b949350505050565b7f646174613a000000000000000000000000000000000000000000000000000000815260008351612ba28160058501602088016122a5565b7f3b6261736536342c0000000000000000000000000000000000000000000000006005918401918201528351612bdf81600d8401602088016122a5565b01600d01949350505050565b7f646174613a696d6167652f706e673b6261736536342c00000000000000000000815260008251612c238160168501602087016122a5565b9190910160160192915050565b8315158152606060208201526000612c4b60608301856122c9565b8281036040840152611a1c81856122c9565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612c9581601a8501602087016122a5565b91909101601a0192915050565b600082612cbf57634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176104a9576104a96127e356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c7e3e74d18c8ebc83762189f63d73ca1ba1d30f3d72b2db4956283fe777016b364736f6c63430008130033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.