Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 44 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 12985698 | 1252 days ago | IN | 0 ETH | 0.0015692 | ||||
Add Many Glasses | 12985647 | 1252 days ago | IN | 0 ETH | 0.12891175 | ||||
Add Many Heads | 12985646 | 1252 days ago | IN | 0 ETH | 0.04033287 | ||||
Add Many Heads | 12985646 | 1252 days ago | IN | 0 ETH | 0.10429226 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.1239596 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.10427378 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.09770579 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.09908915 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.0915514 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.09027947 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.10394928 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.08285777 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.0978753 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.09282663 | ||||
Add Many Heads | 12985645 | 1252 days ago | IN | 0 ETH | 0.09774671 | ||||
Add Many Heads | 12985639 | 1252 days ago | IN | 0 ETH | 0.10029915 | ||||
Add Many Heads | 12985638 | 1252 days ago | IN | 0 ETH | 0.10644496 | ||||
Add Many Heads | 12985633 | 1252 days ago | IN | 0 ETH | 0.11144952 | ||||
Add Many Heads | 12985633 | 1252 days ago | IN | 0 ETH | 0.10020873 | ||||
Add Many Heads | 12985629 | 1252 days ago | IN | 0 ETH | 0.08671569 | ||||
Add Many Heads | 12985629 | 1252 days ago | IN | 0 ETH | 0.09407018 | ||||
Add Many Heads | 12985627 | 1252 days ago | IN | 0 ETH | 0.09525763 | ||||
Add Many Heads | 12985627 | 1252 days ago | IN | 0 ETH | 0.10169967 | ||||
Add Many Heads | 12985625 | 1252 days ago | IN | 0 ETH | 0.09293146 | ||||
Add Many Heads | 12985625 | 1252 days ago | IN | 0 ETH | 0.10392882 |
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:
NounsDescriptor
Compiler Version
v0.8.6+commit.11564f7e
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 Nouns NFT descriptor /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol'; import { Strings } from '@openzeppelin/contracts/utils/Strings.sol'; import { INounsDescriptor } from './interfaces/INounsDescriptor.sol'; import { INounsSeeder } from './interfaces/INounsSeeder.sol'; import { NFTDescriptor } from './libs/NFTDescriptor.sol'; import { MultiPartRLEToSVG } from './libs/MultiPartRLEToSVG.sol'; contract NounsDescriptor is INounsDescriptor, 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 Noun 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; // Noun Color Palettes (Index => Hex Colors) mapping(uint8 => string[]) public override palettes; // Noun Backgrounds (Hex Colors) string[] public override backgrounds; // Noun Bodies (Custom RLE) bytes[] public override bodies; // Noun Accessories (Custom RLE) bytes[] public override accessories; // Noun Heads (Custom RLE) bytes[] public override heads; // Noun Glasses (Custom RLE) bytes[] public override glasses; /** * @notice Require that the parts have not been locked. */ modifier whenPartsNotLocked() { require(!arePartsLocked, 'Parts are locked'); _; } /** * @notice Get the number of available Noun `backgrounds`. */ function backgroundCount() external view override returns (uint256) { return backgrounds.length; } /** * @notice Get the number of available Noun `bodies`. */ function bodyCount() external view override returns (uint256) { return bodies.length; } /** * @notice Get the number of available Noun `accessories`. */ function accessoryCount() external view override returns (uint256) { return accessories.length; } /** * @notice Get the number of available Noun `heads`. */ function headCount() external view override returns (uint256) { return heads.length; } /** * @notice Get the number of available Noun `glasses`. */ function glassesCount() external view override returns (uint256) { return glasses.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 Noun 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 Noun 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 Noun 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 Noun 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 Noun glasses. * @dev This function can only be called by the owner when not locked. */ function addManyGlasses(bytes[] calldata _glasses) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _glasses.length; i++) { _addGlasses(_glasses[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 Noun 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 Noun 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 Noun 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 Noun 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 Noun glasses. * @dev This function can only be called by the owner when not locked. */ function addGlasses(bytes calldata _glasses) external override onlyOwner whenPartsNotLocked { _addGlasses(_glasses); } /** * @notice Lock all Noun 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 for an official Nouns DAO noun. * @dev The returned value may be a base64 encoded data URI or an API URL. */ function tokenURI(uint256 tokenId, INounsSeeder.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 for an official Nouns DAO noun. */ function dataURI(uint256 tokenId, INounsSeeder.Seed memory seed) public view override returns (string memory) { string memory nounId = tokenId.toString(); string memory name = string(abi.encodePacked('Noun ', nounId)); string memory description = string(abi.encodePacked('Noun ', nounId, ' is a member of the Nouns DAO')); 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, INounsSeeder.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(INounsSeeder.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 Noun background. */ function _addBackground(string calldata _background) internal { backgrounds.push(_background); } /** * @notice Add a Noun body. */ function _addBody(bytes calldata _body) internal { bodies.push(_body); } /** * @notice Add a Noun accessory. */ function _addAccessory(bytes calldata _accessory) internal { accessories.push(_accessory); } /** * @notice Add a Noun head. */ function _addHead(bytes calldata _head) internal { heads.push(_head); } /** * @notice Add Noun glasses. */ function _addGlasses(bytes calldata _glasses) internal { glasses.push(_glasses); } /** * @notice Get all Noun parts for the passed `seed`. */ function _getPartsForSeed(INounsSeeder.Seed memory seed) internal view returns (bytes[] memory) { bytes[] memory _parts = new bytes[](4); _parts[0] = bodies[seed.body]; _parts[1] = accessories[seed.accessory]; _parts[2] = heads[seed.head]; _parts[3] = glasses[seed.glasses]; return _parts; } }
// SPDX-License-Identifier: MIT 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT 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 NounsDescriptor /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { INounsSeeder } from './INounsSeeder.sol'; interface INounsDescriptor { 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 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 glasses(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 glassesCount() 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 addManyGlasses(bytes[] calldata glasses) 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 addGlasses(bytes calldata glasses) external; function lockParts() external; function toggleDataURIEnabled() external; function setBaseURI(string calldata baseURI) external; function tokenURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view returns (string memory); function dataURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view returns (string memory); function genericDataURI( string calldata name, string calldata description, INounsSeeder.Seed memory seed ) external view returns (string memory); function generateSVGImage(INounsSeeder.Seed memory seed) external view returns (string memory); }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for NounsSeeder /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { INounsDescriptor } from './INounsDescriptor.sol'; interface INounsSeeder { struct Seed { uint48 background; uint48 body; uint48 accessory; uint48 head; uint48 glasses; } function generateSeed(uint256 nounId, INounsDescriptor descriptor) external view returns (Seed memory); }
// 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))); } }
// 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; uint256 width; 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.left == image.width) { 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 width = bounds.right - bounds.left; 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, width: width, rects: rects }); } }
// SPDX-License-Identifier: MIT 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 /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // 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) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, 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; } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": { "contracts/libs/NFTDescriptor.sol": { "NFTDescriptor": "0x0bbad8c947210ab6284699605ce2a61780958264" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"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":"_glasses","type":"bytes"}],"name":"addGlasses","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":"_glasses","type":"bytes[]"}],"name":"addManyGlasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_heads","type":"bytes[]"}],"name":"addManyHeads","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":"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":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"glasses","type":"uint48"}],"internalType":"struct INounsSeeder.Seed","name":"seed","type":"tuple"}],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"glasses","type":"uint48"}],"internalType":"struct INounsSeeder.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":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"glasses","type":"uint48"}],"internalType":"struct INounsSeeder.Seed","name":"seed","type":"tuple"}],"name":"genericDataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"glasses","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glassesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isDataURIEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockParts","outputs":[],"stateMutability":"nonpayable","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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","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":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"glasses","type":"uint48"}],"internalType":"struct INounsSeeder.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"}]
Contract Creation Code
60806040526000805460ff60a81b1916600160a81b17905534801561002357600080fd5b5061002d33610032565b610082565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612c1a80620000926000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063715018a6116101455780639a796205116100bd578063ce2f4f531161008c578063eba8180611610071578063eba81806146104e8578063f2fde38b146104f0578063f9da88631461050357600080fd5b8063ce2f4f53146104ba578063dfe8478b146104e057600080fd5b80639a79620514610479578063a51e41241461048c578063b982d1b91461049f578063cc2aa091146104b257600080fd5b8063839644da116101145780638a85a1e8116100f95780638a85a1e81461042b5780638da5cb5b1461043e57806391b7916a1461046657600080fd5b8063839644da1461040557806387db11bd1461041857600080fd5b8063715018a6146103a2578063773b9771146103aa5780637a34aad3146103df5780637ca94210146103f257600080fd5b80634531c0a8116101d85780635a503f13116101a7578063615bda101161018c578063615bda1014610374578063638ac270146103875780636c0360eb1461039a57600080fd5b80635a503f131461034e5780635e70664c1461036157600080fd5b80634531c0a8146103185780634daebac21461032057806355f804b314610328578063598fa9da1461033b57600080fd5b80632a1d07691161022f5780633cfdafd3116102145780633cfdafd3146102e05780634479cef2146102f357806344cee73c1461030557600080fd5b80632a1d0769146102c55780632ea04300146102cd57600080fd5b80630475d8631461026157806304bde4dd1461027657806317b552ab1461029f5780632715c90e146102b2575b600080fd5b61027461026f36600461237b565b610516565b005b6102896102843660046124f2565b61063b565b604051610296919061281e565b60405180910390f35b6102746102ad3660046123bd565b6106e7565b6102746102c03660046123bd565b6107c7565b6102746108a3565b6102896102db3660046124d6565b6109dd565b6102896102ee36600461250b565b610b46565b6007545b604051908152602001610296565b6102896103133660046124f2565b610bb2565b6003546102f7565b6005546102f7565b6102746103363660046123bd565b610bc2565b6102896103493660046125d1565b610c73565b61028961035c3660046124f2565b610cab565b61027461036f3660046123bd565b610cbb565b6102746103823660046123bd565b610d97565b61028961039536600461250b565b610e73565b610289610edf565b610274610eec565b6000546103cf9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610296565b6102746103ed36600461237b565b610f5f565b6102896104003660046124f2565b61107a565b610274610413366004612538565b61108a565b610289610426366004612461565b6111d7565b61027461043936600461237b565b61134e565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610296565b61027461047436600461237b565b611469565b6102746104873660046123bd565b611584565b61027461049a36600461237b565b611660565b6102896104ad3660046124f2565b61177b565b6006546102f7565b6000546103cf907501000000000000000000000000000000000000000000900460ff1681565b61027461178b565b6004546102f7565b6102746104fe366004612345565b611875565b61027461051136600461258b565b611971565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60005474010000000000000000000000000000000000000000900460ff16156105ed5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761062483838381811061060d5761060d612b86565b905060200281019061061f919061295a565b611a6b565b8061062e81612adb565b9150506105f0565b505050565b6003818154811061064b57600080fd5b90600052602060002001600091509050805461066690612a87565b80601f016020809104026020016040519081016040528092919081815260200182805461069290612a87565b80156106df5780601f106106b4576101008083540402835291602001916106df565b820191906000526020600020905b8154815290600101906020018083116106c257829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff16331461074e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156107b95760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282611a6b565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461082e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156108995760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282611aa8565b60005473ffffffffffffffffffffffffffffffffffffffff16331461090a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156109755760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001781556040517f1680ee6d421f70ed6030d2fc4fcb50217a5dd617858d56562b119eca59172e579190a1565b6060600060405180604001604052806109f585611ae5565b81526020016003856000015165ffffffffffff1681548110610a1957610a19612b86565b906000526020600020018054610a2e90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5a90612a87565b8015610aa75780601f10610a7c57610100808354040283529160200191610aa7565b820191906000526020600020905b815481529060010190602001808311610a8a57829003601f168201915b50505050508152509050730bbad8c947210ab6284699605ce2a617809582646366b8c2418260026040518363ffffffff1660e01b8152600401610aeb929190612860565b60006040518083038186803b158015610b0357600080fd5b505af4158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f91908101906123f3565b9392505050565b6000546060907501000000000000000000000000000000000000000000900460ff1615610b7e57610b778383610e73565b9050610bac565b6001610b8984611e5e565b604051602001610b9a929190612698565b60405160208183030381529060405290505b92915050565b6004818154811061064b57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610c295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b610c35600183836120ed565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610c67929190612831565b60405180910390a15050565b60026020528160005260406000208181548110610c8f57600080fd5b9060005260206000200160009150915050805461066690612a87565b6006818154811061064b57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610d225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff1615610d8d5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282611f98565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dfe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff1615610e695760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282611fd5565b60606000610e8084611e5e565b9050600081604051602001610e95919061276d565b6040516020818303038152906040529050600082604051602001610eb991906127b2565b6040516020818303038152906040529050610ed58282876111d7565b9695505050505050565b6001805461066690612a87565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b610f5d6000612012565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fc65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156110315760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761106883838381811061105157611051612b86565b9050602002810190611063919061295a565b612087565b8061107281612adb565b915050611034565b6005818154811061064b57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146110f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60ff831660009081526002602052604090205461010090611113908390612a18565b11156111875760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610579565b60005b818110156111d1576111bf848484848181106111a8576111a8612b86565b90506020028101906111ba919061295a565b6120c4565b806111c981612adb565b91505061118a565b50505050565b6060600060405180608001604052808681526020018581526020016111fb85611ae5565b81526020016003856000015165ffffffffffff168154811061121f5761121f612b86565b90600052602060002001805461123490612a87565b80601f016020809104026020016040519081016040528092919081815260200182805461126090612a87565b80156112ad5780601f10611282576101008083540402835291602001916112ad565b820191906000526020600020905b81548152906001019060200180831161129057829003601f168201915b50505050508152509050730bbad8c947210ab6284699605ce2a6178095826463bf1deae28260026040518363ffffffff1660e01b81526004016112f19291906128c7565b60006040518083038186803b15801561130957600080fd5b505af415801561131d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261134591908101906123f3565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113b55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156114205760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761145783838381811061144057611440612b86565b9050602002810190611452919061295a565b611aa8565b8061146181612adb565b915050611423565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff161561153b5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761157283838381811061155b5761155b612b86565b905060200281019061156d919061295a565b611f98565b8061157c81612adb565b91505061153e565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156116565760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282612087565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116c75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156117325760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761176983838381811061175257611752612b86565b9050602002810190611764919061295a565b611fd5565b8061177381612adb565b915050611735565b6007818154811061064b57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146117f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff811675010000000000000000000000000000000000000000009182900460ff1615918202179091556040518181527f360c3d72ee193226275b842f85231c259c934e85459fed80fa68e502ffa9dbde9060200160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b73ffffffffffffffffffffffffffffffffffffffff81166119655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610579565b61196e81612012565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60ff8381166000908152600260205260409020541115611a605760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610579565b6106368383836120c4565b60058054600181018255600091909152610636907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00183836120ed565b60048054600181018255600091909152610636907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0183836120ed565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081611b015790505090506004836020015165ffffffffffff1681548110611b3757611b37612b86565b906000526020600020018054611b4c90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7890612a87565b8015611bc55780601f10611b9a57610100808354040283529160200191611bc5565b820191906000526020600020905b815481529060010190602001808311611ba857829003601f168201915b505050505081600081518110611bdd57611bdd612b86565b60200260200101819052506005836040015165ffffffffffff1681548110611c0757611c07612b86565b906000526020600020018054611c1c90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4890612a87565b8015611c955780601f10611c6a57610100808354040283529160200191611c95565b820191906000526020600020905b815481529060010190602001808311611c7857829003601f168201915b505050505081600181518110611cad57611cad612b86565b60200260200101819052506006836060015165ffffffffffff1681548110611cd757611cd7612b86565b906000526020600020018054611cec90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1890612a87565b8015611d655780601f10611d3a57610100808354040283529160200191611d65565b820191906000526020600020905b815481529060010190602001808311611d4857829003601f168201915b505050505081600281518110611d7d57611d7d612b86565b60200260200101819052506007836080015165ffffffffffff1681548110611da757611da7612b86565b906000526020600020018054611dbc90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890612a87565b8015611e355780601f10611e0a57610100808354040283529160200191611e35565b820191906000526020600020905b815481529060010190602001808311611e1857829003601f168201915b505050505081600381518110611e4d57611e4d612b86565b602090810291909101015292915050565b606081611e9e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ec85780611eb281612adb565b9150611ec19050600a83612a30565b9150611ea2565b60008167ffffffffffffffff811115611ee357611ee3612bb5565b6040519080825280601f01601f191660200182016040528015611f0d576020820181803683370190505b5090505b8415611f9057611f22600183612a44565b9150611f2f600a86612b14565b611f3a906030612a18565b60f81b818381518110611f4f57611f4f612b86565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611f89600a86612a30565b9450611f11565b949350505050565b60038054600181018255600091909152610636907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0183836120ed565b60078054600181018255600091909152610636907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880183836120ed565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60068054600181018255600091909152610636907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0183836120ed565b60ff831660009081526002602090815260408220805460018101825590835291206111d1910183835b8280546120f990612a87565b90600052602060002090601f01602090048101928261211b576000855561217f565b82601f10612152578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561217f565b8280016001018555821561217f579182015b8281111561217f578235825591602001919060010190612164565b5061218b92915061218f565b5090565b5b8082111561218b5760008155600101612190565b60008083601f8401126121b657600080fd5b50813567ffffffffffffffff8111156121ce57600080fd5b6020830191508360208260051b85010111156121e957600080fd5b9250929050565b60008083601f84011261220257600080fd5b50813567ffffffffffffffff81111561221a57600080fd5b6020830191508360208285010111156121e957600080fd5b600082601f83011261224357600080fd5b8135612256612251826129f0565b6129bf565b81815284602083860101111561226b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060a0828403121561229a57600080fd5b60405160a0810181811067ffffffffffffffff821117156122bd576122bd612bb5565b6040529050806122cc83612319565b81526122da60208401612319565b60208201526122eb60408401612319565b60408201526122fc60608401612319565b606082015261230d60808401612319565b60808201525092915050565b803565ffffffffffff8116811461232f57600080fd5b919050565b803560ff8116811461232f57600080fd5b60006020828403121561235757600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610b3f57600080fd5b6000806020838503121561238e57600080fd5b823567ffffffffffffffff8111156123a557600080fd5b6123b1858286016121a4565b90969095509350505050565b600080602083850312156123d057600080fd5b823567ffffffffffffffff8111156123e757600080fd5b6123b1858286016121f0565b60006020828403121561240557600080fd5b815167ffffffffffffffff81111561241c57600080fd5b8201601f8101841361242d57600080fd5b805161243b612251826129f0565b81815285602083850101111561245057600080fd5b611345826020830160208601612a5b565b600080600060e0848603121561247657600080fd5b833567ffffffffffffffff8082111561248e57600080fd5b61249a87838801612232565b945060208601359150808211156124b057600080fd5b506124bd86828701612232565b9250506124cd8560408601612288565b90509250925092565b600060a082840312156124e857600080fd5b610b3f8383612288565b60006020828403121561250457600080fd5b5035919050565b60008060c0838503121561251e57600080fd5b8235915061252f8460208501612288565b90509250929050565b60008060006040848603121561254d57600080fd5b61255684612334565b9250602084013567ffffffffffffffff81111561257257600080fd5b61257e868287016121a4565b9497909650939450505050565b6000806000604084860312156125a057600080fd5b6125a984612334565b9250602084013567ffffffffffffffff8111156125c557600080fd5b61257e868287016121f0565b600080604083850312156125e457600080fd5b6125ed83612334565b946020939093013593505050565b600081518084526020808501808196508360051b8101915082860160005b85811015612643578284038952612631848351612650565b98850198935090840190600101612619565b5091979650505050505050565b60008151808452612668816020860160208601612a5b565b601f01601f19169290920160200192915050565b6000815161268e818560208601612a5b565b9290920192915050565b600080845481600182811c9150808316806126b457607f831692505b60208084108214156126ed577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561270157600181146127305761275d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061275d565b60008b81526020902060005b868110156127555781548b82015290850190830161273c565b505084890196505b505050505050611345818561267c565b7f4e6f756e200000000000000000000000000000000000000000000000000000008152600082516127a5816005850160208701612a5b565b9190910160050192915050565b7f4e6f756e200000000000000000000000000000000000000000000000000000008152600082516127ea816005850160208701612a5b565b7f2069732061206d656d626572206f6620746865204e6f756e732044414f0000006005939091019283015250602201919050565b602081526000610b3f6020830184612650565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b604081526000835160408084015261287b60808401826125fb565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160608501526128b68282612650565b925050508260208301529392505050565b6040815260008351608060408401526128e360c0840182612650565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261291f8383612650565b9250604087015191508085840301608086015261293c83836125fb565b925060608701519150808584030160a0860152506128b68282612650565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261298f57600080fd5b83018035915067ffffffffffffffff8211156129aa57600080fd5b6020019150368190038213156121e957600080fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129e8576129e8612bb5565b604052919050565b600067ffffffffffffffff821115612a0a57612a0a612bb5565b50601f01601f191660200190565b60008219821115612a2b57612a2b612b28565b500190565b600082612a3f57612a3f612b57565b500490565b600082821015612a5657612a56612b28565b500390565b60005b83811015612a76578181015183820152602001612a5e565b838111156111d15750506000910152565b600181811c90821680612a9b57607f821691505b60208210811415612ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b0d57612b0d612b28565b5060010190565b600082612b2357612b23612b57565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212201b5dcc3b52aba7439c1192f4b6c5f2f16af023a99531c2bea28df04ee2b34cee64736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025c5760003560e01c8063715018a6116101455780639a796205116100bd578063ce2f4f531161008c578063eba8180611610071578063eba81806146104e8578063f2fde38b146104f0578063f9da88631461050357600080fd5b8063ce2f4f53146104ba578063dfe8478b146104e057600080fd5b80639a79620514610479578063a51e41241461048c578063b982d1b91461049f578063cc2aa091146104b257600080fd5b8063839644da116101145780638a85a1e8116100f95780638a85a1e81461042b5780638da5cb5b1461043e57806391b7916a1461046657600080fd5b8063839644da1461040557806387db11bd1461041857600080fd5b8063715018a6146103a2578063773b9771146103aa5780637a34aad3146103df5780637ca94210146103f257600080fd5b80634531c0a8116101d85780635a503f13116101a7578063615bda101161018c578063615bda1014610374578063638ac270146103875780636c0360eb1461039a57600080fd5b80635a503f131461034e5780635e70664c1461036157600080fd5b80634531c0a8146103185780634daebac21461032057806355f804b314610328578063598fa9da1461033b57600080fd5b80632a1d07691161022f5780633cfdafd3116102145780633cfdafd3146102e05780634479cef2146102f357806344cee73c1461030557600080fd5b80632a1d0769146102c55780632ea04300146102cd57600080fd5b80630475d8631461026157806304bde4dd1461027657806317b552ab1461029f5780632715c90e146102b2575b600080fd5b61027461026f36600461237b565b610516565b005b6102896102843660046124f2565b61063b565b604051610296919061281e565b60405180910390f35b6102746102ad3660046123bd565b6106e7565b6102746102c03660046123bd565b6107c7565b6102746108a3565b6102896102db3660046124d6565b6109dd565b6102896102ee36600461250b565b610b46565b6007545b604051908152602001610296565b6102896103133660046124f2565b610bb2565b6003546102f7565b6005546102f7565b6102746103363660046123bd565b610bc2565b6102896103493660046125d1565b610c73565b61028961035c3660046124f2565b610cab565b61027461036f3660046123bd565b610cbb565b6102746103823660046123bd565b610d97565b61028961039536600461250b565b610e73565b610289610edf565b610274610eec565b6000546103cf9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610296565b6102746103ed36600461237b565b610f5f565b6102896104003660046124f2565b61107a565b610274610413366004612538565b61108a565b610289610426366004612461565b6111d7565b61027461043936600461237b565b61134e565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610296565b61027461047436600461237b565b611469565b6102746104873660046123bd565b611584565b61027461049a36600461237b565b611660565b6102896104ad3660046124f2565b61177b565b6006546102f7565b6000546103cf907501000000000000000000000000000000000000000000900460ff1681565b61027461178b565b6004546102f7565b6102746104fe366004612345565b611875565b61027461051136600461258b565b611971565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60005474010000000000000000000000000000000000000000900460ff16156105ed5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761062483838381811061060d5761060d612b86565b905060200281019061061f919061295a565b611a6b565b8061062e81612adb565b9150506105f0565b505050565b6003818154811061064b57600080fd5b90600052602060002001600091509050805461066690612a87565b80601f016020809104026020016040519081016040528092919081815260200182805461069290612a87565b80156106df5780601f106106b4576101008083540402835291602001916106df565b820191906000526020600020905b8154815290600101906020018083116106c257829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff16331461074e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156107b95760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282611a6b565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461082e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156108995760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282611aa8565b60005473ffffffffffffffffffffffffffffffffffffffff16331461090a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156109755760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001781556040517f1680ee6d421f70ed6030d2fc4fcb50217a5dd617858d56562b119eca59172e579190a1565b6060600060405180604001604052806109f585611ae5565b81526020016003856000015165ffffffffffff1681548110610a1957610a19612b86565b906000526020600020018054610a2e90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5a90612a87565b8015610aa75780601f10610a7c57610100808354040283529160200191610aa7565b820191906000526020600020905b815481529060010190602001808311610a8a57829003601f168201915b50505050508152509050730bbad8c947210ab6284699605ce2a617809582646366b8c2418260026040518363ffffffff1660e01b8152600401610aeb929190612860565b60006040518083038186803b158015610b0357600080fd5b505af4158015610b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3f91908101906123f3565b9392505050565b6000546060907501000000000000000000000000000000000000000000900460ff1615610b7e57610b778383610e73565b9050610bac565b6001610b8984611e5e565b604051602001610b9a929190612698565b60405160208183030381529060405290505b92915050565b6004818154811061064b57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610c295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b610c35600183836120ed565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610c67929190612831565b60405180910390a15050565b60026020528160005260406000208181548110610c8f57600080fd5b9060005260206000200160009150915050805461066690612a87565b6006818154811061064b57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610d225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff1615610d8d5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282611f98565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dfe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff1615610e695760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282611fd5565b60606000610e8084611e5e565b9050600081604051602001610e95919061276d565b6040516020818303038152906040529050600082604051602001610eb991906127b2565b6040516020818303038152906040529050610ed58282876111d7565b9695505050505050565b6001805461066690612a87565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b610f5d6000612012565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fc65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156110315760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761106883838381811061105157611051612b86565b9050602002810190611063919061295a565b612087565b8061107281612adb565b915050611034565b6005818154811061064b57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146110f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60ff831660009081526002602052604090205461010090611113908390612a18565b11156111875760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610579565b60005b818110156111d1576111bf848484848181106111a8576111a8612b86565b90506020028101906111ba919061295a565b6120c4565b806111c981612adb565b91505061118a565b50505050565b6060600060405180608001604052808681526020018581526020016111fb85611ae5565b81526020016003856000015165ffffffffffff168154811061121f5761121f612b86565b90600052602060002001805461123490612a87565b80601f016020809104026020016040519081016040528092919081815260200182805461126090612a87565b80156112ad5780601f10611282576101008083540402835291602001916112ad565b820191906000526020600020905b81548152906001019060200180831161129057829003601f168201915b50505050508152509050730bbad8c947210ab6284699605ce2a6178095826463bf1deae28260026040518363ffffffff1660e01b81526004016112f19291906128c7565b60006040518083038186803b15801561130957600080fd5b505af415801561131d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261134591908101906123f3565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113b55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156114205760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761145783838381811061144057611440612b86565b9050602002810190611452919061295a565b611aa8565b8061146181612adb565b915050611423565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff161561153b5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761157283838381811061155b5761155b612b86565b905060200281019061156d919061295a565b611f98565b8061157c81612adb565b91505061153e565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156116565760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b6107c38282612087565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116c75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60005474010000000000000000000000000000000000000000900460ff16156117325760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b6564000000000000000000000000000000006044820152606401610579565b60005b818110156106365761176983838381811061175257611752612b86565b9050602002810190611764919061295a565b611fd5565b8061177381612adb565b915050611735565b6007818154811061064b57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146117f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff811675010000000000000000000000000000000000000000009182900460ff1615918202179091556040518181527f360c3d72ee193226275b842f85231c259c934e85459fed80fa68e502ffa9dbde9060200160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b73ffffffffffffffffffffffffffffffffffffffff81166119655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610579565b61196e81612012565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b60ff8381166000908152600260205260409020541115611a605760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610579565b6106368383836120c4565b60058054600181018255600091909152610636907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00183836120ed565b60048054600181018255600091909152610636907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0183836120ed565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081611b015790505090506004836020015165ffffffffffff1681548110611b3757611b37612b86565b906000526020600020018054611b4c90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7890612a87565b8015611bc55780601f10611b9a57610100808354040283529160200191611bc5565b820191906000526020600020905b815481529060010190602001808311611ba857829003601f168201915b505050505081600081518110611bdd57611bdd612b86565b60200260200101819052506005836040015165ffffffffffff1681548110611c0757611c07612b86565b906000526020600020018054611c1c90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4890612a87565b8015611c955780601f10611c6a57610100808354040283529160200191611c95565b820191906000526020600020905b815481529060010190602001808311611c7857829003601f168201915b505050505081600181518110611cad57611cad612b86565b60200260200101819052506006836060015165ffffffffffff1681548110611cd757611cd7612b86565b906000526020600020018054611cec90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1890612a87565b8015611d655780601f10611d3a57610100808354040283529160200191611d65565b820191906000526020600020905b815481529060010190602001808311611d4857829003601f168201915b505050505081600281518110611d7d57611d7d612b86565b60200260200101819052506007836080015165ffffffffffff1681548110611da757611da7612b86565b906000526020600020018054611dbc90612a87565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890612a87565b8015611e355780601f10611e0a57610100808354040283529160200191611e35565b820191906000526020600020905b815481529060010190602001808311611e1857829003601f168201915b505050505081600381518110611e4d57611e4d612b86565b602090810291909101015292915050565b606081611e9e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ec85780611eb281612adb565b9150611ec19050600a83612a30565b9150611ea2565b60008167ffffffffffffffff811115611ee357611ee3612bb5565b6040519080825280601f01601f191660200182016040528015611f0d576020820181803683370190505b5090505b8415611f9057611f22600183612a44565b9150611f2f600a86612b14565b611f3a906030612a18565b60f81b818381518110611f4f57611f4f612b86565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611f89600a86612a30565b9450611f11565b949350505050565b60038054600181018255600091909152610636907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0183836120ed565b60078054600181018255600091909152610636907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880183836120ed565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60068054600181018255600091909152610636907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0183836120ed565b60ff831660009081526002602090815260408220805460018101825590835291206111d1910183835b8280546120f990612a87565b90600052602060002090601f01602090048101928261211b576000855561217f565b82601f10612152578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561217f565b8280016001018555821561217f579182015b8281111561217f578235825591602001919060010190612164565b5061218b92915061218f565b5090565b5b8082111561218b5760008155600101612190565b60008083601f8401126121b657600080fd5b50813567ffffffffffffffff8111156121ce57600080fd5b6020830191508360208260051b85010111156121e957600080fd5b9250929050565b60008083601f84011261220257600080fd5b50813567ffffffffffffffff81111561221a57600080fd5b6020830191508360208285010111156121e957600080fd5b600082601f83011261224357600080fd5b8135612256612251826129f0565b6129bf565b81815284602083860101111561226b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060a0828403121561229a57600080fd5b60405160a0810181811067ffffffffffffffff821117156122bd576122bd612bb5565b6040529050806122cc83612319565b81526122da60208401612319565b60208201526122eb60408401612319565b60408201526122fc60608401612319565b606082015261230d60808401612319565b60808201525092915050565b803565ffffffffffff8116811461232f57600080fd5b919050565b803560ff8116811461232f57600080fd5b60006020828403121561235757600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610b3f57600080fd5b6000806020838503121561238e57600080fd5b823567ffffffffffffffff8111156123a557600080fd5b6123b1858286016121a4565b90969095509350505050565b600080602083850312156123d057600080fd5b823567ffffffffffffffff8111156123e757600080fd5b6123b1858286016121f0565b60006020828403121561240557600080fd5b815167ffffffffffffffff81111561241c57600080fd5b8201601f8101841361242d57600080fd5b805161243b612251826129f0565b81815285602083850101111561245057600080fd5b611345826020830160208601612a5b565b600080600060e0848603121561247657600080fd5b833567ffffffffffffffff8082111561248e57600080fd5b61249a87838801612232565b945060208601359150808211156124b057600080fd5b506124bd86828701612232565b9250506124cd8560408601612288565b90509250925092565b600060a082840312156124e857600080fd5b610b3f8383612288565b60006020828403121561250457600080fd5b5035919050565b60008060c0838503121561251e57600080fd5b8235915061252f8460208501612288565b90509250929050565b60008060006040848603121561254d57600080fd5b61255684612334565b9250602084013567ffffffffffffffff81111561257257600080fd5b61257e868287016121a4565b9497909650939450505050565b6000806000604084860312156125a057600080fd5b6125a984612334565b9250602084013567ffffffffffffffff8111156125c557600080fd5b61257e868287016121f0565b600080604083850312156125e457600080fd5b6125ed83612334565b946020939093013593505050565b600081518084526020808501808196508360051b8101915082860160005b85811015612643578284038952612631848351612650565b98850198935090840190600101612619565b5091979650505050505050565b60008151808452612668816020860160208601612a5b565b601f01601f19169290920160200192915050565b6000815161268e818560208601612a5b565b9290920192915050565b600080845481600182811c9150808316806126b457607f831692505b60208084108214156126ed577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561270157600181146127305761275d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061275d565b60008b81526020902060005b868110156127555781548b82015290850190830161273c565b505084890196505b505050505050611345818561267c565b7f4e6f756e200000000000000000000000000000000000000000000000000000008152600082516127a5816005850160208701612a5b565b9190910160050192915050565b7f4e6f756e200000000000000000000000000000000000000000000000000000008152600082516127ea816005850160208701612a5b565b7f2069732061206d656d626572206f6620746865204e6f756e732044414f0000006005939091019283015250602201919050565b602081526000610b3f6020830184612650565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b604081526000835160408084015261287b60808401826125fb565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160608501526128b68282612650565b925050508260208301529392505050565b6040815260008351608060408401526128e360c0840182612650565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261291f8383612650565b9250604087015191508085840301608086015261293c83836125fb565b925060608701519150808584030160a0860152506128b68282612650565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261298f57600080fd5b83018035915067ffffffffffffffff8211156129aa57600080fd5b6020019150368190038213156121e957600080fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129e8576129e8612bb5565b604052919050565b600067ffffffffffffffff821115612a0a57612a0a612bb5565b50601f01601f191660200190565b60008219821115612a2b57612a2b612b28565b500190565b600082612a3f57612a3f612b57565b500490565b600082821015612a5657612a56612b28565b500390565b60005b83811015612a76578181015183820152602001612a5e565b838111156111d15750506000910152565b600181811c90821680612a9b57607f821691505b60208210811415612ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b0d57612b0d612b28565b5060010190565b600082612b2357612b23612b57565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212201b5dcc3b52aba7439c1192f4b6c5f2f16af023a99531c2bea28df04ee2b34cee64736f6c63430008060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.