Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 33 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Wool Mint Pr... | 13836364 | 1167 days ago | IN | 0 ETH | 0.00136954 | ||||
Set Wool Mint Pa... | 13836358 | 1167 days ago | IN | 0 ETH | 0.00119335 | ||||
Set Merkle Root | 13825133 | 1168 days ago | IN | 0 ETH | 0.00240668 | ||||
Set Merkle Root | 13825097 | 1168 days ago | IN | 0 ETH | 0.00340132 | ||||
Set Presale Mint... | 13825041 | 1168 days ago | IN | 0 ETH | 0.00297808 | ||||
Set Wool Mint Pa... | 13825037 | 1168 days ago | IN | 0 ETH | 0.00318093 | ||||
Set Merkle Root | 13824520 | 1168 days ago | IN | 0 ETH | 0.00310485 | ||||
Upload Unreveal ... | 13823664 | 1168 days ago | IN | 0 ETH | 0.02403912 | ||||
Set Presale Mint... | 13823328 | 1169 days ago | IN | 0 ETH | 0.00213776 | ||||
Set Merkle Root | 13823325 | 1169 days ago | IN | 0 ETH | 0.00391645 | ||||
Set Contracts | 13823196 | 1169 days ago | IN | 0 ETH | 0.00613317 | ||||
Upload Traits | 13822371 | 1169 days ago | IN | 0 ETH | 0.18341165 | ||||
Upload Traits | 13822366 | 1169 days ago | IN | 0 ETH | 0.09146471 | ||||
Upload Traits | 13822346 | 1169 days ago | IN | 0 ETH | 0.1536181 | ||||
Upload Traits | 13822338 | 1169 days ago | IN | 0 ETH | 0.05865116 | ||||
Upload Traits | 13822316 | 1169 days ago | IN | 0 ETH | 0.05126808 | ||||
Upload Traits | 13822310 | 1169 days ago | IN | 0 ETH | 0.04903589 | ||||
Upload Traits | 13822298 | 1169 days ago | IN | 0 ETH | 0.05744074 | ||||
Upload Traits | 13822291 | 1169 days ago | IN | 0 ETH | 0.20136364 | ||||
Upload Traits | 13822286 | 1169 days ago | IN | 0 ETH | 0.14791315 | ||||
Upload Traits | 13822265 | 1169 days ago | IN | 0 ETH | 0.16819048 | ||||
Upload Traits | 13822260 | 1169 days ago | IN | 0 ETH | 0.08757448 | ||||
Upload Traits | 13822234 | 1169 days ago | IN | 0 ETH | 0.24119241 | ||||
Upload Traits | 13822224 | 1169 days ago | IN | 0 ETH | 0.29112778 | ||||
Upload Traits | 13822198 | 1169 days ago | IN | 0 ETH | 0.259005 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Traits
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "./ICryptoBees.sol"; import "./IHoney.sol"; import "./Base64.sol"; contract Traits is Ownable { using Strings for uint256; using MerkleProof for bytes32[]; // struct to store each trait's data for metadata and rendering struct Trait { string name; string png; } string unrevealedImage; ICryptoBees beesContract; IHoney honeyContract; // mint price ETH uint256 public constant MINT_PRICE = .06 ether; uint256 public constant MINT_PRICE_DISCOUNT = .055 ether; uint256 public constant MINTS_PER_WHITELIST = 6; // used to ensure there are no duplicates mapping(uint256 => uint256) public existingCombinations; // mint price HONEY uint256 public constant MINT_PRICE_HONEY = 3000 ether; // mint price WOOL uint256 public mintPriceWool = 6600 ether; // max number of tokens that can be minted uint256 public constant MAX_TOKENS = 40000; // number of tokens that can be claimed for ETH uint256 public constant PAID_TOKENS = 10000; /// @notice controls if mintWithEthPresale is paused bool public mintWithEthPresalePaused = true; /// @notice controls if mintWithWool is paused bool public mintWithWoolPaused = true; /// @notice controls if mainMint is paused bool public mintWithEthPaused = true; mapping(address => uint8) public whitelistMints; bytes32 private merkleRootWhitelist; string[8] _traitTypes = ["Body", "Color", "Eyes", "Mouth", "Nose", "Hair", "Accessories", "Feelers"]; // storage of each traits name and base64 PNG data mapping(uint8 => mapping(uint8 => Trait)) public traitData; string[4] _strengths = ["5", "6", "7", "8"]; // 0 - 7 are associated with Bees, 8 - 18 are associated with Bears, 16 - 23 with Beekeeper uint8[][24] public rarities; // 0 - 7 are associated with Bees, 8 - 18 are associated with Bears, 16 - 23 with Beekeeper uint8[][24] public aliases; constructor() { // colours rarities[1] = [255, 215, 122, 76, 30, 15]; aliases[1] = [0, 0, 0, 0, 0, 0]; // eyes rarities[2] = [255, 217, 217, 230, 217, 204, 230, 230, 230, 230, 230, 191, 191, 191, 191]; aliases[2] = [0, 0, 1, 2, 3, 4, 0, 1, 2, 6, 7, 1, 1, 2, 5]; // mouth rarities[3] = [255, 202, 191, 181, 215, 248, 199, 194, 189, 184, 179, 217, 174, 174, 174, 174, 174]; aliases[3] = [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 10]; // nose rarities[4] = [255, 230, 204, 192, 179, 179, 179]; aliases[4] = [0, 0, 1, 2, 0, 1, 3]; // hair rarities[5] = [255, 127, 204, 230, 115, 115, 115, 115, 115]; aliases[5] = [0, 0, 1, 3, 5, 4, 1, 1, 2]; // accessory rarities[6] = [255, 99, 53]; aliases[6] = [0, 0, 0]; // feelers rarities[7] = [255, 140, 204, 102, 179, 89, 89]; aliases[7] = [0, 0, 1, 2, 0, 1, 3]; //bear - colours rarities[9] = [255, 153, 153]; aliases[9] = [0, 0, 1]; //bear - eyes rarities[10] = [255, 220, 184, 148, 222, 186, 151, 225, 189, 153, 117, 240, 204, 168, 133, 145, 145, 97, 97]; aliases[10] = [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 3, 6, 10, 14]; //bear - mouth rarities[11] = [255, 235, 184, 204, 225, 174, 245, 245, 245, 184, 184, 122]; aliases[11] = [0, 0, 1, 2, 3, 4, 0, 1, 6, 2, 3, 5]; //bear - nose rarities[12] = [255, 230, 204, 179, 179, 179, 179]; aliases[12] = [0, 0, 1, 3, 1, 2, 3]; //bear - hat/hair rarities[13] = [255, 204, 204, 204, 102, 102, 102, 102]; aliases[13] = [0, 1, 0, 2, 3, 2, 4, 4]; //bear - accessory rarities[14] = [255, 89, 89, 53, 53, 35, 35]; aliases[14] = [0, 0, 1, 1, 2, 2, 3]; // bear strength rarities[15] = [255, 102, 153, 51]; aliases[15] = [0, 0, 1, 1]; //beekeeper - color rarities[17] = [255, 153, 153, 153, 76, 76]; aliases[17] = [0, 0, 1, 1, 2, 2]; //beekeeper - eyes rarities[18] = [255, 170, 142, 113]; aliases[18] = [0, 0, 1, 2]; //beekeeper - mouth rarities[19] = [255, 243, 230, 217, 204, 192, 179]; aliases[19] = [0, 0, 1, 2, 3, 4, 5]; //beekeeper - hair rarities[21] = [255, 230, 230, 230, 230, 230, 230, 230, 230]; aliases[21] = [0, 0, 1, 1, 3, 4, 3, 1, 0]; //beekeeper - accessory rarities[22] = [255, 122, 122, 122, 122, 122, 122, 122, 122, 122, 92, 30]; aliases[22] = [0, 0, 1, 1, 4, 3, 0, 2, 2, 1, 5, 4]; //beekeeper skill rarities[23] = [255, 102, 153, 51]; aliases[23] = [0, 0, 1, 2]; } function setContracts(address _BEES, address _HONEY) external onlyOwner { honeyContract = IHoney(_HONEY); beesContract = ICryptoBees(_BEES); } /** MINTING */ function mintForEth( address addr, uint256 amount, uint256 minted, uint256 value, bool stake ) external { require(_msgSender() == address(beesContract), "DONT CHEAT!"); mintCheck(addr, amount, minted, false, value, true); for (uint256 i = 1; i <= amount; i++) { beesContract.mint(addr, minted + i, stake); } } function mintForEthWhitelist( address addr, uint256 amount, uint256 minted, uint256 value, bytes32[] calldata _merkleProof, bool stake ) external { require(_msgSender() == address(beesContract), "DONT CHEAT!"); bytes32 leaf = keccak256(abi.encodePacked(addr)); require(MerkleProof.verify(_merkleProof, merkleRootWhitelist, leaf), "You are not on the whitelist!"); mintCheck(addr, amount, minted, true, value, true); for (uint256 i = 1; i <= amount; i++) { beesContract.mint(addr, minted + i, stake); whitelistMints[addr]++; } } function mintForHoney( address addr, uint256 amount, uint256 minted, bool stake ) external { require(_msgSender() == address(beesContract), "DONT CHEAT!"); mintCheck(addr, amount, minted, false, 0, false); uint256 totalHoneyCost = 0; for (uint256 i = 1; i <= amount; i++) { totalHoneyCost += mintCost(minted + i); beesContract.mint(addr, minted + i, stake); } honeyContract.burn(addr, totalHoneyCost); } function mintForWool( address addr, uint256 amount, uint256 minted, bool stake ) external returns (uint256 totalWoolCost) { require(_msgSender() == address(beesContract), "DONT CHEAT!"); require(!mintWithWoolPaused, "WOOL minting paused"); require(minted + amount <= PAID_TOKENS, "All tokens on-sale already sold"); mintCheck(addr, amount, minted, false, 0, false); for (uint256 i = 1; i <= amount; i++) { totalWoolCost += mintPriceWool; beesContract.mint(addr, minted + i, stake); } } function mintCheck( address addr, uint256 amount, uint256 minted, bool presale, uint256 value, bool isEth ) private view { require(tx.origin == addr, "Only EOA"); require(minted + amount <= MAX_TOKENS, "All tokens minted"); if (presale) { require(!mintWithEthPresalePaused, "Presale mint paused"); require(amount > 0 && whitelistMints[addr] + amount <= MINTS_PER_WHITELIST, "Only limited amount for WL mint"); } else { require(amount > 0 && amount <= 10, "Invalid mint amount sale"); } if (isEth) { require(minted + amount <= PAID_TOKENS, "All tokens on-sale already sold"); if (presale) require(amount * MINT_PRICE_DISCOUNT == value, "Invalid payment amount presale"); else { require(amount * MINT_PRICE == value, "Invalid payment amount sale"); require(!mintWithEthPaused, "Public sale currently paused"); } } } function getTokenTextType(uint256 tokenId) external view returns (string memory) { require(beesContract.doesExist(tokenId), "ERC721Metadata: Nonexistent token"); return _getTokenTextType(tokenId); } function _getTokenTextType(uint256 tokenId) private view returns (string memory) { uint8 _type = beesContract.getTokenData(tokenId)._type; if (_type == 1) return "BEE"; else if (_type == 2) return "BEAR"; else if (_type == 3) return "BEEKEEPER"; else return "NOT REVEALED"; } function setPresaleMintPaused(bool _paused) external onlyOwner { mintWithEthPresalePaused = _paused; } function setWoolMintPaused(bool _paused) external onlyOwner { mintWithWoolPaused = _paused; } function setMintWithEthPaused(bool _paused) external onlyOwner { mintWithEthPaused = _paused; } function setWoolMintPrice(uint256 _price) external onlyOwner { mintPriceWool = _price; } function setMerkleRoot(bytes32 root) public onlyOwner { merkleRootWhitelist = root; } /** * generates traits for a specific token, checking to make sure it's unique * @param seed a pseudorandom 256 bit number to derive traits from * @return t - a struct of traits for the given token ID */ function generate(uint256 seed) public view returns (ICryptoBees.Token memory) { require(_msgSender() == address(beesContract), "DONT CHEAT!"); ICryptoBees.Token memory t = selectTraits(seed); return t; } /** * selects the species and all of its traits based on the seed value * @param seed a pseudorandom 256 bit number to derive traits from * @return t - a struct of randomly selected traits */ function selectTraits(uint256 seed) internal view returns (ICryptoBees.Token memory t) { uint256 num = ((seed & 0xFFFF) % 100); t._type = 1; if (num == 0) t._type = 3; else if (num < 10) t._type = 2; uint8 shift = t._type > 0 ? ((t._type - 1) * 8) : 0; seed >>= 16; t.color = selectTrait(uint16(seed & 0xFFFF), 1 + shift); seed >>= 16; t.eyes = selectTrait(uint16(seed & 0xFFFF), 2 + shift); seed >>= 16; t.mouth = selectTrait(uint16(seed & 0xFFFF), 3 + shift); if (t._type != 3) { seed >>= 16; t.nose = selectTrait(uint16(seed & 0xFFFF), 4 + shift); } seed >>= 16; t.hair = selectTrait(uint16(seed & 0xFFFF), 5 + shift); seed >>= 16; t.accessory = selectTrait(uint16(seed & 0xFFFF), 6 + shift); if (t._type == 1) { seed >>= 16; t.feelers = selectTrait(uint16(seed & 0xFFFF), 7); } else { seed >>= 16; t.strength = selectTrait(uint16(seed & 0xFFFF), 7 + shift); } } /** * uses A.J. Walker's Alias algorithm for O(1) rarity table lookup * ensuring O(1) instead of O(n) reduces mint cost by more than 50% * probability & alias tables are generated off-chain beforehand * @param seed portion of the 256 bit seed to remove trait correlation * @param traitType the trait type to select a trait for * @return the ID of the randomly selected trait */ function selectTrait(uint16 seed, uint8 traitType) internal view returns (uint8) { uint8 trait = uint8(seed) % uint8(rarities[traitType].length); if (seed >> 8 < rarities[traitType][trait]) return trait; return aliases[traitType][trait]; } /** * converts a struct to a 256 bit hash to check for uniqueness * @param t the struct to pack into a hash * @return the 256 bit hash of the struct */ function structToHash(ICryptoBees.Token memory t) internal pure returns (uint256) { return uint256(bytes32(abi.encodePacked(t._type, t.color, t.eyes, t.mouth, t.nose, t.hair, t.accessory, t.feelers, t.strength))); } /** * Gen 0 can be mint for honey too * @param tokenId the ID to check the cost of to mint * @return the cost of the given token ID */ function mintCost(uint256 tokenId) public pure returns (uint256) { if (tokenId <= 20000) return MINT_PRICE_HONEY; if (tokenId <= 30000) return 7500 ether; return 15000 ether; } /** * administrative to upload the names and images associated with each trait * @param traitType the trait type to upload the traits for (see traitTypes for a mapping) * @param traitNames the names and base64 encoded PNGs for each trait * @param traitImages the names and base64 encoded PNGs for each trait */ function uploadTraits( uint8 traitType, string[] calldata traitNames, string[] calldata traitImages ) external onlyOwner { require(traitNames.length == traitImages.length, "Mismatched inputs"); for (uint256 i = 0; i < traitNames.length; i++) { traitData[traitType][uint8(i)] = Trait(traitNames[i], traitImages[i]); } } function uploadUnrevealImage(string calldata image) external onlyOwner { unrevealedImage = image; } // function random(uint256 seed) internal view returns (uint256) { // return uint256(keccak256(abi.encodePacked(seed))); // } /** RENDER */ /** * generates an <image> element using base64 encoded PNGs * @param trait the trait storing the PNG data * @return the <image> element */ function drawTrait(Trait memory trait) internal pure returns (string memory) { if (bytes(trait.png).length == 0) return ""; return string( abi.encodePacked( '<image x="4" y="4" width="32" height="32" image-rendering="pixelated" preserveAspectRatio="xMidYMid" xlink:href="data:image/png;base64,', trait.png, '"/>' ) ); } /** * generates an <image> element using base64 encoded PNGs * @return the <image> element */ function drawUnrevealedImage() internal view returns (string memory) { return string( abi.encodePacked( '<image x="4" y="4" width="32" height="32" image-rendering="pixelated" preserveAspectRatio="xMidYMid" xlink:href="data:image/png;base64,', unrevealedImage, '"/>' ) ); } // /** // * generates an entire SVG by composing multiple <image> elements of PNGs // * @param tokenId the ID of the token to generate an SVG for // * @return a valid SVG of the Sheep / Wolf // */ function drawSVG(uint256 tokenId) public view returns (string memory) { ICryptoBees.Token memory s = beesContract.getTokenData(tokenId); uint8 shift = s._type > 0 ? ((s._type - 1) * 8) : 0; string memory svgString; if (s._type == 0) svgString = drawUnrevealedImage(); else { svgString = string( abi.encodePacked( drawTrait(traitData[0 + shift][0]), drawTrait(traitData[1 + shift][s.color]), drawTrait(traitData[2 + shift][s.eyes]), drawTrait(traitData[3 + shift][s.mouth]), drawTrait(traitData[4 + shift][s.nose]), drawTrait(traitData[5 + shift][s.hair]), drawTrait(traitData[6 + shift][s.accessory]), drawTrait(traitData[7][s.feelers]) ) ); } return string( abi.encodePacked( '<svg id="cryptobees" width="100%" height="100%" version="1.1" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">', svgString, "</svg>" ) ); } /** * generates an attribute for the attributes array in the ERC721 metadata standard * @param traitType the trait type to reference as the metadata key * @param value the token's trait associated with the key * @return a JSON dictionary for the single attribute */ function attributeForTypeAndValue(string memory traitType, string memory value) internal pure returns (string memory) { return string(abi.encodePacked('{"trait_type":"', traitType, '","value":"', value, '"}')); } /** * generates an array composed of all the individual traits and values * @param tokenId the ID of the token to compose the metadata for * @return a JSON array of all of the attributes for given token ID */ function compileAttributes(uint256 tokenId) public view returns (string memory) { ICryptoBees.Token memory t = beesContract.getTokenData(tokenId); string memory textType = _getTokenTextType(tokenId); uint8 shift = t._type > 0 ? ((t._type - 1) * 8) : 0; string memory traits; traits = string( abi.encodePacked( attributeForTypeAndValue(_traitTypes[1], traitData[1 + shift][t.color].name), ",", attributeForTypeAndValue(_traitTypes[2], traitData[2 + shift][t.eyes].name), ",", attributeForTypeAndValue(_traitTypes[3], traitData[3 + shift][t.mouth].name), ",", attributeForTypeAndValue(_traitTypes[5], traitData[5 + shift][t.hair].name), ",", attributeForTypeAndValue(_traitTypes[6], traitData[6 + shift][t.accessory].name), "," ) ); if (t._type != 3) { traits = string(abi.encodePacked(traits, attributeForTypeAndValue(_traitTypes[4], traitData[4 + shift][t.nose].name), ",")); } if (t._type == 1) { traits = string(abi.encodePacked(traits, attributeForTypeAndValue(_traitTypes[7], traitData[7][t.feelers].name), ",")); } else if (t._type == 2) { traits = string(abi.encodePacked(traits, attributeForTypeAndValue("Strength", _strengths[t.strength]), ",")); } else if (t._type == 3) { traits = string(abi.encodePacked(traits, attributeForTypeAndValue("Skill", _strengths[t.strength]), ",")); } return string( abi.encodePacked( "[", traits, '{"trait_type":"Generation","value":', tokenId <= PAID_TOKENS ? '"Gen 0"' : '"Gen 1"', '},{"trait_type":"Type","value":"', textType, '"}]' ) ); } function tokenURI(uint256 tokenId) public view returns (string memory) { // require(beesContract.doesExist(tokenId), "ERC721Metadata: Nonexistent token"); string memory textType = _getTokenTextType(tokenId); string memory metadata = string( abi.encodePacked( '{"name": "', textType, " #", uint256(tokenId).toString(), '", "type": "', textType, '", "description": "People realized that the path to prosperity is to relocate to a farm. Some have bought sheep, some land but many ended up with nothing. $HONEY is the new opportunity.', '","image": "data:image/svg+xml;base64,', Base64.encode(bytes(drawSVG(tokenId))), '","attributes":', compileAttributes(tokenId), "}" ) ); return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(metadata)))); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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.0 (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: MIT // OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } }
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; // import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface ICryptoBees { struct Token { uint8 _type; uint8 color; uint8 eyes; uint8 mouth; uint8 nose; uint8 hair; uint8 accessory; uint8 feelers; uint8 strength; uint48 lastAttackTimestamp; uint48 cooldownTillTimestamp; } function getMinted() external view returns (uint256 m); function increaseTokensPot(address _owner, uint256 amount) external; function updateTokensLastAttack( uint256 tokenId, uint48 timestamp, uint48 till ) external; function mint( address addr, uint256 tokenId, bool stake ) external; function setPaused(bool _paused) external; function getTokenData(uint256 tokenId) external view returns (Token memory token); function getOwnerOf(uint256 tokenId) external view returns (address); function doesExist(uint256 tokenId) external view returns (bool exists); function performTransferFrom( address sender, address recipient, uint256 amount ) external; function performSafeTransferFrom( address from, address to, uint256 tokenId ) external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.9; interface IHoney { function mint(address to, uint256 amount) external; function mintGiveaway(address[] calldata addresses, uint256 amount) external; function burn(address from, uint256 amount) external; function disableGiveaway() external; function addController(address controller) external; function removeController(address controller) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; 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); // solhint-disable-next-line no-inline-assembly 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTS_PER_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_DISCOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_HONEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAID_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"aliases","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"compileAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"drawSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingCombinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"generate","outputs":[{"components":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"hair","type":"uint8"},{"internalType":"uint8","name":"accessory","type":"uint8"},{"internalType":"uint8","name":"feelers","type":"uint8"},{"internalType":"uint8","name":"strength","type":"uint8"},{"internalType":"uint48","name":"lastAttackTimestamp","type":"uint48"},{"internalType":"uint48","name":"cooldownTillTimestamp","type":"uint48"}],"internalType":"struct ICryptoBees.Token","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTextType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintForEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintForEthWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintForHoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintForWool","outputs":[{"internalType":"uint256","name":"totalWoolCost","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPriceWool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintWithEthPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintWithEthPresalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintWithWoolPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarities","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_BEES","type":"address"},{"internalType":"address","name":"_HONEY","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setMintWithEthPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPresaleMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setWoolMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setWoolMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"traitData","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"png","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"traitType","type":"uint8"},{"internalType":"string[]","name":"traitNames","type":"string[]"},{"internalType":"string[]","name":"traitImages","type":"string[]"}],"name":"uploadTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"image","type":"string"}],"name":"uploadUnrevealImage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMints","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
690165c96647b38a20000060059081556006805462ffffff191662010101179055600461018081815263426f647960e01b6101a05260809081526101c08381526421b7b637b960d91b6101e05260a052610200828152634579657360e01b6102205260c0526102409283526409adeeae8d60db1b6102605260e092909252610280818152634e6f736560e01b6102a052610100526102c0908152632430b4b960e11b6102e05261012052600b6103009081526a4163636573736f7269657360a81b61032052610140526103806040526007610340908152664665656c65727360c81b6103605261016052620000f990600990600862000f80565b506040805160c081018252600160808201818152603560f81b60a0840152825282518084018452818152601b60f91b6020828101919091528084019190915283518085018552828152603760f81b81830152838501528351808501909452908352600760fb1b9083015260608101919091526200017b90601290600462000fd7565b503480156200018957600080fd5b50620001953362000f30565b6040805160c08101825260ff815260d76020820152607a91810191909152604c6060820152601e6080820152600f60a0820152620001d89060179060066200101c565b506040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526200021b90602f9060066200101c565b50604080516101e08101825260ff815260d96020820181905291810182905260e660608201819052608082019290925260cc60a082015260c0810182905260e081018290526101008101829052610120810182905261014081019190915260bf610160820181905261018082018190526101a082018190526101c0820152620002a990601890600f6200101c565b50604080516101e081018252600080825260208201819052600192820183905260026060830181905260036080840152600460a084015260c083019190915260e0820183905261010082018190526006610120830152600761014083015261016082018390526101808201929092526101a081019190915260056101c08201526200033990603090600f6200101c565b50604080516102208101825260ff815260ca602082015260bf9181019190915260b5606082015260d7608082015260f860a082015260c760c082015260c260e082015260bd61010082015260b861012082015260b361014082015260d961016082015260ae61018082018190526101a082018190526101c082018190526101e08201819052610200820152620003d49060199060116200101c565b5060408051610220810182526000808252602082018190526001928201839052600260608301819052600360808401819052600460a08501819052600560c0860152600660e08601526007610100860152600861012086015260096101408601526101608501939093526101808401949094526101a08301526101c082018390526101e0820152600a61020082015290602e90620004779291019060116200101c565b506040805160e08101825260ff815260e6602082015260cc9181019190915260c06060820181905260b36080830181905260a0830181905290820152620004c390601a9060076200101c565b506040805160e081018252600080825260208201819052600192820183905260026060830152608082015260a0810191909152600360c08201526200050d9060329060076200101c565b50604080516101208101825260ff8152607f602082015260cc9181019190915260e6606082015260736080820181905260a0820181905260c0820181905260e082018190526101008201526200056890601b9060096200101c565b5060408051610120810182526000808252602082015260019181018290526003606082015260056080820152600460a082015260c0810182905260e08101919091526002610100820152620005c29060339060096200101c565b506040805160608101825260ff815260636020820152603591810191909152620005f190601c9060036200101c565b5060408051606081018252600080825260208201819052918101919091526200061f9060349060036200101c565b506040805160e08101825260ff8152608c602082015260cc918101919091526066606082015260b36080820152605960a0820181905260c08201526200066a90601d9060076200101c565b506040805160e081018252600080825260208201819052600192820183905260026060830152608082015260a0810191909152600360c0820152620006b49060359060076200101c565b506040805160608101825260ff815260996020820181905291810191909152620006e390601f9060036200101c565b506040805160608101825260008082526020820152600191810191909152620007119060379060036200101c565b50604080516102608101825260ff815260dc602082015260b8918101919091526094606082015260de608082015260ba60a0820152609760c082015260e160e082015260bd6101008201526099610120820152607561014082015260f061016082015260cc61018082015260a86101a082015260856101c082015260916101e08201819052610200820152606161022082018190526102408201526016600a620007c09291019060136200101c565b5060408051610260810182526000808252602082015260019181019190915260026060820152600360808201819052600460a0830152600560c0830152600660e08301819052600761010084015260086101208401526009610140840152600a6101608401819052600b610180850152600c6101a0850152600d6101c08501526101e0840192909252610200830152610220820152600e6102408201526200086d9060389060136200101c565b50604080516101808101825260ff815260eb602082015260b891810182905260cc606082015260e1608082015260ae60a082015260f560c0820181905260e082018190526101008201526101208101829052610140810191909152607a610160820152620008e090602190600c6200101c565b5060408051610180810182526000808252602082018190526001928201839052600260608301819052600360808401819052600460a085015260c084019290925260e0830193909352600661010083015261012082019290925261014081019190915260056101608201526200095b90603990600c6200101c565b506040805160e08101825260ff815260e6602082015260cc9181019190915260b3606082018190526080820181905260a0820181905260c0820152620009a69060229060076200101c565b506040805160e0810182526000808252602082015260019181018290526003606082018190526080820192909252600260a082015260c0810191909152620009f390603a9060076200101c565b50604080516101008101825260ff815260cc60208201819052918101829052606081019190915260666080820181905260a0820181905260c0820181905260e082015262000a469060239060086200101c565b506040805161010081018252600080825260016020830152918101919091526002606082018190526003608083015260a0820152600460c0820181905260e082015262000a9890603b9060086200101c565b506040805160e08101825260ff8152605960208201819052918101919091526035606082018190526080820152602360a0820181905260c082015262000ae39060249060076200101c565b506040805160e081018252600080825260208201526001918101829052606081019190915260026080820181905260a0820152600360c082015262000b2d90603c9060076200101c565b506040805160808101825260ff8152606660208201526099918101919091526033606082015262000b639060259060046200101c565b5060408051608081018252600080825260208201526001918101829052606081019190915262000b9890603d9060046200101c565b506040805160c08101825260ff81526099602082018190529181018290526060810191909152604c6080820181905260a082015262000bdc9060279060066200101c565b506040805160c081018252600080825260208201526001918101829052606081019190915260026080820181905260a082015262000c1f90603f9060066200101c565b506040805160808101825260ff815260aa6020820152608e918101919091526071606082015262000c559060289060046200101c565b5060408051608081018252600080825260208201526001818301526002606082015262000c85919060046200101c565b506040805160e08101825260ff815260f3602082015260e69181019190915260d9606082015260cc608082015260c060a0820181905260b39082015262000cd19060299060076200101c565b506040805160e081018252600080825260208201526001918101919091526002606082015260036080820152600460a0820152600560c082015262000d1b9060419060076200101c565b50604080516101208101825260ff815260e660208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915262000d7690602b9060096200101c565b506040805161012081018252600080825260208201819052600192820183905260608201839052600360808301819052600460a084015260c083015260e082019290925261010081019190915262000dd39060439060096200101c565b50604080516101808101825260ff8152607a60208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152605c610140820152601e61016082015262000e4690602c90600c6200101c565b506040805161018081018252600080825260208201819052600192820183905260608201839052600460808301819052600360a084015260c0830191909152600260e08301819052610100830152610120820192909252600561014082015261016081019190915262000ebe90604490600c6200101c565b506040805160808101825260ff8152606660208201526099918101919091526033606082015262000ef490602d9060046200101c565b5060408051608081018252600080825260208201526001918101919091526002606082015262000f299060459060046200101c565b50620011f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b826008810192821562000fc5579160200282015b8281111562000fc5578251805162000fb4918491602090910190620010c5565b509160200191906001019062000f94565b5062000fd392915062001142565b5090565b826004810192821562000fc5579160200282015b8281111562000fc557825180516200100b918491602090910190620010c5565b509160200191906001019062000feb565b82805482825590600052602060002090601f01602090048101928215620010b75791602002820160005b838211156200108657835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262001046565b8015620010b55782816101000a81549060ff021916905560010160208160000104928301926001030262001086565b505b5062000fd392915062001163565b828054620010d390620011bc565b90600052602060002090601f016020900481019282620010f75760008555620010b7565b82601f106200111257805160ff1916838001178555620010b7565b82800160010185558215620010b7579182015b82811115620010b757825182559160200191906001019062001125565b8082111562000fd35760006200115982826200117a565b5060010162001142565b5b8082111562000fd3576000815560010162001164565b5080546200118890620011bc565b6000825580601f1062001199575050565b601f016020900490600052602060002090810190620011b9919062001163565b50565b600181811c90821680620011d157607f821691505b60208210811415620011f357634e487b7160e01b600052602260045260246000fd5b50919050565b613dbd80620012096000396000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c80638da5cb5b11610125578063c87b56dd116100ad578063edfdb76d1161007c578063edfdb76d146104bd578063f0395a0e146104d0578063f2fa6382146104e3578063f2fde38b146104ec578063f47c84c5146104ff57600080fd5b8063c87b56dd14610471578063cd43029814610484578063cdb6d2fc14610497578063d8952a49146104aa57600080fd5b8063a4a8be85116100f4578063a4a8be851461042c578063adaa1bad1461043f578063b13b25d414610447578063c002d23d1461045a578063c084f5401461046857600080fd5b80638da5cb5b146103bd5780639bf2ee35146103d8578063a1b8f374146103f9578063a2ecc4031461041957600080fd5b80634a7dd523116101a8578063715018a611610177578063715018a6146103695780637778b5d2146103715780637abecb86146103845780637cb6475914610397578063874fd9fa146103aa57600080fd5b80634a7dd5231461031b5780635ab510371461033b5780635c520a4b1461034957806368dba5e51461035657600080fd5b806327de8f27116101ef57806327de8f27146102ad57806333df4b2c146102c057806336838391146102d35780633faddaa5146102e657806347cd5f1c1461030857600080fd5b80628af2e614610220578063014681391461025a578063110428f81461026f578063161b384c1461028d575b600080fd5b61024361022e366004612d22565b60076020526000908152604090205460ff1681565b60405160ff90911681526020015b60405180910390f35b61026d610268366004612d4b565b610508565b005b61027f68a2a15d09519be0000081565b604051908152602001610251565b6102a061029b366004612d68565b610555565b6040516102519190612ddd565b61027f6102bb366004612d68565b610637565b6102436102ce366004612df0565b61067d565b6102436102e1366004612df0565b6106c3565b6006546102f890610100900460ff1681565b6040519015158152602001610251565b61026d610316366004612e6d565b6106d3565b61032e610329366004612d68565b610878565b6040516102519190612ef0565b61027f66c3663566a5800081565b6006546102f89060ff1681565b6102a0610364366004612d68565b6108c5565b61026d6111c2565b61026d61037f366004612fc8565b6111f8565b6102a0610392366004612d68565b61134f565b61026d6103a5366004612d68565b611868565b61026d6103b8366004612d68565b611897565b6000546040516001600160a01b039091168152602001610251565b6103eb6103e6366004613010565b6118c6565b604051610251929190613049565b61027f610407366004612d68565b60046020526000908152604090205481565b61026d610427366004612d4b565b6119fd565b6006546102f89062010000900460ff1681565b61027f600681565b61026d610455366004613077565b611a43565b61027f66d529ae9e86000081565b61027f61271081565b6102a061047f366004612d68565b611c17565b61026d6104923660046130fc565b611ca3565b61027f6104a5366004612fc8565b611cde565b61026d6104b836600461316e565b611e70565b61026d6104cb366004612d4b565b611ecb565b61026d6104de3660046131a1565b611f08565b61027f60055481565b61026d6104fa366004612d22565b611fd5565b61027f619c4081565b6000546001600160a01b0316331461053b5760405162461bcd60e51b8152600401610532906131f5565b60405180910390fd5b600680549115156101000261ff0019909216919091179055565b60025460405163745b90cb60e11b8152600481018390526060916001600160a01b03169063e8b721969060240160206040518083038186803b15801561059a57600080fd5b505afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d2919061322a565b6106285760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b6064820152608401610532565b61063182612070565b92915050565b6000614e208211610652575068a2a15d09519be00000919050565b617530821161066c57506901969368974c05b00000919050565b5069032d26d12e980b600000919050565b6016826018811061068d57600080fd5b01818154811061069c57600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b602e826018811061068d57600080fd5b6000546001600160a01b031633146106fd5760405162461bcd60e51b8152600401610532906131f5565b8281146107405760405162461bcd60e51b81526020600482015260116024820152704d69736d61746368656420696e7075747360781b6044820152606401610532565b60005b8381101561087057604051806040016040528086868481811061076857610768613247565b905060200281019061077a919061325d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020018484848181106107c6576107c6613247565b90506020028101906107d8919061325d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452505060ff808a1682526011602090815260408084209287168452918152912083518051919350610840928492910190612b9d565b5060208281015180516108599260018501920190612b9d565b509050508080610868906132ba565b915050610743565b505050505050565b610880612c21565b6002546001600160a01b0316336001600160a01b0316146108b35760405162461bcd60e51b8152600401610532906132d5565b60006108be836121b4565b9392505050565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b15801561091057600080fd5b505afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190613369565b9050600061095584612070565b9050600080836000015160ff161161096e576000610987565b825161097c90600190613443565b610987906008613466565b90506060610ae26009600101805461099e9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546109ca9061348f565b8015610a175780601f106109ec57610100808354040283529160200191610a17565b820191906000526020600020905b8154815290600101906020018083116109fa57829003601f168201915b505050505060116000856001610a2d91906134c4565b60ff9081168252602080830193909352604091820160009081208a8501519092168152925290208054610a5f9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b9061348f565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050612356565b610bb660096002018054610af59061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b219061348f565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505060116000866002610b8491906134c4565b60ff9081168252602080830193909352604091820160009081208b8401519092168152925290208054610a5f9061348f565b610c8b60096003018054610bc99061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf59061348f565b8015610c425780601f10610c1757610100808354040283529160200191610c42565b820191906000526020600020905b815481529060010190602001808311610c2557829003601f168201915b505050505060116000876003610c5891906134c4565b60ff90811682526020808301939093526040918201600090812060608d01519092168152925290208054610a5f9061348f565b610d6060096005018054610c9e9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cca9061348f565b8015610d175780601f10610cec57610100808354040283529160200191610d17565b820191906000526020600020905b815481529060010190602001808311610cfa57829003601f168201915b505050505060116000886005610d2d91906134c4565b60ff90811682526020808301939093526040918201600090812060a08e01519092168152925290208054610a5f9061348f565b610e3560096006018054610d739061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9f9061348f565b8015610dec5780601f10610dc157610100808354040283529160200191610dec565b820191906000526020600020905b815481529060010190602001808311610dcf57829003601f168201915b505050505060116000896006610e0291906134c4565b60ff90811682526020808301939093526040918201600090812060c08f01519092168152925290208054610a5f9061348f565b604051602001610e49959493929190613505565b6040516020818303038152906040529050836000015160ff16600314610f625780610f3f60096004018054610e7d9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea99061348f565b8015610ef65780601f10610ecb57610100808354040283529160200191610ef6565b820191906000526020600020905b815481529060010190602001808311610ed957829003601f168201915b505050505060116000866004610f0c91906134c4565b60ff90811682526020808301939093526040918201600090812060808c01519092168152925290208054610a5f9061348f565b604051602001610f509291906135a4565b60405160208183030381529060405290505b836000015160ff1660011415611078578061105160096007018054610f869061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb29061348f565b8015610fff5780601f10610fd457610100808354040283529160200191610fff565b820191906000526020600020905b815481529060010190602001808311610fe257829003601f168201915b5050600760009081526011602090815260e08c015160ff1682527f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c9052604090208054909350610a5f9250905061348f565b6040516020016110629291906135a4565b6040516020818303038152906040529050611144565b836000015160ff16600214156110d45780611051604051806040016040528060088152602001670a6e8e4cadccee8d60c31b815250601287610100015160ff16600481106110c8576110c8613247565b018054610a5f9061348f565b836000015160ff166003141561114457806111216040518060400160405280600581526020016414dada5b1b60da1b815250601287610100015160ff16600481106110c8576110c8613247565b6040516020016111329291906135a4565b60405160208183030381529060405290505b8061271087111561117457604051806040016040528060078152602001661123b2b710189160c91b815250611195565b604051806040016040528060078152602001661123b2b710181160c91b8152505b846040516020016111a8939291906135df565b604051602081830303815290604052945050505050919050565b6000546001600160a01b031633146111ec5760405162461bcd60e51b8152600401610532906131f5565b6111f66000612382565b565b6002546001600160a01b0316336001600160a01b03161461122b5760405162461bcd60e51b8152600401610532906132d5565b61123b84848460008060006123d2565b600060015b8481116112e1576112546102bb828661369f565b61125e908361369f565b6002549092506001600160a01b031663d1a1beb48761127d848861369f565b866040518463ffffffff1660e01b815260040161129c939291906136b7565b600060405180830381600087803b1580156112b657600080fd5b505af11580156112ca573d6000803e3d6000fd5b5050505080806112d9906132ba565b915050611240565b50600354604051632770a7eb60e21b81526001600160a01b0387811660048301526024820184905290911690639dc29fac90604401600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b505050505050505050565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b15801561139a57600080fd5b505afa1580156113ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d29190613369565b9050600080826000015160ff16116113eb576000611404565b81516113f990600190613443565b611404906008613466565b825190915060609060ff166114225761141b61271c565b905061183e565b61158f6011600061143385826134c4565b60ff1660ff16815260200190815260200160002060008060ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546114a29061348f565b80156114ef5780601f106114c4576101008083540402835291602001916114ef565b820191906000526020600020905b8154815290600101906020018083116114d257829003601f168201915b505050505081526020016001820180546115089061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546115349061348f565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b505050505081525050612744565b6115eb601160006115a18660016134c4565b60ff1660ff1681526020019081526020016000206000866020015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b611647601160006115fd8760026134c4565b60ff1660ff1681526020019081526020016000206000876040015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6116a3601160006116598860036134c4565b60ff1660ff1681526020019081526020016000206000886060015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6116ff601160006116b58960046134c4565b60ff1660ff1681526020019081526020016000206000896080015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b61175b601160006117118a60056134c4565b60ff1660ff16815260200190815260200160002060008a60a0015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6117b76011600061176d8b60066134c4565b60ff1660ff16815260200190815260200160002060008b60c0015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b600760009081526011602090815260e08c015160ff1682527f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c905260409081902081518083019092528054611815929190829082906114769061348f565b60405160200161182c9897969594939291906136da565b60405160208183030381529060405290505b8060405160200161184f919061377f565b6040516020818303038152906040529350505050919050565b6000546001600160a01b031633146118925760405162461bcd60e51b8152600401610532906131f5565b600855565b6000546001600160a01b031633146118c15760405162461bcd60e51b8152600401610532906131f5565b600555565b60116020908152600092835260408084209091529082529020805481906118ec9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546119189061348f565b80156119655780601f1061193a57610100808354040283529160200191611965565b820191906000526020600020905b81548152906001019060200180831161194857829003601f168201915b50505050509080600101805461197a9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546119a69061348f565b80156119f35780601f106119c8576101008083540402835291602001916119f3565b820191906000526020600020905b8154815290600101906020018083116119d657829003601f168201915b5050505050905082565b6000546001600160a01b03163314611a275760405162461bcd60e51b8152600401610532906131f5565b60068054911515620100000262ff000019909216919091179055565b6002546001600160a01b0316336001600160a01b031614611a765760405162461bcd60e51b8152600401610532906132d5565b6040516bffffffffffffffffffffffff19606089901b166020820152600090603401604051602081830303815290604052805190602001209050611af1848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506008549150849050612791565b611b3d5760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f74206f6e207468652077686974656c697374210000006044820152606401610532565b611b4d88888860018960016123d2565b60015b878111611344576002546001600160a01b031663d1a1beb48a611b73848b61369f565b866040518463ffffffff1660e01b8152600401611b92939291906136b7565b600060405180830381600087803b158015611bac57600080fd5b505af1158015611bc0573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600760205260408120805460ff1691611beb8361386c565b91906101000a81548160ff021916908360ff160217905550508080611c0f906132ba565b915050611b50565b60606000611c2483612070565b9050600081611c32856127a7565b83611c44611c3f8861134f565b6128ad565b611c4d886108c5565b604051602001611c6195949392919061388c565b6040516020818303038152906040529050611c7b816128ad565b604051602001611c8b9190613a6f565b60405160208183030381529060405292505050919050565b6000546001600160a01b03163314611ccd5760405162461bcd60e51b8152600401610532906131f5565b611cd960018383612c7d565b505050565b6002546000906001600160a01b0316336001600160a01b031614611d145760405162461bcd60e51b8152600401610532906132d5565b600654610100900460ff1615611d625760405162461bcd60e51b815260206004820152601360248201527215d3d3d3081b5a5b9d1a5b99c81c185d5cd959606a1b6044820152606401610532565b612710611d6f858561369f565b1115611dbd5760405162461bcd60e51b815260206004820152601f60248201527f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c64006044820152606401610532565b611dcd85858560008060006123d2565b60015b848111611e6757600554611de4908361369f565b6002549092506001600160a01b031663d1a1beb487611e03848861369f565b866040518463ffffffff1660e01b8152600401611e22939291906136b7565b600060405180830381600087803b158015611e3c57600080fd5b505af1158015611e50573d6000803e3d6000fd5b505050508080611e5f906132ba565b915050611dd0565b50949350505050565b6000546001600160a01b03163314611e9a5760405162461bcd60e51b8152600401610532906131f5565b600380546001600160a01b039283166001600160a01b03199182161790915560028054939092169216919091179055565b6000546001600160a01b03163314611ef55760405162461bcd60e51b8152600401610532906131f5565b6006805460ff1916911515919091179055565b6002546001600160a01b0316336001600160a01b031614611f3b5760405162461bcd60e51b8152600401610532906132d5565b611f4b85858560008660016123d2565b60015b848111610870576002546001600160a01b031663d1a1beb487611f71848861369f565b856040518463ffffffff1660e01b8152600401611f90939291906136b7565b600060405180830381600087803b158015611faa57600080fd5b505af1158015611fbe573d6000803e3d6000fd5b505050508080611fcd906132ba565b915050611f4e565b6000546001600160a01b03163314611fff5760405162461bcd60e51b8152600401610532906131f5565b6001600160a01b0381166120645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610532565b61206d81612382565b50565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b1580156120bb57600080fd5b505afa1580156120cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f39190613369565b519050600160ff8216141561212357505060408051808201909152600381526242454560e81b6020820152919050565b8060ff16600214156121515750506040805180820190915260048152632122a0a960e11b6020820152919050565b8060ff16600314156121845750506040805180820190915260098152682122a2a5a2a2a822a960b91b6020820152919050565b505060408051808201909152600c81526b1393d508149155915053115160a21b6020820152919050565b50919050565b6121bc612c21565b60006121cd606461ffff8516613aca565b600183529050806121e157600382526121ef565b600a8110156121ef57600282525b815160009060ff1661220257600061221b565b825161221090600190613443565b61221b906008613466565b60109490941c93905061223c61ffff85166122378360016134c4565b612a15565b60ff16602084015260109390931c9261225e61ffff85166122378360026134c4565b60ff16604084015260109390931c9261228061ffff85166122378360036134c4565b60ff90811660608501528351166003146122b75760109390931c926122ae61ffff85166122378360046134c4565b60ff1660808401525b60109390931c926122d161ffff85166122378360056134c4565b60ff1660a084015260109390931c926122f361ffff85166122378360066134c4565b60ff90811660c08501528351166001141561232b57601084901c935061231e8461ffff166007612a15565b60ff1660e084015261234f565b60109390931c9261234561ffff85166122378360076134c4565b60ff166101008401525b5050919050565b6060828260405160200161236b929190613ade565b604051602081830303815290604052905092915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b326001600160a01b038716146124155760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b6044820152606401610532565b619c40612422868661369f565b11156124645760405162461bcd60e51b8152602060048201526011602482015270105b1b081d1bdad95b9cc81b5a5b9d1959607a1b6044820152606401610532565b821561253c5760065460ff16156124b35760405162461bcd60e51b8152602060048201526013602482015272141c995cd85b19481b5a5b9d081c185d5cd959606a1b6044820152606401610532565b6000851180156124eb57506001600160a01b0386166000908152600760205260409020546006906124e890879060ff1661369f565b11155b6125375760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c79206c696d6974656420616d6f756e7420666f7220574c206d696e74006044820152606401610532565b612599565b60008511801561254d5750600a8511155b6125995760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d696e7420616d6f756e742073616c6500000000000000006044820152606401610532565b8015610870576127106125ac868661369f565b11156125fa5760405162461bcd60e51b815260206004820152601f60248201527f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c64006044820152606401610532565b8215612664578161261266c3663566a5800087613b4f565b1461265f5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964207061796d656e7420616d6f756e742070726573616c6500006044820152606401610532565b610870565b8161267666d529ae9e86000087613b4f565b146126c35760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964207061796d656e7420616d6f756e742073616c6500000000006044820152606401610532565b60065462010000900460ff16156108705760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632073616c652063757272656e746c7920706175736564000000006044820152606401610532565b606060016040516020016127309190613c19565b604051602081830303815290604052905090565b60608160200151516000141561276857505060408051602081019091526000815290565b60208083015160405161277b9201613cc9565b6040516020818303038152906040529050919050565b60008261279e8584612af1565b14949350505050565b6060816127cb5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127f557806127df816132ba565b91506127ee9050600a83613cfa565b91506127cf565b60008167ffffffffffffffff811115612810576128106132fa565b6040519080825280601f01601f19166020018201604052801561283a576020820181803683370190505b5090505b84156128a55761284f600183613d0e565b915061285c600a86613aca565b61286790603061369f565b60f81b81838151811061287c5761287c613247565b60200101906001600160f81b031916908160001a90535061289e600a86613cfa565b945061283e565b949350505050565b60608151600014156128cd57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d4860409139905060006003845160026128fc919061369f565b6129069190613cfa565b612911906004613b4f565b9050600061292082602061369f565b67ffffffffffffffff811115612938576129386132fa565b6040519080825280601f01601f191660200182016040528015612962576020820181803683370190505b509050818152600183018586518101602084015b818310156129d05760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612976565b6003895106600181146129ea57600281146129fb57612a07565b613d3d60f01b600119830152612a07565b603d60f81b6000198301525b509398975050505050505050565b60008060168360ff1660188110612a2e57612a2e613247565b0154612a3a9085613d25565b905060168360ff1660188110612a5257612a52613247565b018160ff1681548110612a6757612a67613247565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015612a9d579050610631565b602e8360ff1660188110612ab357612ab3613247565b018160ff1681548110612ac857612ac8613247565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b600081815b8451811015612b95576000858281518110612b1357612b13613247565b60200260200101519050808311612b55576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b82565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b8d816132ba565b915050612af6565b509392505050565b828054612ba99061348f565b90600052602060002090601f016020900481019282612bcb5760008555612c11565b82601f10612be457805160ff1916838001178555612c11565b82800160010185558215612c11579182015b82811115612c11578251825591602001919060010190612bf6565b50612c1d929150612cf1565b5090565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b828054612c899061348f565b90600052602060002090601f016020900481019282612cab5760008555612c11565b82601f10612cc45782800160ff19823516178555612c11565b82800160010185558215612c11579182015b82811115612c11578235825591602001919060010190612cd6565b5b80821115612c1d5760008155600101612cf2565b80356001600160a01b0381168114612d1d57600080fd5b919050565b600060208284031215612d3457600080fd5b6108be82612d06565b801515811461206d57600080fd5b600060208284031215612d5d57600080fd5b81356108be81612d3d565b600060208284031215612d7a57600080fd5b5035919050565b60005b83811015612d9c578181015183820152602001612d84565b83811115612dab576000848401525b50505050565b60008151808452612dc9816020860160208601612d81565b601f01601f19169290920160200192915050565b6020815260006108be6020830184612db1565b60008060408385031215612e0357600080fd5b50508035926020909101359150565b60ff8116811461206d57600080fd5b60008083601f840112612e3357600080fd5b50813567ffffffffffffffff811115612e4b57600080fd5b6020830191508360208260051b8501011115612e6657600080fd5b9250929050565b600080600080600060608688031215612e8557600080fd5b8535612e9081612e12565b9450602086013567ffffffffffffffff80821115612ead57600080fd5b612eb989838a01612e21565b90965094506040880135915080821115612ed257600080fd5b50612edf88828901612e21565b969995985093965092949392505050565b815160ff16815261016081016020830151612f10602084018260ff169052565b506040830151612f25604084018260ff169052565b506060830151612f3a606084018260ff169052565b506080830151612f4f608084018260ff169052565b5060a0830151612f6460a084018260ff169052565b5060c0830151612f7960c084018260ff169052565b5060e0830151612f8e60e084018260ff169052565b506101008381015160ff16908301526101208084015165ffffffffffff908116918401919091526101409384015116929091019190915290565b60008060008060808587031215612fde57600080fd5b612fe785612d06565b93506020850135925060408501359150606085013561300581612d3d565b939692955090935050565b6000806040838503121561302357600080fd5b823561302e81612e12565b9150602083013561303e81612e12565b809150509250929050565b60408152600061305c6040830185612db1565b828103602084015261306e8185612db1565b95945050505050565b600080600080600080600060c0888a03121561309257600080fd5b61309b88612d06565b9650602088013595506040880135945060608801359350608088013567ffffffffffffffff8111156130cc57600080fd5b6130d88a828b01612e21565b90945092505060a08801356130ec81612d3d565b8091505092959891949750929550565b6000806020838503121561310f57600080fd5b823567ffffffffffffffff8082111561312757600080fd5b818501915085601f83011261313b57600080fd5b81358181111561314a57600080fd5b86602082850101111561315c57600080fd5b60209290920196919550909350505050565b6000806040838503121561318157600080fd5b61318a83612d06565b915061319860208401612d06565b90509250929050565b600080600080600060a086880312156131b957600080fd5b6131c286612d06565b945060208601359350604086013592506060860135915060808601356131e781612d3d565b809150509295509295909350565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561323c57600080fd5b81516108be81612d3d565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261327457600080fd5b83018035915067ffffffffffffffff82111561328f57600080fd5b602001915036819003821315612e6657600080fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156132ce576132ce6132a4565b5060010190565b6020808252600b908201526a444f4e542043484541542160a81b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561334257634e487b7160e01b600052604160045260246000fd5b60405290565b8051612d1d81612e12565b805165ffffffffffff81168114612d1d57600080fd5b6000610160828403121561337c57600080fd5b613384613310565b61338d83613348565b815261339b60208401613348565b60208201526133ac60408401613348565b60408201526133bd60608401613348565b60608201526133ce60808401613348565b60808201526133df60a08401613348565b60a08201526133f060c08401613348565b60c082015261340160e08401613348565b60e0820152610100613414818501613348565b90820152610120613426848201613353565b90820152610140613438848201613353565b908201529392505050565b600060ff821660ff84168082101561345d5761345d6132a4565b90039392505050565b600060ff821660ff84168160ff0481118215151615613487576134876132a4565b029392505050565b600181811c908216806134a357607f821691505b602082108114156121ae57634e487b7160e01b600052602260045260246000fd5b600060ff821660ff84168060ff038211156134e1576134e16132a4565b019392505050565b600081516134fb818560208601612d81565b9290920192915050565b60008651613517818460208b01612d81565b8083019050600b60fa1b8082528751613537816001850160208c01612d81565b600192019182018190528651613554816002850160208b01612d81565b600292019182018190528551613571816003850160208a01612d81565b60039201918201819052845161358e816004850160208901612d81565b6004920191820152600501979650505050505050565b600083516135b6818460208801612d81565b8351908301906135ca818360208801612d81565b600b60fa1b9101908152600101949350505050565b605b60f81b8152600084516135fb816001850160208901612d81565b7f7b2274726169745f74797065223a2247656e65726174696f6e222c2276616c756001918401918201526232911d60e91b60218201528451613644816024840160208901612d81565b7f7d2c7b2274726169745f74797065223a2254797065222c2276616c7565223a22602492909101918201528351613682816044840160208801612d81565b62227d5d60e81b6044929091019182015260470195945050505050565b600082198211156136b2576136b26132a4565b500190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6000895160206136ed8285838f01612d81565b8a51918401916137008184848f01612d81565b8a519201916137128184848e01612d81565b89519201916137248184848d01612d81565b88519201916137368184848c01612d81565b87519201916137488184848b01612d81565b865192019161375a8184848a01612d81565b855192019161376c8184848901612d81565b919091019b9a5050505050505050505050565b7f3c7376672069643d2263727970746f62656573222077696474683d223130302581527f22206865696768743d2231303025222076657273696f6e3d22312e312220766960208201527f6577426f783d223020302034302034302220786d6c6e733d22687474703a2f2f60408201527f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b60608201527f3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b223e60808201526000825161384f8160a0850160208701612d81565b651e17b9bb339f60d11b60a093909101928301525060a601919050565b600060ff821660ff811415613883576138836132a4565b60010192915050565b693d913730b6b2911d101160b11b815285516000906138b281600a850160208b01612d81565b61202360f01b600a9184019182015286516138d481600c840160208b01612d81565b6b111610113a3cb832911d101160a11b600c92909101918201528551613901816018840160208a01612d81565b7f222c20226465736372697074696f6e223a202250656f706c65207265616c697a910160188101919091527f6564207468617420746865207061746820746f2070726f73706572697479206960388201527f7320746f2072656c6f6361746520746f2061206661726d2e20536f6d6520686160588201527f766520626f756768742073686565702c20736f6d65206c616e6420627574206d60788201527f616e7920656e6465642075702077697468206e6f7468696e672e2024484f4e4560988201527f5920697320746865206e6577206f70706f7274756e6974792e0000000000000060b88201527f222c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260d182015265185cd94d8d0b60d21b60f1820152613a63613a56613a50613a3560f78501896134e9565b6e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b866134e9565b607d60f81b815260010190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613aa781601d850160208701612d81565b91909101601d0192915050565b634e487b7160e01b600052601260045260246000fd5b600082613ad957613ad9613ab4565b500690565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090613b0981600f850160208801612d81565b6a1116113b30b63ab2911d1160a91b600f918401918201528351613b3481601a840160208801612d81565b61227d60f01b601a9290910191820152601c01949350505050565b6000816000190483118215151615613b6957613b696132a4565b500290565b7f3c696d61676520783d22342220793d2234222077696474683d2233322220686581527f696768743d2233322220696d6167652d72656e646572696e673d22706978656c60208201527f6174656422207072657365727665417370656374526174696f3d22784d69645960408201527f4d69642220786c696e6b3a687265663d22646174613a696d6167652f706e673b60608201526618985cd94d8d0b60ca1b608082015260870190565b6000613c2482613b6e565b8354600090600181811c9080831680613c3e57607f831692505b6020808410821415613c5e57634e487b7160e01b86526022600452602486fd5b818015613c725760018114613c8357613cb0565b60ff19861688528488019650613cb0565b60008b81526020902060005b86811015613ca85781548a820152908501908301613c8f565b505084880196505b50505050505061306e816211179f60e91b815260030190565b6000613cd482613b6e565b8351613ce4818360208801612d81565b6211179f60e91b91019081526003019392505050565b600082613d0957613d09613ab4565b500490565b600082821015613d2057613d206132a4565b500390565b600060ff831680613d3857613d38613ab4565b8060ff8416069150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e0a6b5efc594d8cf092b6b8ca8780522fa1c713e6ebe42127d74a28a8c82e5e164736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061021b5760003560e01c80638da5cb5b11610125578063c87b56dd116100ad578063edfdb76d1161007c578063edfdb76d146104bd578063f0395a0e146104d0578063f2fa6382146104e3578063f2fde38b146104ec578063f47c84c5146104ff57600080fd5b8063c87b56dd14610471578063cd43029814610484578063cdb6d2fc14610497578063d8952a49146104aa57600080fd5b8063a4a8be85116100f4578063a4a8be851461042c578063adaa1bad1461043f578063b13b25d414610447578063c002d23d1461045a578063c084f5401461046857600080fd5b80638da5cb5b146103bd5780639bf2ee35146103d8578063a1b8f374146103f9578063a2ecc4031461041957600080fd5b80634a7dd523116101a8578063715018a611610177578063715018a6146103695780637778b5d2146103715780637abecb86146103845780637cb6475914610397578063874fd9fa146103aa57600080fd5b80634a7dd5231461031b5780635ab510371461033b5780635c520a4b1461034957806368dba5e51461035657600080fd5b806327de8f27116101ef57806327de8f27146102ad57806333df4b2c146102c057806336838391146102d35780633faddaa5146102e657806347cd5f1c1461030857600080fd5b80628af2e614610220578063014681391461025a578063110428f81461026f578063161b384c1461028d575b600080fd5b61024361022e366004612d22565b60076020526000908152604090205460ff1681565b60405160ff90911681526020015b60405180910390f35b61026d610268366004612d4b565b610508565b005b61027f68a2a15d09519be0000081565b604051908152602001610251565b6102a061029b366004612d68565b610555565b6040516102519190612ddd565b61027f6102bb366004612d68565b610637565b6102436102ce366004612df0565b61067d565b6102436102e1366004612df0565b6106c3565b6006546102f890610100900460ff1681565b6040519015158152602001610251565b61026d610316366004612e6d565b6106d3565b61032e610329366004612d68565b610878565b6040516102519190612ef0565b61027f66c3663566a5800081565b6006546102f89060ff1681565b6102a0610364366004612d68565b6108c5565b61026d6111c2565b61026d61037f366004612fc8565b6111f8565b6102a0610392366004612d68565b61134f565b61026d6103a5366004612d68565b611868565b61026d6103b8366004612d68565b611897565b6000546040516001600160a01b039091168152602001610251565b6103eb6103e6366004613010565b6118c6565b604051610251929190613049565b61027f610407366004612d68565b60046020526000908152604090205481565b61026d610427366004612d4b565b6119fd565b6006546102f89062010000900460ff1681565b61027f600681565b61026d610455366004613077565b611a43565b61027f66d529ae9e86000081565b61027f61271081565b6102a061047f366004612d68565b611c17565b61026d6104923660046130fc565b611ca3565b61027f6104a5366004612fc8565b611cde565b61026d6104b836600461316e565b611e70565b61026d6104cb366004612d4b565b611ecb565b61026d6104de3660046131a1565b611f08565b61027f60055481565b61026d6104fa366004612d22565b611fd5565b61027f619c4081565b6000546001600160a01b0316331461053b5760405162461bcd60e51b8152600401610532906131f5565b60405180910390fd5b600680549115156101000261ff0019909216919091179055565b60025460405163745b90cb60e11b8152600481018390526060916001600160a01b03169063e8b721969060240160206040518083038186803b15801561059a57600080fd5b505afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d2919061322a565b6106285760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b6064820152608401610532565b61063182612070565b92915050565b6000614e208211610652575068a2a15d09519be00000919050565b617530821161066c57506901969368974c05b00000919050565b5069032d26d12e980b600000919050565b6016826018811061068d57600080fd5b01818154811061069c57600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b602e826018811061068d57600080fd5b6000546001600160a01b031633146106fd5760405162461bcd60e51b8152600401610532906131f5565b8281146107405760405162461bcd60e51b81526020600482015260116024820152704d69736d61746368656420696e7075747360781b6044820152606401610532565b60005b8381101561087057604051806040016040528086868481811061076857610768613247565b905060200281019061077a919061325d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020018484848181106107c6576107c6613247565b90506020028101906107d8919061325d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452505060ff808a1682526011602090815260408084209287168452918152912083518051919350610840928492910190612b9d565b5060208281015180516108599260018501920190612b9d565b509050508080610868906132ba565b915050610743565b505050505050565b610880612c21565b6002546001600160a01b0316336001600160a01b0316146108b35760405162461bcd60e51b8152600401610532906132d5565b60006108be836121b4565b9392505050565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b15801561091057600080fd5b505afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190613369565b9050600061095584612070565b9050600080836000015160ff161161096e576000610987565b825161097c90600190613443565b610987906008613466565b90506060610ae26009600101805461099e9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546109ca9061348f565b8015610a175780601f106109ec57610100808354040283529160200191610a17565b820191906000526020600020905b8154815290600101906020018083116109fa57829003601f168201915b505050505060116000856001610a2d91906134c4565b60ff9081168252602080830193909352604091820160009081208a8501519092168152925290208054610a5f9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b9061348f565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050612356565b610bb660096002018054610af59061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b219061348f565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505060116000866002610b8491906134c4565b60ff9081168252602080830193909352604091820160009081208b8401519092168152925290208054610a5f9061348f565b610c8b60096003018054610bc99061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf59061348f565b8015610c425780601f10610c1757610100808354040283529160200191610c42565b820191906000526020600020905b815481529060010190602001808311610c2557829003601f168201915b505050505060116000876003610c5891906134c4565b60ff90811682526020808301939093526040918201600090812060608d01519092168152925290208054610a5f9061348f565b610d6060096005018054610c9e9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cca9061348f565b8015610d175780601f10610cec57610100808354040283529160200191610d17565b820191906000526020600020905b815481529060010190602001808311610cfa57829003601f168201915b505050505060116000886005610d2d91906134c4565b60ff90811682526020808301939093526040918201600090812060a08e01519092168152925290208054610a5f9061348f565b610e3560096006018054610d739061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9f9061348f565b8015610dec5780601f10610dc157610100808354040283529160200191610dec565b820191906000526020600020905b815481529060010190602001808311610dcf57829003601f168201915b505050505060116000896006610e0291906134c4565b60ff90811682526020808301939093526040918201600090812060c08f01519092168152925290208054610a5f9061348f565b604051602001610e49959493929190613505565b6040516020818303038152906040529050836000015160ff16600314610f625780610f3f60096004018054610e7d9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea99061348f565b8015610ef65780601f10610ecb57610100808354040283529160200191610ef6565b820191906000526020600020905b815481529060010190602001808311610ed957829003601f168201915b505050505060116000866004610f0c91906134c4565b60ff90811682526020808301939093526040918201600090812060808c01519092168152925290208054610a5f9061348f565b604051602001610f509291906135a4565b60405160208183030381529060405290505b836000015160ff1660011415611078578061105160096007018054610f869061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb29061348f565b8015610fff5780601f10610fd457610100808354040283529160200191610fff565b820191906000526020600020905b815481529060010190602001808311610fe257829003601f168201915b5050600760009081526011602090815260e08c015160ff1682527f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c9052604090208054909350610a5f9250905061348f565b6040516020016110629291906135a4565b6040516020818303038152906040529050611144565b836000015160ff16600214156110d45780611051604051806040016040528060088152602001670a6e8e4cadccee8d60c31b815250601287610100015160ff16600481106110c8576110c8613247565b018054610a5f9061348f565b836000015160ff166003141561114457806111216040518060400160405280600581526020016414dada5b1b60da1b815250601287610100015160ff16600481106110c8576110c8613247565b6040516020016111329291906135a4565b60405160208183030381529060405290505b8061271087111561117457604051806040016040528060078152602001661123b2b710189160c91b815250611195565b604051806040016040528060078152602001661123b2b710181160c91b8152505b846040516020016111a8939291906135df565b604051602081830303815290604052945050505050919050565b6000546001600160a01b031633146111ec5760405162461bcd60e51b8152600401610532906131f5565b6111f66000612382565b565b6002546001600160a01b0316336001600160a01b03161461122b5760405162461bcd60e51b8152600401610532906132d5565b61123b84848460008060006123d2565b600060015b8481116112e1576112546102bb828661369f565b61125e908361369f565b6002549092506001600160a01b031663d1a1beb48761127d848861369f565b866040518463ffffffff1660e01b815260040161129c939291906136b7565b600060405180830381600087803b1580156112b657600080fd5b505af11580156112ca573d6000803e3d6000fd5b5050505080806112d9906132ba565b915050611240565b50600354604051632770a7eb60e21b81526001600160a01b0387811660048301526024820184905290911690639dc29fac90604401600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b505050505050505050565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b15801561139a57600080fd5b505afa1580156113ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d29190613369565b9050600080826000015160ff16116113eb576000611404565b81516113f990600190613443565b611404906008613466565b825190915060609060ff166114225761141b61271c565b905061183e565b61158f6011600061143385826134c4565b60ff1660ff16815260200190815260200160002060008060ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546114a29061348f565b80156114ef5780601f106114c4576101008083540402835291602001916114ef565b820191906000526020600020905b8154815290600101906020018083116114d257829003601f168201915b505050505081526020016001820180546115089061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546115349061348f565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b505050505081525050612744565b6115eb601160006115a18660016134c4565b60ff1660ff1681526020019081526020016000206000866020015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b611647601160006115fd8760026134c4565b60ff1660ff1681526020019081526020016000206000876040015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6116a3601160006116598860036134c4565b60ff1660ff1681526020019081526020016000206000886060015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6116ff601160006116b58960046134c4565b60ff1660ff1681526020019081526020016000206000896080015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b61175b601160006117118a60056134c4565b60ff1660ff16815260200190815260200160002060008a60a0015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6117b76011600061176d8b60066134c4565b60ff1660ff16815260200190815260200160002060008b60c0015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b600760009081526011602090815260e08c015160ff1682527f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c905260409081902081518083019092528054611815929190829082906114769061348f565b60405160200161182c9897969594939291906136da565b60405160208183030381529060405290505b8060405160200161184f919061377f565b6040516020818303038152906040529350505050919050565b6000546001600160a01b031633146118925760405162461bcd60e51b8152600401610532906131f5565b600855565b6000546001600160a01b031633146118c15760405162461bcd60e51b8152600401610532906131f5565b600555565b60116020908152600092835260408084209091529082529020805481906118ec9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546119189061348f565b80156119655780601f1061193a57610100808354040283529160200191611965565b820191906000526020600020905b81548152906001019060200180831161194857829003601f168201915b50505050509080600101805461197a9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546119a69061348f565b80156119f35780601f106119c8576101008083540402835291602001916119f3565b820191906000526020600020905b8154815290600101906020018083116119d657829003601f168201915b5050505050905082565b6000546001600160a01b03163314611a275760405162461bcd60e51b8152600401610532906131f5565b60068054911515620100000262ff000019909216919091179055565b6002546001600160a01b0316336001600160a01b031614611a765760405162461bcd60e51b8152600401610532906132d5565b6040516bffffffffffffffffffffffff19606089901b166020820152600090603401604051602081830303815290604052805190602001209050611af1848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506008549150849050612791565b611b3d5760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f74206f6e207468652077686974656c697374210000006044820152606401610532565b611b4d88888860018960016123d2565b60015b878111611344576002546001600160a01b031663d1a1beb48a611b73848b61369f565b866040518463ffffffff1660e01b8152600401611b92939291906136b7565b600060405180830381600087803b158015611bac57600080fd5b505af1158015611bc0573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600760205260408120805460ff1691611beb8361386c565b91906101000a81548160ff021916908360ff160217905550508080611c0f906132ba565b915050611b50565b60606000611c2483612070565b9050600081611c32856127a7565b83611c44611c3f8861134f565b6128ad565b611c4d886108c5565b604051602001611c6195949392919061388c565b6040516020818303038152906040529050611c7b816128ad565b604051602001611c8b9190613a6f565b60405160208183030381529060405292505050919050565b6000546001600160a01b03163314611ccd5760405162461bcd60e51b8152600401610532906131f5565b611cd960018383612c7d565b505050565b6002546000906001600160a01b0316336001600160a01b031614611d145760405162461bcd60e51b8152600401610532906132d5565b600654610100900460ff1615611d625760405162461bcd60e51b815260206004820152601360248201527215d3d3d3081b5a5b9d1a5b99c81c185d5cd959606a1b6044820152606401610532565b612710611d6f858561369f565b1115611dbd5760405162461bcd60e51b815260206004820152601f60248201527f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c64006044820152606401610532565b611dcd85858560008060006123d2565b60015b848111611e6757600554611de4908361369f565b6002549092506001600160a01b031663d1a1beb487611e03848861369f565b866040518463ffffffff1660e01b8152600401611e22939291906136b7565b600060405180830381600087803b158015611e3c57600080fd5b505af1158015611e50573d6000803e3d6000fd5b505050508080611e5f906132ba565b915050611dd0565b50949350505050565b6000546001600160a01b03163314611e9a5760405162461bcd60e51b8152600401610532906131f5565b600380546001600160a01b039283166001600160a01b03199182161790915560028054939092169216919091179055565b6000546001600160a01b03163314611ef55760405162461bcd60e51b8152600401610532906131f5565b6006805460ff1916911515919091179055565b6002546001600160a01b0316336001600160a01b031614611f3b5760405162461bcd60e51b8152600401610532906132d5565b611f4b85858560008660016123d2565b60015b848111610870576002546001600160a01b031663d1a1beb487611f71848861369f565b856040518463ffffffff1660e01b8152600401611f90939291906136b7565b600060405180830381600087803b158015611faa57600080fd5b505af1158015611fbe573d6000803e3d6000fd5b505050508080611fcd906132ba565b915050611f4e565b6000546001600160a01b03163314611fff5760405162461bcd60e51b8152600401610532906131f5565b6001600160a01b0381166120645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610532565b61206d81612382565b50565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b1580156120bb57600080fd5b505afa1580156120cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f39190613369565b519050600160ff8216141561212357505060408051808201909152600381526242454560e81b6020820152919050565b8060ff16600214156121515750506040805180820190915260048152632122a0a960e11b6020820152919050565b8060ff16600314156121845750506040805180820190915260098152682122a2a5a2a2a822a960b91b6020820152919050565b505060408051808201909152600c81526b1393d508149155915053115160a21b6020820152919050565b50919050565b6121bc612c21565b60006121cd606461ffff8516613aca565b600183529050806121e157600382526121ef565b600a8110156121ef57600282525b815160009060ff1661220257600061221b565b825161221090600190613443565b61221b906008613466565b60109490941c93905061223c61ffff85166122378360016134c4565b612a15565b60ff16602084015260109390931c9261225e61ffff85166122378360026134c4565b60ff16604084015260109390931c9261228061ffff85166122378360036134c4565b60ff90811660608501528351166003146122b75760109390931c926122ae61ffff85166122378360046134c4565b60ff1660808401525b60109390931c926122d161ffff85166122378360056134c4565b60ff1660a084015260109390931c926122f361ffff85166122378360066134c4565b60ff90811660c08501528351166001141561232b57601084901c935061231e8461ffff166007612a15565b60ff1660e084015261234f565b60109390931c9261234561ffff85166122378360076134c4565b60ff166101008401525b5050919050565b6060828260405160200161236b929190613ade565b604051602081830303815290604052905092915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b326001600160a01b038716146124155760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b6044820152606401610532565b619c40612422868661369f565b11156124645760405162461bcd60e51b8152602060048201526011602482015270105b1b081d1bdad95b9cc81b5a5b9d1959607a1b6044820152606401610532565b821561253c5760065460ff16156124b35760405162461bcd60e51b8152602060048201526013602482015272141c995cd85b19481b5a5b9d081c185d5cd959606a1b6044820152606401610532565b6000851180156124eb57506001600160a01b0386166000908152600760205260409020546006906124e890879060ff1661369f565b11155b6125375760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c79206c696d6974656420616d6f756e7420666f7220574c206d696e74006044820152606401610532565b612599565b60008511801561254d5750600a8511155b6125995760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d696e7420616d6f756e742073616c6500000000000000006044820152606401610532565b8015610870576127106125ac868661369f565b11156125fa5760405162461bcd60e51b815260206004820152601f60248201527f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c64006044820152606401610532565b8215612664578161261266c3663566a5800087613b4f565b1461265f5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964207061796d656e7420616d6f756e742070726573616c6500006044820152606401610532565b610870565b8161267666d529ae9e86000087613b4f565b146126c35760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964207061796d656e7420616d6f756e742073616c6500000000006044820152606401610532565b60065462010000900460ff16156108705760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632073616c652063757272656e746c7920706175736564000000006044820152606401610532565b606060016040516020016127309190613c19565b604051602081830303815290604052905090565b60608160200151516000141561276857505060408051602081019091526000815290565b60208083015160405161277b9201613cc9565b6040516020818303038152906040529050919050565b60008261279e8584612af1565b14949350505050565b6060816127cb5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127f557806127df816132ba565b91506127ee9050600a83613cfa565b91506127cf565b60008167ffffffffffffffff811115612810576128106132fa565b6040519080825280601f01601f19166020018201604052801561283a576020820181803683370190505b5090505b84156128a55761284f600183613d0e565b915061285c600a86613aca565b61286790603061369f565b60f81b81838151811061287c5761287c613247565b60200101906001600160f81b031916908160001a90535061289e600a86613cfa565b945061283e565b949350505050565b60608151600014156128cd57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d4860409139905060006003845160026128fc919061369f565b6129069190613cfa565b612911906004613b4f565b9050600061292082602061369f565b67ffffffffffffffff811115612938576129386132fa565b6040519080825280601f01601f191660200182016040528015612962576020820181803683370190505b509050818152600183018586518101602084015b818310156129d05760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612976565b6003895106600181146129ea57600281146129fb57612a07565b613d3d60f01b600119830152612a07565b603d60f81b6000198301525b509398975050505050505050565b60008060168360ff1660188110612a2e57612a2e613247565b0154612a3a9085613d25565b905060168360ff1660188110612a5257612a52613247565b018160ff1681548110612a6757612a67613247565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015612a9d579050610631565b602e8360ff1660188110612ab357612ab3613247565b018160ff1681548110612ac857612ac8613247565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b600081815b8451811015612b95576000858281518110612b1357612b13613247565b60200260200101519050808311612b55576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b82565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b8d816132ba565b915050612af6565b509392505050565b828054612ba99061348f565b90600052602060002090601f016020900481019282612bcb5760008555612c11565b82601f10612be457805160ff1916838001178555612c11565b82800160010185558215612c11579182015b82811115612c11578251825591602001919060010190612bf6565b50612c1d929150612cf1565b5090565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b828054612c899061348f565b90600052602060002090601f016020900481019282612cab5760008555612c11565b82601f10612cc45782800160ff19823516178555612c11565b82800160010185558215612c11579182015b82811115612c11578235825591602001919060010190612cd6565b5b80821115612c1d5760008155600101612cf2565b80356001600160a01b0381168114612d1d57600080fd5b919050565b600060208284031215612d3457600080fd5b6108be82612d06565b801515811461206d57600080fd5b600060208284031215612d5d57600080fd5b81356108be81612d3d565b600060208284031215612d7a57600080fd5b5035919050565b60005b83811015612d9c578181015183820152602001612d84565b83811115612dab576000848401525b50505050565b60008151808452612dc9816020860160208601612d81565b601f01601f19169290920160200192915050565b6020815260006108be6020830184612db1565b60008060408385031215612e0357600080fd5b50508035926020909101359150565b60ff8116811461206d57600080fd5b60008083601f840112612e3357600080fd5b50813567ffffffffffffffff811115612e4b57600080fd5b6020830191508360208260051b8501011115612e6657600080fd5b9250929050565b600080600080600060608688031215612e8557600080fd5b8535612e9081612e12565b9450602086013567ffffffffffffffff80821115612ead57600080fd5b612eb989838a01612e21565b90965094506040880135915080821115612ed257600080fd5b50612edf88828901612e21565b969995985093965092949392505050565b815160ff16815261016081016020830151612f10602084018260ff169052565b506040830151612f25604084018260ff169052565b506060830151612f3a606084018260ff169052565b506080830151612f4f608084018260ff169052565b5060a0830151612f6460a084018260ff169052565b5060c0830151612f7960c084018260ff169052565b5060e0830151612f8e60e084018260ff169052565b506101008381015160ff16908301526101208084015165ffffffffffff908116918401919091526101409384015116929091019190915290565b60008060008060808587031215612fde57600080fd5b612fe785612d06565b93506020850135925060408501359150606085013561300581612d3d565b939692955090935050565b6000806040838503121561302357600080fd5b823561302e81612e12565b9150602083013561303e81612e12565b809150509250929050565b60408152600061305c6040830185612db1565b828103602084015261306e8185612db1565b95945050505050565b600080600080600080600060c0888a03121561309257600080fd5b61309b88612d06565b9650602088013595506040880135945060608801359350608088013567ffffffffffffffff8111156130cc57600080fd5b6130d88a828b01612e21565b90945092505060a08801356130ec81612d3d565b8091505092959891949750929550565b6000806020838503121561310f57600080fd5b823567ffffffffffffffff8082111561312757600080fd5b818501915085601f83011261313b57600080fd5b81358181111561314a57600080fd5b86602082850101111561315c57600080fd5b60209290920196919550909350505050565b6000806040838503121561318157600080fd5b61318a83612d06565b915061319860208401612d06565b90509250929050565b600080600080600060a086880312156131b957600080fd5b6131c286612d06565b945060208601359350604086013592506060860135915060808601356131e781612d3d565b809150509295509295909350565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561323c57600080fd5b81516108be81612d3d565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261327457600080fd5b83018035915067ffffffffffffffff82111561328f57600080fd5b602001915036819003821315612e6657600080fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156132ce576132ce6132a4565b5060010190565b6020808252600b908201526a444f4e542043484541542160a81b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561334257634e487b7160e01b600052604160045260246000fd5b60405290565b8051612d1d81612e12565b805165ffffffffffff81168114612d1d57600080fd5b6000610160828403121561337c57600080fd5b613384613310565b61338d83613348565b815261339b60208401613348565b60208201526133ac60408401613348565b60408201526133bd60608401613348565b60608201526133ce60808401613348565b60808201526133df60a08401613348565b60a08201526133f060c08401613348565b60c082015261340160e08401613348565b60e0820152610100613414818501613348565b90820152610120613426848201613353565b90820152610140613438848201613353565b908201529392505050565b600060ff821660ff84168082101561345d5761345d6132a4565b90039392505050565b600060ff821660ff84168160ff0481118215151615613487576134876132a4565b029392505050565b600181811c908216806134a357607f821691505b602082108114156121ae57634e487b7160e01b600052602260045260246000fd5b600060ff821660ff84168060ff038211156134e1576134e16132a4565b019392505050565b600081516134fb818560208601612d81565b9290920192915050565b60008651613517818460208b01612d81565b8083019050600b60fa1b8082528751613537816001850160208c01612d81565b600192019182018190528651613554816002850160208b01612d81565b600292019182018190528551613571816003850160208a01612d81565b60039201918201819052845161358e816004850160208901612d81565b6004920191820152600501979650505050505050565b600083516135b6818460208801612d81565b8351908301906135ca818360208801612d81565b600b60fa1b9101908152600101949350505050565b605b60f81b8152600084516135fb816001850160208901612d81565b7f7b2274726169745f74797065223a2247656e65726174696f6e222c2276616c756001918401918201526232911d60e91b60218201528451613644816024840160208901612d81565b7f7d2c7b2274726169745f74797065223a2254797065222c2276616c7565223a22602492909101918201528351613682816044840160208801612d81565b62227d5d60e81b6044929091019182015260470195945050505050565b600082198211156136b2576136b26132a4565b500190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6000895160206136ed8285838f01612d81565b8a51918401916137008184848f01612d81565b8a519201916137128184848e01612d81565b89519201916137248184848d01612d81565b88519201916137368184848c01612d81565b87519201916137488184848b01612d81565b865192019161375a8184848a01612d81565b855192019161376c8184848901612d81565b919091019b9a5050505050505050505050565b7f3c7376672069643d2263727970746f62656573222077696474683d223130302581527f22206865696768743d2231303025222076657273696f6e3d22312e312220766960208201527f6577426f783d223020302034302034302220786d6c6e733d22687474703a2f2f60408201527f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b60608201527f3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b223e60808201526000825161384f8160a0850160208701612d81565b651e17b9bb339f60d11b60a093909101928301525060a601919050565b600060ff821660ff811415613883576138836132a4565b60010192915050565b693d913730b6b2911d101160b11b815285516000906138b281600a850160208b01612d81565b61202360f01b600a9184019182015286516138d481600c840160208b01612d81565b6b111610113a3cb832911d101160a11b600c92909101918201528551613901816018840160208a01612d81565b7f222c20226465736372697074696f6e223a202250656f706c65207265616c697a910160188101919091527f6564207468617420746865207061746820746f2070726f73706572697479206960388201527f7320746f2072656c6f6361746520746f2061206661726d2e20536f6d6520686160588201527f766520626f756768742073686565702c20736f6d65206c616e6420627574206d60788201527f616e7920656e6465642075702077697468206e6f7468696e672e2024484f4e4560988201527f5920697320746865206e6577206f70706f7274756e6974792e0000000000000060b88201527f222c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260d182015265185cd94d8d0b60d21b60f1820152613a63613a56613a50613a3560f78501896134e9565b6e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b866134e9565b607d60f81b815260010190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613aa781601d850160208701612d81565b91909101601d0192915050565b634e487b7160e01b600052601260045260246000fd5b600082613ad957613ad9613ab4565b500690565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090613b0981600f850160208801612d81565b6a1116113b30b63ab2911d1160a91b600f918401918201528351613b3481601a840160208801612d81565b61227d60f01b601a9290910191820152601c01949350505050565b6000816000190483118215151615613b6957613b696132a4565b500290565b7f3c696d61676520783d22342220793d2234222077696474683d2233322220686581527f696768743d2233322220696d6167652d72656e646572696e673d22706978656c60208201527f6174656422207072657365727665417370656374526174696f3d22784d69645960408201527f4d69642220786c696e6b3a687265663d22646174613a696d6167652f706e673b60608201526618985cd94d8d0b60ca1b608082015260870190565b6000613c2482613b6e565b8354600090600181811c9080831680613c3e57607f831692505b6020808410821415613c5e57634e487b7160e01b86526022600452602486fd5b818015613c725760018114613c8357613cb0565b60ff19861688528488019650613cb0565b60008b81526020902060005b86811015613ca85781548a820152908501908301613c8f565b505084880196505b50505050505061306e816211179f60e91b815260030190565b6000613cd482613b6e565b8351613ce4818360208801612d81565b6211179f60e91b91019081526003019392505050565b600082613d0957613d09613ab4565b500490565b600082821015613d2057613d206132a4565b500390565b600060ff831680613d3857613d38613ab4565b8060ff8416069150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e0a6b5efc594d8cf092b6b8ca8780522fa1c713e6ebe42127d74a28a8c82e5e164736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.