ETH Price: $2,210.64 (-4.79%)

Contract

0xfd79a6Cda2886429a5aa1dE96ed588b8a8CfBf12
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Wool Mint Pr...138363642021-12-19 15:17:031167 days ago1639927023IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0013695447.59811126
Set Wool Mint Pa...138363582021-12-19 15:15:451167 days ago1639926945IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0011933546.00815338
Set Merkle Root138251332021-12-17 21:52:271168 days ago1639777947IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0024066891.67967022
Set Merkle Root138250972021-12-17 21:45:321168 days ago1639777532IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.00340132117.0812
Set Presale Mint...138250412021-12-17 21:32:191168 days ago1639776739IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.00297808114.98846075
Set Wool Mint Pa...138250372021-12-17 21:31:041168 days ago1639776664IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.00318093110.68736404
Set Merkle Root138245202021-12-17 19:35:271168 days ago1639769727IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.00310485106.92032108
Upload Unreveal ...138236642021-12-17 16:22:541168 days ago1639758174IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0240391275.50262092
Set Presale Mint...138233282021-12-17 15:07:531169 days ago1639753673IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0021377674.48918542
Set Merkle Root138233252021-12-17 15:07:331169 days ago1639753653IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0039164584.86167166
Set Contracts138231962021-12-17 14:38:131169 days ago1639751893IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0061331789.19681323
Upload Traits138223712021-12-17 11:25:261169 days ago1639740326IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.1834116546.0400891
Upload Traits138223662021-12-17 11:24:051169 days ago1639740245IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0914647139.61212463
Upload Traits138223462021-12-17 11:20:311169 days ago1639740031IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.153618141.29391405
Upload Traits138223382021-12-17 11:19:321169 days ago1639739972IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0586511648.17194027
Upload Traits138223162021-12-17 11:14:501169 days ago1639739690IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0512680849.62020261
Upload Traits138223102021-12-17 11:13:091169 days ago1639739589IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0490358947.33930539
Upload Traits138222982021-12-17 11:10:531169 days ago1639739453IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0574407460.0625352
Upload Traits138222912021-12-17 11:08:571169 days ago1639739337IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.2013636450.96257855
Upload Traits138222862021-12-17 11:07:501169 days ago1639739270IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.1479131554.0240139
Upload Traits138222652021-12-17 11:04:261169 days ago1639739066IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.1681904872.87058559
Upload Traits138222602021-12-17 11:03:131169 days ago1639738993IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.0875744882.71920285
Upload Traits138222342021-12-17 10:57:431169 days ago1639738663IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.2411924179.90822081
Upload Traits138222242021-12-17 10:54:201169 days ago1639738460IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.2911277877.36984365
Upload Traits138221982021-12-17 10:47:011169 days ago1639738021IN
0xfd79a6Cd...8a8CfBf12
0 ETH0.25900556.43716827
View all transactions

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

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

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

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

File 5 of 8 : ICryptoBees.sol
//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;
}

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

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

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

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

Contract Security Audit

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

690165c96647b38a20000060059081556006805462ffffff191662010101179055600461018081815263426f647960e01b6101a05260809081526101c08381526421b7b637b960d91b6101e05260a052610200828152634579657360e01b6102205260c0526102409283526409adeeae8d60db1b6102605260e092909252610280818152634e6f736560e01b6102a052610100526102c0908152632430b4b960e11b6102e05261012052600b6103009081526a4163636573736f7269657360a81b61032052610140526103806040526007610340908152664665656c65727360c81b6103605261016052620000f990600990600862000f80565b506040805160c081018252600160808201818152603560f81b60a0840152825282518084018452818152601b60f91b6020828101919091528084019190915283518085018552828152603760f81b81830152838501528351808501909452908352600760fb1b9083015260608101919091526200017b90601290600462000fd7565b503480156200018957600080fd5b50620001953362000f30565b6040805160c08101825260ff815260d76020820152607a91810191909152604c6060820152601e6080820152600f60a0820152620001d89060179060066200101c565b506040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526200021b90602f9060066200101c565b50604080516101e08101825260ff815260d96020820181905291810182905260e660608201819052608082019290925260cc60a082015260c0810182905260e081018290526101008101829052610120810182905261014081019190915260bf610160820181905261018082018190526101a082018190526101c0820152620002a990601890600f6200101c565b50604080516101e081018252600080825260208201819052600192820183905260026060830181905260036080840152600460a084015260c083019190915260e0820183905261010082018190526006610120830152600761014083015261016082018390526101808201929092526101a081019190915260056101c08201526200033990603090600f6200101c565b50604080516102208101825260ff815260ca602082015260bf9181019190915260b5606082015260d7608082015260f860a082015260c760c082015260c260e082015260bd61010082015260b861012082015260b361014082015260d961016082015260ae61018082018190526101a082018190526101c082018190526101e08201819052610200820152620003d49060199060116200101c565b5060408051610220810182526000808252602082018190526001928201839052600260608301819052600360808401819052600460a08501819052600560c0860152600660e08601526007610100860152600861012086015260096101408601526101608501939093526101808401949094526101a08301526101c082018390526101e0820152600a61020082015290602e90620004779291019060116200101c565b506040805160e08101825260ff815260e6602082015260cc9181019190915260c06060820181905260b36080830181905260a0830181905290820152620004c390601a9060076200101c565b506040805160e081018252600080825260208201819052600192820183905260026060830152608082015260a0810191909152600360c08201526200050d9060329060076200101c565b50604080516101208101825260ff8152607f602082015260cc9181019190915260e6606082015260736080820181905260a0820181905260c0820181905260e082018190526101008201526200056890601b9060096200101c565b5060408051610120810182526000808252602082015260019181018290526003606082015260056080820152600460a082015260c0810182905260e08101919091526002610100820152620005c29060339060096200101c565b506040805160608101825260ff815260636020820152603591810191909152620005f190601c9060036200101c565b5060408051606081018252600080825260208201819052918101919091526200061f9060349060036200101c565b506040805160e08101825260ff8152608c602082015260cc918101919091526066606082015260b36080820152605960a0820181905260c08201526200066a90601d9060076200101c565b506040805160e081018252600080825260208201819052600192820183905260026060830152608082015260a0810191909152600360c0820152620006b49060359060076200101c565b506040805160608101825260ff815260996020820181905291810191909152620006e390601f9060036200101c565b506040805160608101825260008082526020820152600191810191909152620007119060379060036200101c565b50604080516102608101825260ff815260dc602082015260b8918101919091526094606082015260de608082015260ba60a0820152609760c082015260e160e082015260bd6101008201526099610120820152607561014082015260f061016082015260cc61018082015260a86101a082015260856101c082015260916101e08201819052610200820152606161022082018190526102408201526016600a620007c09291019060136200101c565b5060408051610260810182526000808252602082015260019181019190915260026060820152600360808201819052600460a0830152600560c0830152600660e08301819052600761010084015260086101208401526009610140840152600a6101608401819052600b610180850152600c6101a0850152600d6101c08501526101e0840192909252610200830152610220820152600e6102408201526200086d9060389060136200101c565b50604080516101808101825260ff815260eb602082015260b891810182905260cc606082015260e1608082015260ae60a082015260f560c0820181905260e082018190526101008201526101208101829052610140810191909152607a610160820152620008e090602190600c6200101c565b5060408051610180810182526000808252602082018190526001928201839052600260608301819052600360808401819052600460a085015260c084019290925260e0830193909352600661010083015261012082019290925261014081019190915260056101608201526200095b90603990600c6200101c565b506040805160e08101825260ff815260e6602082015260cc9181019190915260b3606082018190526080820181905260a0820181905260c0820152620009a69060229060076200101c565b506040805160e0810182526000808252602082015260019181018290526003606082018190526080820192909252600260a082015260c0810191909152620009f390603a9060076200101c565b50604080516101008101825260ff815260cc60208201819052918101829052606081019190915260666080820181905260a0820181905260c0820181905260e082015262000a469060239060086200101c565b506040805161010081018252600080825260016020830152918101919091526002606082018190526003608083015260a0820152600460c0820181905260e082015262000a9890603b9060086200101c565b506040805160e08101825260ff8152605960208201819052918101919091526035606082018190526080820152602360a0820181905260c082015262000ae39060249060076200101c565b506040805160e081018252600080825260208201526001918101829052606081019190915260026080820181905260a0820152600360c082015262000b2d90603c9060076200101c565b506040805160808101825260ff8152606660208201526099918101919091526033606082015262000b639060259060046200101c565b5060408051608081018252600080825260208201526001918101829052606081019190915262000b9890603d9060046200101c565b506040805160c08101825260ff81526099602082018190529181018290526060810191909152604c6080820181905260a082015262000bdc9060279060066200101c565b506040805160c081018252600080825260208201526001918101829052606081019190915260026080820181905260a082015262000c1f90603f9060066200101c565b506040805160808101825260ff815260aa6020820152608e918101919091526071606082015262000c559060289060046200101c565b5060408051608081018252600080825260208201526001818301526002606082015262000c85919060046200101c565b506040805160e08101825260ff815260f3602082015260e69181019190915260d9606082015260cc608082015260c060a0820181905260b39082015262000cd19060299060076200101c565b506040805160e081018252600080825260208201526001918101919091526002606082015260036080820152600460a0820152600560c082015262000d1b9060419060076200101c565b50604080516101208101825260ff815260e660208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915262000d7690602b9060096200101c565b506040805161012081018252600080825260208201819052600192820183905260608201839052600360808301819052600460a084015260c083015260e082019290925261010081019190915262000dd39060439060096200101c565b50604080516101808101825260ff8152607a60208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152605c610140820152601e61016082015262000e4690602c90600c6200101c565b506040805161018081018252600080825260208201819052600192820183905260608201839052600460808301819052600360a084015260c0830191909152600260e08301819052610100830152610120820192909252600561014082015261016081019190915262000ebe90604490600c6200101c565b506040805160808101825260ff8152606660208201526099918101919091526033606082015262000ef490602d9060046200101c565b5060408051608081018252600080825260208201526001918101919091526002606082015262000f299060459060046200101c565b50620011f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b826008810192821562000fc5579160200282015b8281111562000fc5578251805162000fb4918491602090910190620010c5565b509160200191906001019062000f94565b5062000fd392915062001142565b5090565b826004810192821562000fc5579160200282015b8281111562000fc557825180516200100b918491602090910190620010c5565b509160200191906001019062000feb565b82805482825590600052602060002090601f01602090048101928215620010b75791602002820160005b838211156200108657835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262001046565b8015620010b55782816101000a81549060ff021916905560010160208160000104928301926001030262001086565b505b5062000fd392915062001163565b828054620010d390620011bc565b90600052602060002090601f016020900481019282620010f75760008555620010b7565b82601f106200111257805160ff1916838001178555620010b7565b82800160010185558215620010b7579182015b82811115620010b757825182559160200191906001019062001125565b8082111562000fd35760006200115982826200117a565b5060010162001142565b5b8082111562000fd3576000815560010162001164565b5080546200118890620011bc565b6000825580601f1062001199575050565b601f016020900490600052602060002090810190620011b9919062001163565b50565b600181811c90821680620011d157607f821691505b60208210811415620011f357634e487b7160e01b600052602260045260246000fd5b50919050565b613dbd80620012096000396000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c80638da5cb5b11610125578063c87b56dd116100ad578063edfdb76d1161007c578063edfdb76d146104bd578063f0395a0e146104d0578063f2fa6382146104e3578063f2fde38b146104ec578063f47c84c5146104ff57600080fd5b8063c87b56dd14610471578063cd43029814610484578063cdb6d2fc14610497578063d8952a49146104aa57600080fd5b8063a4a8be85116100f4578063a4a8be851461042c578063adaa1bad1461043f578063b13b25d414610447578063c002d23d1461045a578063c084f5401461046857600080fd5b80638da5cb5b146103bd5780639bf2ee35146103d8578063a1b8f374146103f9578063a2ecc4031461041957600080fd5b80634a7dd523116101a8578063715018a611610177578063715018a6146103695780637778b5d2146103715780637abecb86146103845780637cb6475914610397578063874fd9fa146103aa57600080fd5b80634a7dd5231461031b5780635ab510371461033b5780635c520a4b1461034957806368dba5e51461035657600080fd5b806327de8f27116101ef57806327de8f27146102ad57806333df4b2c146102c057806336838391146102d35780633faddaa5146102e657806347cd5f1c1461030857600080fd5b80628af2e614610220578063014681391461025a578063110428f81461026f578063161b384c1461028d575b600080fd5b61024361022e366004612d22565b60076020526000908152604090205460ff1681565b60405160ff90911681526020015b60405180910390f35b61026d610268366004612d4b565b610508565b005b61027f68a2a15d09519be0000081565b604051908152602001610251565b6102a061029b366004612d68565b610555565b6040516102519190612ddd565b61027f6102bb366004612d68565b610637565b6102436102ce366004612df0565b61067d565b6102436102e1366004612df0565b6106c3565b6006546102f890610100900460ff1681565b6040519015158152602001610251565b61026d610316366004612e6d565b6106d3565b61032e610329366004612d68565b610878565b6040516102519190612ef0565b61027f66c3663566a5800081565b6006546102f89060ff1681565b6102a0610364366004612d68565b6108c5565b61026d6111c2565b61026d61037f366004612fc8565b6111f8565b6102a0610392366004612d68565b61134f565b61026d6103a5366004612d68565b611868565b61026d6103b8366004612d68565b611897565b6000546040516001600160a01b039091168152602001610251565b6103eb6103e6366004613010565b6118c6565b604051610251929190613049565b61027f610407366004612d68565b60046020526000908152604090205481565b61026d610427366004612d4b565b6119fd565b6006546102f89062010000900460ff1681565b61027f600681565b61026d610455366004613077565b611a43565b61027f66d529ae9e86000081565b61027f61271081565b6102a061047f366004612d68565b611c17565b61026d6104923660046130fc565b611ca3565b61027f6104a5366004612fc8565b611cde565b61026d6104b836600461316e565b611e70565b61026d6104cb366004612d4b565b611ecb565b61026d6104de3660046131a1565b611f08565b61027f60055481565b61026d6104fa366004612d22565b611fd5565b61027f619c4081565b6000546001600160a01b0316331461053b5760405162461bcd60e51b8152600401610532906131f5565b60405180910390fd5b600680549115156101000261ff0019909216919091179055565b60025460405163745b90cb60e11b8152600481018390526060916001600160a01b03169063e8b721969060240160206040518083038186803b15801561059a57600080fd5b505afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d2919061322a565b6106285760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b6064820152608401610532565b61063182612070565b92915050565b6000614e208211610652575068a2a15d09519be00000919050565b617530821161066c57506901969368974c05b00000919050565b5069032d26d12e980b600000919050565b6016826018811061068d57600080fd5b01818154811061069c57600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b602e826018811061068d57600080fd5b6000546001600160a01b031633146106fd5760405162461bcd60e51b8152600401610532906131f5565b8281146107405760405162461bcd60e51b81526020600482015260116024820152704d69736d61746368656420696e7075747360781b6044820152606401610532565b60005b8381101561087057604051806040016040528086868481811061076857610768613247565b905060200281019061077a919061325d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020018484848181106107c6576107c6613247565b90506020028101906107d8919061325d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452505060ff808a1682526011602090815260408084209287168452918152912083518051919350610840928492910190612b9d565b5060208281015180516108599260018501920190612b9d565b509050508080610868906132ba565b915050610743565b505050505050565b610880612c21565b6002546001600160a01b0316336001600160a01b0316146108b35760405162461bcd60e51b8152600401610532906132d5565b60006108be836121b4565b9392505050565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b15801561091057600080fd5b505afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190613369565b9050600061095584612070565b9050600080836000015160ff161161096e576000610987565b825161097c90600190613443565b610987906008613466565b90506060610ae26009600101805461099e9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546109ca9061348f565b8015610a175780601f106109ec57610100808354040283529160200191610a17565b820191906000526020600020905b8154815290600101906020018083116109fa57829003601f168201915b505050505060116000856001610a2d91906134c4565b60ff9081168252602080830193909352604091820160009081208a8501519092168152925290208054610a5f9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b9061348f565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050612356565b610bb660096002018054610af59061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b219061348f565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505060116000866002610b8491906134c4565b60ff9081168252602080830193909352604091820160009081208b8401519092168152925290208054610a5f9061348f565b610c8b60096003018054610bc99061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf59061348f565b8015610c425780601f10610c1757610100808354040283529160200191610c42565b820191906000526020600020905b815481529060010190602001808311610c2557829003601f168201915b505050505060116000876003610c5891906134c4565b60ff90811682526020808301939093526040918201600090812060608d01519092168152925290208054610a5f9061348f565b610d6060096005018054610c9e9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cca9061348f565b8015610d175780601f10610cec57610100808354040283529160200191610d17565b820191906000526020600020905b815481529060010190602001808311610cfa57829003601f168201915b505050505060116000886005610d2d91906134c4565b60ff90811682526020808301939093526040918201600090812060a08e01519092168152925290208054610a5f9061348f565b610e3560096006018054610d739061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9f9061348f565b8015610dec5780601f10610dc157610100808354040283529160200191610dec565b820191906000526020600020905b815481529060010190602001808311610dcf57829003601f168201915b505050505060116000896006610e0291906134c4565b60ff90811682526020808301939093526040918201600090812060c08f01519092168152925290208054610a5f9061348f565b604051602001610e49959493929190613505565b6040516020818303038152906040529050836000015160ff16600314610f625780610f3f60096004018054610e7d9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea99061348f565b8015610ef65780601f10610ecb57610100808354040283529160200191610ef6565b820191906000526020600020905b815481529060010190602001808311610ed957829003601f168201915b505050505060116000866004610f0c91906134c4565b60ff90811682526020808301939093526040918201600090812060808c01519092168152925290208054610a5f9061348f565b604051602001610f509291906135a4565b60405160208183030381529060405290505b836000015160ff1660011415611078578061105160096007018054610f869061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb29061348f565b8015610fff5780601f10610fd457610100808354040283529160200191610fff565b820191906000526020600020905b815481529060010190602001808311610fe257829003601f168201915b5050600760009081526011602090815260e08c015160ff1682527f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c9052604090208054909350610a5f9250905061348f565b6040516020016110629291906135a4565b6040516020818303038152906040529050611144565b836000015160ff16600214156110d45780611051604051806040016040528060088152602001670a6e8e4cadccee8d60c31b815250601287610100015160ff16600481106110c8576110c8613247565b018054610a5f9061348f565b836000015160ff166003141561114457806111216040518060400160405280600581526020016414dada5b1b60da1b815250601287610100015160ff16600481106110c8576110c8613247565b6040516020016111329291906135a4565b60405160208183030381529060405290505b8061271087111561117457604051806040016040528060078152602001661123b2b710189160c91b815250611195565b604051806040016040528060078152602001661123b2b710181160c91b8152505b846040516020016111a8939291906135df565b604051602081830303815290604052945050505050919050565b6000546001600160a01b031633146111ec5760405162461bcd60e51b8152600401610532906131f5565b6111f66000612382565b565b6002546001600160a01b0316336001600160a01b03161461122b5760405162461bcd60e51b8152600401610532906132d5565b61123b84848460008060006123d2565b600060015b8481116112e1576112546102bb828661369f565b61125e908361369f565b6002549092506001600160a01b031663d1a1beb48761127d848861369f565b866040518463ffffffff1660e01b815260040161129c939291906136b7565b600060405180830381600087803b1580156112b657600080fd5b505af11580156112ca573d6000803e3d6000fd5b5050505080806112d9906132ba565b915050611240565b50600354604051632770a7eb60e21b81526001600160a01b0387811660048301526024820184905290911690639dc29fac90604401600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b505050505050505050565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b15801561139a57600080fd5b505afa1580156113ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d29190613369565b9050600080826000015160ff16116113eb576000611404565b81516113f990600190613443565b611404906008613466565b825190915060609060ff166114225761141b61271c565b905061183e565b61158f6011600061143385826134c4565b60ff1660ff16815260200190815260200160002060008060ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546114a29061348f565b80156114ef5780601f106114c4576101008083540402835291602001916114ef565b820191906000526020600020905b8154815290600101906020018083116114d257829003601f168201915b505050505081526020016001820180546115089061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546115349061348f565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b505050505081525050612744565b6115eb601160006115a18660016134c4565b60ff1660ff1681526020019081526020016000206000866020015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b611647601160006115fd8760026134c4565b60ff1660ff1681526020019081526020016000206000876040015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6116a3601160006116598860036134c4565b60ff1660ff1681526020019081526020016000206000886060015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6116ff601160006116b58960046134c4565b60ff1660ff1681526020019081526020016000206000896080015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b61175b601160006117118a60056134c4565b60ff1660ff16815260200190815260200160002060008a60a0015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6117b76011600061176d8b60066134c4565b60ff1660ff16815260200190815260200160002060008b60c0015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b600760009081526011602090815260e08c015160ff1682527f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c905260409081902081518083019092528054611815929190829082906114769061348f565b60405160200161182c9897969594939291906136da565b60405160208183030381529060405290505b8060405160200161184f919061377f565b6040516020818303038152906040529350505050919050565b6000546001600160a01b031633146118925760405162461bcd60e51b8152600401610532906131f5565b600855565b6000546001600160a01b031633146118c15760405162461bcd60e51b8152600401610532906131f5565b600555565b60116020908152600092835260408084209091529082529020805481906118ec9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546119189061348f565b80156119655780601f1061193a57610100808354040283529160200191611965565b820191906000526020600020905b81548152906001019060200180831161194857829003601f168201915b50505050509080600101805461197a9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546119a69061348f565b80156119f35780601f106119c8576101008083540402835291602001916119f3565b820191906000526020600020905b8154815290600101906020018083116119d657829003601f168201915b5050505050905082565b6000546001600160a01b03163314611a275760405162461bcd60e51b8152600401610532906131f5565b60068054911515620100000262ff000019909216919091179055565b6002546001600160a01b0316336001600160a01b031614611a765760405162461bcd60e51b8152600401610532906132d5565b6040516bffffffffffffffffffffffff19606089901b166020820152600090603401604051602081830303815290604052805190602001209050611af1848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506008549150849050612791565b611b3d5760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f74206f6e207468652077686974656c697374210000006044820152606401610532565b611b4d88888860018960016123d2565b60015b878111611344576002546001600160a01b031663d1a1beb48a611b73848b61369f565b866040518463ffffffff1660e01b8152600401611b92939291906136b7565b600060405180830381600087803b158015611bac57600080fd5b505af1158015611bc0573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600760205260408120805460ff1691611beb8361386c565b91906101000a81548160ff021916908360ff160217905550508080611c0f906132ba565b915050611b50565b60606000611c2483612070565b9050600081611c32856127a7565b83611c44611c3f8861134f565b6128ad565b611c4d886108c5565b604051602001611c6195949392919061388c565b6040516020818303038152906040529050611c7b816128ad565b604051602001611c8b9190613a6f565b60405160208183030381529060405292505050919050565b6000546001600160a01b03163314611ccd5760405162461bcd60e51b8152600401610532906131f5565b611cd960018383612c7d565b505050565b6002546000906001600160a01b0316336001600160a01b031614611d145760405162461bcd60e51b8152600401610532906132d5565b600654610100900460ff1615611d625760405162461bcd60e51b815260206004820152601360248201527215d3d3d3081b5a5b9d1a5b99c81c185d5cd959606a1b6044820152606401610532565b612710611d6f858561369f565b1115611dbd5760405162461bcd60e51b815260206004820152601f60248201527f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c64006044820152606401610532565b611dcd85858560008060006123d2565b60015b848111611e6757600554611de4908361369f565b6002549092506001600160a01b031663d1a1beb487611e03848861369f565b866040518463ffffffff1660e01b8152600401611e22939291906136b7565b600060405180830381600087803b158015611e3c57600080fd5b505af1158015611e50573d6000803e3d6000fd5b505050508080611e5f906132ba565b915050611dd0565b50949350505050565b6000546001600160a01b03163314611e9a5760405162461bcd60e51b8152600401610532906131f5565b600380546001600160a01b039283166001600160a01b03199182161790915560028054939092169216919091179055565b6000546001600160a01b03163314611ef55760405162461bcd60e51b8152600401610532906131f5565b6006805460ff1916911515919091179055565b6002546001600160a01b0316336001600160a01b031614611f3b5760405162461bcd60e51b8152600401610532906132d5565b611f4b85858560008660016123d2565b60015b848111610870576002546001600160a01b031663d1a1beb487611f71848861369f565b856040518463ffffffff1660e01b8152600401611f90939291906136b7565b600060405180830381600087803b158015611faa57600080fd5b505af1158015611fbe573d6000803e3d6000fd5b505050508080611fcd906132ba565b915050611f4e565b6000546001600160a01b03163314611fff5760405162461bcd60e51b8152600401610532906131f5565b6001600160a01b0381166120645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610532565b61206d81612382565b50565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b1580156120bb57600080fd5b505afa1580156120cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f39190613369565b519050600160ff8216141561212357505060408051808201909152600381526242454560e81b6020820152919050565b8060ff16600214156121515750506040805180820190915260048152632122a0a960e11b6020820152919050565b8060ff16600314156121845750506040805180820190915260098152682122a2a5a2a2a822a960b91b6020820152919050565b505060408051808201909152600c81526b1393d508149155915053115160a21b6020820152919050565b50919050565b6121bc612c21565b60006121cd606461ffff8516613aca565b600183529050806121e157600382526121ef565b600a8110156121ef57600282525b815160009060ff1661220257600061221b565b825161221090600190613443565b61221b906008613466565b60109490941c93905061223c61ffff85166122378360016134c4565b612a15565b60ff16602084015260109390931c9261225e61ffff85166122378360026134c4565b60ff16604084015260109390931c9261228061ffff85166122378360036134c4565b60ff90811660608501528351166003146122b75760109390931c926122ae61ffff85166122378360046134c4565b60ff1660808401525b60109390931c926122d161ffff85166122378360056134c4565b60ff1660a084015260109390931c926122f361ffff85166122378360066134c4565b60ff90811660c08501528351166001141561232b57601084901c935061231e8461ffff166007612a15565b60ff1660e084015261234f565b60109390931c9261234561ffff85166122378360076134c4565b60ff166101008401525b5050919050565b6060828260405160200161236b929190613ade565b604051602081830303815290604052905092915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b326001600160a01b038716146124155760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b6044820152606401610532565b619c40612422868661369f565b11156124645760405162461bcd60e51b8152602060048201526011602482015270105b1b081d1bdad95b9cc81b5a5b9d1959607a1b6044820152606401610532565b821561253c5760065460ff16156124b35760405162461bcd60e51b8152602060048201526013602482015272141c995cd85b19481b5a5b9d081c185d5cd959606a1b6044820152606401610532565b6000851180156124eb57506001600160a01b0386166000908152600760205260409020546006906124e890879060ff1661369f565b11155b6125375760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c79206c696d6974656420616d6f756e7420666f7220574c206d696e74006044820152606401610532565b612599565b60008511801561254d5750600a8511155b6125995760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d696e7420616d6f756e742073616c6500000000000000006044820152606401610532565b8015610870576127106125ac868661369f565b11156125fa5760405162461bcd60e51b815260206004820152601f60248201527f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c64006044820152606401610532565b8215612664578161261266c3663566a5800087613b4f565b1461265f5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964207061796d656e7420616d6f756e742070726573616c6500006044820152606401610532565b610870565b8161267666d529ae9e86000087613b4f565b146126c35760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964207061796d656e7420616d6f756e742073616c6500000000006044820152606401610532565b60065462010000900460ff16156108705760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632073616c652063757272656e746c7920706175736564000000006044820152606401610532565b606060016040516020016127309190613c19565b604051602081830303815290604052905090565b60608160200151516000141561276857505060408051602081019091526000815290565b60208083015160405161277b9201613cc9565b6040516020818303038152906040529050919050565b60008261279e8584612af1565b14949350505050565b6060816127cb5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127f557806127df816132ba565b91506127ee9050600a83613cfa565b91506127cf565b60008167ffffffffffffffff811115612810576128106132fa565b6040519080825280601f01601f19166020018201604052801561283a576020820181803683370190505b5090505b84156128a55761284f600183613d0e565b915061285c600a86613aca565b61286790603061369f565b60f81b81838151811061287c5761287c613247565b60200101906001600160f81b031916908160001a90535061289e600a86613cfa565b945061283e565b949350505050565b60608151600014156128cd57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d4860409139905060006003845160026128fc919061369f565b6129069190613cfa565b612911906004613b4f565b9050600061292082602061369f565b67ffffffffffffffff811115612938576129386132fa565b6040519080825280601f01601f191660200182016040528015612962576020820181803683370190505b509050818152600183018586518101602084015b818310156129d05760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612976565b6003895106600181146129ea57600281146129fb57612a07565b613d3d60f01b600119830152612a07565b603d60f81b6000198301525b509398975050505050505050565b60008060168360ff1660188110612a2e57612a2e613247565b0154612a3a9085613d25565b905060168360ff1660188110612a5257612a52613247565b018160ff1681548110612a6757612a67613247565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015612a9d579050610631565b602e8360ff1660188110612ab357612ab3613247565b018160ff1681548110612ac857612ac8613247565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b600081815b8451811015612b95576000858281518110612b1357612b13613247565b60200260200101519050808311612b55576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b82565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b8d816132ba565b915050612af6565b509392505050565b828054612ba99061348f565b90600052602060002090601f016020900481019282612bcb5760008555612c11565b82601f10612be457805160ff1916838001178555612c11565b82800160010185558215612c11579182015b82811115612c11578251825591602001919060010190612bf6565b50612c1d929150612cf1565b5090565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b828054612c899061348f565b90600052602060002090601f016020900481019282612cab5760008555612c11565b82601f10612cc45782800160ff19823516178555612c11565b82800160010185558215612c11579182015b82811115612c11578235825591602001919060010190612cd6565b5b80821115612c1d5760008155600101612cf2565b80356001600160a01b0381168114612d1d57600080fd5b919050565b600060208284031215612d3457600080fd5b6108be82612d06565b801515811461206d57600080fd5b600060208284031215612d5d57600080fd5b81356108be81612d3d565b600060208284031215612d7a57600080fd5b5035919050565b60005b83811015612d9c578181015183820152602001612d84565b83811115612dab576000848401525b50505050565b60008151808452612dc9816020860160208601612d81565b601f01601f19169290920160200192915050565b6020815260006108be6020830184612db1565b60008060408385031215612e0357600080fd5b50508035926020909101359150565b60ff8116811461206d57600080fd5b60008083601f840112612e3357600080fd5b50813567ffffffffffffffff811115612e4b57600080fd5b6020830191508360208260051b8501011115612e6657600080fd5b9250929050565b600080600080600060608688031215612e8557600080fd5b8535612e9081612e12565b9450602086013567ffffffffffffffff80821115612ead57600080fd5b612eb989838a01612e21565b90965094506040880135915080821115612ed257600080fd5b50612edf88828901612e21565b969995985093965092949392505050565b815160ff16815261016081016020830151612f10602084018260ff169052565b506040830151612f25604084018260ff169052565b506060830151612f3a606084018260ff169052565b506080830151612f4f608084018260ff169052565b5060a0830151612f6460a084018260ff169052565b5060c0830151612f7960c084018260ff169052565b5060e0830151612f8e60e084018260ff169052565b506101008381015160ff16908301526101208084015165ffffffffffff908116918401919091526101409384015116929091019190915290565b60008060008060808587031215612fde57600080fd5b612fe785612d06565b93506020850135925060408501359150606085013561300581612d3d565b939692955090935050565b6000806040838503121561302357600080fd5b823561302e81612e12565b9150602083013561303e81612e12565b809150509250929050565b60408152600061305c6040830185612db1565b828103602084015261306e8185612db1565b95945050505050565b600080600080600080600060c0888a03121561309257600080fd5b61309b88612d06565b9650602088013595506040880135945060608801359350608088013567ffffffffffffffff8111156130cc57600080fd5b6130d88a828b01612e21565b90945092505060a08801356130ec81612d3d565b8091505092959891949750929550565b6000806020838503121561310f57600080fd5b823567ffffffffffffffff8082111561312757600080fd5b818501915085601f83011261313b57600080fd5b81358181111561314a57600080fd5b86602082850101111561315c57600080fd5b60209290920196919550909350505050565b6000806040838503121561318157600080fd5b61318a83612d06565b915061319860208401612d06565b90509250929050565b600080600080600060a086880312156131b957600080fd5b6131c286612d06565b945060208601359350604086013592506060860135915060808601356131e781612d3d565b809150509295509295909350565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561323c57600080fd5b81516108be81612d3d565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261327457600080fd5b83018035915067ffffffffffffffff82111561328f57600080fd5b602001915036819003821315612e6657600080fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156132ce576132ce6132a4565b5060010190565b6020808252600b908201526a444f4e542043484541542160a81b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561334257634e487b7160e01b600052604160045260246000fd5b60405290565b8051612d1d81612e12565b805165ffffffffffff81168114612d1d57600080fd5b6000610160828403121561337c57600080fd5b613384613310565b61338d83613348565b815261339b60208401613348565b60208201526133ac60408401613348565b60408201526133bd60608401613348565b60608201526133ce60808401613348565b60808201526133df60a08401613348565b60a08201526133f060c08401613348565b60c082015261340160e08401613348565b60e0820152610100613414818501613348565b90820152610120613426848201613353565b90820152610140613438848201613353565b908201529392505050565b600060ff821660ff84168082101561345d5761345d6132a4565b90039392505050565b600060ff821660ff84168160ff0481118215151615613487576134876132a4565b029392505050565b600181811c908216806134a357607f821691505b602082108114156121ae57634e487b7160e01b600052602260045260246000fd5b600060ff821660ff84168060ff038211156134e1576134e16132a4565b019392505050565b600081516134fb818560208601612d81565b9290920192915050565b60008651613517818460208b01612d81565b8083019050600b60fa1b8082528751613537816001850160208c01612d81565b600192019182018190528651613554816002850160208b01612d81565b600292019182018190528551613571816003850160208a01612d81565b60039201918201819052845161358e816004850160208901612d81565b6004920191820152600501979650505050505050565b600083516135b6818460208801612d81565b8351908301906135ca818360208801612d81565b600b60fa1b9101908152600101949350505050565b605b60f81b8152600084516135fb816001850160208901612d81565b7f7b2274726169745f74797065223a2247656e65726174696f6e222c2276616c756001918401918201526232911d60e91b60218201528451613644816024840160208901612d81565b7f7d2c7b2274726169745f74797065223a2254797065222c2276616c7565223a22602492909101918201528351613682816044840160208801612d81565b62227d5d60e81b6044929091019182015260470195945050505050565b600082198211156136b2576136b26132a4565b500190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6000895160206136ed8285838f01612d81565b8a51918401916137008184848f01612d81565b8a519201916137128184848e01612d81565b89519201916137248184848d01612d81565b88519201916137368184848c01612d81565b87519201916137488184848b01612d81565b865192019161375a8184848a01612d81565b855192019161376c8184848901612d81565b919091019b9a5050505050505050505050565b7f3c7376672069643d2263727970746f62656573222077696474683d223130302581527f22206865696768743d2231303025222076657273696f6e3d22312e312220766960208201527f6577426f783d223020302034302034302220786d6c6e733d22687474703a2f2f60408201527f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b60608201527f3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b223e60808201526000825161384f8160a0850160208701612d81565b651e17b9bb339f60d11b60a093909101928301525060a601919050565b600060ff821660ff811415613883576138836132a4565b60010192915050565b693d913730b6b2911d101160b11b815285516000906138b281600a850160208b01612d81565b61202360f01b600a9184019182015286516138d481600c840160208b01612d81565b6b111610113a3cb832911d101160a11b600c92909101918201528551613901816018840160208a01612d81565b7f222c20226465736372697074696f6e223a202250656f706c65207265616c697a910160188101919091527f6564207468617420746865207061746820746f2070726f73706572697479206960388201527f7320746f2072656c6f6361746520746f2061206661726d2e20536f6d6520686160588201527f766520626f756768742073686565702c20736f6d65206c616e6420627574206d60788201527f616e7920656e6465642075702077697468206e6f7468696e672e2024484f4e4560988201527f5920697320746865206e6577206f70706f7274756e6974792e0000000000000060b88201527f222c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260d182015265185cd94d8d0b60d21b60f1820152613a63613a56613a50613a3560f78501896134e9565b6e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b866134e9565b607d60f81b815260010190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613aa781601d850160208701612d81565b91909101601d0192915050565b634e487b7160e01b600052601260045260246000fd5b600082613ad957613ad9613ab4565b500690565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090613b0981600f850160208801612d81565b6a1116113b30b63ab2911d1160a91b600f918401918201528351613b3481601a840160208801612d81565b61227d60f01b601a9290910191820152601c01949350505050565b6000816000190483118215151615613b6957613b696132a4565b500290565b7f3c696d61676520783d22342220793d2234222077696474683d2233322220686581527f696768743d2233322220696d6167652d72656e646572696e673d22706978656c60208201527f6174656422207072657365727665417370656374526174696f3d22784d69645960408201527f4d69642220786c696e6b3a687265663d22646174613a696d6167652f706e673b60608201526618985cd94d8d0b60ca1b608082015260870190565b6000613c2482613b6e565b8354600090600181811c9080831680613c3e57607f831692505b6020808410821415613c5e57634e487b7160e01b86526022600452602486fd5b818015613c725760018114613c8357613cb0565b60ff19861688528488019650613cb0565b60008b81526020902060005b86811015613ca85781548a820152908501908301613c8f565b505084880196505b50505050505061306e816211179f60e91b815260030190565b6000613cd482613b6e565b8351613ce4818360208801612d81565b6211179f60e91b91019081526003019392505050565b600082613d0957613d09613ab4565b500490565b600082821015613d2057613d206132a4565b500390565b600060ff831680613d3857613d38613ab4565b8060ff8416069150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e0a6b5efc594d8cf092b6b8ca8780522fa1c713e6ebe42127d74a28a8c82e5e164736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021b5760003560e01c80638da5cb5b11610125578063c87b56dd116100ad578063edfdb76d1161007c578063edfdb76d146104bd578063f0395a0e146104d0578063f2fa6382146104e3578063f2fde38b146104ec578063f47c84c5146104ff57600080fd5b8063c87b56dd14610471578063cd43029814610484578063cdb6d2fc14610497578063d8952a49146104aa57600080fd5b8063a4a8be85116100f4578063a4a8be851461042c578063adaa1bad1461043f578063b13b25d414610447578063c002d23d1461045a578063c084f5401461046857600080fd5b80638da5cb5b146103bd5780639bf2ee35146103d8578063a1b8f374146103f9578063a2ecc4031461041957600080fd5b80634a7dd523116101a8578063715018a611610177578063715018a6146103695780637778b5d2146103715780637abecb86146103845780637cb6475914610397578063874fd9fa146103aa57600080fd5b80634a7dd5231461031b5780635ab510371461033b5780635c520a4b1461034957806368dba5e51461035657600080fd5b806327de8f27116101ef57806327de8f27146102ad57806333df4b2c146102c057806336838391146102d35780633faddaa5146102e657806347cd5f1c1461030857600080fd5b80628af2e614610220578063014681391461025a578063110428f81461026f578063161b384c1461028d575b600080fd5b61024361022e366004612d22565b60076020526000908152604090205460ff1681565b60405160ff90911681526020015b60405180910390f35b61026d610268366004612d4b565b610508565b005b61027f68a2a15d09519be0000081565b604051908152602001610251565b6102a061029b366004612d68565b610555565b6040516102519190612ddd565b61027f6102bb366004612d68565b610637565b6102436102ce366004612df0565b61067d565b6102436102e1366004612df0565b6106c3565b6006546102f890610100900460ff1681565b6040519015158152602001610251565b61026d610316366004612e6d565b6106d3565b61032e610329366004612d68565b610878565b6040516102519190612ef0565b61027f66c3663566a5800081565b6006546102f89060ff1681565b6102a0610364366004612d68565b6108c5565b61026d6111c2565b61026d61037f366004612fc8565b6111f8565b6102a0610392366004612d68565b61134f565b61026d6103a5366004612d68565b611868565b61026d6103b8366004612d68565b611897565b6000546040516001600160a01b039091168152602001610251565b6103eb6103e6366004613010565b6118c6565b604051610251929190613049565b61027f610407366004612d68565b60046020526000908152604090205481565b61026d610427366004612d4b565b6119fd565b6006546102f89062010000900460ff1681565b61027f600681565b61026d610455366004613077565b611a43565b61027f66d529ae9e86000081565b61027f61271081565b6102a061047f366004612d68565b611c17565b61026d6104923660046130fc565b611ca3565b61027f6104a5366004612fc8565b611cde565b61026d6104b836600461316e565b611e70565b61026d6104cb366004612d4b565b611ecb565b61026d6104de3660046131a1565b611f08565b61027f60055481565b61026d6104fa366004612d22565b611fd5565b61027f619c4081565b6000546001600160a01b0316331461053b5760405162461bcd60e51b8152600401610532906131f5565b60405180910390fd5b600680549115156101000261ff0019909216919091179055565b60025460405163745b90cb60e11b8152600481018390526060916001600160a01b03169063e8b721969060240160206040518083038186803b15801561059a57600080fd5b505afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d2919061322a565b6106285760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b6064820152608401610532565b61063182612070565b92915050565b6000614e208211610652575068a2a15d09519be00000919050565b617530821161066c57506901969368974c05b00000919050565b5069032d26d12e980b600000919050565b6016826018811061068d57600080fd5b01818154811061069c57600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b602e826018811061068d57600080fd5b6000546001600160a01b031633146106fd5760405162461bcd60e51b8152600401610532906131f5565b8281146107405760405162461bcd60e51b81526020600482015260116024820152704d69736d61746368656420696e7075747360781b6044820152606401610532565b60005b8381101561087057604051806040016040528086868481811061076857610768613247565b905060200281019061077a919061325d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020018484848181106107c6576107c6613247565b90506020028101906107d8919061325d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452505060ff808a1682526011602090815260408084209287168452918152912083518051919350610840928492910190612b9d565b5060208281015180516108599260018501920190612b9d565b509050508080610868906132ba565b915050610743565b505050505050565b610880612c21565b6002546001600160a01b0316336001600160a01b0316146108b35760405162461bcd60e51b8152600401610532906132d5565b60006108be836121b4565b9392505050565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b15801561091057600080fd5b505afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190613369565b9050600061095584612070565b9050600080836000015160ff161161096e576000610987565b825161097c90600190613443565b610987906008613466565b90506060610ae26009600101805461099e9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546109ca9061348f565b8015610a175780601f106109ec57610100808354040283529160200191610a17565b820191906000526020600020905b8154815290600101906020018083116109fa57829003601f168201915b505050505060116000856001610a2d91906134c4565b60ff9081168252602080830193909352604091820160009081208a8501519092168152925290208054610a5f9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b9061348f565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050612356565b610bb660096002018054610af59061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b219061348f565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505060116000866002610b8491906134c4565b60ff9081168252602080830193909352604091820160009081208b8401519092168152925290208054610a5f9061348f565b610c8b60096003018054610bc99061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf59061348f565b8015610c425780601f10610c1757610100808354040283529160200191610c42565b820191906000526020600020905b815481529060010190602001808311610c2557829003601f168201915b505050505060116000876003610c5891906134c4565b60ff90811682526020808301939093526040918201600090812060608d01519092168152925290208054610a5f9061348f565b610d6060096005018054610c9e9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cca9061348f565b8015610d175780601f10610cec57610100808354040283529160200191610d17565b820191906000526020600020905b815481529060010190602001808311610cfa57829003601f168201915b505050505060116000886005610d2d91906134c4565b60ff90811682526020808301939093526040918201600090812060a08e01519092168152925290208054610a5f9061348f565b610e3560096006018054610d739061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9f9061348f565b8015610dec5780601f10610dc157610100808354040283529160200191610dec565b820191906000526020600020905b815481529060010190602001808311610dcf57829003601f168201915b505050505060116000896006610e0291906134c4565b60ff90811682526020808301939093526040918201600090812060c08f01519092168152925290208054610a5f9061348f565b604051602001610e49959493929190613505565b6040516020818303038152906040529050836000015160ff16600314610f625780610f3f60096004018054610e7d9061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea99061348f565b8015610ef65780601f10610ecb57610100808354040283529160200191610ef6565b820191906000526020600020905b815481529060010190602001808311610ed957829003601f168201915b505050505060116000866004610f0c91906134c4565b60ff90811682526020808301939093526040918201600090812060808c01519092168152925290208054610a5f9061348f565b604051602001610f509291906135a4565b60405160208183030381529060405290505b836000015160ff1660011415611078578061105160096007018054610f869061348f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb29061348f565b8015610fff5780601f10610fd457610100808354040283529160200191610fff565b820191906000526020600020905b815481529060010190602001808311610fe257829003601f168201915b5050600760009081526011602090815260e08c015160ff1682527f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c9052604090208054909350610a5f9250905061348f565b6040516020016110629291906135a4565b6040516020818303038152906040529050611144565b836000015160ff16600214156110d45780611051604051806040016040528060088152602001670a6e8e4cadccee8d60c31b815250601287610100015160ff16600481106110c8576110c8613247565b018054610a5f9061348f565b836000015160ff166003141561114457806111216040518060400160405280600581526020016414dada5b1b60da1b815250601287610100015160ff16600481106110c8576110c8613247565b6040516020016111329291906135a4565b60405160208183030381529060405290505b8061271087111561117457604051806040016040528060078152602001661123b2b710189160c91b815250611195565b604051806040016040528060078152602001661123b2b710181160c91b8152505b846040516020016111a8939291906135df565b604051602081830303815290604052945050505050919050565b6000546001600160a01b031633146111ec5760405162461bcd60e51b8152600401610532906131f5565b6111f66000612382565b565b6002546001600160a01b0316336001600160a01b03161461122b5760405162461bcd60e51b8152600401610532906132d5565b61123b84848460008060006123d2565b600060015b8481116112e1576112546102bb828661369f565b61125e908361369f565b6002549092506001600160a01b031663d1a1beb48761127d848861369f565b866040518463ffffffff1660e01b815260040161129c939291906136b7565b600060405180830381600087803b1580156112b657600080fd5b505af11580156112ca573d6000803e3d6000fd5b5050505080806112d9906132ba565b915050611240565b50600354604051632770a7eb60e21b81526001600160a01b0387811660048301526024820184905290911690639dc29fac90604401600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b505050505050505050565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b15801561139a57600080fd5b505afa1580156113ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d29190613369565b9050600080826000015160ff16116113eb576000611404565b81516113f990600190613443565b611404906008613466565b825190915060609060ff166114225761141b61271c565b905061183e565b61158f6011600061143385826134c4565b60ff1660ff16815260200190815260200160002060008060ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546114a29061348f565b80156114ef5780601f106114c4576101008083540402835291602001916114ef565b820191906000526020600020905b8154815290600101906020018083116114d257829003601f168201915b505050505081526020016001820180546115089061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546115349061348f565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b505050505081525050612744565b6115eb601160006115a18660016134c4565b60ff1660ff1681526020019081526020016000206000866020015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b611647601160006115fd8760026134c4565b60ff1660ff1681526020019081526020016000206000876040015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6116a3601160006116598860036134c4565b60ff1660ff1681526020019081526020016000206000886060015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6116ff601160006116b58960046134c4565b60ff1660ff1681526020019081526020016000206000896080015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b61175b601160006117118a60056134c4565b60ff1660ff16815260200190815260200160002060008a60a0015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b6117b76011600061176d8b60066134c4565b60ff1660ff16815260200190815260200160002060008b60c0015160ff1660ff1681526020019081526020016000206040518060400160405290816000820180546114769061348f565b600760009081526011602090815260e08c015160ff1682527f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c905260409081902081518083019092528054611815929190829082906114769061348f565b60405160200161182c9897969594939291906136da565b60405160208183030381529060405290505b8060405160200161184f919061377f565b6040516020818303038152906040529350505050919050565b6000546001600160a01b031633146118925760405162461bcd60e51b8152600401610532906131f5565b600855565b6000546001600160a01b031633146118c15760405162461bcd60e51b8152600401610532906131f5565b600555565b60116020908152600092835260408084209091529082529020805481906118ec9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546119189061348f565b80156119655780601f1061193a57610100808354040283529160200191611965565b820191906000526020600020905b81548152906001019060200180831161194857829003601f168201915b50505050509080600101805461197a9061348f565b80601f01602080910402602001604051908101604052809291908181526020018280546119a69061348f565b80156119f35780601f106119c8576101008083540402835291602001916119f3565b820191906000526020600020905b8154815290600101906020018083116119d657829003601f168201915b5050505050905082565b6000546001600160a01b03163314611a275760405162461bcd60e51b8152600401610532906131f5565b60068054911515620100000262ff000019909216919091179055565b6002546001600160a01b0316336001600160a01b031614611a765760405162461bcd60e51b8152600401610532906132d5565b6040516bffffffffffffffffffffffff19606089901b166020820152600090603401604051602081830303815290604052805190602001209050611af1848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506008549150849050612791565b611b3d5760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f74206f6e207468652077686974656c697374210000006044820152606401610532565b611b4d88888860018960016123d2565b60015b878111611344576002546001600160a01b031663d1a1beb48a611b73848b61369f565b866040518463ffffffff1660e01b8152600401611b92939291906136b7565b600060405180830381600087803b158015611bac57600080fd5b505af1158015611bc0573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600760205260408120805460ff1691611beb8361386c565b91906101000a81548160ff021916908360ff160217905550508080611c0f906132ba565b915050611b50565b60606000611c2483612070565b9050600081611c32856127a7565b83611c44611c3f8861134f565b6128ad565b611c4d886108c5565b604051602001611c6195949392919061388c565b6040516020818303038152906040529050611c7b816128ad565b604051602001611c8b9190613a6f565b60405160208183030381529060405292505050919050565b6000546001600160a01b03163314611ccd5760405162461bcd60e51b8152600401610532906131f5565b611cd960018383612c7d565b505050565b6002546000906001600160a01b0316336001600160a01b031614611d145760405162461bcd60e51b8152600401610532906132d5565b600654610100900460ff1615611d625760405162461bcd60e51b815260206004820152601360248201527215d3d3d3081b5a5b9d1a5b99c81c185d5cd959606a1b6044820152606401610532565b612710611d6f858561369f565b1115611dbd5760405162461bcd60e51b815260206004820152601f60248201527f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c64006044820152606401610532565b611dcd85858560008060006123d2565b60015b848111611e6757600554611de4908361369f565b6002549092506001600160a01b031663d1a1beb487611e03848861369f565b866040518463ffffffff1660e01b8152600401611e22939291906136b7565b600060405180830381600087803b158015611e3c57600080fd5b505af1158015611e50573d6000803e3d6000fd5b505050508080611e5f906132ba565b915050611dd0565b50949350505050565b6000546001600160a01b03163314611e9a5760405162461bcd60e51b8152600401610532906131f5565b600380546001600160a01b039283166001600160a01b03199182161790915560028054939092169216919091179055565b6000546001600160a01b03163314611ef55760405162461bcd60e51b8152600401610532906131f5565b6006805460ff1916911515919091179055565b6002546001600160a01b0316336001600160a01b031614611f3b5760405162461bcd60e51b8152600401610532906132d5565b611f4b85858560008660016123d2565b60015b848111610870576002546001600160a01b031663d1a1beb487611f71848861369f565b856040518463ffffffff1660e01b8152600401611f90939291906136b7565b600060405180830381600087803b158015611faa57600080fd5b505af1158015611fbe573d6000803e3d6000fd5b505050508080611fcd906132ba565b915050611f4e565b6000546001600160a01b03163314611fff5760405162461bcd60e51b8152600401610532906131f5565b6001600160a01b0381166120645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610532565b61206d81612382565b50565b60025460405163b09afec160e01b8152600481018390526060916000916001600160a01b039091169063b09afec1906024016101606040518083038186803b1580156120bb57600080fd5b505afa1580156120cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f39190613369565b519050600160ff8216141561212357505060408051808201909152600381526242454560e81b6020820152919050565b8060ff16600214156121515750506040805180820190915260048152632122a0a960e11b6020820152919050565b8060ff16600314156121845750506040805180820190915260098152682122a2a5a2a2a822a960b91b6020820152919050565b505060408051808201909152600c81526b1393d508149155915053115160a21b6020820152919050565b50919050565b6121bc612c21565b60006121cd606461ffff8516613aca565b600183529050806121e157600382526121ef565b600a8110156121ef57600282525b815160009060ff1661220257600061221b565b825161221090600190613443565b61221b906008613466565b60109490941c93905061223c61ffff85166122378360016134c4565b612a15565b60ff16602084015260109390931c9261225e61ffff85166122378360026134c4565b60ff16604084015260109390931c9261228061ffff85166122378360036134c4565b60ff90811660608501528351166003146122b75760109390931c926122ae61ffff85166122378360046134c4565b60ff1660808401525b60109390931c926122d161ffff85166122378360056134c4565b60ff1660a084015260109390931c926122f361ffff85166122378360066134c4565b60ff90811660c08501528351166001141561232b57601084901c935061231e8461ffff166007612a15565b60ff1660e084015261234f565b60109390931c9261234561ffff85166122378360076134c4565b60ff166101008401525b5050919050565b6060828260405160200161236b929190613ade565b604051602081830303815290604052905092915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b326001600160a01b038716146124155760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b6044820152606401610532565b619c40612422868661369f565b11156124645760405162461bcd60e51b8152602060048201526011602482015270105b1b081d1bdad95b9cc81b5a5b9d1959607a1b6044820152606401610532565b821561253c5760065460ff16156124b35760405162461bcd60e51b8152602060048201526013602482015272141c995cd85b19481b5a5b9d081c185d5cd959606a1b6044820152606401610532565b6000851180156124eb57506001600160a01b0386166000908152600760205260409020546006906124e890879060ff1661369f565b11155b6125375760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c79206c696d6974656420616d6f756e7420666f7220574c206d696e74006044820152606401610532565b612599565b60008511801561254d5750600a8511155b6125995760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d696e7420616d6f756e742073616c6500000000000000006044820152606401610532565b8015610870576127106125ac868661369f565b11156125fa5760405162461bcd60e51b815260206004820152601f60248201527f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c64006044820152606401610532565b8215612664578161261266c3663566a5800087613b4f565b1461265f5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964207061796d656e7420616d6f756e742070726573616c6500006044820152606401610532565b610870565b8161267666d529ae9e86000087613b4f565b146126c35760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964207061796d656e7420616d6f756e742073616c6500000000006044820152606401610532565b60065462010000900460ff16156108705760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632073616c652063757272656e746c7920706175736564000000006044820152606401610532565b606060016040516020016127309190613c19565b604051602081830303815290604052905090565b60608160200151516000141561276857505060408051602081019091526000815290565b60208083015160405161277b9201613cc9565b6040516020818303038152906040529050919050565b60008261279e8584612af1565b14949350505050565b6060816127cb5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127f557806127df816132ba565b91506127ee9050600a83613cfa565b91506127cf565b60008167ffffffffffffffff811115612810576128106132fa565b6040519080825280601f01601f19166020018201604052801561283a576020820181803683370190505b5090505b84156128a55761284f600183613d0e565b915061285c600a86613aca565b61286790603061369f565b60f81b81838151811061287c5761287c613247565b60200101906001600160f81b031916908160001a90535061289e600a86613cfa565b945061283e565b949350505050565b60608151600014156128cd57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d4860409139905060006003845160026128fc919061369f565b6129069190613cfa565b612911906004613b4f565b9050600061292082602061369f565b67ffffffffffffffff811115612938576129386132fa565b6040519080825280601f01601f191660200182016040528015612962576020820181803683370190505b509050818152600183018586518101602084015b818310156129d05760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612976565b6003895106600181146129ea57600281146129fb57612a07565b613d3d60f01b600119830152612a07565b603d60f81b6000198301525b509398975050505050505050565b60008060168360ff1660188110612a2e57612a2e613247565b0154612a3a9085613d25565b905060168360ff1660188110612a5257612a52613247565b018160ff1681548110612a6757612a67613247565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015612a9d579050610631565b602e8360ff1660188110612ab357612ab3613247565b018160ff1681548110612ac857612ac8613247565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b600081815b8451811015612b95576000858281518110612b1357612b13613247565b60200260200101519050808311612b55576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b82565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b8d816132ba565b915050612af6565b509392505050565b828054612ba99061348f565b90600052602060002090601f016020900481019282612bcb5760008555612c11565b82601f10612be457805160ff1916838001178555612c11565b82800160010185558215612c11579182015b82811115612c11578251825591602001919060010190612bf6565b50612c1d929150612cf1565b5090565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b828054612c899061348f565b90600052602060002090601f016020900481019282612cab5760008555612c11565b82601f10612cc45782800160ff19823516178555612c11565b82800160010185558215612c11579182015b82811115612c11578235825591602001919060010190612cd6565b5b80821115612c1d5760008155600101612cf2565b80356001600160a01b0381168114612d1d57600080fd5b919050565b600060208284031215612d3457600080fd5b6108be82612d06565b801515811461206d57600080fd5b600060208284031215612d5d57600080fd5b81356108be81612d3d565b600060208284031215612d7a57600080fd5b5035919050565b60005b83811015612d9c578181015183820152602001612d84565b83811115612dab576000848401525b50505050565b60008151808452612dc9816020860160208601612d81565b601f01601f19169290920160200192915050565b6020815260006108be6020830184612db1565b60008060408385031215612e0357600080fd5b50508035926020909101359150565b60ff8116811461206d57600080fd5b60008083601f840112612e3357600080fd5b50813567ffffffffffffffff811115612e4b57600080fd5b6020830191508360208260051b8501011115612e6657600080fd5b9250929050565b600080600080600060608688031215612e8557600080fd5b8535612e9081612e12565b9450602086013567ffffffffffffffff80821115612ead57600080fd5b612eb989838a01612e21565b90965094506040880135915080821115612ed257600080fd5b50612edf88828901612e21565b969995985093965092949392505050565b815160ff16815261016081016020830151612f10602084018260ff169052565b506040830151612f25604084018260ff169052565b506060830151612f3a606084018260ff169052565b506080830151612f4f608084018260ff169052565b5060a0830151612f6460a084018260ff169052565b5060c0830151612f7960c084018260ff169052565b5060e0830151612f8e60e084018260ff169052565b506101008381015160ff16908301526101208084015165ffffffffffff908116918401919091526101409384015116929091019190915290565b60008060008060808587031215612fde57600080fd5b612fe785612d06565b93506020850135925060408501359150606085013561300581612d3d565b939692955090935050565b6000806040838503121561302357600080fd5b823561302e81612e12565b9150602083013561303e81612e12565b809150509250929050565b60408152600061305c6040830185612db1565b828103602084015261306e8185612db1565b95945050505050565b600080600080600080600060c0888a03121561309257600080fd5b61309b88612d06565b9650602088013595506040880135945060608801359350608088013567ffffffffffffffff8111156130cc57600080fd5b6130d88a828b01612e21565b90945092505060a08801356130ec81612d3d565b8091505092959891949750929550565b6000806020838503121561310f57600080fd5b823567ffffffffffffffff8082111561312757600080fd5b818501915085601f83011261313b57600080fd5b81358181111561314a57600080fd5b86602082850101111561315c57600080fd5b60209290920196919550909350505050565b6000806040838503121561318157600080fd5b61318a83612d06565b915061319860208401612d06565b90509250929050565b600080600080600060a086880312156131b957600080fd5b6131c286612d06565b945060208601359350604086013592506060860135915060808601356131e781612d3d565b809150509295509295909350565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561323c57600080fd5b81516108be81612d3d565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261327457600080fd5b83018035915067ffffffffffffffff82111561328f57600080fd5b602001915036819003821315612e6657600080fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156132ce576132ce6132a4565b5060010190565b6020808252600b908201526a444f4e542043484541542160a81b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561334257634e487b7160e01b600052604160045260246000fd5b60405290565b8051612d1d81612e12565b805165ffffffffffff81168114612d1d57600080fd5b6000610160828403121561337c57600080fd5b613384613310565b61338d83613348565b815261339b60208401613348565b60208201526133ac60408401613348565b60408201526133bd60608401613348565b60608201526133ce60808401613348565b60808201526133df60a08401613348565b60a08201526133f060c08401613348565b60c082015261340160e08401613348565b60e0820152610100613414818501613348565b90820152610120613426848201613353565b90820152610140613438848201613353565b908201529392505050565b600060ff821660ff84168082101561345d5761345d6132a4565b90039392505050565b600060ff821660ff84168160ff0481118215151615613487576134876132a4565b029392505050565b600181811c908216806134a357607f821691505b602082108114156121ae57634e487b7160e01b600052602260045260246000fd5b600060ff821660ff84168060ff038211156134e1576134e16132a4565b019392505050565b600081516134fb818560208601612d81565b9290920192915050565b60008651613517818460208b01612d81565b8083019050600b60fa1b8082528751613537816001850160208c01612d81565b600192019182018190528651613554816002850160208b01612d81565b600292019182018190528551613571816003850160208a01612d81565b60039201918201819052845161358e816004850160208901612d81565b6004920191820152600501979650505050505050565b600083516135b6818460208801612d81565b8351908301906135ca818360208801612d81565b600b60fa1b9101908152600101949350505050565b605b60f81b8152600084516135fb816001850160208901612d81565b7f7b2274726169745f74797065223a2247656e65726174696f6e222c2276616c756001918401918201526232911d60e91b60218201528451613644816024840160208901612d81565b7f7d2c7b2274726169745f74797065223a2254797065222c2276616c7565223a22602492909101918201528351613682816044840160208801612d81565b62227d5d60e81b6044929091019182015260470195945050505050565b600082198211156136b2576136b26132a4565b500190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6000895160206136ed8285838f01612d81565b8a51918401916137008184848f01612d81565b8a519201916137128184848e01612d81565b89519201916137248184848d01612d81565b88519201916137368184848c01612d81565b87519201916137488184848b01612d81565b865192019161375a8184848a01612d81565b855192019161376c8184848901612d81565b919091019b9a5050505050505050505050565b7f3c7376672069643d2263727970746f62656573222077696474683d223130302581527f22206865696768743d2231303025222076657273696f6e3d22312e312220766960208201527f6577426f783d223020302034302034302220786d6c6e733d22687474703a2f2f60408201527f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b60608201527f3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b223e60808201526000825161384f8160a0850160208701612d81565b651e17b9bb339f60d11b60a093909101928301525060a601919050565b600060ff821660ff811415613883576138836132a4565b60010192915050565b693d913730b6b2911d101160b11b815285516000906138b281600a850160208b01612d81565b61202360f01b600a9184019182015286516138d481600c840160208b01612d81565b6b111610113a3cb832911d101160a11b600c92909101918201528551613901816018840160208a01612d81565b7f222c20226465736372697074696f6e223a202250656f706c65207265616c697a910160188101919091527f6564207468617420746865207061746820746f2070726f73706572697479206960388201527f7320746f2072656c6f6361746520746f2061206661726d2e20536f6d6520686160588201527f766520626f756768742073686565702c20736f6d65206c616e6420627574206d60788201527f616e7920656e6465642075702077697468206e6f7468696e672e2024484f4e4560988201527f5920697320746865206e6577206f70706f7274756e6974792e0000000000000060b88201527f222c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260d182015265185cd94d8d0b60d21b60f1820152613a63613a56613a50613a3560f78501896134e9565b6e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b866134e9565b607d60f81b815260010190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613aa781601d850160208701612d81565b91909101601d0192915050565b634e487b7160e01b600052601260045260246000fd5b600082613ad957613ad9613ab4565b500690565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090613b0981600f850160208801612d81565b6a1116113b30b63ab2911d1160a91b600f918401918201528351613b3481601a840160208801612d81565b61227d60f01b601a9290910191820152601c01949350505050565b6000816000190483118215151615613b6957613b696132a4565b500290565b7f3c696d61676520783d22342220793d2234222077696474683d2233322220686581527f696768743d2233322220696d6167652d72656e646572696e673d22706978656c60208201527f6174656422207072657365727665417370656374526174696f3d22784d69645960408201527f4d69642220786c696e6b3a687265663d22646174613a696d6167652f706e673b60608201526618985cd94d8d0b60ca1b608082015260870190565b6000613c2482613b6e565b8354600090600181811c9080831680613c3e57607f831692505b6020808410821415613c5e57634e487b7160e01b86526022600452602486fd5b818015613c725760018114613c8357613cb0565b60ff19861688528488019650613cb0565b60008b81526020902060005b86811015613ca85781548a820152908501908301613c8f565b505084880196505b50505050505061306e816211179f60e91b815260030190565b6000613cd482613b6e565b8351613ce4818360208801612d81565b6211179f60e91b91019081526003019392505050565b600082613d0957613d09613ab4565b500490565b600082821015613d2057613d206132a4565b500390565b600060ff831680613d3857613d38613ab4565b8060ff8416069150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e0a6b5efc594d8cf092b6b8ca8780522fa1c713e6ebe42127d74a28a8c82e5e164736f6c63430008090033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.