ETH Price: $2,342.13 (+0.95%)

Contract

0x8abC21a84992b8C50c086D5133D6B428b8FC7439
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Svg Renderer180943112023-09-08 21:16:23367 days ago1694207783IN
0x8abC21a8...8b8FC7439
0 ETH0.0004023613.87458464
Set Archival Met...180457172023-09-02 1:58:59374 days ago1693619939IN
0x8abC21a8...8b8FC7439
0 ETH0.0075873310.42218199
Create Art Piece180457042023-09-02 1:56:23374 days ago1693619783IN
0x8abC21a8...8b8FC7439
0 ETH0.0396278910.55074093
Create Art Piece180457032023-09-02 1:56:11374 days ago1693619771IN
0x8abC21a8...8b8FC7439
0 ETH0.0326889810.61169316
Create Art Piece180457022023-09-02 1:55:59374 days ago1693619759IN
0x8abC21a8...8b8FC7439
0 ETH0.0299413510.92798488
Create Art Piece180457012023-09-02 1:55:47374 days ago1693619747IN
0x8abC21a8...8b8FC7439
0 ETH0.0508981111.06078086
Create Art Piece180457002023-09-02 1:55:35374 days ago1693619735IN
0x8abC21a8...8b8FC7439
0 ETH0.0576082711.07163814
Set Svg Renderer180456852023-09-02 1:52:35374 days ago1693619555IN
0x8abC21a8...8b8FC7439
0 ETH0.000452269.81043172
0x60a06040180456692023-09-02 1:49:23374 days ago1693619363IN
 Create: PixelPioneerArtwork
0 ETH0.0323710112.5481642

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PixelPioneerArtwork

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 13 : PixelPioneerArtwork.sol
// 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
    }
}

File 2 of 13 : OwnableDeferral.sol
// 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;
}

File 3 of 13 : OwnableDeferralResolution.sol
// 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();
    }
}

File 4 of 13 : ArtDatastoreManager.sol
// 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;
    }
}

File 5 of 13 : IChainNativeArtProducer.sol
// 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);
}

File 6 of 13 : IDynamicArt.sol
// 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;
    }
}

File 7 of 13 : IScriptyStorageProvider.sol
// 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);
}

File 8 of 13 : ISVGConstructor.sol
// 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);
}

File 9 of 13 : PNGBackedSVGArt.sol
// 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);
    }
}

File 10 of 13 : Ownable.sol
// 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);
    }
}

File 11 of 13 : Base64.sol
// 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;
    }
}

File 12 of 13 : Context.sol
// 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;
    }
}

File 13 of 13 : PixelPioneerArtworkBase.sol
// 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, '');
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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"}]

60a060405234801561001057600080fd5b50600561001c33610024565b608052610074565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b608051612d51620000976000396000818161144b01526114770152612d516000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80639363f314116100d8578063e440e1541161008c578063f3317c5111610066578063f3317c5114610306578063f68ce88c14610319578063fd4bec851461032c57600080fd5b8063e440e1541461022b578063e49a1076146102e2578063f2fde38b146102f357600080fd5b8063ab9f973c116100bd578063ab9f973c146102a9578063b01781da146102bc578063cc7b4fc7146102cf57600080fd5b80639363f31414610276578063a096299c1461028957600080fd5b80635f1e575a1161012f57806373f246c91161011457806373f246c91461022b578063801b848d1461023e5780638da5cb5b1461025157600080fd5b80635f1e575a14610210578063715018a61461022357600080fd5b80631cb73660116101605780631cb73660146101c85780632f156613146101dd5780633a4c3937146101fd57600080fd5b806316c3d2cb1461017c5780631b4bcfca1461019a575b600080fd5b61018461033f565b604051610191919061223e565b60405180910390f35b6101bb6101a836600461228c565b5060408051602081019091526000815290565b60405161019191906122f5565b6101db6101d6366004612354565b61034e565b005b6101f06101eb36600461228c565b610475565b6040516101919190612418565b6101db61020b3660046124bc565b6104af565b6101bb61021e36600461228c565b610819565b6101db610824565b6101bb61023936600461228c565b610838565b6101bb61024c36600461228c565b610843565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610191565b6101db6102843660046124bc565b61084e565b61029c610297366004612560565b61086e565b60405161019191906125ac565b6101db6102b736600461261e565b610a5e565b6101bb6102ca366004612560565b610a95565b6101bb6102dd36600461228c565b610bc2565b6003546001600160a01b031661025e565b6101db61030136600461261e565b610bcd565b6101db610314366004612639565b610c5d565b6101db61032736600461267b565b610ea5565b6101db61033a3660046126fc565b611037565b6060610349611356565b905090565b6103566113e2565b868514801561036457508683145b801561036f57508681145b6103c05760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206e756d626572206f6620617373657473000000000000000060448201526064015b60405180910390fd5b60005b8781101561046a576104588989838181106103e0576103e0612786565b905060200201358888848181106103f9576103f9612786565b905060200281019061040b919061279c565b88888681811061041d5761041d612786565b905060200281019061042f919061279c565b88888881811061044157610441612786565b9050602002810190610453919061279c565b611426565b80610462816127f9565b9150506103c3565b505050505050505050565b6104a06040518060800160405280600081526020016060815260200160608152602001606081525090565b6104a9826116c0565b92915050565b6104b76113e2565b866000036104d85760405163cc4ccb6b60e01b815260040160405180910390fd5b600087815260016020818152604080842081516080810190925280548252928301805491939284019161050a90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461053690612812565b80156105835780601f1061055857610100808354040283529160200191610583565b820191906000526020600020905b81548152906001019060200180831161056657829003601f168201915b5050505050815260200160028201805461059c90612812565b80601f01602080910402602001604051908101604052809291908181526020018280546105c890612812565b80156106155780601f106105ea57610100808354040283529160200191610615565b820191906000526020600020905b8154815290600101906020018083116105f857829003601f168201915b5050505050815260200160038201805461062e90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461065a90612812565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b505050505081525050905080600001516000036106f0576040517fac3891e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87815285156107355786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208201525b83156107775784848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408201525b81156107b95782828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060608201525b600088815260016020818152604090922083518155918301518392918201906107e290826128a8565b50604082015160028201906107f790826128a8565b506060820151600382019061080c90826128a8565b5050505050505050505050565b60606104a9826118c9565b61082c611917565b6108366000611971565b565b60606104a9826119ce565b60606104a982611a26565b6108566113e2565b61086587878787878787611426565b50505050505050565b6108a2604051806080016040528060006001600160a01b031681526020016000815260200160608152602001606081525090565b600484846040516108b4929190612968565b9081526040519081900360200190206108ce600184612978565b815481106108de576108de612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805461094090612812565b80601f016020809104026020016040519081016040528092919081815260200182805461096c90612812565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081526020016003820180546109d290612812565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90612812565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b50505050508152505090505b9392505050565b610a666113e2565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60606040518060400160405280600381526020016234b33360e91b815250604051602001610ac3919061298b565b604051602081830303815290604052805190602001208484604051602001610aec929190612968565b6040516020818303038152906040528051906020012003610b1757610b1082611a42565b9050610a57565b604051806040016040528060038152602001621c18dd60ea1b815250604051602001610b43919061298b565b604051602081830303815290604052805190602001208484604051602001610b6c929190612968565b6040516020818303038152906040528051906020012003610b9057610b1082611d03565b6040517f70ad5b7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606104a982611f2b565b610bd5611917565b6001600160a01b038116610c515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103b7565b610c5a81611971565b50565b610c656113e2565b600060048383604051610c79929190612968565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015610e1d576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610cfa90612812565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690612812565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b50505050508152602001600382018054610d8c90612812565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890612812565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b50505050508152505081526020019060010190610ca7565b5050505090506000815111610e745760405162461bcd60e51b815260206004820152600e60248201527f617272617920697320656d70747900000000000000000000000000000000000060448201526064016103b7565b60048383604051610e86929190612968565b90815260200160405180910390206000610ea09190612183565b505050565b610ead6113e2565b60005b8381101561102f5760006040518060800160405280886001600160a01b03168152602001836001610ee191906129a7565b8152602001878785818110610ef857610ef8612786565b9050602002810190610f0a919061279c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050915250604051909150600490610f919086908690612968565b90815260408051602092819003830190208054600180820183556000928352918490208551600490920201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911781559284015190830155820151829190600282019061100390826128a8565b506060820151600382019061101890826128a8565b505050508080611027906127f9565b915050610eb0565b505050505050565b61103f6113e2565b600061104c600187612978565b9050600060048484604051611062929190612968565b9081526020016040518091039020828154811061108157611081612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820180546110e390612812565b80601f016020809104026020016040519081016040528092919081815260200182805461110f90612812565b801561115c5780601f106111315761010080835404028352916020019161115c565b820191906000526020600020905b81548152906001019060200180831161113f57829003601f168201915b5050505050815260200160038201805461117590612812565b80601f01602080910402602001604051908101604052809291908181526020018280546111a190612812565b80156111ee5780601f106111c3576101008083540402835291602001916111ee565b820191906000526020600020905b8154815290600101906020018083116111d157829003601f168201915b50505050508152505090508681602001511461124c5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642061646472657373696e67000000000000000000000000000060448201526064016103b7565b876004858560405161125f929190612968565b9081526020016040518091039020838154811061127e5761127e612786565b906000526020600020906004020160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508585600486866040516112c7929190612968565b908152602001604051809103902084815481106112e6576112e6612786565b906000526020600020906004020160020191826113049291906129ba565b50838360048686604051611319929190612968565b9081526020016040518091039020848154811061133857611338612786565b9060005260206000209060040201600301918261046a9291906129ba565b606060028054806020026020016040519081016040528092919081815260200182805480156113d857602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116113935790505b5050505050905090565b6000546001600160a01b03163314610836576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866000036114475760405163cc4ccb6b60e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000001180156114a457506002547f0000000000000000000000000000000000000000000000000000000000000000906114a29060016129a7565b115b156114db576040517f444920b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008781526001602052604090205415611521576040517fb4a85a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61154c6040518060800160405280600081526020016060815260200160608152602001606081525090565b878152604080516020601f890181900481028201810190925287815290889088908190840183828082843760009201919091525050505060208083019190915260408051601f870183900483028101830190915285815290869086908190840183828082843760009201919091525050505060408083019190915280516020601f850181900481028201810190925283815290849084908190840183828082843760009201829052506060860194909452505050888152600160208181526040909220835181559183015183929182019061162790826128a8565b506040820151600282019061163c90826128a8565b506060820151600382019061165190826128a8565b5050600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6004820401805460039092166008026101000a67ffffffffffffffff818102199093169b90921691909102999099179098555050505050505050565b6116eb6040518060800160405280600081526020016060815260200160608152602001606081525090565b6000828152600160208181526040928390208351608081019094528054845291820180549184019161171c90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461174890612812565b80156117955780601f1061176a57610100808354040283529160200191611795565b820191906000526020600020905b81548152906001019060200180831161177857829003601f168201915b505050505081526020016002820180546117ae90612812565b80601f01602080910402602001604051908101604052809291908181526020018280546117da90612812565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b5050505050815260200160038201805461184090612812565b80601f016020809104026020016040519081016040528092919081815260200182805461186c90612812565b80156118b95780601f1061188e576101008083540402835291602001916118b9565b820191906000526020600020905b81548152906001019060200180831161189c57829003601f168201915b5050505050815250509050919050565b606060006118d683611a42565b9050610a57816040518060400160405280600b81526020017f696d6167652f782d696666000000000000000000000000000000000000000000815250611f75565b6000546001600160a01b031633146108365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b7565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060006119db836116c0565b604081015151909150151560006119f1856116c0565b6020015190506000611a1186848660400151611a0c86611fa9565b611fd2565b9050611a1c81612015565b9695505050505050565b60606000611a33836116c0565b602001519050610a5781611fa9565b60606000611a51600184612978565b9050600060046040518060400160405280600381526020016234b33360e91b815250604051611a80919061298b565b90815260200160405180910390208281548110611a9f57611a9f612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282018054611b0190612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2d90612812565b8015611b7a5780601f10611b4f57610100808354040283529160200191611b7a565b820191906000526020600020905b815481529060010190602001808311611b5d57829003601f168201915b50505050508152602001600382018054611b9390612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbf90612812565b8015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b505050505081525050905083816020015114611c6a5760405162461bcd60e51b815260206004820152601260248201527f494646206e6f7420636f6e66696775726564000000000000000000000000000060448201526064016103b7565b805160408083015190517ff96355940000000000000000000000000000000000000000000000000000000081526001600160a01b0383169163f963559491611cb59190600401612a7b565b600060405180830381865afa158015611cd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cfa9190810190612b19565b95945050505050565b60606000611d12600184612978565b905060006004604051806040016040528060038152602001621c18dd60ea1b815250604051611d41919061298b565b90815260200160405180910390208281548110611d6057611d60612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282018054611dc290612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611dee90612812565b8015611e3b5780601f10611e1057610100808354040283529160200191611e3b565b820191906000526020600020905b815481529060010190602001808311611e1e57829003601f168201915b50505050508152602001600382018054611e5490612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8090612812565b8015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b505050505081525050905083816020015114611c6a5760405162461bcd60e51b815260206004820152601360248201527f50494354206e6f7420636f6e666967757265640000000000000000000000000060448201526064016103b7565b60606000611f3883611d03565b9050610a57816040518060400160405280600c81526020017f696d6167652f782d7069637400000000000000000000000000000000000000008152505b606081611f8184612030565b604051602001611f92929190612b6a565b604051602081830303815290604052905092915050565b606081604051602001611fbc9190612beb565b6040516020818303038152906040529050919050565b6060611fe66003546001600160a01b031690565b6001600160a01b031663645b305a8585856040518463ffffffff1660e01b8152600401611cb593929190612c30565b606061202082612030565b604051602001611fbc9190612c5d565b6060815160000361204f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612cdc604091399050600060038451600261207e91906129a7565b6120889190612ca2565b612093906004612cc4565b67ffffffffffffffff8111156120ab576120ab61284c565b6040519080825280601f01601f1916602001820160405280156120d5576020820181803683370190505b509050600182016020820185865187015b80821015612141576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506120e6565b505060038651066001811461215d576002811461217057612178565b603d6001830353603d6002830353612178565b603d60018303535b509195945050505050565b5080546000825560040290600052602060002090810190610c5a91905b808211156121f057805473ffffffffffffffffffffffffffffffffffffffff191681556000600182018190556121d960028301826121f4565b6121e76003830160006121f4565b506004016121a0565b5090565b50805461220090612812565b6000825580601f10612210575050565b601f016020900490600052602060002090810190610c5a91905b808211156121f0576000815560010161222a565b6020808252825182820181905260009190848201906040850190845b8181101561228057835167ffffffffffffffff168352928401929184019160010161225a565b50909695505050505050565b60006020828403121561229e57600080fd5b5035919050565b60005b838110156122c05781810151838201526020016122a8565b50506000910152565b600081518084526122e18160208601602086016122a5565b601f01601f19169290920160200192915050565b602081526000610a5760208301846122c9565b60008083601f84011261231a57600080fd5b50813567ffffffffffffffff81111561233257600080fd5b6020830191508360208260051b850101111561234d57600080fd5b9250929050565b6000806000806000806000806080898b03121561237057600080fd5b883567ffffffffffffffff8082111561238857600080fd5b6123948c838d01612308565b909a50985060208b01359150808211156123ad57600080fd5b6123b98c838d01612308565b909850965060408b01359150808211156123d257600080fd5b6123de8c838d01612308565b909650945060608b01359150808211156123f757600080fd5b506124048b828c01612308565b999c989b5096995094979396929594505050565b6020815281516020820152600060208301516080604084015261243e60a08401826122c9565b90506040840151601f198085840301606086015261245c83836122c9565b9250606086015191508085840301608086015250611cfa82826122c9565b60008083601f84011261248c57600080fd5b50813567ffffffffffffffff8111156124a457600080fd5b60208301915083602082850101111561234d57600080fd5b60008060008060008060006080888a0312156124d757600080fd5b87359650602088013567ffffffffffffffff808211156124f657600080fd5b6125028b838c0161247a565b909850965060408a013591508082111561251b57600080fd5b6125278b838c0161247a565b909650945060608a013591508082111561254057600080fd5b5061254d8a828b0161247a565b989b979a50959850939692959293505050565b60008060006040848603121561257557600080fd5b833567ffffffffffffffff81111561258c57600080fd5b6125988682870161247a565b909790965060209590950135949350505050565b602081526001600160a01b0382511660208201526020820151604082015260006040830151608060608401526125e560a08401826122c9565b90506060840151601f19848303016080850152611cfa82826122c9565b80356001600160a01b038116811461261957600080fd5b919050565b60006020828403121561263057600080fd5b610a5782612602565b6000806020838503121561264c57600080fd5b823567ffffffffffffffff81111561266357600080fd5b61266f8582860161247a565b90969095509350505050565b60008060008060006060868803121561269357600080fd5b61269c86612602565b9450602086013567ffffffffffffffff808211156126b957600080fd5b6126c589838a01612308565b909650945060408801359150808211156126de57600080fd5b506126eb8882890161247a565b969995985093965092949392505050565b6000806000806000806080878903121561271557600080fd5b61271e87612602565b955060208701359450604087013567ffffffffffffffff8082111561274257600080fd5b61274e8a838b0161247a565b9096509450606089013591508082111561276757600080fd5b5061277489828a0161247a565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126127b357600080fd5b83018035915067ffffffffffffffff8211156127ce57600080fd5b60200191503681900382131561234d57600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161280b5761280b6127e3565b5060010190565b600181811c9082168061282657607f821691505b60208210810361284657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f821115610ea057600081815260208120601f850160051c810160208610156128895750805b601f850160051c820191505b8181101561102f57828155600101612895565b815167ffffffffffffffff8111156128c2576128c261284c565b6128d6816128d08454612812565b84612862565b602080601f83116001811461290b57600084156128f35750858301515b600019600386901b1c1916600185901b17855561102f565b600085815260208120601f198616915b8281101561293a5788860151825594840194600190910190840161291b565b50858210156129585787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b818103818111156104a9576104a96127e3565b6000825161299d8184602087016122a5565b9190910192915050565b808201808211156104a9576104a96127e3565b67ffffffffffffffff8311156129d2576129d261284c565b6129e6836129e08354612812565b83612862565b6000601f841160018114612a1a5760008515612a025750838201355b600019600387901b1c1916600186901b178355612a74565b600083815260209020601f19861690835b82811015612a4b5786850135825560209485019460019092019101612a2b565b5086821015612a685760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b604081526000612a8e60408301846122c9565b828103602093840152600081529190910192915050565b600067ffffffffffffffff80841115612ac057612ac061284c565b604051601f8501601f19908116603f01168101908282118183101715612ae857612ae861284c565b81604052809350858152868686011115612b0157600080fd5b612b0f8660208301876122a5565b5050509392505050565b600060208284031215612b2b57600080fd5b815167ffffffffffffffff811115612b4257600080fd5b8201601f81018413612b5357600080fd5b612b6284825160208401612aa5565b949350505050565b7f646174613a000000000000000000000000000000000000000000000000000000815260008351612ba28160058501602088016122a5565b7f3b6261736536342c0000000000000000000000000000000000000000000000006005918401918201528351612bdf81600d8401602088016122a5565b01600d01949350505050565b7f646174613a696d6167652f706e673b6261736536342c00000000000000000000815260008251612c238160168501602087016122a5565b9190910160160192915050565b8315158152606060208201526000612c4b60608301856122c9565b8281036040840152611a1c81856122c9565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612c9581601a8501602087016122a5565b91909101601a0192915050565b600082612cbf57634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176104a9576104a96127e356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c7e3e74d18c8ebc83762189f63d73ca1ba1d30f3d72b2db4956283fe777016b364736f6c63430008130033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101775760003560e01c80639363f314116100d8578063e440e1541161008c578063f3317c5111610066578063f3317c5114610306578063f68ce88c14610319578063fd4bec851461032c57600080fd5b8063e440e1541461022b578063e49a1076146102e2578063f2fde38b146102f357600080fd5b8063ab9f973c116100bd578063ab9f973c146102a9578063b01781da146102bc578063cc7b4fc7146102cf57600080fd5b80639363f31414610276578063a096299c1461028957600080fd5b80635f1e575a1161012f57806373f246c91161011457806373f246c91461022b578063801b848d1461023e5780638da5cb5b1461025157600080fd5b80635f1e575a14610210578063715018a61461022357600080fd5b80631cb73660116101605780631cb73660146101c85780632f156613146101dd5780633a4c3937146101fd57600080fd5b806316c3d2cb1461017c5780631b4bcfca1461019a575b600080fd5b61018461033f565b604051610191919061223e565b60405180910390f35b6101bb6101a836600461228c565b5060408051602081019091526000815290565b60405161019191906122f5565b6101db6101d6366004612354565b61034e565b005b6101f06101eb36600461228c565b610475565b6040516101919190612418565b6101db61020b3660046124bc565b6104af565b6101bb61021e36600461228c565b610819565b6101db610824565b6101bb61023936600461228c565b610838565b6101bb61024c36600461228c565b610843565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610191565b6101db6102843660046124bc565b61084e565b61029c610297366004612560565b61086e565b60405161019191906125ac565b6101db6102b736600461261e565b610a5e565b6101bb6102ca366004612560565b610a95565b6101bb6102dd36600461228c565b610bc2565b6003546001600160a01b031661025e565b6101db61030136600461261e565b610bcd565b6101db610314366004612639565b610c5d565b6101db61032736600461267b565b610ea5565b6101db61033a3660046126fc565b611037565b6060610349611356565b905090565b6103566113e2565b868514801561036457508683145b801561036f57508681145b6103c05760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206e756d626572206f6620617373657473000000000000000060448201526064015b60405180910390fd5b60005b8781101561046a576104588989838181106103e0576103e0612786565b905060200201358888848181106103f9576103f9612786565b905060200281019061040b919061279c565b88888681811061041d5761041d612786565b905060200281019061042f919061279c565b88888881811061044157610441612786565b9050602002810190610453919061279c565b611426565b80610462816127f9565b9150506103c3565b505050505050505050565b6104a06040518060800160405280600081526020016060815260200160608152602001606081525090565b6104a9826116c0565b92915050565b6104b76113e2565b866000036104d85760405163cc4ccb6b60e01b815260040160405180910390fd5b600087815260016020818152604080842081516080810190925280548252928301805491939284019161050a90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461053690612812565b80156105835780601f1061055857610100808354040283529160200191610583565b820191906000526020600020905b81548152906001019060200180831161056657829003601f168201915b5050505050815260200160028201805461059c90612812565b80601f01602080910402602001604051908101604052809291908181526020018280546105c890612812565b80156106155780601f106105ea57610100808354040283529160200191610615565b820191906000526020600020905b8154815290600101906020018083116105f857829003601f168201915b5050505050815260200160038201805461062e90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461065a90612812565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b505050505081525050905080600001516000036106f0576040517fac3891e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87815285156107355786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208201525b83156107775784848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408201525b81156107b95782828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060608201525b600088815260016020818152604090922083518155918301518392918201906107e290826128a8565b50604082015160028201906107f790826128a8565b506060820151600382019061080c90826128a8565b5050505050505050505050565b60606104a9826118c9565b61082c611917565b6108366000611971565b565b60606104a9826119ce565b60606104a982611a26565b6108566113e2565b61086587878787878787611426565b50505050505050565b6108a2604051806080016040528060006001600160a01b031681526020016000815260200160608152602001606081525090565b600484846040516108b4929190612968565b9081526040519081900360200190206108ce600184612978565b815481106108de576108de612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805461094090612812565b80601f016020809104026020016040519081016040528092919081815260200182805461096c90612812565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081526020016003820180546109d290612812565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90612812565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b50505050508152505090505b9392505050565b610a666113e2565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60606040518060400160405280600381526020016234b33360e91b815250604051602001610ac3919061298b565b604051602081830303815290604052805190602001208484604051602001610aec929190612968565b6040516020818303038152906040528051906020012003610b1757610b1082611a42565b9050610a57565b604051806040016040528060038152602001621c18dd60ea1b815250604051602001610b43919061298b565b604051602081830303815290604052805190602001208484604051602001610b6c929190612968565b6040516020818303038152906040528051906020012003610b9057610b1082611d03565b6040517f70ad5b7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606104a982611f2b565b610bd5611917565b6001600160a01b038116610c515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103b7565b610c5a81611971565b50565b610c656113e2565b600060048383604051610c79929190612968565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015610e1d576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610cfa90612812565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690612812565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b50505050508152602001600382018054610d8c90612812565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890612812565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b50505050508152505081526020019060010190610ca7565b5050505090506000815111610e745760405162461bcd60e51b815260206004820152600e60248201527f617272617920697320656d70747900000000000000000000000000000000000060448201526064016103b7565b60048383604051610e86929190612968565b90815260200160405180910390206000610ea09190612183565b505050565b610ead6113e2565b60005b8381101561102f5760006040518060800160405280886001600160a01b03168152602001836001610ee191906129a7565b8152602001878785818110610ef857610ef8612786565b9050602002810190610f0a919061279c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050915250604051909150600490610f919086908690612968565b90815260408051602092819003830190208054600180820183556000928352918490208551600490920201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911781559284015190830155820151829190600282019061100390826128a8565b506060820151600382019061101890826128a8565b505050508080611027906127f9565b915050610eb0565b505050505050565b61103f6113e2565b600061104c600187612978565b9050600060048484604051611062929190612968565b9081526020016040518091039020828154811061108157611081612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820180546110e390612812565b80601f016020809104026020016040519081016040528092919081815260200182805461110f90612812565b801561115c5780601f106111315761010080835404028352916020019161115c565b820191906000526020600020905b81548152906001019060200180831161113f57829003601f168201915b5050505050815260200160038201805461117590612812565b80601f01602080910402602001604051908101604052809291908181526020018280546111a190612812565b80156111ee5780601f106111c3576101008083540402835291602001916111ee565b820191906000526020600020905b8154815290600101906020018083116111d157829003601f168201915b50505050508152505090508681602001511461124c5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642061646472657373696e67000000000000000000000000000060448201526064016103b7565b876004858560405161125f929190612968565b9081526020016040518091039020838154811061127e5761127e612786565b906000526020600020906004020160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508585600486866040516112c7929190612968565b908152602001604051809103902084815481106112e6576112e6612786565b906000526020600020906004020160020191826113049291906129ba565b50838360048686604051611319929190612968565b9081526020016040518091039020848154811061133857611338612786565b9060005260206000209060040201600301918261046a9291906129ba565b606060028054806020026020016040519081016040528092919081815260200182805480156113d857602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116113935790505b5050505050905090565b6000546001600160a01b03163314610836576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866000036114475760405163cc4ccb6b60e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000051180156114a457506002547f0000000000000000000000000000000000000000000000000000000000000005906114a29060016129a7565b115b156114db576040517f444920b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008781526001602052604090205415611521576040517fb4a85a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61154c6040518060800160405280600081526020016060815260200160608152602001606081525090565b878152604080516020601f890181900481028201810190925287815290889088908190840183828082843760009201919091525050505060208083019190915260408051601f870183900483028101830190915285815290869086908190840183828082843760009201919091525050505060408083019190915280516020601f850181900481028201810190925283815290849084908190840183828082843760009201829052506060860194909452505050888152600160208181526040909220835181559183015183929182019061162790826128a8565b506040820151600282019061163c90826128a8565b506060820151600382019061165190826128a8565b5050600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6004820401805460039092166008026101000a67ffffffffffffffff818102199093169b90921691909102999099179098555050505050505050565b6116eb6040518060800160405280600081526020016060815260200160608152602001606081525090565b6000828152600160208181526040928390208351608081019094528054845291820180549184019161171c90612812565b80601f016020809104026020016040519081016040528092919081815260200182805461174890612812565b80156117955780601f1061176a57610100808354040283529160200191611795565b820191906000526020600020905b81548152906001019060200180831161177857829003601f168201915b505050505081526020016002820180546117ae90612812565b80601f01602080910402602001604051908101604052809291908181526020018280546117da90612812565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b5050505050815260200160038201805461184090612812565b80601f016020809104026020016040519081016040528092919081815260200182805461186c90612812565b80156118b95780601f1061188e576101008083540402835291602001916118b9565b820191906000526020600020905b81548152906001019060200180831161189c57829003601f168201915b5050505050815250509050919050565b606060006118d683611a42565b9050610a57816040518060400160405280600b81526020017f696d6167652f782d696666000000000000000000000000000000000000000000815250611f75565b6000546001600160a01b031633146108365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b7565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060006119db836116c0565b604081015151909150151560006119f1856116c0565b6020015190506000611a1186848660400151611a0c86611fa9565b611fd2565b9050611a1c81612015565b9695505050505050565b60606000611a33836116c0565b602001519050610a5781611fa9565b60606000611a51600184612978565b9050600060046040518060400160405280600381526020016234b33360e91b815250604051611a80919061298b565b90815260200160405180910390208281548110611a9f57611a9f612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282018054611b0190612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2d90612812565b8015611b7a5780601f10611b4f57610100808354040283529160200191611b7a565b820191906000526020600020905b815481529060010190602001808311611b5d57829003601f168201915b50505050508152602001600382018054611b9390612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbf90612812565b8015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b505050505081525050905083816020015114611c6a5760405162461bcd60e51b815260206004820152601260248201527f494646206e6f7420636f6e66696775726564000000000000000000000000000060448201526064016103b7565b805160408083015190517ff96355940000000000000000000000000000000000000000000000000000000081526001600160a01b0383169163f963559491611cb59190600401612a7b565b600060405180830381865afa158015611cd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cfa9190810190612b19565b95945050505050565b60606000611d12600184612978565b905060006004604051806040016040528060038152602001621c18dd60ea1b815250604051611d41919061298b565b90815260200160405180910390208281548110611d6057611d60612786565b90600052602060002090600402016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282018054611dc290612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611dee90612812565b8015611e3b5780601f10611e1057610100808354040283529160200191611e3b565b820191906000526020600020905b815481529060010190602001808311611e1e57829003601f168201915b50505050508152602001600382018054611e5490612812565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8090612812565b8015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b505050505081525050905083816020015114611c6a5760405162461bcd60e51b815260206004820152601360248201527f50494354206e6f7420636f6e666967757265640000000000000000000000000060448201526064016103b7565b60606000611f3883611d03565b9050610a57816040518060400160405280600c81526020017f696d6167652f782d7069637400000000000000000000000000000000000000008152505b606081611f8184612030565b604051602001611f92929190612b6a565b604051602081830303815290604052905092915050565b606081604051602001611fbc9190612beb565b6040516020818303038152906040529050919050565b6060611fe66003546001600160a01b031690565b6001600160a01b031663645b305a8585856040518463ffffffff1660e01b8152600401611cb593929190612c30565b606061202082612030565b604051602001611fbc9190612c5d565b6060815160000361204f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612cdc604091399050600060038451600261207e91906129a7565b6120889190612ca2565b612093906004612cc4565b67ffffffffffffffff8111156120ab576120ab61284c565b6040519080825280601f01601f1916602001820160405280156120d5576020820181803683370190505b509050600182016020820185865187015b80821015612141576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506120e6565b505060038651066001811461215d576002811461217057612178565b603d6001830353603d6002830353612178565b603d60018303535b509195945050505050565b5080546000825560040290600052602060002090810190610c5a91905b808211156121f057805473ffffffffffffffffffffffffffffffffffffffff191681556000600182018190556121d960028301826121f4565b6121e76003830160006121f4565b506004016121a0565b5090565b50805461220090612812565b6000825580601f10612210575050565b601f016020900490600052602060002090810190610c5a91905b808211156121f0576000815560010161222a565b6020808252825182820181905260009190848201906040850190845b8181101561228057835167ffffffffffffffff168352928401929184019160010161225a565b50909695505050505050565b60006020828403121561229e57600080fd5b5035919050565b60005b838110156122c05781810151838201526020016122a8565b50506000910152565b600081518084526122e18160208601602086016122a5565b601f01601f19169290920160200192915050565b602081526000610a5760208301846122c9565b60008083601f84011261231a57600080fd5b50813567ffffffffffffffff81111561233257600080fd5b6020830191508360208260051b850101111561234d57600080fd5b9250929050565b6000806000806000806000806080898b03121561237057600080fd5b883567ffffffffffffffff8082111561238857600080fd5b6123948c838d01612308565b909a50985060208b01359150808211156123ad57600080fd5b6123b98c838d01612308565b909850965060408b01359150808211156123d257600080fd5b6123de8c838d01612308565b909650945060608b01359150808211156123f757600080fd5b506124048b828c01612308565b999c989b5096995094979396929594505050565b6020815281516020820152600060208301516080604084015261243e60a08401826122c9565b90506040840151601f198085840301606086015261245c83836122c9565b9250606086015191508085840301608086015250611cfa82826122c9565b60008083601f84011261248c57600080fd5b50813567ffffffffffffffff8111156124a457600080fd5b60208301915083602082850101111561234d57600080fd5b60008060008060008060006080888a0312156124d757600080fd5b87359650602088013567ffffffffffffffff808211156124f657600080fd5b6125028b838c0161247a565b909850965060408a013591508082111561251b57600080fd5b6125278b838c0161247a565b909650945060608a013591508082111561254057600080fd5b5061254d8a828b0161247a565b989b979a50959850939692959293505050565b60008060006040848603121561257557600080fd5b833567ffffffffffffffff81111561258c57600080fd5b6125988682870161247a565b909790965060209590950135949350505050565b602081526001600160a01b0382511660208201526020820151604082015260006040830151608060608401526125e560a08401826122c9565b90506060840151601f19848303016080850152611cfa82826122c9565b80356001600160a01b038116811461261957600080fd5b919050565b60006020828403121561263057600080fd5b610a5782612602565b6000806020838503121561264c57600080fd5b823567ffffffffffffffff81111561266357600080fd5b61266f8582860161247a565b90969095509350505050565b60008060008060006060868803121561269357600080fd5b61269c86612602565b9450602086013567ffffffffffffffff808211156126b957600080fd5b6126c589838a01612308565b909650945060408801359150808211156126de57600080fd5b506126eb8882890161247a565b969995985093965092949392505050565b6000806000806000806080878903121561271557600080fd5b61271e87612602565b955060208701359450604087013567ffffffffffffffff8082111561274257600080fd5b61274e8a838b0161247a565b9096509450606089013591508082111561276757600080fd5b5061277489828a0161247a565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126127b357600080fd5b83018035915067ffffffffffffffff8211156127ce57600080fd5b60200191503681900382131561234d57600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161280b5761280b6127e3565b5060010190565b600181811c9082168061282657607f821691505b60208210810361284657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f821115610ea057600081815260208120601f850160051c810160208610156128895750805b601f850160051c820191505b8181101561102f57828155600101612895565b815167ffffffffffffffff8111156128c2576128c261284c565b6128d6816128d08454612812565b84612862565b602080601f83116001811461290b57600084156128f35750858301515b600019600386901b1c1916600185901b17855561102f565b600085815260208120601f198616915b8281101561293a5788860151825594840194600190910190840161291b565b50858210156129585787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b818103818111156104a9576104a96127e3565b6000825161299d8184602087016122a5565b9190910192915050565b808201808211156104a9576104a96127e3565b67ffffffffffffffff8311156129d2576129d261284c565b6129e6836129e08354612812565b83612862565b6000601f841160018114612a1a5760008515612a025750838201355b600019600387901b1c1916600186901b178355612a74565b600083815260209020601f19861690835b82811015612a4b5786850135825560209485019460019092019101612a2b565b5086821015612a685760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b604081526000612a8e60408301846122c9565b828103602093840152600081529190910192915050565b600067ffffffffffffffff80841115612ac057612ac061284c565b604051601f8501601f19908116603f01168101908282118183101715612ae857612ae861284c565b81604052809350858152868686011115612b0157600080fd5b612b0f8660208301876122a5565b5050509392505050565b600060208284031215612b2b57600080fd5b815167ffffffffffffffff811115612b4257600080fd5b8201601f81018413612b5357600080fd5b612b6284825160208401612aa5565b949350505050565b7f646174613a000000000000000000000000000000000000000000000000000000815260008351612ba28160058501602088016122a5565b7f3b6261736536342c0000000000000000000000000000000000000000000000006005918401918201528351612bdf81600d8401602088016122a5565b01600d01949350505050565b7f646174613a696d6167652f706e673b6261736536342c00000000000000000000815260008251612c238160168501602087016122a5565b9190910160160192915050565b8315158152606060208201526000612c4b60608301856122c9565b8281036040840152611a1c81856122c9565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612c9581601a8501602087016122a5565b91909101601a0192915050565b600082612cbf57634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176104a9576104a96127e356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c7e3e74d18c8ebc83762189f63d73ca1ba1d30f3d72b2db4956283fe777016b364736f6c63430008130033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.