Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 14762743 | 805 days ago | IN | 0 ETH | 0.00269512 | ||||
Add Many Shiny A... | 14750157 | 807 days ago | IN | 0 ETH | 0.00707333 | ||||
Add Many Mouths | 14750157 | 807 days ago | IN | 0 ETH | 0.00451529 | ||||
Add Many Noses | 14750157 | 807 days ago | IN | 0 ETH | 0.00360138 | ||||
Add Many Eyes | 14750157 | 807 days ago | IN | 0 ETH | 0.01366576 | ||||
Add Many Heads | 14750157 | 807 days ago | IN | 0 ETH | 0.00513407 | ||||
Add Many Accesso... | 14750156 | 807 days ago | IN | 0 ETH | 0.00689306 | ||||
Add Many Bodies | 14750156 | 807 days ago | IN | 0 ETH | 0.01065938 | ||||
Add Many Colors ... | 14750156 | 807 days ago | IN | 0 ETH | 0.00879856 | ||||
Add Many Backgro... | 14750156 | 807 days ago | IN | 0 ETH | 0.00254306 | ||||
Add Many Backgro... | 14750139 | 807 days ago | IN | 0 ETH | 0.00472569 | ||||
0x60806040 | 14750129 | 807 days ago | IN | 0 ETH | 0.12223592 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ShinyDescriptor
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 /// @title The Shiny Club NFT descriptor /********************************* * ・゚・゚✧.・・゚shiny.club・✫・゜・゚✧ * *********************************/ pragma solidity ^0.8.9; import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol'; import { Strings } from '@openzeppelin/contracts/utils/Strings.sol'; import { IShinyDescriptor } from './interfaces/IShinyDescriptor.sol'; import { IShinySeeder } from './interfaces/IShinySeeder.sol'; import { NFTDescriptor } from './libs/NFTDescriptor.sol'; import { MultiPartRLEToSVG } from './libs/MultiPartRLEToSVG.sol'; contract ShinyDescriptor is IShinyDescriptor, Ownable { using Strings for uint256; // prettier-ignore // https://creativecommons.org/publicdomain/zero/1.0/legalcode.txt bytes32 constant COPYRIGHT_CC0_1_0_UNIVERSAL_LICENSE = 0xa2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499; // Whether or not new Shiny parts can be added bool public override arePartsLocked; // Shiny Color Palettes (Index => Hex Colors) mapping(uint8 => string[]) public override palettes; // Shiny Backgrounds (Hex Colors) string[] public override backgrounds; // Shiny Bodies (Custom RLE) bytes[] public override bodies; // Shiny Accessories (Custom RLE) bytes[] public override accessories; // Shiny Heads (Custom RLE) bytes[] public override heads; // Shiny Eyes (Custom RLE) bytes[] public override eyes; // Shiny Noses (Custom RLE) bytes[] public override noses; // Shiny Mouths (Custom RLE) bytes[] public override mouths; // Shiny Shiny Accessories (Custom RLE) bytes[] public override shinyAccessories; /** * @notice Require that the parts have not been locked. */ modifier whenPartsNotLocked() { require(!arePartsLocked, 'Parts are locked'); _; } /** * @notice Get the number of available Shiny `backgrounds`. */ function backgroundCount() external view override returns (uint256) { return backgrounds.length; } /** * @notice Get the number of available Shiny `bodies`. */ function bodyCount() external view override returns (uint256) { return bodies.length; } /** * @notice Get the number of available Shiny `accessories`. */ function accessoryCount() external view override returns (uint256) { return accessories.length; } /** * @notice Get the number of available Shiny `heads`. */ function headCount() external view override returns (uint256) { return heads.length; } /** * @notice Get the number of available Shiny `eyes`. */ function eyesCount() external view override returns (uint256) { return eyes.length; } /** * @notice Get the number of available Shiny `noses`. */ function nosesCount() external view override returns (uint256) { return noses.length; } /** * @notice Get the number of available Shiny `mouths`. */ function mouthsCount() external view override returns (uint256) { return mouths.length; } /** * @notice Get the number of available Shiny `shinyAccessories`. */ function shinyAccessoriesCount() external view override returns (uint256) { return shinyAccessories.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 Batch add Shiny 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 Shiny bodies. * @dev This function can only be called by the owner when not locked. */ function addManyBodies(bytes[] calldata _bodies) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _bodies.length; i++) { _addBody(_bodies[i]); } } /** * @notice Batch add Shiny accessories. * @dev This function can only be called by the owner when not locked. */ function addManyAccessories(bytes[] calldata _accessories) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _accessories.length; i++) { _addAccessory(_accessories[i]); } } /** * @notice Batch add Shiny heads. * @dev This function can only be called by the owner when not locked. */ function addManyHeads(bytes[] calldata _heads) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _heads.length; i++) { _addHead(_heads[i]); } } /** * @notice Batch add Shiny 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 Shiny noses. * @dev This function can only be called by the owner when not locked. */ function addManyNoses(bytes[] calldata _noses) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _noses.length; i++) { _addNoses(_noses[i]); } } /** * @notice Batch add Shiny 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++) { _addMouths(_mouths[i]); } } /** * @notice Batch add Shiny shinyAccessories. * @dev This function can only be called by the owner when not locked. */ function addManyShinyAccessories(bytes[] calldata _shinyAccessories) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _shinyAccessories.length; i++) { _addShinyAccessories(_shinyAccessories[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 Shiny 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 Shiny body. * @dev This function can only be called by the owner when not locked. */ function addBody(bytes calldata _body) external override onlyOwner whenPartsNotLocked { _addBody(_body); } /** * @notice Add a Shiny 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 Shiny head. * @dev This function can only be called by the owner when not locked. */ function addHead(bytes calldata _head) external override onlyOwner whenPartsNotLocked { _addHead(_head); } /** * @notice Add Shiny 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 Add Shiny noses. * @dev This function can only be called by the owner when not locked. */ function addNoses(bytes calldata _noses) external override onlyOwner whenPartsNotLocked { _addNoses(_noses); } /** * @notice Add Shiny noses. * @dev This function can only be called by the owner when not locked. */ function addMouths(bytes calldata _mouths) external override onlyOwner whenPartsNotLocked { _addMouths(_mouths); } /** * @notice Lock all Shiny 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 Given a token ID and seed, construct a token URI for a Shiny. * @dev The returned value may be a base64 encoded data URI or an API URL. */ function tokenURI(uint256 tokenId, IShinySeeder.Seed memory seed, bool isShiny) external view override returns (string memory) { return dataURI(tokenId, seed, isShiny); } /** * @notice Given a token ID and seed, construct a base64 encoded data URI for a Shiny. */ function dataURI(uint256 tokenId, IShinySeeder.Seed memory seed, bool isShiny) public view override returns (string memory) { string memory shinyId = tokenId.toString(); string memory name = string(abi.encodePacked('Shiny ', shinyId)); string memory description = string(abi.encodePacked('Shiny ', shinyId, ' is a member of Shiny Club')); return genericDataURI(name, description, seed, isShiny); } /** * @notice Given a name, description, and seed, construct a base64 encoded data URI. */ function genericDataURI( string memory name, string memory description, IShinySeeder.Seed memory seed, bool isShiny ) public view override returns (string memory) { NFTDescriptor.TokenURIParams memory params = NFTDescriptor.TokenURIParams({ name: name, description: description, parts: _getPartsForSeed(seed), background: backgrounds[seed.background], isShiny: isShiny }); return NFTDescriptor.constructTokenURI(params, palettes); } /** * @notice Given a seed, construct a base64 encoded SVG image. */ function generateSVGImage(IShinySeeder.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 Shiny background. */ function _addBackground(string calldata _background) internal { backgrounds.push(_background); } /** * @notice Add a Shiny body. */ function _addBody(bytes calldata _body) internal { bodies.push(_body); } /** * @notice Add a Shiny accessory. */ function _addAccessory(bytes calldata _accessory) internal { accessories.push(_accessory); } /** * @notice Add a Shiny head. */ function _addHead(bytes calldata _head) internal { heads.push(_head); } /** * @notice Add Shiny eyes. */ function _addEyes(bytes calldata _eyes) internal { eyes.push(_eyes); } /** * @notice Add Shiny noses. */ function _addNoses(bytes calldata _noses) internal { noses.push(_noses); } /** * @notice Add Shiny mouths. */ function _addMouths(bytes calldata _mouths) internal { mouths.push(_mouths); } /** * @notice Add Shiny shinyAccessories. */ function _addShinyAccessories(bytes calldata _shinyAccessories) internal { shinyAccessories.push(_shinyAccessories); } /** * @notice Get all Shiny parts for the passed `seed`. */ function _getPartsForSeed(IShinySeeder.Seed memory seed) internal view returns (bytes[] memory) { bytes[] memory _parts = new bytes[](7); _parts[0] = bodies[seed.body]; _parts[1] = accessories[seed.accessory]; _parts[2] = heads[seed.head]; _parts[3] = eyes[seed.eyes]; _parts[4] = noses[seed.nose]; _parts[5] = mouths[seed.mouth]; _parts[6] = shinyAccessories[seed.shinyAccessory]; return _parts; } }
// 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); } }
// 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); } }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for ShinyDescriptor /********************************* * ・゚・゚✧.・・゚shiny.club・✫・゜・゚✧ * *********************************/ pragma solidity ^0.8.9; import { IShinySeeder } from './IShinySeeder.sol'; interface IShinyDescriptor { event PartsLocked(); function arePartsLocked() external returns (bool); function palettes(uint8 paletteIndex, uint256 colorIndex) external view returns (string memory); function backgrounds(uint256 index) external view returns (string memory); function bodies(uint256 index) external view returns (bytes memory); function accessories(uint256 index) external view returns (bytes memory); function heads(uint256 index) external view returns (bytes memory); function eyes(uint256 index) external view returns (bytes memory); function noses(uint256 index) external view returns (bytes memory); function mouths(uint256 index) external view returns (bytes memory); function shinyAccessories(uint256 index) external view returns (bytes memory); function backgroundCount() external view returns (uint256); function bodyCount() external view returns (uint256); function accessoryCount() external view returns (uint256); function headCount() external view returns (uint256); function eyesCount() external view returns (uint256); function nosesCount() external view returns (uint256); function mouthsCount() external view returns (uint256); function shinyAccessoriesCount() external view returns (uint256); function addManyColorsToPalette(uint8 paletteIndex, string[] calldata newColors) external; function addManyBackgrounds(string[] calldata backgrounds) external; function addManyBodies(bytes[] calldata bodies) external; function addManyAccessories(bytes[] calldata accessories) external; function addManyHeads(bytes[] calldata heads) external; function addManyEyes(bytes[] calldata eyes) external; function addManyNoses(bytes[] calldata noses) external; function addManyMouths(bytes[] calldata mouths) external; function addManyShinyAccessories(bytes[] calldata shinyAccessories) external; function addColorToPalette(uint8 paletteIndex, string calldata color) external; function addBackground(string calldata background) external; function addBody(bytes calldata body) external; function addAccessory(bytes calldata accessory) external; function addHead(bytes calldata head) external; function addEyes(bytes calldata eyes) external; function addNoses(bytes calldata noses) external; function addMouths(bytes calldata mouths) external; function lockParts() external; function tokenURI(uint256 tokenId, IShinySeeder.Seed memory seed, bool isShiny) external view returns (string memory); function dataURI(uint256 tokenId, IShinySeeder.Seed memory seed, bool isShiny) external view returns (string memory); function genericDataURI( string calldata name, string calldata description, IShinySeeder.Seed memory seed, bool isShiny ) external view returns (string memory); function generateSVGImage(IShinySeeder.Seed memory seed) external view returns (string memory); }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for ShinySeeder /********************************* * ・゚・゚✧.・・゚shiny.club・✫・゜・゚✧ * *********************************/ pragma solidity ^0.8.9; import { IShinyDescriptor } from './IShinyDescriptor.sol'; interface IShinySeeder { struct Seed { uint16 background; uint16 body; uint16 accessory; uint16 head; uint16 eyes; uint16 nose; uint16 mouth; uint16 shinyAccessory; } function generateSeedForMint(uint256 tokenId, IShinyDescriptor descriptor, bool isShiny) external view returns (Seed memory); function generateSeedWithValues(Seed memory newSeed, IShinyDescriptor descriptor, bool isShiny) external view returns (Seed memory); }
// SPDX-License-Identifier: GPL-3.0 /// @title A library used to construct ERC721 token URIs and SVG images /********************************* * ・゚・゚✧.・・゚shiny.club・✫・゜・゚✧ * *********************************/ pragma solidity ^0.8.9; import { Base64 } from 'base64-sol/base64.sol'; import { MultiPartRLEToSVG } from './MultiPartRLEToSVG.sol'; library NFTDescriptor { struct TokenURIParams { string name; string description; bytes[] parts; string background; bool isShiny; } /** * @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 ); string memory is_shiny = params.isShiny ? "yes" : "no"; // prettier-ignore return string( abi.encodePacked( 'data:application/json;base64,', Base64.encode( bytes( abi.encodePacked('{"name":"', params.name, '", "attributes": [{"trait_type":"is_shiny", "value":"', is_shiny, '"}], "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))); } }
// SPDX-License-Identifier: GPL-3.0 /// @title A library used to convert multi-part RLE compressed images to SVG /********************************* * ・゚・゚✧.・・゚shiny.club・✫・゜・゚✧ * *********************************/ pragma solidity ^0.8.9; 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="320" height="320" viewBox="0 0 320 320" 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. */ // prettier-ignore function _generateSVGRects(SVGParams memory params, mapping(uint8 => string[]) storage palettes) private view returns (string memory svg) { string[33] memory lookup = [ '0', '10', '20', '30', '40', '50', '60', '70', '80', '90', '100', '110', '120', '130', '140', '150', '160', '170', '180', '190', '200', '210', '220', '230', '240', '250', '260', '270', '280', '290', '300', '310', '320' ]; 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 }); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.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; } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": { "contracts/libs/NFTDescriptor.sol": { "NFTDescriptor": "0x71a9b7b58459c33570ba33ca1a648bfc42a88305" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"accessories","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":"_body","type":"bytes"}],"name":"addBody","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":"_head","type":"bytes"}],"name":"addHead","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_accessories","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":"_bodies","type":"bytes[]"}],"name":"addManyBodies","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":"_heads","type":"bytes[]"}],"name":"addManyHeads","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_mouths","type":"bytes[]"}],"name":"addManyMouths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_noses","type":"bytes[]"}],"name":"addManyNoses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_shinyAccessories","type":"bytes[]"}],"name":"addManyShinyAccessories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_mouths","type":"bytes"}],"name":"addMouths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_noses","type":"bytes"}],"name":"addNoses","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bodies","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bodyCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint16","name":"background","type":"uint16"},{"internalType":"uint16","name":"body","type":"uint16"},{"internalType":"uint16","name":"accessory","type":"uint16"},{"internalType":"uint16","name":"head","type":"uint16"},{"internalType":"uint16","name":"eyes","type":"uint16"},{"internalType":"uint16","name":"nose","type":"uint16"},{"internalType":"uint16","name":"mouth","type":"uint16"},{"internalType":"uint16","name":"shinyAccessory","type":"uint16"}],"internalType":"struct IShinySeeder.Seed","name":"seed","type":"tuple"},{"internalType":"bool","name":"isShiny","type":"bool"}],"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":"uint16","name":"background","type":"uint16"},{"internalType":"uint16","name":"body","type":"uint16"},{"internalType":"uint16","name":"accessory","type":"uint16"},{"internalType":"uint16","name":"head","type":"uint16"},{"internalType":"uint16","name":"eyes","type":"uint16"},{"internalType":"uint16","name":"nose","type":"uint16"},{"internalType":"uint16","name":"mouth","type":"uint16"},{"internalType":"uint16","name":"shinyAccessory","type":"uint16"}],"internalType":"struct IShinySeeder.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":"uint16","name":"background","type":"uint16"},{"internalType":"uint16","name":"body","type":"uint16"},{"internalType":"uint16","name":"accessory","type":"uint16"},{"internalType":"uint16","name":"head","type":"uint16"},{"internalType":"uint16","name":"eyes","type":"uint16"},{"internalType":"uint16","name":"nose","type":"uint16"},{"internalType":"uint16","name":"mouth","type":"uint16"},{"internalType":"uint16","name":"shinyAccessory","type":"uint16"}],"internalType":"struct IShinySeeder.Seed","name":"seed","type":"tuple"},{"internalType":"bool","name":"isShiny","type":"bool"}],"name":"genericDataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"headCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"heads","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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":"noses","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nosesCount","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":"uint256","name":"","type":"uint256"}],"name":"shinyAccessories","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shinyAccessoriesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint16","name":"background","type":"uint16"},{"internalType":"uint16","name":"body","type":"uint16"},{"internalType":"uint16","name":"accessory","type":"uint16"},{"internalType":"uint16","name":"head","type":"uint16"},{"internalType":"uint16","name":"eyes","type":"uint16"},{"internalType":"uint16","name":"nose","type":"uint16"},{"internalType":"uint16","name":"mouth","type":"uint16"},{"internalType":"uint16","name":"shinyAccessory","type":"uint16"}],"internalType":"struct IShinySeeder.Seed","name":"seed","type":"tuple"},{"internalType":"bool","name":"isShiny","type":"bool"}],"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"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613220806200007f6000396000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c80637a34aad311610191578063a5ba4aa2116100e3578063d9ab8a4311610097578063eba8180611610071578063eba81806146105cb578063f2fde38b146105d3578063f9da8863146105e657600080fd5b8063d9ab8a4314610592578063dce72c23146105a5578063e6339d6a146105b857600080fd5b8063c1733f9e116100c8578063c1733f9e14610564578063cc2aa09114610577578063d6e3d97e1461057f57600080fd5b8063a5ba4aa214610549578063b48f35d21461055157600080fd5b80638a85a1e81161014557806391b7916a1161011f57806391b7916a146105105780639a79620514610523578063a3053dd51461053657600080fd5b80638a85a1e8146104c25780638da5cb5b146104d557806390f1d5dc146104fd57600080fd5b80638104468c116101765780638104468c14610494578063839644da1461049c57806389369989146104af57600080fd5b80637a34aad31461046e5780637ca942101461048157600080fd5b806344cee73c1161024a578063598fa9da116101fe57806367a14fb6116101d857806367a14fb61461043a578063715018a614610442578063773b97711461044a57600080fd5b8063598fa9da146104015780635a503f13146104145780635e70664c1461042757600080fd5b80634daebac21161022f5780634daebac2146103d3578063553afbca146103db57806356e27265146103ee57600080fd5b806344cee73c146103b85780634531c0a8146103cb57600080fd5b80630edd1788116102a15780632715c90e116102865780632715c90e1461038a5780632a1d07691461039d578063440b57d2146103a557600080fd5b80630edd17881461036457806317b552ab1461037757600080fd5b806307d6e0b5116102d257806307d6e0b51461032c5780630a46b1681461033f5780630de518661461035257600080fd5b80630475d863146102ee57806304bde4dd14610303575b600080fd5b6103016102fc366004612832565b6105f9565b005b610316610311366004612874565b61070d565b6040516103239190612903565b60405180910390f35b61031661033a366004612a83565b6107b9565b61031661034d366004612b5e565b6107ce565b6008545b604051908152602001610323565b610301610372366004612c28565b610968565b610301610385366004612c28565b610a37565b610301610398366004612c28565b610b02565b610301610bcd565b6103016103b3366004612832565b610ce5565b6103166103c6366004612874565b610def565b600254610356565b600454610356565b6103016103e9366004612832565b610dff565b6103166103fc366004612874565b610f09565b61031661040f366004612c6f565b610f19565b610316610422366004612874565b610f51565b610301610435366004612c28565b610f61565b600754610356565b61030161102c565b60005461045e90600160a01b900460ff1681565b6040519015158152602001610323565b61030161047c366004612832565b61109f565b61031661048f366004612874565b6111a9565b600654610356565b6103016104aa366004612c99565b6111b9565b6103166104bd366004612874565b611306565b6103016104d0366004612832565b611316565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610323565b61031661050b366004612874565b611420565b61030161051e366004612832565b611430565b610301610531366004612c28565b61153a565b610316610544366004612874565b611605565b600954610356565b61030161055f366004612832565b611615565b610301610572366004612832565b61171f565b600554610356565b61031661058d366004612a83565b611829565b6103166105a0366004612cec565b611897565b6103016105b3366004612c28565b611a1a565b6103016105c6366004612c28565b611ae5565b600354610356565b6103016105e1366004612d09565b611bb0565b6103016105f4366004612d3f565b611cac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600054600160a01b900460ff16156106bf5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b81811015610708576106f68383838181106106df576106df612d85565b90506020028101906106f19190612db4565b611da6565b8061070081612e48565b9150506106c2565b505050565b6002818154811061071d57600080fd5b90600052602060002001600091509050805461073890612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461076490612e81565b80156107b15780601f10610786576101008083540402835291602001916107b1565b820191906000526020600020905b81548152906001019060200180831161079457829003601f168201915b505050505081565b60606107c6848484611829565b949350505050565b606060006040518060a001604052808781526020018681526020016107f286611de3565b81526020016002866000015161ffff168154811061081257610812612d85565b90600052602060002001805461082790612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461085390612e81565b80156108a05780601f10610875576101008083540402835291602001916108a0565b820191906000526020600020905b81548152906001019060200180831161088357829003601f168201915b5050505050815260200184151581525090507371a9b7b58459c33570ba33ca1a648bfc42a8830563bf1deae28260016040518363ffffffff1660e01b81526004016108ec929190612f2a565b60006040518083038186803b15801561090457600080fd5b505af4158015610918573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261095e9190810190612fd5565b9695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610a295760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a3382826123b1565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610af85760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a338282611da6565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610bc35760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a3382826123ee565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610c8e5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1781556040517f1680ee6d421f70ed6030d2fc4fcb50217a5dd617858d56562b119eca59172e579190a1565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d4c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610da65760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b8181101561070857610ddd838383818110610dc657610dc6612d85565b9050602002810190610dd89190612db4565b6123b1565b80610de781612e48565b915050610da9565b6003818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610e665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610ec05760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b8181101561070857610ef7838383818110610ee057610ee0612d85565b9050602002810190610ef29190612db4565b61242b565b80610f0181612e48565b915050610ec3565b6009818154811061071d57600080fd5b60016020528160005260406000208181548110610f3557600080fd5b9060005260206000200160009150915050805461073890612e81565b6005818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610fc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156110225760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a338282612468565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b61109d60006124a5565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156111605760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761119783838381811061118057611180612d85565b90506020028101906111929190612db4565b61251a565b806111a181612e48565b915050611163565b6004818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146112205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b60ff83166000908152600160205260409020546101009061124290839061304c565b11156112b65760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161065c565b60005b81811015611300576112ee848484848181106112d7576112d7612d85565b90506020028101906112e99190612db4565b612557565b806112f881612e48565b9150506112b9565b50505050565b6007818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461137d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156113d75760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761140e8383838181106113f7576113f7612d85565b90506020028101906114099190612db4565b6123ee565b8061141881612e48565b9150506113da565b6008818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146114975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156114f15760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761152883838381811061151157611511612d85565b90506020028101906115239190612db4565b612468565b8061153281612e48565b9150506114f4565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115a15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156115fb5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a33828261251a565b6006818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461167c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156116d65760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761170d8383838181106116f6576116f6612d85565b90506020028101906117089190612db4565b612583565b8061171781612e48565b9150506116d9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156117e05760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761181783838381811061180057611800612d85565b90506020028101906118129190612db4565b6125c0565b8061182181612e48565b9150506117e3565b60606000611836856125fd565b905060008160405160200161184b9190613064565b604051602081830303815290604052905060008260405160200161186f91906130a9565b604051602081830303815290604052905061188c828288886107ce565b979650505050505050565b6060600060405180604001604052806118af85611de3565b81526020016002856000015161ffff16815481106118cf576118cf612d85565b9060005260206000200180546118e490612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461191090612e81565b801561195d5780601f106119325761010080835404028352916020019161195d565b820191906000526020600020905b81548152906001019060200180831161194057829003601f168201915b505050505081525090507371a9b7b58459c33570ba33ca1a648bfc42a883056366b8c2418260016040518363ffffffff1660e01b81526004016119a1929190613115565b60006040518083038186803b1580156119b957600080fd5b505af41580156119cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a139190810190612fd5565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615611adb5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a338282612583565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615611ba65760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a3382826125c0565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b73ffffffffffffffffffffffffffffffffffffffff8116611ca05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b611ca9816124a5565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b60ff8381166000908152600160205260409020541115611d9b5760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161065c565b610708838383612557565b60048054600181018255600091909152610708907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01838361272f565b604080516007808252610100820190925260609160009190816020015b6060815260200190600190039081611e005790505090506003836020015161ffff1681548110611e3257611e32612d85565b906000526020600020018054611e4790612e81565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7390612e81565b8015611ec05780601f10611e9557610100808354040283529160200191611ec0565b820191906000526020600020905b815481529060010190602001808311611ea357829003601f168201915b505050505081600081518110611ed857611ed8612d85565b60200260200101819052506004836040015161ffff1681548110611efe57611efe612d85565b906000526020600020018054611f1390612e81565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3f90612e81565b8015611f8c5780601f10611f6157610100808354040283529160200191611f8c565b820191906000526020600020905b815481529060010190602001808311611f6f57829003601f168201915b505050505081600181518110611fa457611fa4612d85565b60200260200101819052506005836060015161ffff1681548110611fca57611fca612d85565b906000526020600020018054611fdf90612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461200b90612e81565b80156120585780601f1061202d57610100808354040283529160200191612058565b820191906000526020600020905b81548152906001019060200180831161203b57829003601f168201915b50505050508160028151811061207057612070612d85565b60200260200101819052506006836080015161ffff168154811061209657612096612d85565b9060005260206000200180546120ab90612e81565b80601f01602080910402602001604051908101604052809291908181526020018280546120d790612e81565b80156121245780601f106120f957610100808354040283529160200191612124565b820191906000526020600020905b81548152906001019060200180831161210757829003601f168201915b50505050508160038151811061213c5761213c612d85565b602002602001018190525060078360a0015161ffff168154811061216257612162612d85565b90600052602060002001805461217790612e81565b80601f01602080910402602001604051908101604052809291908181526020018280546121a390612e81565b80156121f05780601f106121c5576101008083540402835291602001916121f0565b820191906000526020600020905b8154815290600101906020018083116121d357829003601f168201915b50505050508160048151811061220857612208612d85565b602002602001018190525060088360c0015161ffff168154811061222e5761222e612d85565b90600052602060002001805461224390612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461226f90612e81565b80156122bc5780601f10612291576101008083540402835291602001916122bc565b820191906000526020600020905b81548152906001019060200180831161229f57829003601f168201915b5050505050816005815181106122d4576122d4612d85565b602002602001018190525060098360e0015161ffff16815481106122fa576122fa612d85565b90600052602060002001805461230f90612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90612e81565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b5050505050816006815181106123a0576123a0612d85565b602090810291909101015292915050565b60088054600181018255600091909152610708907ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301838361272f565b60038054600181018255600091909152610708907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01838361272f565b60098054600181018255600091909152610708907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01838361272f565b60028054600181018255600091909152610708907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01838361272f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60058054600181018255600091909152610708907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001838361272f565b60ff8316600090815260016020818152604083208054928301815583529091206113009101838361272f565b60068054600181018255600091909152610708907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01838361272f565b60078054600181018255600091909152610708907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68801838361272f565b60608161263d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612667578061265181612e48565b91506126609050600a836131ab565b9150612641565b60008167ffffffffffffffff81111561268257612682612916565b6040519080825280601f01601f1916602001820160405280156126ac576020820181803683370190505b5090505b84156107c6576126c16001836131bf565b91506126ce600a866131d6565b6126d990603061304c565b60f81b8183815181106126ee576126ee612d85565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612728600a866131ab565b94506126b0565b82805461273b90612e81565b90600052602060002090601f01602090048101928261275d57600085556127c1565b82601f10612794578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008235161785556127c1565b828001600101855582156127c1579182015b828111156127c15782358255916020019190600101906127a6565b506127cd9291506127d1565b5090565b5b808211156127cd57600081556001016127d2565b60008083601f8401126127f857600080fd5b50813567ffffffffffffffff81111561281057600080fd5b6020830191508360208260051b850101111561282b57600080fd5b9250929050565b6000806020838503121561284557600080fd5b823567ffffffffffffffff81111561285c57600080fd5b612868858286016127e6565b90969095509350505050565b60006020828403121561288657600080fd5b5035919050565b60005b838110156128a8578181015183820152602001612890565b838111156113005750506000910152565b600081518084526128d181602086016020860161288d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a1360208301846128b9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561298c5761298c612916565b604052919050565b803561ffff811681146129a657600080fd5b919050565b60006101008083850312156129bf57600080fd5b6040519081019067ffffffffffffffff821181831017156129e2576129e2612916565b816040528092506129f284612994565b8152612a0060208501612994565b6020820152612a1160408501612994565b6040820152612a2260608501612994565b6060820152612a3360808501612994565b6080820152612a4460a08501612994565b60a0820152612a5560c08501612994565b60c0820152612a6660e08501612994565b60e0820152505092915050565b803580151581146129a657600080fd5b60008060006101408486031215612a9957600080fd5b83359250612aaa85602086016129ab565b9150612ab96101208501612a73565b90509250925092565b600067ffffffffffffffff821115612adc57612adc612916565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112612b1957600080fd5b8135612b2c612b2782612ac2565b612945565b818152846020838601011115612b4157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806101608587031215612b7557600080fd5b843567ffffffffffffffff80821115612b8d57600080fd5b612b9988838901612b08565b95506020870135915080821115612baf57600080fd5b50612bbc87828801612b08565b935050612bcc86604087016129ab565b9150612bdb6101408601612a73565b905092959194509250565b60008083601f840112612bf857600080fd5b50813567ffffffffffffffff811115612c1057600080fd5b60208301915083602082850101111561282b57600080fd5b60008060208385031215612c3b57600080fd5b823567ffffffffffffffff811115612c5257600080fd5b61286885828601612be6565b803560ff811681146129a657600080fd5b60008060408385031215612c8257600080fd5b612c8b83612c5e565b946020939093013593505050565b600080600060408486031215612cae57600080fd5b612cb784612c5e565b9250602084013567ffffffffffffffff811115612cd357600080fd5b612cdf868287016127e6565b9497909650939450505050565b60006101008284031215612cff57600080fd5b611a1383836129ab565b600060208284031215612d1b57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611a1357600080fd5b600080600060408486031215612d5457600080fd5b612d5d84612c5e565b9250602084013567ffffffffffffffff811115612d7957600080fd5b612cdf86828701612be6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612de957600080fd5b83018035915067ffffffffffffffff821115612e0457600080fd5b60200191503681900382131561282b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e7a57612e7a612e19565b5060010190565b600181811c90821680612e9557607f821691505b60208210811415612ecf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600081518084526020808501808196508360051b8101915082860160005b85811015612f1d578284038952612f0b8483516128b9565b98850198935090840190600101612ef3565b5091979650505050505050565b604081526000835160a06040840152612f4660e08401826128b9565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152612f8283836128b9565b92506040870151915080858403016080860152612f9f8383612ed5565b925060608701519150808584030160a086015250612fbd82826128b9565b60809690960151151560c08501525050506020015290565b600060208284031215612fe757600080fd5b815167ffffffffffffffff811115612ffe57600080fd5b8201601f8101841361300f57600080fd5b805161301d612b2782612ac2565b81815285602083850101111561303257600080fd5b61304382602083016020860161288d565b95945050505050565b6000821982111561305f5761305f612e19565b500190565b7f5368696e7920000000000000000000000000000000000000000000000000000081526000825161309c81600685016020870161288d565b9190910160060192915050565b7f5368696e792000000000000000000000000000000000000000000000000000008152600082516130e181600685016020870161288d565b7f2069732061206d656d626572206f66205368696e7920436c75620000000000006006939091019283015250602001919050565b60408152600083516040808401526131306080840182612ed5565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084830301606085015261316b82826128b9565b925050508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826131ba576131ba61317c565b500490565b6000828210156131d1576131d1612e19565b500390565b6000826131e5576131e561317c565b50069056fea264697066735822122069f7e8186d8a6fc939799f506e3df83fcae9866b4fc9ff3f363d4d3ad1abb63764736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102e95760003560e01c80637a34aad311610191578063a5ba4aa2116100e3578063d9ab8a4311610097578063eba8180611610071578063eba81806146105cb578063f2fde38b146105d3578063f9da8863146105e657600080fd5b8063d9ab8a4314610592578063dce72c23146105a5578063e6339d6a146105b857600080fd5b8063c1733f9e116100c8578063c1733f9e14610564578063cc2aa09114610577578063d6e3d97e1461057f57600080fd5b8063a5ba4aa214610549578063b48f35d21461055157600080fd5b80638a85a1e81161014557806391b7916a1161011f57806391b7916a146105105780639a79620514610523578063a3053dd51461053657600080fd5b80638a85a1e8146104c25780638da5cb5b146104d557806390f1d5dc146104fd57600080fd5b80638104468c116101765780638104468c14610494578063839644da1461049c57806389369989146104af57600080fd5b80637a34aad31461046e5780637ca942101461048157600080fd5b806344cee73c1161024a578063598fa9da116101fe57806367a14fb6116101d857806367a14fb61461043a578063715018a614610442578063773b97711461044a57600080fd5b8063598fa9da146104015780635a503f13146104145780635e70664c1461042757600080fd5b80634daebac21161022f5780634daebac2146103d3578063553afbca146103db57806356e27265146103ee57600080fd5b806344cee73c146103b85780634531c0a8146103cb57600080fd5b80630edd1788116102a15780632715c90e116102865780632715c90e1461038a5780632a1d07691461039d578063440b57d2146103a557600080fd5b80630edd17881461036457806317b552ab1461037757600080fd5b806307d6e0b5116102d257806307d6e0b51461032c5780630a46b1681461033f5780630de518661461035257600080fd5b80630475d863146102ee57806304bde4dd14610303575b600080fd5b6103016102fc366004612832565b6105f9565b005b610316610311366004612874565b61070d565b6040516103239190612903565b60405180910390f35b61031661033a366004612a83565b6107b9565b61031661034d366004612b5e565b6107ce565b6008545b604051908152602001610323565b610301610372366004612c28565b610968565b610301610385366004612c28565b610a37565b610301610398366004612c28565b610b02565b610301610bcd565b6103016103b3366004612832565b610ce5565b6103166103c6366004612874565b610def565b600254610356565b600454610356565b6103016103e9366004612832565b610dff565b6103166103fc366004612874565b610f09565b61031661040f366004612c6f565b610f19565b610316610422366004612874565b610f51565b610301610435366004612c28565b610f61565b600754610356565b61030161102c565b60005461045e90600160a01b900460ff1681565b6040519015158152602001610323565b61030161047c366004612832565b61109f565b61031661048f366004612874565b6111a9565b600654610356565b6103016104aa366004612c99565b6111b9565b6103166104bd366004612874565b611306565b6103016104d0366004612832565b611316565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610323565b61031661050b366004612874565b611420565b61030161051e366004612832565b611430565b610301610531366004612c28565b61153a565b610316610544366004612874565b611605565b600954610356565b61030161055f366004612832565b611615565b610301610572366004612832565b61171f565b600554610356565b61031661058d366004612a83565b611829565b6103166105a0366004612cec565b611897565b6103016105b3366004612c28565b611a1a565b6103016105c6366004612c28565b611ae5565b600354610356565b6103016105e1366004612d09565b611bb0565b6103016105f4366004612d3f565b611cac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600054600160a01b900460ff16156106bf5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b81811015610708576106f68383838181106106df576106df612d85565b90506020028101906106f19190612db4565b611da6565b8061070081612e48565b9150506106c2565b505050565b6002818154811061071d57600080fd5b90600052602060002001600091509050805461073890612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461076490612e81565b80156107b15780601f10610786576101008083540402835291602001916107b1565b820191906000526020600020905b81548152906001019060200180831161079457829003601f168201915b505050505081565b60606107c6848484611829565b949350505050565b606060006040518060a001604052808781526020018681526020016107f286611de3565b81526020016002866000015161ffff168154811061081257610812612d85565b90600052602060002001805461082790612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461085390612e81565b80156108a05780601f10610875576101008083540402835291602001916108a0565b820191906000526020600020905b81548152906001019060200180831161088357829003601f168201915b5050505050815260200184151581525090507371a9b7b58459c33570ba33ca1a648bfc42a8830563bf1deae28260016040518363ffffffff1660e01b81526004016108ec929190612f2a565b60006040518083038186803b15801561090457600080fd5b505af4158015610918573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261095e9190810190612fd5565b9695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610a295760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a3382826123b1565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610af85760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a338282611da6565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610bc35760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a3382826123ee565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610c8e5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1781556040517f1680ee6d421f70ed6030d2fc4fcb50217a5dd617858d56562b119eca59172e579190a1565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d4c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610da65760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b8181101561070857610ddd838383818110610dc657610dc6612d85565b9050602002810190610dd89190612db4565b6123b1565b80610de781612e48565b915050610da9565b6003818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610e665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615610ec05760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b8181101561070857610ef7838383818110610ee057610ee0612d85565b9050602002810190610ef29190612db4565b61242b565b80610f0181612e48565b915050610ec3565b6009818154811061071d57600080fd5b60016020528160005260406000208181548110610f3557600080fd5b9060005260206000200160009150915050805461073890612e81565b6005818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610fc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156110225760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a338282612468565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b61109d60006124a5565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156111605760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761119783838381811061118057611180612d85565b90506020028101906111929190612db4565b61251a565b806111a181612e48565b915050611163565b6004818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146112205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b60ff83166000908152600160205260409020546101009061124290839061304c565b11156112b65760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161065c565b60005b81811015611300576112ee848484848181106112d7576112d7612d85565b90506020028101906112e99190612db4565b612557565b806112f881612e48565b9150506112b9565b50505050565b6007818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461137d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156113d75760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761140e8383838181106113f7576113f7612d85565b90506020028101906114099190612db4565b6123ee565b8061141881612e48565b9150506113da565b6008818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146114975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156114f15760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761152883838381811061151157611511612d85565b90506020028101906115239190612db4565b612468565b8061153281612e48565b9150506114f4565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115a15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156115fb5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a33828261251a565b6006818154811061071d57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461167c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156116d65760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761170d8383838181106116f6576116f6612d85565b90506020028101906117089190612db4565b612583565b8061171781612e48565b9150506116d9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff16156117e05760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b60005b818110156107085761181783838381811061180057611800612d85565b90506020028101906118129190612db4565b6125c0565b8061182181612e48565b9150506117e3565b60606000611836856125fd565b905060008160405160200161184b9190613064565b604051602081830303815290604052905060008260405160200161186f91906130a9565b604051602081830303815290604052905061188c828288886107ce565b979650505050505050565b6060600060405180604001604052806118af85611de3565b81526020016002856000015161ffff16815481106118cf576118cf612d85565b9060005260206000200180546118e490612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461191090612e81565b801561195d5780601f106119325761010080835404028352916020019161195d565b820191906000526020600020905b81548152906001019060200180831161194057829003601f168201915b505050505081525090507371a9b7b58459c33570ba33ca1a648bfc42a883056366b8c2418260016040518363ffffffff1660e01b81526004016119a1929190613115565b60006040518083038186803b1580156119b957600080fd5b505af41580156119cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a139190810190612fd5565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615611adb5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a338282612583565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b600054600160a01b900460ff1615611ba65760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161065c565b610a3382826125c0565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b73ffffffffffffffffffffffffffffffffffffffff8116611ca05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b611ca9816124a5565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b60ff8381166000908152600160205260409020541115611d9b5760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161065c565b610708838383612557565b60048054600181018255600091909152610708907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01838361272f565b604080516007808252610100820190925260609160009190816020015b6060815260200190600190039081611e005790505090506003836020015161ffff1681548110611e3257611e32612d85565b906000526020600020018054611e4790612e81565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7390612e81565b8015611ec05780601f10611e9557610100808354040283529160200191611ec0565b820191906000526020600020905b815481529060010190602001808311611ea357829003601f168201915b505050505081600081518110611ed857611ed8612d85565b60200260200101819052506004836040015161ffff1681548110611efe57611efe612d85565b906000526020600020018054611f1390612e81565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3f90612e81565b8015611f8c5780601f10611f6157610100808354040283529160200191611f8c565b820191906000526020600020905b815481529060010190602001808311611f6f57829003601f168201915b505050505081600181518110611fa457611fa4612d85565b60200260200101819052506005836060015161ffff1681548110611fca57611fca612d85565b906000526020600020018054611fdf90612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461200b90612e81565b80156120585780601f1061202d57610100808354040283529160200191612058565b820191906000526020600020905b81548152906001019060200180831161203b57829003601f168201915b50505050508160028151811061207057612070612d85565b60200260200101819052506006836080015161ffff168154811061209657612096612d85565b9060005260206000200180546120ab90612e81565b80601f01602080910402602001604051908101604052809291908181526020018280546120d790612e81565b80156121245780601f106120f957610100808354040283529160200191612124565b820191906000526020600020905b81548152906001019060200180831161210757829003601f168201915b50505050508160038151811061213c5761213c612d85565b602002602001018190525060078360a0015161ffff168154811061216257612162612d85565b90600052602060002001805461217790612e81565b80601f01602080910402602001604051908101604052809291908181526020018280546121a390612e81565b80156121f05780601f106121c5576101008083540402835291602001916121f0565b820191906000526020600020905b8154815290600101906020018083116121d357829003601f168201915b50505050508160048151811061220857612208612d85565b602002602001018190525060088360c0015161ffff168154811061222e5761222e612d85565b90600052602060002001805461224390612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461226f90612e81565b80156122bc5780601f10612291576101008083540402835291602001916122bc565b820191906000526020600020905b81548152906001019060200180831161229f57829003601f168201915b5050505050816005815181106122d4576122d4612d85565b602002602001018190525060098360e0015161ffff16815481106122fa576122fa612d85565b90600052602060002001805461230f90612e81565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90612e81565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b5050505050816006815181106123a0576123a0612d85565b602090810291909101015292915050565b60088054600181018255600091909152610708907ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301838361272f565b60038054600181018255600091909152610708907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01838361272f565b60098054600181018255600091909152610708907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01838361272f565b60028054600181018255600091909152610708907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01838361272f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60058054600181018255600091909152610708907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001838361272f565b60ff8316600090815260016020818152604083208054928301815583529091206113009101838361272f565b60068054600181018255600091909152610708907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01838361272f565b60078054600181018255600091909152610708907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68801838361272f565b60608161263d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612667578061265181612e48565b91506126609050600a836131ab565b9150612641565b60008167ffffffffffffffff81111561268257612682612916565b6040519080825280601f01601f1916602001820160405280156126ac576020820181803683370190505b5090505b84156107c6576126c16001836131bf565b91506126ce600a866131d6565b6126d990603061304c565b60f81b8183815181106126ee576126ee612d85565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612728600a866131ab565b94506126b0565b82805461273b90612e81565b90600052602060002090601f01602090048101928261275d57600085556127c1565b82601f10612794578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008235161785556127c1565b828001600101855582156127c1579182015b828111156127c15782358255916020019190600101906127a6565b506127cd9291506127d1565b5090565b5b808211156127cd57600081556001016127d2565b60008083601f8401126127f857600080fd5b50813567ffffffffffffffff81111561281057600080fd5b6020830191508360208260051b850101111561282b57600080fd5b9250929050565b6000806020838503121561284557600080fd5b823567ffffffffffffffff81111561285c57600080fd5b612868858286016127e6565b90969095509350505050565b60006020828403121561288657600080fd5b5035919050565b60005b838110156128a8578181015183820152602001612890565b838111156113005750506000910152565b600081518084526128d181602086016020860161288d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a1360208301846128b9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561298c5761298c612916565b604052919050565b803561ffff811681146129a657600080fd5b919050565b60006101008083850312156129bf57600080fd5b6040519081019067ffffffffffffffff821181831017156129e2576129e2612916565b816040528092506129f284612994565b8152612a0060208501612994565b6020820152612a1160408501612994565b6040820152612a2260608501612994565b6060820152612a3360808501612994565b6080820152612a4460a08501612994565b60a0820152612a5560c08501612994565b60c0820152612a6660e08501612994565b60e0820152505092915050565b803580151581146129a657600080fd5b60008060006101408486031215612a9957600080fd5b83359250612aaa85602086016129ab565b9150612ab96101208501612a73565b90509250925092565b600067ffffffffffffffff821115612adc57612adc612916565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112612b1957600080fd5b8135612b2c612b2782612ac2565b612945565b818152846020838601011115612b4157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806101608587031215612b7557600080fd5b843567ffffffffffffffff80821115612b8d57600080fd5b612b9988838901612b08565b95506020870135915080821115612baf57600080fd5b50612bbc87828801612b08565b935050612bcc86604087016129ab565b9150612bdb6101408601612a73565b905092959194509250565b60008083601f840112612bf857600080fd5b50813567ffffffffffffffff811115612c1057600080fd5b60208301915083602082850101111561282b57600080fd5b60008060208385031215612c3b57600080fd5b823567ffffffffffffffff811115612c5257600080fd5b61286885828601612be6565b803560ff811681146129a657600080fd5b60008060408385031215612c8257600080fd5b612c8b83612c5e565b946020939093013593505050565b600080600060408486031215612cae57600080fd5b612cb784612c5e565b9250602084013567ffffffffffffffff811115612cd357600080fd5b612cdf868287016127e6565b9497909650939450505050565b60006101008284031215612cff57600080fd5b611a1383836129ab565b600060208284031215612d1b57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611a1357600080fd5b600080600060408486031215612d5457600080fd5b612d5d84612c5e565b9250602084013567ffffffffffffffff811115612d7957600080fd5b612cdf86828701612be6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612de957600080fd5b83018035915067ffffffffffffffff821115612e0457600080fd5b60200191503681900382131561282b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e7a57612e7a612e19565b5060010190565b600181811c90821680612e9557607f821691505b60208210811415612ecf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600081518084526020808501808196508360051b8101915082860160005b85811015612f1d578284038952612f0b8483516128b9565b98850198935090840190600101612ef3565b5091979650505050505050565b604081526000835160a06040840152612f4660e08401826128b9565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152612f8283836128b9565b92506040870151915080858403016080860152612f9f8383612ed5565b925060608701519150808584030160a086015250612fbd82826128b9565b60809690960151151560c08501525050506020015290565b600060208284031215612fe757600080fd5b815167ffffffffffffffff811115612ffe57600080fd5b8201601f8101841361300f57600080fd5b805161301d612b2782612ac2565b81815285602083850101111561303257600080fd5b61304382602083016020860161288d565b95945050505050565b6000821982111561305f5761305f612e19565b500190565b7f5368696e7920000000000000000000000000000000000000000000000000000081526000825161309c81600685016020870161288d565b9190910160060192915050565b7f5368696e792000000000000000000000000000000000000000000000000000008152600082516130e181600685016020870161288d565b7f2069732061206d656d626572206f66205368696e7920436c75620000000000006006939091019283015250602001919050565b60408152600083516040808401526131306080840182612ed5565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084830301606085015261316b82826128b9565b925050508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826131ba576131ba61317c565b500490565b6000828210156131d1576131d1612e19565b500390565b6000826131e5576131e561317c565b50069056fea264697066735822122069f7e8186d8a6fc939799f506e3df83fcae9866b4fc9ff3f363d4d3ad1abb63764736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.