ETH Price: $3,180.28 (+1.53%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...148695522022-05-30 0:26:44974 days ago1653870404IN
0x51B2CCc1...0C7f73A6a
0 ETH0.0009759734.23384854
Add Many One Of ...139863632022-01-11 20:21:191112 days ago1641932479IN
0x51B2CCc1...0C7f73A6a
0 ETH0.2735077178.19484869
Add Many One Of ...139863632022-01-11 20:21:191112 days ago1641932479IN
0x51B2CCc1...0C7f73A6a
0 ETH0.28449841178.19484869
Add Many Mouths139863632022-01-11 20:21:191112 days ago1641932479IN
0x51B2CCc1...0C7f73A6a
0 ETH0.05459985178.69484869
Add Many Mouths139863632022-01-11 20:21:191112 days ago1641932479IN
0x51B2CCc1...0C7f73A6a
0 ETH0.12276836178.69484869
Add Many Skins139863632022-01-11 20:21:191112 days ago1641932479IN
0x51B2CCc1...0C7f73A6a
0 ETH0.05396262178.69484869
Add Many Skins139863632022-01-11 20:21:191112 days ago1641932479IN
0x51B2CCc1...0C7f73A6a
0 ETH0.15026601178.19484869
Add Many Accesso...139863582022-01-11 20:19:311112 days ago1641932371IN
0x51B2CCc1...0C7f73A6a
0 ETH0.0405792172.48881354
Add Many Clothes139863582022-01-11 20:19:311112 days ago1641932371IN
0x51B2CCc1...0C7f73A6a
0 ETH0.20534603172.48881354
Add Many Bg Item...139863582022-01-11 20:19:311112 days ago1641932371IN
0x51B2CCc1...0C7f73A6a
0 ETH0.0961839172.48881354
Add Many Hats139863582022-01-11 20:19:311112 days ago1641932371IN
0x51B2CCc1...0C7f73A6a
0 ETH0.01976394172.48881354
Add Many Eyes139863552022-01-11 20:18:351112 days ago1641932315IN
0x51B2CCc1...0C7f73A6a
0 ETH0.03218142151.84786366
Add Many Colors ...139863552022-01-11 20:18:351112 days ago1641932315IN
0x51B2CCc1...0C7f73A6a
0 ETH0.5835893151.84786366
Add Many Backgro...139863552022-01-11 20:18:351112 days ago1641932315IN
0x51B2CCc1...0C7f73A6a
0 ETH0.01774099151.84786366

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Descriptor

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 9 : Descriptor.sol
// SPDX-License-Identifier: GPL-3.0

/// @title The Wizards NFT descriptor

pragma solidity ^0.8.6;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {IDescriptor} from "./IDescriptor.sol";
import {ISeeder} from "../seeder/ISeeder.sol";
import {NFTDescriptor} from "../libs/NFTDescriptor.sol";
import {MultiPartRLEToSVG} from "../libs/MultiPartRLEToSVG.sol";

contract Descriptor is IDescriptor, Ownable {
    using Strings for uint256;

    // Whether or not new parts can be added
    bool public override arePartsLocked;

    // Whether or not `tokenURI` should be returned as a data URI (Default: true)
    bool public override isDataURIEnabled = true;

    // Base URI
    string public override baseURI;

    // Color Palettes (Index => Hex Colors)
    mapping(uint8 => string[]) public override palettes;

    // Backgrounds (Hex Colors)
    string[] public override backgrounds;

    // Skins (Custom RLE)
    bytes[] public override skins;

    // Clothes (Custom RLE)
    bytes[] public override clothes;

    // Accessories (Custom RLE)
    bytes[] public override accessory;

    // BgItems (orb, staff, etc) (Custom RLE)
    bytes[] public override bgItems;

    // Mouths (Custom RLE)
    bytes[] public override mouths;

    // Eyes (Custom RLE)
    bytes[] public override eyes;

    // Hats (Custom RLE)
    bytes[] public override hats;

    // 1-1 wizards (Custom RLE)
    bytes[] public override oneOfOnes;

    uint256 public lastOneOfOneCount;

    /**
     * @notice Require that the parts have not been locked.
     */
    modifier whenPartsNotLocked() {
        require(!arePartsLocked, "Parts are locked");
        _;
    }

    /**
     * @notice Get the number of available `backgrounds`.
     */
    function backgroundCount() external view override returns (uint256) {
        return backgrounds.length;
    }

    /**
     * @notice One of ones count.
     */
    function oneOfOnesCount() external view override returns (uint256) {
        return oneOfOnes.length;
    }

    /**
     * @notice Get the number of available `skins`.
     */
    function skinsCount() external view override returns (uint256) {
        return skins.length;
    }

    /**
     * @notice Get the number of available `clothes`.
     */
    function clothesCount() external view override returns (uint256) {
        return clothes.length;
    }

    /**
     * @notice Get the number of available `accesories`.
     */
    function accessoryCount() external view override returns (uint256) {
        return accessory.length;
    }

    /**
     * @notice Get the number of available `bg items`.
     */
    function bgItemsCount() external view override returns (uint256) {
        return bgItems.length;
    }

    /**
     * @notice Get the number of available `hats`.
     */
    function hatsCount() external view override returns (uint256) {
        return hats.length;
    }

    /**
     * @notice Get the number of available `mouths`.
     */
    function mouthsCount() external view override returns (uint256) {
        return mouths.length;
    }

    /**
     * @notice Get the number of available `eyes`.
     */
    function eyesCount() external view override returns (uint256) {
        return eyes.length;
    }

    /**
     * @notice Add colors to a color palette.
     * @dev This function can only be called by the owner.
     */
    function addManyColorsToPalette(
        uint8 paletteIndex,
        string[] calldata newColors
    ) external override onlyOwner {
        require(
            palettes[paletteIndex].length + newColors.length <= 256,
            "Palettes can only hold 256 colors"
        );
        for (uint256 i = 0; i < newColors.length; i++) {
            _addColorToPalette(paletteIndex, newColors[i]);
        }
    }

    /**
     * @notice Replaces colors in a color palette.
     * @dev This function can only be called by the owner and should only
     * be used administratively to restore proper palette indexes.
     */
    function replacePalette(uint8 paletteIndex, string[] calldata newColors)
        external
        onlyOwner
    {
        require(newColors.length <= 256, "Palettes can only hold 256 colors");

        delete palettes[paletteIndex];
        for (uint256 i = 0; i < newColors.length; i++) {
            _addColorToPalette(paletteIndex, newColors[i]);
        }
    }

    /**
     * @notice Batch add backgrounds.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManyBackgrounds(string[] calldata _backgrounds)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        for (uint256 i = 0; i < _backgrounds.length; i++) {
            _addBackground(_backgrounds[i]);
        }
    }

    /**
     * @notice Batch add skins.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManySkins(bytes[] calldata _skins)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        for (uint256 i = 0; i < _skins.length; i++) {
            _addSkin(_skins[i]);
        }
    }

    /**
     * @notice Batch add hats.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManyHats(bytes[] calldata _hats)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        for (uint256 i = 0; i < _hats.length; i++) {
            _addHat(_hats[i]);
        }
    }

    /**
     * @notice Batch add eyes.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManyEyes(bytes[] calldata _eyes)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        for (uint256 i = 0; i < _eyes.length; i++) {
            _addEyes(_eyes[i]);
        }
    }

    /**
     * @notice Batch add mouths.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManyMouths(bytes[] calldata _mouths)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        for (uint256 i = 0; i < _mouths.length; i++) {
            _addMouth(_mouths[i]);
        }
    }

    /**
     * @notice Batch add bg items.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManyBgItems(bytes[] calldata _bgItems)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        for (uint256 i = 0; i < _bgItems.length; i++) {
            _addBgItem(_bgItems[i]);
        }
    }

    /**
     * @notice Batch add accessories.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManyAccessories(bytes[] calldata _accessory)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        for (uint256 i = 0; i < _accessory.length; i++) {
            _addAccessory(_accessory[i]);
        }
    }

    /**
     * @notice Batch add clothes.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManyClothes(bytes[] calldata _clothes)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        for (uint256 i = 0; i < _clothes.length; i++) {
            _addClothes(_clothes[i]);
        }
    }

    /**
     * @notice Batch add one of one Wizards.
     * @dev This function can only be called by the owner when not locked.
     */
    function addManyOneOfOnes(bytes[] calldata _oneOfOnes)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        lastOneOfOneCount += _oneOfOnes.length;

        for (uint256 i = 0; i < _oneOfOnes.length; i++) {
            _addOneOfOne(_oneOfOnes[i]);
        }
    }

    /**
     * @notice Add a single color to a color palette.
     * @dev This function can only be called by the owner.
     */
    function addColorToPalette(uint8 _paletteIndex, string calldata _color)
        external
        override
        onlyOwner
    {
        require(
            palettes[_paletteIndex].length <= 255,
            "Palettes can only hold 256 colors"
        );
        _addColorToPalette(_paletteIndex, _color);
    }

    /**
     * @notice Add a one of one wizards.
     * @dev This function can only be called by the owner when not locked.
     */
    function addOneOfOne(bytes calldata _oneOfOne)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        lastOneOfOneCount += 1;
        _addOneOfOne(_oneOfOne);
    }

    /**
     * @notice Add a background.
     * @dev This function can only be called by the owner when not locked.
     */
    function addBackground(string calldata _background)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        _addBackground(_background);
    }

    /**
     * @notice Add a skin.
     * @dev This function can only be called by the owner when not locked.
     */
    function addSkin(bytes calldata _skin)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        _addSkin(_skin);
    }

    /**
     * @notice Add wizard hat.
     * @dev This function can only be called by the owner when not locked.
     */
    function addHat(bytes calldata _hat)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        _addHat(_hat);
    }

    /**
     * @notice Add a clothes.
     * @dev This function can only be called by the owner when not locked.
     */
    function addClothes(bytes calldata _clothes)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        _addClothes(_clothes);
    }

    /**
     * @notice Add a bg item.
     * @dev This function can only be called by the owner when not locked.
     */
    function addBgItem(bytes calldata _bgItem)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        _addBgItem(_bgItem);
    }

    /**
     * @notice Add a accessory.
     * @dev This function can only be called by the owner when not locked.
     */
    function addAccessory(bytes calldata _accessory)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        _addAccessory(_accessory);
    }

    /**
     * @notice Add a mouth.
     * @dev This function can only be called by the owner when not locked.
     */
    function addMouth(bytes calldata _mouth)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        _addMouth(_mouth);
    }

    /**
     * @notice Add eyes.
     * @dev This function can only be called by the owner when not locked.
     */
    function addEyes(bytes calldata _eyes)
        external
        override
        onlyOwner
        whenPartsNotLocked
    {
        _addEyes(_eyes);
    }

    /**
     * @notice Lock all parts.
     * @dev This cannot be reversed and can only be called by the owner when not locked.
     */
    function lockParts() external override onlyOwner whenPartsNotLocked {
        arePartsLocked = true;

        emit PartsLocked();
    }

    /**
     * @notice Toggle a boolean value which determines if `tokenURI` returns a data URI
     * or an HTTP URL.
     * @dev This can only be called by the owner.
     */
    function toggleDataURIEnabled() external override onlyOwner {
        bool enabled = !isDataURIEnabled;

        isDataURIEnabled = enabled;
        emit DataURIToggled(enabled);
    }

    /**
     * @notice Set the base URI for all token IDs. It is automatically
     * added as a prefix to the value returned in {tokenURI}, or to the
     * token ID if {tokenURI} is empty.
     * @dev This can only be called by the owner.
     */
    function setBaseURI(string calldata _baseURI) external override onlyOwner {
        baseURI = _baseURI;

        emit BaseURIUpdated(_baseURI);
    }

    /**
     * @notice Given a token ID and seed, construct a token URI.
     * @dev The returned value may be a base64 encoded data URI or an API URL.
     */
    function tokenURI(uint256 tokenId, ISeeder.Seed memory seed)
        external
        view
        override
        returns (string memory)
    {
        if (isDataURIEnabled) {
            return dataURI(tokenId, seed);
        }

        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }

    /**
     * @notice Given a token ID and seed, construct a base64 encoded data URI.
     */
    function dataURI(uint256 tokenId, ISeeder.Seed memory seed)
        public
        view
        override
        returns (string memory)
    {
        string memory wizardId = tokenId.toString();
        string memory name = string(abi.encodePacked("Wizard #", wizardId));

        string memory description = "";
        if (seed.oneOfOne) {
            description = string(
                abi.encodePacked(
                    "Wizard #",
                    wizardId,
                    " is a one of one artpiece and a member of the WizardsDAO"
                )
            );
        } else {
            description = string(
                abi.encodePacked(
                    "Wizard #",
                    wizardId,
                    " is a member of the WizardsDAO"
                )
            );
        }

        return genericDataURI(name, description, seed);
    }

    /**
     * @notice Given a name, description, and seed, construct a base64 encoded data URI.
     */
    function genericDataURI(
        string memory name,
        string memory description,
        ISeeder.Seed memory seed
    ) public view override returns (string memory) {
        NFTDescriptor.TokenURIParams memory params = NFTDescriptor
            .TokenURIParams({
                name: name,
                description: description,
                parts: _getPartsForSeed(seed),
                background: backgrounds[seed.background]
            });
        return NFTDescriptor.constructTokenURI(params, palettes);
    }

    /**
     * @notice Given a seed, construct a base64 encoded SVG image.
     */
    function generateSVGImage(ISeeder.Seed memory seed)
        external
        view
        override
        returns (string memory)
    {
        MultiPartRLEToSVG.SVGParams memory params = MultiPartRLEToSVG
            .SVGParams({
                parts: _getPartsForSeed(seed),
                background: backgrounds[seed.background]
            });
        return NFTDescriptor.generateSVGImage(params, palettes);
    }

    /**
     * @notice Add a single color to a color palette.
     */
    function _addColorToPalette(uint8 _paletteIndex, string calldata _color)
        internal
    {
        palettes[_paletteIndex].push(_color);
    }

    /**
     * @notice Add a single one of one wizard.
     */
    function _addOneOfOne(bytes calldata _oneOfOne) internal {
        oneOfOnes.push(_oneOfOne);
    }

    /**
     * @notice Add a background.
     */
    function _addBackground(string calldata _background) internal {
        backgrounds.push(_background);
    }

    /**
     * @notice Add a skin.
     */
    function _addSkin(bytes calldata _skin) internal {
        skins.push(_skin);
    }

    /**
     * @notice Add clothes.
     */
    function _addClothes(bytes calldata _clothes) internal {
        clothes.push(_clothes);
    }

    /**
     * @notice Add accessories.
     */
    function _addAccessory(bytes calldata _accessory) internal {
        accessory.push(_accessory);
    }

    /**
     * @notice Add bg items.
     */
    function _addBgItem(bytes calldata _bgItem) internal {
        bgItems.push(_bgItem);
    }

    /**
     * @notice Add a mouth.
     */
    function _addMouth(bytes calldata _mouth) internal {
        mouths.push(_mouth);
    }

    /**
     * @notice Add eyes.
     */
    function _addEyes(bytes calldata _eyes) internal {
        eyes.push(_eyes);
    }

    /**
     * @notice Add hat.
     */
    function _addHat(bytes calldata _hat) internal {
        hats.push(_hat);
    }

    /**
     * @notice Get all parts for the passed `seed`.
     */
    function _getPartsForSeed(ISeeder.Seed memory seed)
        internal
        view
        returns (bytes[] memory)
    {
        if (seed.oneOfOne) {
            bytes[] memory _oneOfOneParts = new bytes[](1);
            _oneOfOneParts[0] = oneOfOnes[seed.oneOfOneIndex];
            return _oneOfOneParts;
        }

        bytes[] memory _parts = new bytes[](7);
        _parts[0] = skins[seed.skin];
        _parts[1] = clothes[seed.clothes];
        _parts[2] = eyes[seed.eyes];
        _parts[3] = mouths[seed.mouth];
        _parts[4] = accessory[seed.accessory];
        _parts[5] = bgItems[seed.bgItem];
        _parts[6] = hats[seed.hat];

        return _parts;
    }
}

File 2 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 9 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 4 of 9 : IDescriptor.sol
// SPDX-License-Identifier: GPL-3.0

/// @title Interface for Descriptor

pragma solidity ^0.8.6;

import { ISeeder } from '../seeder/ISeeder.sol';

interface IDescriptor {
    event PartsLocked();

    event DataURIToggled(bool enabled);

    event BaseURIUpdated(string baseURI);

    function arePartsLocked() external returns (bool);

    function isDataURIEnabled() external returns (bool);    

    function baseURI() external returns (string memory);

    function palettes(uint8 paletteIndex, uint256 colorIndex) external view returns (string memory);

    function addManyColorsToPalette(uint8 paletteIndex, string[] calldata newColors) external;

    function addColorToPalette(uint8 paletteIndex, string calldata color) external;


    function backgrounds(uint256 index) external view returns (string memory);    

    function backgroundCount() external view returns (uint256);

    function addManyBackgrounds(string[] calldata backgrounds) external;

    function addBackground(string calldata background) external;    

    
    
    function oneOfOnes(uint256 index) external view returns (bytes memory);

    function oneOfOnesCount() external view returns (uint256);

    function addOneOfOne(bytes calldata _oneOfOne) external;

    function addManyOneOfOnes(bytes[] calldata _oneOfOnes) external;    


    function skins(uint256 index) external view returns (bytes memory);

    function skinsCount() external view returns (uint256);

    function addManySkins(bytes[] calldata skins) external;

    function addSkin(bytes calldata skin) external;


    function hats(uint256 index) external view returns (bytes memory);

    function hatsCount() external view returns (uint256);

    function addManyHats(bytes[] calldata hats) external;

    function addHat(bytes calldata hat) external;

    
    function clothes(uint256 index) external view returns (bytes memory);

    function clothesCount() external view returns (uint256);

    function addManyClothes(bytes[] calldata ears) external;

    function addClothes(bytes calldata ear) external;


    function mouths(uint256 index) external view returns (bytes memory);

    function mouthsCount() external view returns (uint256);

    function addManyMouths(bytes[] calldata mouths) external;

    function addMouth(bytes calldata mouth) external;

    
    function eyes(uint256 index) external view returns (bytes memory);

    function eyesCount() external view returns (uint256);

    function addManyEyes(bytes[] calldata eyes) external;

    function addEyes(bytes calldata eye) external;


    function accessory(uint256 index) external view returns (bytes memory);

    function accessoryCount() external view returns (uint256);

    function addManyAccessories(bytes[] calldata noses) external;

    function addAccessory(bytes calldata nose) external;


    function bgItems(uint256 index) external view returns (bytes memory);

    function bgItemsCount() external view returns (uint256);

    function addManyBgItems(bytes[] calldata noses) external;

    function addBgItem(bytes calldata nose) external;


    function lockParts() external;

    function toggleDataURIEnabled() external;

    function setBaseURI(string calldata baseURI) external;

    function tokenURI(uint256 tokenId, ISeeder.Seed memory seed) external view returns (string memory);

    function dataURI(uint256 tokenId, ISeeder.Seed memory seed) external view returns (string memory);

    function genericDataURI(
        string calldata name,
        string calldata description,
        ISeeder.Seed memory seed
    ) external view returns (string memory);

    function generateSVGImage(ISeeder.Seed memory seed) external view returns (string memory);
}

File 5 of 9 : ISeeder.sol
// SPDX-License-Identifier: GPL-3.0

/// @title Interface for Seeder

pragma solidity ^0.8.6;

import { IDescriptor } from '../descriptor/IDescriptor.sol';

// "Skin", "Cloth", "Eye", "Mouth", "Acc", "Item", "Hat"
interface ISeeder {
    struct Seed {
        uint48 background;
        uint48 skin;
        uint48 clothes;
        uint48 eyes;
        uint48 mouth;
        uint48 accessory;
        uint48 bgItem;
        uint48 hat;
        bool oneOfOne;
        uint48 oneOfOneIndex;
    }

    function generateSeed(uint256 wizardId, IDescriptor descriptor, bool isOneOfOne, uint48 isOneOfOneIndex) external view returns (Seed memory);
}

File 6 of 9 : NFTDescriptor.sol
// SPDX-License-Identifier: GPL-3.0

/// @title A library used to construct ERC721 token URIs and SVG images

pragma solidity ^0.8.6;

import { Base64 } from 'base64-sol/base64.sol';
import { MultiPartRLEToSVG } from './MultiPartRLEToSVG.sol';

library NFTDescriptor {
    struct TokenURIParams {
        string name;
        string description;
        bytes[] parts;
        string background;
    }

    /**
     * @notice Construct an ERC721 token URI.
     */
    function constructTokenURI(TokenURIParams memory params, mapping(uint8 => string[]) storage palettes)
        public
        view
        returns (string memory)
    {
        string memory image = generateSVGImage(
            MultiPartRLEToSVG.SVGParams({ parts: params.parts, background: params.background }),
            palettes
        );

        // prettier-ignore
        return string(
            abi.encodePacked(
                'data:application/json;base64,',
                Base64.encode(
                    bytes(
                        abi.encodePacked('{"name":"', params.name, '", "description":"', params.description, '", "image": "', 'data:image/svg+xml;base64,', image, '"}')
                    )
                )
            )
        );
    }

    /**
     * @notice Generate an SVG image for use in the ERC721 token URI.
     */
    function generateSVGImage(MultiPartRLEToSVG.SVGParams memory params, mapping(uint8 => string[]) storage palettes)
        public
        view
        returns (string memory svg)
    {
        return Base64.encode(bytes(MultiPartRLEToSVG.generateSVG(params, palettes)));
    }
}

File 7 of 9 : MultiPartRLEToSVG.sol
// SPDX-License-Identifier: GPL-3.0

/// @title A library used to convert multi-part RLE compressed images to SVG

pragma solidity ^0.8.6;

library MultiPartRLEToSVG {
    struct SVGParams {
        bytes[] parts;
        string background;
    }

    struct ContentBounds {
        uint8 top;
        uint8 right;
        uint8 bottom;
        uint8 left;
    }

    struct Rect {
        uint8 length;
        uint8 colorIndex;
    }

    struct DecodedImage {
        uint8 paletteIndex;
        ContentBounds bounds;
        Rect[] rects;
    }

    /**
     * @notice Given RLE image parts and color palettes, merge to generate a single SVG image.
     */
    function generateSVG(SVGParams memory params, mapping(uint8 => string[]) storage palettes)
        internal
        view
        returns (string memory svg)
    {
        // prettier-ignore
        return string(
            abi.encodePacked(
                '<svg width="190" height="190" viewBox="0 0 190 190" xmlns="http://www.w3.org/2000/svg" shape-rendering="crispEdges">',
                '<rect width="100%" height="100%" fill="#', params.background, '" />',
                _generateSVGRects(params, palettes),
                '</svg>'
            )
        );
    }

    /**
     * @notice Given RLE image parts and color palettes, generate SVG rects.
     * This is a lookup table that enables very cheap int to string
     * conversions when operating on a set of predefined integers.
     * This is used below to convert the integer length of each rectangle
     * in a 19x19 pixel grid to the string representation of the length
     * in a 190x190 pixel grid, which is the chosen dimension for all Wizards.
     * For example: A length of 3 gets mapped to '30'.
     */    
    // prettier-ignore
    function _generateSVGRects(SVGParams memory params, mapping(uint8 => string[]) storage palettes)
        private
        view
        returns (string memory svg)
    {
        string[20] memory lookup = [
            '0', '10', '20', '30', '40', '50', '60', '70', 
            '80', '90', '100', '110', '120', '130', '140', '150', 
            '160', '170', '180', '190'
        ];
        string memory rects;
        for (uint8 p = 0; p < params.parts.length; p++) {
            DecodedImage memory image = _decodeRLEImage(params.parts[p]);
            string[] storage palette = palettes[image.paletteIndex];
            uint256 currentX = image.bounds.left;
            uint256 currentY = image.bounds.top;
            uint256 cursor;
            string[16] memory buffer;

            string memory part;
            for (uint256 i = 0; i < image.rects.length; i++) {
                Rect memory rect = image.rects[i];
                if (rect.colorIndex != 0) {
                    buffer[cursor] = lookup[rect.length];          // width
                    buffer[cursor + 1] = lookup[currentX];         // x
                    buffer[cursor + 2] = lookup[currentY];         // y
                    buffer[cursor + 3] = palette[rect.colorIndex]; // color

                    cursor += 4;

                    if (cursor >= 16) {
                        part = string(abi.encodePacked(part, _getChunk(cursor, buffer)));
                        cursor = 0;
                    }
                }

                currentX += rect.length;
                if (currentX == image.bounds.right) {
                    currentX = image.bounds.left;
                    currentY++;
                }
            }

            if (cursor != 0) {
                part = string(abi.encodePacked(part, _getChunk(cursor, buffer)));
            }
            rects = string(abi.encodePacked(rects, part));
        }
        return rects;
    }

    /**
     * @notice Return a string that consists of all rects in the provided `buffer`.
     */
    // prettier-ignore
    function _getChunk(uint256 cursor, string[16] memory buffer) private pure returns (string memory) {
        string memory chunk;
        for (uint256 i = 0; i < cursor; i += 4) {
            chunk = string(
                abi.encodePacked(
                    chunk,
                    '<rect width="', buffer[i], '" height="10" x="', buffer[i + 1], '" y="', buffer[i + 2], '" fill="#', buffer[i + 3], '" />'
                )
            );
        }
        return chunk;
    }

    /**
     * @notice Decode a single RLE compressed image into a `DecodedImage`.
     */
    function _decodeRLEImage(bytes memory image) private pure returns (DecodedImage memory) {
        uint8 paletteIndex = uint8(image[0]);
        ContentBounds memory bounds = ContentBounds({
            top: uint8(image[1]),
            right: uint8(image[2]),
            bottom: uint8(image[3]),
            left: uint8(image[4])
        });

        uint256 cursor;
        Rect[] memory rects = new Rect[]((image.length - 5) / 2);
        for (uint256 i = 5; i < image.length; i += 2) {
            rects[cursor] = Rect({ length: uint8(image[i]), colorIndex: uint8(image[i + 1]) });
            cursor++;
        }
        return DecodedImage({ paletteIndex: paletteIndex, bounds: bounds, rects: rects });
    }
}

File 8 of 9 : 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 9 of 9 : base64.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {
    "contracts/internal/libs/NFTDescriptor.sol": {
      "NFTDescriptor": "0x6b06f5e119868b3aa688cf7249701ce2a603fa79"
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"DataURIToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"PartsLocked","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"accessory","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accessoryCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_accessory","type":"bytes"}],"name":"addAccessory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_background","type":"string"}],"name":"addBackground","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_bgItem","type":"bytes"}],"name":"addBgItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_clothes","type":"bytes"}],"name":"addClothes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_paletteIndex","type":"uint8"},{"internalType":"string","name":"_color","type":"string"}],"name":"addColorToPalette","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_eyes","type":"bytes"}],"name":"addEyes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_hat","type":"bytes"}],"name":"addHat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_accessory","type":"bytes[]"}],"name":"addManyAccessories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_backgrounds","type":"string[]"}],"name":"addManyBackgrounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_bgItems","type":"bytes[]"}],"name":"addManyBgItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_clothes","type":"bytes[]"}],"name":"addManyClothes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"paletteIndex","type":"uint8"},{"internalType":"string[]","name":"newColors","type":"string[]"}],"name":"addManyColorsToPalette","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_eyes","type":"bytes[]"}],"name":"addManyEyes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_hats","type":"bytes[]"}],"name":"addManyHats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_mouths","type":"bytes[]"}],"name":"addManyMouths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_oneOfOnes","type":"bytes[]"}],"name":"addManyOneOfOnes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_skins","type":"bytes[]"}],"name":"addManySkins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_mouth","type":"bytes"}],"name":"addMouth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_oneOfOne","type":"bytes"}],"name":"addOneOfOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_skin","type":"bytes"}],"name":"addSkin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arePartsLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"backgroundCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"backgrounds","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bgItems","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bgItemsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"clothes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clothesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"skin","type":"uint48"},{"internalType":"uint48","name":"clothes","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"bgItem","type":"uint48"},{"internalType":"uint48","name":"hat","type":"uint48"},{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint48","name":"oneOfOneIndex","type":"uint48"}],"internalType":"struct ISeeder.Seed","name":"seed","type":"tuple"}],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eyes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eyesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"skin","type":"uint48"},{"internalType":"uint48","name":"clothes","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"bgItem","type":"uint48"},{"internalType":"uint48","name":"hat","type":"uint48"},{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint48","name":"oneOfOneIndex","type":"uint48"}],"internalType":"struct ISeeder.Seed","name":"seed","type":"tuple"}],"name":"generateSVGImage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"skin","type":"uint48"},{"internalType":"uint48","name":"clothes","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"bgItem","type":"uint48"},{"internalType":"uint48","name":"hat","type":"uint48"},{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint48","name":"oneOfOneIndex","type":"uint48"}],"internalType":"struct ISeeder.Seed","name":"seed","type":"tuple"}],"name":"genericDataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hats","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hatsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDataURIEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOneOfOneCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockParts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mouths","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mouthsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"oneOfOnes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneOfOnesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"palettes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"paletteIndex","type":"uint8"},{"internalType":"string[]","name":"newColors","type":"string[]"}],"name":"replacePalette","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"skins","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skinsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleDataURIEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"skin","type":"uint48"},{"internalType":"uint48","name":"clothes","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"bgItem","type":"uint48"},{"internalType":"uint48","name":"hat","type":"uint48"},{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint48","name":"oneOfOneIndex","type":"uint48"}],"internalType":"struct ISeeder.Seed","name":"seed","type":"tuple"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000805460ff60a81b1916600160a81b1790553480156200002457600080fd5b50620000303362000036565b62000086565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613c7280620000966000396000f3fe608060405234801561001057600080fd5b50600436106103625760003560e01c8063839644da116101c8578063c2deb8ec11610104578063e1bf8c51116100a2578063f2fde38b1161007c578063f2fde38b146106ea578063f9da8863146106fd578063fbb4aeff14610710578063fcbc920c1461072357600080fd5b8063e1bf8c51146106b1578063e74ff30f146106c4578063ee50c646146106d757600080fd5b8063ce2f4f53116100de578063ce2f4f531461065d578063dce72c2314610683578063dfe8478b14610696578063e11f49ea1461069e57600080fd5b8063c2deb8ec1461062e578063c48db0db14610641578063c50b7bc81461065457600080fd5b8063a7cde8b311610171578063ba58353d1161014b578063ba58353d146105e2578063bca747b5146105f5578063bcd4de1714610608578063c114543b1461061b57600080fd5b8063a7cde8b3146105b4578063ad1a4c3d146105c7578063b48f35d2146105cf57600080fd5b806390f1d5dc116101a257806390f1d5dc1461057b57806391b7916a1461058e578063a3053dd5146105a157600080fd5b8063839644da1461052d57806383cbdb02146105405780638da5cb5b1461055357600080fd5b806355f804b3116102a257806371aaa66b116102405780638104468c1161021a5780638104468c146104ec578063814146bf146104f457806381d23bd21461050757806381d69f091461051a57600080fd5b806371aaa66b146104a2578063773b9771146104b557806380ebc062146104d957600080fd5b80636b0be8871161027c5780636b0be887146104775780636b4311571461048a5780636c0360eb14610492578063715018a61461049a57600080fd5b806355f804b31461043e578063598fa9da146104515780635e70664c1461046457600080fd5b80632db2ede51161030f5780634531c0a8116102e95780634531c0a8146104135780634daebac21461041b57806350271c161461042357806353632ff11461042b57600080fd5b80632db2ede5146103da57806340a29775146103ed578063440b57d21461040057600080fd5b806317b552ab1161034057806317b552ab146103b75780632a1d0769146103ca5780632c6be7cb146103d257600080fd5b80630475d8631461036757806304bde4dd1461037c5780630de51866146103a5575b600080fd5b61037a610375366004613314565b61072b565b005b61038f61038a36600461348d565b61083f565b60405161039c919061384c565b60405180910390f35b6008545b60405190815260200161039c565b61037a6103c5366004613356565b6108eb565b61037a6109ba565b6005546103a9565b61038f6103e836600461348d565b610ad2565b61038f6103fb3660046134a6565b610ae2565b61037a61040e366004613314565b610b8b565b6003546103a9565b6006546103a9565b600b546103a9565b61037a610439366004613356565b610c95565b61037a61044c366004613356565b610d60565b61038f61045f36600461356d565b610e11565b61037a610472366004613356565b610e49565b61038f61048536600461348d565b610f14565b6007546103a9565b61038f610f24565b61037a610f31565b61037a6104b0366004613356565b610fa4565b6000546104c990600160a01b900460ff1681565b604051901515815260200161039c565b61038f6104e736600461348d565b61106f565b6009546103a9565b61038f6105023660046133fa565b61107f565b61038f6105153660046134a6565b6111f6565b61037a610528366004613314565b611261565b61037a61053b3660046134d4565b611386565b61037a61054e366004613356565b6114d3565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039c565b61038f61058936600461348d565b61159e565b61037a61059c366004613314565b6115ae565b61038f6105af36600461348d565b6116b8565b61037a6105c2366004613314565b6116c8565b6004546103a9565b61037a6105dd366004613314565b6117d2565b61037a6105f0366004613314565b6118dc565b61038f61060336600461348d565b6119e6565b61038f610616366004613470565b6119f6565b61037a610629366004613314565b611b5f565b61038f61063c36600461348d565b611c69565b61037a61064f366004613356565b611c79565b6103a9600c5481565b6000546104c9907501000000000000000000000000000000000000000000900460ff1681565b61037a610691366004613356565b611d44565b61037a611e0f565b61037a6106ac3660046134d4565b611ef9565b61038f6106bf36600461348d565b612026565b61037a6106d2366004613356565b612036565b61037a6106e5366004613314565b61211a565b61037a6106f83660046132de565b612224565b61037a61070b366004613527565b612320565b61037a61071e366004613356565b61241a565b600a546103a9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600054600160a01b900460ff16156107f15760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a5761082883838381811061081157610811613bde565b90506020028101906108239190613988565b6124e5565b8061083281613b33565b9150506107f4565b505050565b6003818154811061084f57600080fd5b90600052602060002001600091509050805461086a90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461089690613adf565b80156108e35780601f106108b8576101008083540402835291602001916108e3565b820191906000526020600020905b8154815290600101906020018083116108c657829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156109ac5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b682826124e5565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610a7b5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1781556040517f1680ee6d421f70ed6030d2fc4fcb50217a5dd617858d56562b119eca59172e579190a1565b6004818154811061084f57600080fd5b60606000610aef84612522565b9050600081604051602001610b049190613709565b60408051601f19818403018152602083019091526000825261010086015190925015610b515782604051602001610b3b91906137ba565b6040516020818303038152906040529050610b74565b82604051602001610b62919061374e565b60405160208183030381529060405290505b610b7f82828761107f565b93505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610c4c5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a57610c83838383818110610c6c57610c6c613bde565b9050602002810190610c7e9190613988565b61265c565b80610c8d81613b33565b915050610c4f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cfc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610d565760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612699565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dc75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610dd360018383612fc9565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610e0592919061385f565b60405180910390a15050565b60026020528160005260406000208181548110610e2d57600080fd5b9060005260206000200160009150915050805461086a90613adf565b60005473ffffffffffffffffffffffffffffffffffffffff163314610eb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610f0a5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b682826126d6565b6007818154811061084f57600080fd5b6001805461086a90613adf565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610fa26000612713565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461100b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156110655760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b6828261265c565b600b818154811061084f57600080fd5b6060600060405180608001604052808681526020018581526020016110a385612788565b81526020016003856000015165ffffffffffff16815481106110c7576110c7613bde565b9060005260206000200180546110dc90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461110890613adf565b80156111555780601f1061112a57610100808354040283529160200191611155565b820191906000526020600020905b81548152906001019060200180831161113857829003601f168201915b50505050508152509050736b06f5e119868b3aa688cf7249701ce2a603fa7963bf1deae28260026040518363ffffffff1660e01b81526004016111999291906138f5565b60006040518083038186803b1580156111b157600080fd5b505af41580156111c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ed919081019061338c565b95945050505050565b6000546060907501000000000000000000000000000000000000000000900460ff161561122e576112278383610ae2565b9050610b85565b600161123984612522565b60405160200161124a929190613634565b604051602081830303815290604052905092915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156113225760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b81819050600c60008282546113379190613a70565b90915550600090505b8181101561083a5761137483838381811061135d5761135d613bde565b905060200281019061136f9190613988565b612e6f565b8061137e81613b33565b915050611340565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b60ff83166000908152600260205260409020546101009061140f908390613a70565b11156114835760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b60005b818110156114cd576114bb848484848181106114a4576114a4613bde565b90506020028101906114b69190613988565b612eac565b806114c581613b33565b915050611486565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461153a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156115945760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612ed9565b6008818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146116155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff161561166f5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576116a683838381811061168f5761168f613bde565b90506020028101906116a19190613988565b6126d6565b806116b081613b33565b915050611672565b6009818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461172f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156117895760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576117c08383838181106117a9576117a9613bde565b90506020028101906117bb9190613988565b612ed9565b806117ca81613b33565b91505061178c565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156118935760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576118ca8383838181106118b3576118b3613bde565b90506020028101906118c59190613988565b612f16565b806118d481613b33565b915050611896565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff161561199d5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576119d48383838181106119bd576119bd613bde565b90506020028101906119cf9190613988565b612f53565b806119de81613b33565b9150506119a0565b600a818154811061084f57600080fd5b606060006040518060400160405280611a0e85612788565b81526020016003856000015165ffffffffffff1681548110611a3257611a32613bde565b906000526020600020018054611a4790613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7390613adf565b8015611ac05780601f10611a9557610100808354040283529160200191611ac0565b820191906000526020600020905b815481529060010190602001808311611aa357829003601f168201915b50505050508152509050736b06f5e119868b3aa688cf7249701ce2a603fa796366b8c2418260026040518363ffffffff1660e01b8152600401611b0492919061388e565b60006040518083038186803b158015611b1c57600080fd5b505af4158015611b30573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b58919081019061338c565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bc65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611c205760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a57611c57838383818110611c4057611c40613bde565b9050602002810190611c529190613988565b612f90565b80611c6181613b33565b915050611c23565b6006818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611ce05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611d3a5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f53565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611e055760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f16565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff811675010000000000000000000000000000000000000000009182900460ff1615918202179091556040518181527f360c3d72ee193226275b842f85231c259c934e85459fed80fa68e502ffa9dbde9060200160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610100811115611fd85760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b60ff83166000908152600260205260408120611ff39161306b565b60005b818110156114cd57612014848484848181106114a4576114a4613bde565b8061201e81613b33565b915050611ff6565b6005818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461209d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156120f75760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6001600c600082825461210a9190613a70565b909155506109b690508282612e6f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156121db5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576122128383838181106121fb576121fb613bde565b905060200281019061220d9190613988565b612699565b8061221c81613b33565b9150506121de565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b73ffffffffffffffffffffffffffffffffffffffff81166123145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161078e565b61231d81612713565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146123875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b60ff838116600090815260026020526040902054111561240f5760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b61083a838383612eac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156124db5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f90565b6006805460018101825560009190915261083a907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f018383612fc9565b60608161256257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561258c578061257681613b33565b91506125859050600a83613a88565b9150612566565b60008167ffffffffffffffff8111156125a7576125a7613c0d565b6040519080825280601f01601f1916602001820160405280156125d1576020820181803683370190505b5090505b8415612654576125e6600183613a9c565b91506125f3600a86613b6c565b6125fe906030613a70565b60f81b81838151811061261357612613613bde565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061264d600a86613a88565b94506125d5565b949350505050565b6008805460018101825560009190915261083a907ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018383612fc9565b6004805460018101825560009190915261083a907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018383612fc9565b6003805460018101825560009190915261083a907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018383612fc9565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60608161010001511561289a57604080516001808252818301909252600091816020015b60608152602001906001900390816127ac579050509050600b83610120015165ffffffffffff16815481106127e3576127e3613bde565b9060005260206000200180546127f890613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461282490613adf565b80156128715780601f1061284657610100808354040283529160200191612871565b820191906000526020600020905b81548152906001019060200180831161285457829003601f168201915b50505050508160008151811061288957612889613bde565b602090810291909101015292915050565b6040805160078082526101008201909252600091816020015b60608152602001906001900390816128b35790505090506004836020015165ffffffffffff16815481106128e9576128e9613bde565b9060005260206000200180546128fe90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461292a90613adf565b80156129775780601f1061294c57610100808354040283529160200191612977565b820191906000526020600020905b81548152906001019060200180831161295a57829003601f168201915b50505050508160008151811061298f5761298f613bde565b60200260200101819052506005836040015165ffffffffffff16815481106129b9576129b9613bde565b9060005260206000200180546129ce90613adf565b80601f01602080910402602001604051908101604052809291908181526020018280546129fa90613adf565b8015612a475780601f10612a1c57610100808354040283529160200191612a47565b820191906000526020600020905b815481529060010190602001808311612a2a57829003601f168201915b505050505081600181518110612a5f57612a5f613bde565b60200260200101819052506009836060015165ffffffffffff1681548110612a8957612a89613bde565b906000526020600020018054612a9e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612aca90613adf565b8015612b175780601f10612aec57610100808354040283529160200191612b17565b820191906000526020600020905b815481529060010190602001808311612afa57829003601f168201915b505050505081600281518110612b2f57612b2f613bde565b60200260200101819052506008836080015165ffffffffffff1681548110612b5957612b59613bde565b906000526020600020018054612b6e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9a90613adf565b8015612be75780601f10612bbc57610100808354040283529160200191612be7565b820191906000526020600020905b815481529060010190602001808311612bca57829003601f168201915b505050505081600381518110612bff57612bff613bde565b602002602001018190525060068360a0015165ffffffffffff1681548110612c2957612c29613bde565b906000526020600020018054612c3e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6a90613adf565b8015612cb75780601f10612c8c57610100808354040283529160200191612cb7565b820191906000526020600020905b815481529060010190602001808311612c9a57829003601f168201915b505050505081600481518110612ccf57612ccf613bde565b602002602001018190525060078360c0015165ffffffffffff1681548110612cf957612cf9613bde565b906000526020600020018054612d0e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3a90613adf565b8015612d875780601f10612d5c57610100808354040283529160200191612d87565b820191906000526020600020905b815481529060010190602001808311612d6a57829003601f168201915b505050505081600581518110612d9f57612d9f613bde565b6020026020010181905250600a8360e0015165ffffffffffff1681548110612dc957612dc9613bde565b906000526020600020018054612dde90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0a90613adf565b8015612e575780601f10612e2c57610100808354040283529160200191612e57565b820191906000526020600020905b815481529060010190602001808311612e3a57829003601f168201915b50505050508160068151811061288957612889613bde565b600b805460018101825560009190915261083a907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018383612fc9565b60ff831660009081526002602090815260408220805460018101825590835291206114cd91018383612fc9565b600a805460018101825560009190915261083a907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8018383612fc9565b6009805460018101825560009190915261083a907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af018383612fc9565b6007805460018101825560009190915261083a907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018383612fc9565b6005805460018101825560009190915261083a907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00183835b828054612fd590613adf565b90600052602060002090601f016020900481019282612ff7576000855561305b565b82601f1061302e578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561305b565b8280016001018555821561305b579182015b8281111561305b578235825591602001919060010190613040565b50613067929150613089565b5090565b508054600082559060005260206000209081019061231d919061309e565b5b80821115613067576000815560010161308a565b808211156130675760006130b282826130bb565b5060010161309e565b5080546130c790613adf565b6000825580601f106130d7575050565b601f01602090049060005260206000209081019061231d9190613089565b60008083601f84011261310757600080fd5b50813567ffffffffffffffff81111561311f57600080fd5b6020830191508360208260051b850101111561313a57600080fd5b9250929050565b8035801515811461315157600080fd5b919050565b60008083601f84011261316857600080fd5b50813567ffffffffffffffff81111561318057600080fd5b60208301915083602082850101111561313a57600080fd5b600082601f8301126131a957600080fd5b81356131bc6131b782613a48565b613a17565b8181528460208386010111156131d157600080fd5b816020850160208301376000918101602001919091529392505050565b6000610140828403121561320157600080fd5b6132096139ed565b9050613214826132b7565b8152613222602083016132b7565b6020820152613233604083016132b7565b6040820152613244606083016132b7565b6060820152613255608083016132b7565b608082015261326660a083016132b7565b60a082015261327760c083016132b7565b60c082015261328860e083016132b7565b60e082015261010061329b818401613141565b908201526101206132ad8382016132b7565b9082015292915050565b803565ffffffffffff8116811461315157600080fd5b803560ff8116811461315157600080fd5b6000602082840312156132f057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611b5857600080fd5b6000806020838503121561332757600080fd5b823567ffffffffffffffff81111561333e57600080fd5b61334a858286016130f5565b90969095509350505050565b6000806020838503121561336957600080fd5b823567ffffffffffffffff81111561338057600080fd5b61334a85828601613156565b60006020828403121561339e57600080fd5b815167ffffffffffffffff8111156133b557600080fd5b8201601f810184136133c657600080fd5b80516133d46131b782613a48565b8181528560208385010111156133e957600080fd5b6111ed826020830160208601613ab3565b6000806000610180848603121561341057600080fd5b833567ffffffffffffffff8082111561342857600080fd5b61343487838801613198565b9450602086013591508082111561344a57600080fd5b5061345786828701613198565b92505061346785604086016131ee565b90509250925092565b6000610140828403121561348357600080fd5b611b5883836131ee565b60006020828403121561349f57600080fd5b5035919050565b60008061016083850312156134ba57600080fd5b823591506134cb84602085016131ee565b90509250929050565b6000806000604084860312156134e957600080fd5b6134f2846132cd565b9250602084013567ffffffffffffffff81111561350e57600080fd5b61351a868287016130f5565b9497909650939450505050565b60008060006040848603121561353c57600080fd5b613545846132cd565b9250602084013567ffffffffffffffff81111561356157600080fd5b61351a86828701613156565b6000806040838503121561358057600080fd5b613589836132cd565b946020939093013593505050565b600081518084526020808501808196508360051b8101915082860160005b858110156135df5782840389526135cd8483516135ec565b988501989350908401906001016135b5565b5091979650505050505050565b60008151808452613604816020860160208601613ab3565b601f01601f19169290920160200192915050565b6000815161362a818560208601613ab3565b9290920192915050565b600080845481600182811c91508083168061365057607f831692505b6020808410821415613689577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561369d57600181146136cc576136f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506136f9565b60008b81526020902060005b868110156136f15781548b8201529085019083016136d8565b505084890196505b5050505050506111ed8185613618565b7f57697a6172642023000000000000000000000000000000000000000000000000815260008251613741816008850160208701613ab3565b9190910160080192915050565b7f57697a6172642023000000000000000000000000000000000000000000000000815260008251613786816008850160208701613ab3565b7f2069732061206d656d626572206f66207468652057697a6172647344414f00006008939091019283015250602601919050565b7f57697a61726420230000000000000000000000000000000000000000000000008152600082516137f2816008850160208701613ab3565b7f2069732061206f6e65206f66206f6e6520617274706965636520616e6420612060089390910192830152507f6d656d626572206f66207468652057697a6172647344414f00000000000000006028820152604001919050565b602081526000611b5860208301846135ec565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60408152600083516040808401526138a96080840182613597565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160608501526138e482826135ec565b925050508260208301529392505050565b60408152600083516080604084015261391160c08401826135ec565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261394d83836135ec565b9250604087015191508085840301608086015261396a8383613597565b925060608701519150808584030160a0860152506138e482826135ec565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139bd57600080fd5b83018035915067ffffffffffffffff8211156139d857600080fd5b60200191503681900382131561313a57600080fd5b604051610140810167ffffffffffffffff81118282101715613a1157613a11613c0d565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a4057613a40613c0d565b604052919050565b600067ffffffffffffffff821115613a6257613a62613c0d565b50601f01601f191660200190565b60008219821115613a8357613a83613b80565b500190565b600082613a9757613a97613baf565b500490565b600082821015613aae57613aae613b80565b500390565b60005b83811015613ace578181015183820152602001613ab6565b838111156114cd5750506000910152565b600181811c90821680613af357607f821691505b60208210811415613b2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b6557613b65613b80565b5060010190565b600082613b7b57613b7b613baf565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212208992b25cc03dfcf217e26c4d12ba849070abcc9891c410230e2222df144bdf0464736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103625760003560e01c8063839644da116101c8578063c2deb8ec11610104578063e1bf8c51116100a2578063f2fde38b1161007c578063f2fde38b146106ea578063f9da8863146106fd578063fbb4aeff14610710578063fcbc920c1461072357600080fd5b8063e1bf8c51146106b1578063e74ff30f146106c4578063ee50c646146106d757600080fd5b8063ce2f4f53116100de578063ce2f4f531461065d578063dce72c2314610683578063dfe8478b14610696578063e11f49ea1461069e57600080fd5b8063c2deb8ec1461062e578063c48db0db14610641578063c50b7bc81461065457600080fd5b8063a7cde8b311610171578063ba58353d1161014b578063ba58353d146105e2578063bca747b5146105f5578063bcd4de1714610608578063c114543b1461061b57600080fd5b8063a7cde8b3146105b4578063ad1a4c3d146105c7578063b48f35d2146105cf57600080fd5b806390f1d5dc116101a257806390f1d5dc1461057b57806391b7916a1461058e578063a3053dd5146105a157600080fd5b8063839644da1461052d57806383cbdb02146105405780638da5cb5b1461055357600080fd5b806355f804b3116102a257806371aaa66b116102405780638104468c1161021a5780638104468c146104ec578063814146bf146104f457806381d23bd21461050757806381d69f091461051a57600080fd5b806371aaa66b146104a2578063773b9771146104b557806380ebc062146104d957600080fd5b80636b0be8871161027c5780636b0be887146104775780636b4311571461048a5780636c0360eb14610492578063715018a61461049a57600080fd5b806355f804b31461043e578063598fa9da146104515780635e70664c1461046457600080fd5b80632db2ede51161030f5780634531c0a8116102e95780634531c0a8146104135780634daebac21461041b57806350271c161461042357806353632ff11461042b57600080fd5b80632db2ede5146103da57806340a29775146103ed578063440b57d21461040057600080fd5b806317b552ab1161034057806317b552ab146103b75780632a1d0769146103ca5780632c6be7cb146103d257600080fd5b80630475d8631461036757806304bde4dd1461037c5780630de51866146103a5575b600080fd5b61037a610375366004613314565b61072b565b005b61038f61038a36600461348d565b61083f565b60405161039c919061384c565b60405180910390f35b6008545b60405190815260200161039c565b61037a6103c5366004613356565b6108eb565b61037a6109ba565b6005546103a9565b61038f6103e836600461348d565b610ad2565b61038f6103fb3660046134a6565b610ae2565b61037a61040e366004613314565b610b8b565b6003546103a9565b6006546103a9565b600b546103a9565b61037a610439366004613356565b610c95565b61037a61044c366004613356565b610d60565b61038f61045f36600461356d565b610e11565b61037a610472366004613356565b610e49565b61038f61048536600461348d565b610f14565b6007546103a9565b61038f610f24565b61037a610f31565b61037a6104b0366004613356565b610fa4565b6000546104c990600160a01b900460ff1681565b604051901515815260200161039c565b61038f6104e736600461348d565b61106f565b6009546103a9565b61038f6105023660046133fa565b61107f565b61038f6105153660046134a6565b6111f6565b61037a610528366004613314565b611261565b61037a61053b3660046134d4565b611386565b61037a61054e366004613356565b6114d3565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039c565b61038f61058936600461348d565b61159e565b61037a61059c366004613314565b6115ae565b61038f6105af36600461348d565b6116b8565b61037a6105c2366004613314565b6116c8565b6004546103a9565b61037a6105dd366004613314565b6117d2565b61037a6105f0366004613314565b6118dc565b61038f61060336600461348d565b6119e6565b61038f610616366004613470565b6119f6565b61037a610629366004613314565b611b5f565b61038f61063c36600461348d565b611c69565b61037a61064f366004613356565b611c79565b6103a9600c5481565b6000546104c9907501000000000000000000000000000000000000000000900460ff1681565b61037a610691366004613356565b611d44565b61037a611e0f565b61037a6106ac3660046134d4565b611ef9565b61038f6106bf36600461348d565b612026565b61037a6106d2366004613356565b612036565b61037a6106e5366004613314565b61211a565b61037a6106f83660046132de565b612224565b61037a61070b366004613527565b612320565b61037a61071e366004613356565b61241a565b600a546103a9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600054600160a01b900460ff16156107f15760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a5761082883838381811061081157610811613bde565b90506020028101906108239190613988565b6124e5565b8061083281613b33565b9150506107f4565b505050565b6003818154811061084f57600080fd5b90600052602060002001600091509050805461086a90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461089690613adf565b80156108e35780601f106108b8576101008083540402835291602001916108e3565b820191906000526020600020905b8154815290600101906020018083116108c657829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156109ac5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b682826124e5565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610a7b5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1781556040517f1680ee6d421f70ed6030d2fc4fcb50217a5dd617858d56562b119eca59172e579190a1565b6004818154811061084f57600080fd5b60606000610aef84612522565b9050600081604051602001610b049190613709565b60408051601f19818403018152602083019091526000825261010086015190925015610b515782604051602001610b3b91906137ba565b6040516020818303038152906040529050610b74565b82604051602001610b62919061374e565b60405160208183030381529060405290505b610b7f82828761107f565b93505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610c4c5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a57610c83838383818110610c6c57610c6c613bde565b9050602002810190610c7e9190613988565b61265c565b80610c8d81613b33565b915050610c4f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cfc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610d565760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612699565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dc75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610dd360018383612fc9565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610e0592919061385f565b60405180910390a15050565b60026020528160005260406000208181548110610e2d57600080fd5b9060005260206000200160009150915050805461086a90613adf565b60005473ffffffffffffffffffffffffffffffffffffffff163314610eb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610f0a5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b682826126d6565b6007818154811061084f57600080fd5b6001805461086a90613adf565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610fa26000612713565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461100b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156110655760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b6828261265c565b600b818154811061084f57600080fd5b6060600060405180608001604052808681526020018581526020016110a385612788565b81526020016003856000015165ffffffffffff16815481106110c7576110c7613bde565b9060005260206000200180546110dc90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461110890613adf565b80156111555780601f1061112a57610100808354040283529160200191611155565b820191906000526020600020905b81548152906001019060200180831161113857829003601f168201915b50505050508152509050736b06f5e119868b3aa688cf7249701ce2a603fa7963bf1deae28260026040518363ffffffff1660e01b81526004016111999291906138f5565b60006040518083038186803b1580156111b157600080fd5b505af41580156111c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ed919081019061338c565b95945050505050565b6000546060907501000000000000000000000000000000000000000000900460ff161561122e576112278383610ae2565b9050610b85565b600161123984612522565b60405160200161124a929190613634565b604051602081830303815290604052905092915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156113225760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b81819050600c60008282546113379190613a70565b90915550600090505b8181101561083a5761137483838381811061135d5761135d613bde565b905060200281019061136f9190613988565b612e6f565b8061137e81613b33565b915050611340565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b60ff83166000908152600260205260409020546101009061140f908390613a70565b11156114835760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b60005b818110156114cd576114bb848484848181106114a4576114a4613bde565b90506020028101906114b69190613988565b612eac565b806114c581613b33565b915050611486565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461153a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156115945760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612ed9565b6008818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146116155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff161561166f5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576116a683838381811061168f5761168f613bde565b90506020028101906116a19190613988565b6126d6565b806116b081613b33565b915050611672565b6009818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461172f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156117895760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576117c08383838181106117a9576117a9613bde565b90506020028101906117bb9190613988565b612ed9565b806117ca81613b33565b91505061178c565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156118935760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576118ca8383838181106118b3576118b3613bde565b90506020028101906118c59190613988565b612f16565b806118d481613b33565b915050611896565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff161561199d5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576119d48383838181106119bd576119bd613bde565b90506020028101906119cf9190613988565b612f53565b806119de81613b33565b9150506119a0565b600a818154811061084f57600080fd5b606060006040518060400160405280611a0e85612788565b81526020016003856000015165ffffffffffff1681548110611a3257611a32613bde565b906000526020600020018054611a4790613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7390613adf565b8015611ac05780601f10611a9557610100808354040283529160200191611ac0565b820191906000526020600020905b815481529060010190602001808311611aa357829003601f168201915b50505050508152509050736b06f5e119868b3aa688cf7249701ce2a603fa796366b8c2418260026040518363ffffffff1660e01b8152600401611b0492919061388e565b60006040518083038186803b158015611b1c57600080fd5b505af4158015611b30573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b58919081019061338c565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bc65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611c205760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a57611c57838383818110611c4057611c40613bde565b9050602002810190611c529190613988565b612f90565b80611c6181613b33565b915050611c23565b6006818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611ce05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611d3a5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f53565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611e055760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f16565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff811675010000000000000000000000000000000000000000009182900460ff1615918202179091556040518181527f360c3d72ee193226275b842f85231c259c934e85459fed80fa68e502ffa9dbde9060200160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610100811115611fd85760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b60ff83166000908152600260205260408120611ff39161306b565b60005b818110156114cd57612014848484848181106114a4576114a4613bde565b8061201e81613b33565b915050611ff6565b6005818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461209d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156120f75760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6001600c600082825461210a9190613a70565b909155506109b690508282612e6f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156121db5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576122128383838181106121fb576121fb613bde565b905060200281019061220d9190613988565b612699565b8061221c81613b33565b9150506121de565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b73ffffffffffffffffffffffffffffffffffffffff81166123145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161078e565b61231d81612713565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146123875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b60ff838116600090815260026020526040902054111561240f5760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b61083a838383612eac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156124db5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f90565b6006805460018101825560009190915261083a907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f018383612fc9565b60608161256257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561258c578061257681613b33565b91506125859050600a83613a88565b9150612566565b60008167ffffffffffffffff8111156125a7576125a7613c0d565b6040519080825280601f01601f1916602001820160405280156125d1576020820181803683370190505b5090505b8415612654576125e6600183613a9c565b91506125f3600a86613b6c565b6125fe906030613a70565b60f81b81838151811061261357612613613bde565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061264d600a86613a88565b94506125d5565b949350505050565b6008805460018101825560009190915261083a907ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018383612fc9565b6004805460018101825560009190915261083a907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018383612fc9565b6003805460018101825560009190915261083a907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018383612fc9565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60608161010001511561289a57604080516001808252818301909252600091816020015b60608152602001906001900390816127ac579050509050600b83610120015165ffffffffffff16815481106127e3576127e3613bde565b9060005260206000200180546127f890613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461282490613adf565b80156128715780601f1061284657610100808354040283529160200191612871565b820191906000526020600020905b81548152906001019060200180831161285457829003601f168201915b50505050508160008151811061288957612889613bde565b602090810291909101015292915050565b6040805160078082526101008201909252600091816020015b60608152602001906001900390816128b35790505090506004836020015165ffffffffffff16815481106128e9576128e9613bde565b9060005260206000200180546128fe90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461292a90613adf565b80156129775780601f1061294c57610100808354040283529160200191612977565b820191906000526020600020905b81548152906001019060200180831161295a57829003601f168201915b50505050508160008151811061298f5761298f613bde565b60200260200101819052506005836040015165ffffffffffff16815481106129b9576129b9613bde565b9060005260206000200180546129ce90613adf565b80601f01602080910402602001604051908101604052809291908181526020018280546129fa90613adf565b8015612a475780601f10612a1c57610100808354040283529160200191612a47565b820191906000526020600020905b815481529060010190602001808311612a2a57829003601f168201915b505050505081600181518110612a5f57612a5f613bde565b60200260200101819052506009836060015165ffffffffffff1681548110612a8957612a89613bde565b906000526020600020018054612a9e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612aca90613adf565b8015612b175780601f10612aec57610100808354040283529160200191612b17565b820191906000526020600020905b815481529060010190602001808311612afa57829003601f168201915b505050505081600281518110612b2f57612b2f613bde565b60200260200101819052506008836080015165ffffffffffff1681548110612b5957612b59613bde565b906000526020600020018054612b6e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9a90613adf565b8015612be75780601f10612bbc57610100808354040283529160200191612be7565b820191906000526020600020905b815481529060010190602001808311612bca57829003601f168201915b505050505081600381518110612bff57612bff613bde565b602002602001018190525060068360a0015165ffffffffffff1681548110612c2957612c29613bde565b906000526020600020018054612c3e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6a90613adf565b8015612cb75780601f10612c8c57610100808354040283529160200191612cb7565b820191906000526020600020905b815481529060010190602001808311612c9a57829003601f168201915b505050505081600481518110612ccf57612ccf613bde565b602002602001018190525060078360c0015165ffffffffffff1681548110612cf957612cf9613bde565b906000526020600020018054612d0e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3a90613adf565b8015612d875780601f10612d5c57610100808354040283529160200191612d87565b820191906000526020600020905b815481529060010190602001808311612d6a57829003601f168201915b505050505081600581518110612d9f57612d9f613bde565b6020026020010181905250600a8360e0015165ffffffffffff1681548110612dc957612dc9613bde565b906000526020600020018054612dde90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0a90613adf565b8015612e575780601f10612e2c57610100808354040283529160200191612e57565b820191906000526020600020905b815481529060010190602001808311612e3a57829003601f168201915b50505050508160068151811061288957612889613bde565b600b805460018101825560009190915261083a907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018383612fc9565b60ff831660009081526002602090815260408220805460018101825590835291206114cd91018383612fc9565b600a805460018101825560009190915261083a907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8018383612fc9565b6009805460018101825560009190915261083a907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af018383612fc9565b6007805460018101825560009190915261083a907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018383612fc9565b6005805460018101825560009190915261083a907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00183835b828054612fd590613adf565b90600052602060002090601f016020900481019282612ff7576000855561305b565b82601f1061302e578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561305b565b8280016001018555821561305b579182015b8281111561305b578235825591602001919060010190613040565b50613067929150613089565b5090565b508054600082559060005260206000209081019061231d919061309e565b5b80821115613067576000815560010161308a565b808211156130675760006130b282826130bb565b5060010161309e565b5080546130c790613adf565b6000825580601f106130d7575050565b601f01602090049060005260206000209081019061231d9190613089565b60008083601f84011261310757600080fd5b50813567ffffffffffffffff81111561311f57600080fd5b6020830191508360208260051b850101111561313a57600080fd5b9250929050565b8035801515811461315157600080fd5b919050565b60008083601f84011261316857600080fd5b50813567ffffffffffffffff81111561318057600080fd5b60208301915083602082850101111561313a57600080fd5b600082601f8301126131a957600080fd5b81356131bc6131b782613a48565b613a17565b8181528460208386010111156131d157600080fd5b816020850160208301376000918101602001919091529392505050565b6000610140828403121561320157600080fd5b6132096139ed565b9050613214826132b7565b8152613222602083016132b7565b6020820152613233604083016132b7565b6040820152613244606083016132b7565b6060820152613255608083016132b7565b608082015261326660a083016132b7565b60a082015261327760c083016132b7565b60c082015261328860e083016132b7565b60e082015261010061329b818401613141565b908201526101206132ad8382016132b7565b9082015292915050565b803565ffffffffffff8116811461315157600080fd5b803560ff8116811461315157600080fd5b6000602082840312156132f057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611b5857600080fd5b6000806020838503121561332757600080fd5b823567ffffffffffffffff81111561333e57600080fd5b61334a858286016130f5565b90969095509350505050565b6000806020838503121561336957600080fd5b823567ffffffffffffffff81111561338057600080fd5b61334a85828601613156565b60006020828403121561339e57600080fd5b815167ffffffffffffffff8111156133b557600080fd5b8201601f810184136133c657600080fd5b80516133d46131b782613a48565b8181528560208385010111156133e957600080fd5b6111ed826020830160208601613ab3565b6000806000610180848603121561341057600080fd5b833567ffffffffffffffff8082111561342857600080fd5b61343487838801613198565b9450602086013591508082111561344a57600080fd5b5061345786828701613198565b92505061346785604086016131ee565b90509250925092565b6000610140828403121561348357600080fd5b611b5883836131ee565b60006020828403121561349f57600080fd5b5035919050565b60008061016083850312156134ba57600080fd5b823591506134cb84602085016131ee565b90509250929050565b6000806000604084860312156134e957600080fd5b6134f2846132cd565b9250602084013567ffffffffffffffff81111561350e57600080fd5b61351a868287016130f5565b9497909650939450505050565b60008060006040848603121561353c57600080fd5b613545846132cd565b9250602084013567ffffffffffffffff81111561356157600080fd5b61351a86828701613156565b6000806040838503121561358057600080fd5b613589836132cd565b946020939093013593505050565b600081518084526020808501808196508360051b8101915082860160005b858110156135df5782840389526135cd8483516135ec565b988501989350908401906001016135b5565b5091979650505050505050565b60008151808452613604816020860160208601613ab3565b601f01601f19169290920160200192915050565b6000815161362a818560208601613ab3565b9290920192915050565b600080845481600182811c91508083168061365057607f831692505b6020808410821415613689577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561369d57600181146136cc576136f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506136f9565b60008b81526020902060005b868110156136f15781548b8201529085019083016136d8565b505084890196505b5050505050506111ed8185613618565b7f57697a6172642023000000000000000000000000000000000000000000000000815260008251613741816008850160208701613ab3565b9190910160080192915050565b7f57697a6172642023000000000000000000000000000000000000000000000000815260008251613786816008850160208701613ab3565b7f2069732061206d656d626572206f66207468652057697a6172647344414f00006008939091019283015250602601919050565b7f57697a61726420230000000000000000000000000000000000000000000000008152600082516137f2816008850160208701613ab3565b7f2069732061206f6e65206f66206f6e6520617274706965636520616e6420612060089390910192830152507f6d656d626572206f66207468652057697a6172647344414f00000000000000006028820152604001919050565b602081526000611b5860208301846135ec565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60408152600083516040808401526138a96080840182613597565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160608501526138e482826135ec565b925050508260208301529392505050565b60408152600083516080604084015261391160c08401826135ec565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261394d83836135ec565b9250604087015191508085840301608086015261396a8383613597565b925060608701519150808584030160a0860152506138e482826135ec565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139bd57600080fd5b83018035915067ffffffffffffffff8211156139d857600080fd5b60200191503681900382131561313a57600080fd5b604051610140810167ffffffffffffffff81118282101715613a1157613a11613c0d565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a4057613a40613c0d565b604052919050565b600067ffffffffffffffff821115613a6257613a62613c0d565b50601f01601f191660200190565b60008219821115613a8357613a83613b80565b500190565b600082613a9757613a97613baf565b500490565b600082821015613aae57613aae613b80565b500390565b60005b83811015613ace578181015183820152602001613ab6565b838111156114cd5750506000910152565b600181811c90821680613af357607f821691505b60208210811415613b2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b6557613b65613b80565b5060010190565b600082613b7b57613b7b613baf565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212208992b25cc03dfcf217e26c4d12ba849070abcc9891c410230e2222df144bdf0464736f6c63430008060033

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.