ETH Price: $3,395.68 (-1.84%)
Gas: 6 Gwei

Contract

0xf701F9cd49216FA6111Ba4c8d41227178592E9B4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60066103136563982021-11-21 5:47:14971 days ago1637473634IN
 Create: dungeonsRender
0 ETH0.2380104383.50472856

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
dungeonsRender

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 2 : dungeonsRender.sol
// SPDX-License-Identifier: CC0-1.0

/// @title Rendering code to draw an svg of the dungeon

/*****************************************************
0000000                                        0000000
0001100  Crypts and Caverns                    0001100
0001100     9000 generative on-chain dungeons  0001100
0003300                                        0003300
*****************************************************/

pragma solidity ^0.8.0;

import { IDungeons } from './interfaces/IDungeons.sol';

contract dungeonsRender {

     struct Maps {
        // Data structure that stores our different maps (layout, doors, points)
        uint256[] layout;
        uint256[] doors;
        uint256[] points;
    }

    struct RenderHelper {   // Helper variables when iterating through and drawing dungeon tiles
        uint256 pixel;
        uint256 start;
        uint256[] layout;
        string parts;
        uint256 counter;
        uint256 numRects;
        uint256 lastStart;
    }

    struct EntityHelper {
        uint256 size;
        uint256 environment;
    }

    string[24] private colors = [
        // Array contains sets of 4 colors:
        // 0 = bg, 1 = wall, 2 = door, 3 = point
        // To calculate, multiply environment (int 0-5) by 4 and add the above numbers.
        // Desert
        "F3D899",   // 0
        "160F09",   // 1
        "FAAA00",   // 2
        "00A29D",   // 3
        // Stone Temple
        "967E67",   // 4
        "F3D899",   // 5
        "3C2A1A",   // 6
        "006669",   // 7
        // Forest Ruins
        "2F590E",   // 8
        "A98C00",   // 9
        "802F1A",   // 10
        "C55300",   // 11
        // Mountain Deep
        "36230F",   // 12
        "744936",   // 13
        "802F1A",   // 14
        "FFA800",   // 15
        //Underwater Keep
        "006669",   // 16
        "004238",   // 17
        "967E67",   // 18
        "F9B569",   // 19
        // Ember"s Glow
        "340D07",   // 20
        "5D0503",   // 21
        "B75700",   // 22
        "FF1800"    // 23
    ];

    string[6] private environmentName = [
        // Names mapped to the above colors
        "Desert Oasis",
        "Stone Temple",
        "Forest Ruins",
        "Mountain Deep",
        "Underwater Keep",
        "Ember's Glow"
    ];
    
    function draw(IDungeons.Dungeon memory dungeon, uint8[] memory x, uint8[] memory y, uint8[] memory entityData) external view returns (string memory) {
        // Hardcoded to save memory: Width = 100

        string memory parts;

        // Setup SVG and draw our background
        // We write at 100x100 and scale it 5x to 500x500 to avoid safari small rendering
        parts = string(abi.encodePacked(
            '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 500 500" shape-rendering="crispEdges" transform-origin="center"><rect width="100%" height="100%" fill="#',
            colors[dungeon.environment * 4],
            '" />'));

        // Draw the name at the top of the image
        parts = drawNameplate(parts, dungeon.dungeonName);

        // Draw the dungeon layout and entities
        (uint256 start, uint256 pixel) = getWidth(dungeon.size);   // Calculate width of each pixel and where we should start the dungeon
        
        RenderHelper memory helper = RenderHelper(pixel, start, fromBytes(dungeon.layout), "", 0, 0, 0);    // Struct to save memory for render calls so we don't get 'stack too deep' in our drawChunk() function

        parts = string(abi.encodePacked(
            parts, 
            chunkDungeon(dungeon, helper),  // Break dungeon walls into chunks and render each section
            drawEntities(x, y, entityData, dungeon, helper),
            '</svg>'));
        
        return parts; 
    }

    function drawNameplate(string memory parts, string memory name) internal pure returns (string memory) {
    // Draw a nameplate w/ map title at the top of the map.
        // Calculate length of string
        uint256 nameLength = uint256(bytes(name).length);   
        uint256 fontSize;
        uint256 multiplier;
        if(nameLength <= 25) {
            fontSize = 5;
            multiplier = 3;
        } else {
            fontSize = 4;
            multiplier = 2;
            nameLength += 7;   // Hack because we can't use fractions for our multiplier
        }

        // Draw black border behind nameplates
        parts = string(
                abi.encodePacked(
                    parts,
                    '<g transform="scale (5 5)"><rect x="', // Scale nameplate by 5x (transform for 100->500)
                    toString((100 - ((nameLength+3)*multiplier)) / 2),    // assume letters are 3 'pixels', add 3 letters worth of spacing (1.5 per side)
                    '" y="-1" width="',
                    toString((nameLength+3)*multiplier),
                    '" height="9" stroke-width="0.3" stroke="black" fill="#FFA800" />'
                ));

        // Draw text on top of nameplate
        parts = string(
                    abi.encodePacked(
                        parts,
                        '<text x="50" y="5.5" width="',
                        toString(nameLength * 3),
                        '" font-family="monospace" font-size="',
                        toString(fontSize), 
                        '" text-anchor="middle">',
                        name,
                        '</text></g>'
                    ));
        
        return(parts);
    }

    function chunkDungeon(IDungeons.Dungeon memory dungeon, RenderHelper memory helper) internal view returns (string memory) {
        // Loop through and figure out how many rectangles we'll need (so we can calculate array size)
        
        for(uint256 y = 0; y < dungeon.size; y++) {
            
            helper.lastStart = helper.counter;
            string memory rowParts;

            for(uint256 x = 0; x < dungeon.size; x++) {
                if(getBit(helper.layout, helper.counter) == 1 && helper.counter > 0 && getBit(helper.layout, helper.counter-1) == 0) {
                    // Last tile was a wall, current tile is floor. Need a new rect.
                    helper.numRects++;

                    // Draw rect with last known X and width of currentX - lastX.
                    rowParts = drawTile(rowParts, helper.start + (helper.lastStart % dungeon.size)*helper.pixel, helper.start + (helper.lastStart / dungeon.size)*helper.pixel, (helper.counter - helper.lastStart)*helper.pixel, helper.pixel, colors[dungeon.environment * 4 + 1]);

                } else if(getBit(helper.layout, helper.counter) == 0 && helper.counter > 0 && getBit(helper.layout, helper.counter-1) == 1) {
                    // Last tile was a floor, start tracking X so we can get a width
                    helper.lastStart = helper.counter;
                }
                helper.counter++;
            }

            // If the last tile on a row is a wall, we need a new rect
            if(getBit(helper.layout, helper.counter-1) == 0) {
                helper.numRects++;
                rowParts = drawTile(rowParts, helper.start + (helper.lastStart % dungeon.size)*helper.pixel, helper.start + (helper.lastStart / dungeon.size)*helper.pixel, (helper.counter - helper.lastStart)*helper.pixel, helper.pixel, colors[dungeon.environment * 4 + 1]);
            }
            helper.parts = string(abi.encodePacked(helper.parts, rowParts));
            rowParts = "";  // Reset for the next row
        }
        return helper.parts;
    }

    function drawEntities(uint8[] memory x, uint8[] memory y, uint8[] memory entityData, IDungeons.Dungeon memory dungeon, RenderHelper memory helper) internal view returns (string memory) {
    // Draw each entity as a pixel on the map
        string memory parts;
        for(uint256 i = 0; i < entityData.length; i++) {
            parts = drawTile(parts, helper.start + (x[i] % dungeon.size)*helper.pixel, helper.start + y[i]*helper.pixel, helper.pixel, helper.pixel, colors[dungeon.environment * 4 + 2 + entityData[i]]);
        }
        return parts;
    }


    function drawTile(string memory row, uint256 x, uint256 y, uint256 width, uint256 pixel, string memory color) internal pure returns(string memory) {
        row = string(
            abi.encodePacked(
                row,
                '<rect x="',
                toString(x),
                '" y="',
                toString(y),
                '" width="', 
                toString(width),
                '" height="',
                toString(pixel),
                '" fill="#',
                color, 
                '" />'
            ));
        
        return(row);

    }

    function getWidth(uint256 size) internal pure returns(uint256, uint256) {
        uint256 pixel = 500 / (size + 3*2);   // Each 'pixel' should be equal widths and take into account dungeon size + allocate padding (3 pixels) on both sides
        uint256 start = (500 - pixel*size) / 2;     // Remove the width and divide by two to get the midpoint where we should start
        return(start, pixel);
    }

    /**
    * @dev - Assembles a tokenURI for output. Normally we would do this in dungeons.sol but needed to save memory
    */
    function tokenURI(uint256 tokenId, IDungeons.Dungeon memory dungeon, uint256[] memory entities) public view returns(string memory) {
        string memory output; 

        // Generate dungeon
        output = this.draw(dungeon, dungeon.entities.x, dungeon.entities.y, dungeon.entities.entityType);

        string memory size = string(abi.encodePacked(toString(dungeon.size), 'x', toString(dungeon.size)));

        // Base64 Encode svg and output
        string memory json = Base64.encode(bytes(string(
            abi.encodePacked('{"name": "Crypts and Caverns #', toString(tokenId),
             '", "description": "Crypts and Caverns is an onchain map generator that produces an infinite set of dungeons. Enemies, treasure, etc intentionally omitted for others to interpret. Feel free to use Crypts and Caverns in any way you want.", "attributes": [ {"trait_type": "name", "value": "',
             dungeon.dungeonName, 
             '"}, {"trait_type": "size", "value": "',
             size, 
             '"}, {"trait_type": "environment", "value": "',
             environmentName[dungeon.environment],
             '"}, {"trait_type": "doors", "value": "',
             toString(entities[1]),
             '"}, {"trait_type": "points of interest", "value": "',
             toString(entities[0]), 
             '"}, {"trait_type": "affinity", "value": "',
             dungeon.affinity,
             '"}, {"trait_type": "legendary", "value": "',
             dungeon.legendary == 1 ? 'Yes' : 'No',
             '"}, {"trait_type": "structure", "value": "',
             dungeon.structure == 0 ? 'Crypt' : 'Cavern',
             '"}],"image": "data:image/svg+xml;base64,',
              Base64.encode(bytes(output)),
             '"}'))));

        output = string(abi.encodePacked('data:application/json;base64,', json));
        
        return output;
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }

    /* Bitwise Helper Functions */
    function getBit(uint256[] memory map, uint256 position) internal pure returns(uint256) {
    // Returns whether a bit is set or off at a given position in our map (credit: @cjpais)
        (uint256 quotient, uint256 remainder) = getDivided(position, 256);
        require(position <= 255 + (quotient * 256));
        return (map[quotient] >> (255 - remainder)) & 1;
    }


    function getDivided(uint256 numerator, uint256 denominator) public pure returns (uint256 quotient, uint256 remainder)
    {
        require(denominator > 0);
        quotient = numerator / denominator;
        remainder = numerator - denominator * quotient;
    }

    function getNumIntsRequired(bytes memory data) public pure returns (uint256)
    {
    // Calculate the number of ints needed to contain the number of bytes in data
        require(data.length > 0);

        (uint256 quotient, uint256 remainder) = getDivided(data.length, 32);

        if (remainder > 0) return quotient + 1;
        return quotient;
    }


    function fromBytes(bytes memory encodedMap) internal pure returns (uint256[] memory) {
    // Converts a bytes array to a map (two uint256)
        uint256 num = getNumIntsRequired(encodedMap);
        uint256[] memory result = new uint256[](num);

        uint256 offset = 0;
        uint256 x;

        for (uint256 i = 0; i < num; i++) {
            assembly {
                x := mload(add(encodedMap, add(0x20, offset)))
                mstore(add(result, add(0x20, offset)), x)
            }
            offset += 0x20;
        }

        return result;
    }
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 { 
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }
        return string(result);
     }
}

File 2 of 2 : IDungeons.sol
// SPDX-License-Identifier: GPL-3.0

/// @title Interface for Crypts and Caverns

/*****************************************************
0000000                                        0000000
0001100  Crypts and Caverns                    0001100
0001100     9000 generative on-chain dungeons  0001100
0003300                                        0003300
*****************************************************/

pragma solidity ^0.8.0;

interface IDungeons {
    struct Dungeon {
        uint8 size;
        uint8 environment;
        uint8 structure;  // crypt or cavern
        uint8 legendary;
        bytes layout;
        EntityData entities;
        string affinity;
        string dungeonName;
    }

    struct EntityData {
        uint8[] x;
        uint8[] y;
        uint8[] entityType;
    }

    function claim(uint256 tokenId) external payable;
    function claimMany(uint256[] memory tokenArray) external payable;
    function ownerClaim(uint256 tokenId) external payable;
    function mint() external payable;
    function openClaim() external;
    function withdraw(address payable recipient, uint256 amount) external;
    function tokenURI(uint256 tokenId) external view returns (string memory);
    function getLayout(uint256 tokenId) external view returns (bytes memory);
    function getSize(uint256 tokenId) external view returns (uint8);
    function getEntities(uint256 tokenId) external view returns (uint8[] memory, uint8[] memory, uint8[] memory);
    function getEnvironment(uint256 tokenId) external view returns (uint8);
    function getName(uint256 tokenId) external view returns (string memory);
    function getNumPoints(uint256 tokenId) external view returns (uint256);
    function getNumDoors(uint256 tokenId) external view returns (uint256);
    function getSvg(uint256 tokenId) external view returns (string memory);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"uint8","name":"size","type":"uint8"},{"internalType":"uint8","name":"environment","type":"uint8"},{"internalType":"uint8","name":"structure","type":"uint8"},{"internalType":"uint8","name":"legendary","type":"uint8"},{"internalType":"bytes","name":"layout","type":"bytes"},{"components":[{"internalType":"uint8[]","name":"x","type":"uint8[]"},{"internalType":"uint8[]","name":"y","type":"uint8[]"},{"internalType":"uint8[]","name":"entityType","type":"uint8[]"}],"internalType":"struct IDungeons.EntityData","name":"entities","type":"tuple"},{"internalType":"string","name":"affinity","type":"string"},{"internalType":"string","name":"dungeonName","type":"string"}],"internalType":"struct IDungeons.Dungeon","name":"dungeon","type":"tuple"},{"internalType":"uint8[]","name":"x","type":"uint8[]"},{"internalType":"uint8[]","name":"y","type":"uint8[]"},{"internalType":"uint8[]","name":"entityData","type":"uint8[]"}],"name":"draw","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"getDivided","outputs":[{"internalType":"uint256","name":"quotient","type":"uint256"},{"internalType":"uint256","name":"remainder","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"getNumIntsRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint8","name":"size","type":"uint8"},{"internalType":"uint8","name":"environment","type":"uint8"},{"internalType":"uint8","name":"structure","type":"uint8"},{"internalType":"uint8","name":"legendary","type":"uint8"},{"internalType":"bytes","name":"layout","type":"bytes"},{"components":[{"internalType":"uint8[]","name":"x","type":"uint8[]"},{"internalType":"uint8[]","name":"y","type":"uint8[]"},{"internalType":"uint8[]","name":"entityType","type":"uint8[]"}],"internalType":"struct IDungeons.EntityData","name":"entities","type":"tuple"},{"internalType":"string","name":"affinity","type":"string"},{"internalType":"string","name":"dungeonName","type":"string"}],"internalType":"struct IDungeons.Dungeon","name":"dungeon","type":"tuple"},{"internalType":"uint256[]","name":"entities","type":"uint256[]"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60066103808181526546334438393960d01b6103a081905260809182526103c08381526531363046303960d01b6103e05260a0526104008381526504641414130360d41b6104205260c052610440838152650c0c104c8e5160d21b6104605260e0526104808381526539363745363760d01b6104a0819052610100919091526104c08481526104e092909252610120919091526105008381526533433241314160d01b61052052610140526105408381526530303636363960d01b610560819052610160919091526105808481526532463539304560d01b6105a052610180526105c08481526504139384330360d41b6105e0526101a0526106008481526538303246314160d01b6106208190526101c0919091526106408581526504335353330360d41b610660526101e05261068085815265199b1919982360d11b6106a052610200526106c0858152651b9a1a1c999b60d11b6106e0526102205261070085815261072091909152610240526107408481526504646413830360d41b61076052610260526107808481526107a091909152610280526107c08381526506060686466760d31b6107e0526102a052610800838152610820919091526102c0526108408281526546394235363960d01b610860526102e0526108808281526533343044303760d01b6108a052610300526108c08281526535443035303360d01b6108e052610320526109008281526504237353730360d41b61092052610340526109806040526109409182526504646313830360d41b61096052610360919091526200025090600090601862000360565b506040805161010081018252600c60c082018181526b446573657274204f6173697360a01b60e08401528252825180840184528181526b53746f6e652054656d706c6560a01b60208281019190915280840191909152835180850185528281526b466f72657374205275696e7360a01b818301528385015283518085018552600d81526c04d6f756e7461696e204465657609c1b81830152606084015283518085018552600f81526e0556e6465727761746572204b65657608c1b81830152608084015283518085019094529083526b456d626572277320476c6f7760a01b9083015260a08101919091526200034b906018906006620003b7565b503480156200035957600080fd5b506200054b565b8260188101928215620003a5579160200282015b82811115620003a5578251805162000394918491602090910190620003fc565b509160200191906001019062000374565b50620003b392915062000487565b5090565b8260068101928215620003a5579160200282015b82811115620003a55782518051620003eb918491602090910190620003fc565b5091602001919060010190620003cb565b8280546200040a9062000504565b90600052602060002090601f0160209004810192826200042e576000855562000479565b82601f106200044957805160ff191683800117855562000479565b8280016001018555821562000479579182015b82811115620004795782518255916020019190600101906200045c565b50620003b3929150620004a8565b80821115620003b35760006200049e8282620004bf565b5060010162000487565b5b80821115620003b35760008155600101620004a9565b508054620004cd9062000504565b6000825580601f10620004e1575062000501565b601f016020900490600052602060002090810190620005019190620004a8565b50565b6002810460018216806200051957607f821691505b602082108114156200052f576200052f62000535565b50919050565b634e487b7160e01b600052602260045260246000fd5b6125f2806200055b6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063194d02d71461005157806319db2b2f1461007b57806329010f431461009b578063a662e0f4146100ae575b600080fd5b61006461005f366004611400565b6100ce565b60405161007292919061225e565b60405180910390f35b61008e610089366004611385565b610107565b60405161007291906121f2565b61008e6100a93660046112c9565b610373565b6100c16100bc366004611261565b61048f565b6040516100729190612250565b600080600083116100de57600080fd5b6100e88385612367565b91506100f48284612391565b6100fe90856123f5565b90509250929050565b60a08201518051602082015160409283015192516329010f4360e01b8152606093849330936329010f4393610142938a939291600401612203565b60006040518083038186803b15801561015a57600080fd5b505afa15801561016e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101969190810190611295565b905060006101aa856000015160ff166104d5565b85516101b89060ff166104d5565b6040516020016101c9929190611fc6565b604051602081830303815290604052905060006103436101e8886104d5565b8760e001518460188a6020015160ff166006811061021657634e487b7160e01b600052603260045260246000fd5b016102488a60018151811061023b57634e487b7160e01b600052603260045260246000fd5b60200260200101516104d5565b61026c8b60008151811061023b57634e487b7160e01b600052603260045260246000fd5b8c60c001518d6060015160ff166001146102a057604051806040016040528060028152602001614e6f60f01b8152506102bd565b6040518060400160405280600381526020016259657360e81b8152505b60408f015160ff16156102ee576040518060400160405280600681526020016521b0bb32b93760d11b81525061030d565b6040518060400160405280600581526020016410dc9e5c1d60da1b8152505b6103168d6105f7565b60405160200161032f9a999897969594939291906120f1565b6040516020818303038152906040526105f7565b90508060405160200161035691906120da565b60408051601f1981840301815291905293505050505b9392505050565b60608060008660200151600461038991906123c6565b60ff16601881106103aa57634e487b7160e01b600052603260045260246000fd5b016040516020016103bb91906120b8565b60405160208183030381529060405290506103da818760e0015161076a565b90506000806103ef886000015160ff16610858565b9150915060006040518060e001604052808381526020018481526020016104198b608001516108a4565b8152602001604051806020016040528060008152508152602001600081526020016000815260200160008152509050836104538a83610951565b6104608a8a8a8e87610ce3565b60405160200161047293929190611f31565b60408051808303601f190181529190529998505050505050505050565b60008082511161049e57600080fd5b6000806104ad845160206100ce565b909250905080156104cc576104c382600161230e565b925050506104d0565b5090505b919050565b6060816104fa57506040805180820190915260018152600360fc1b60208201526104d0565b8160005b8115610524578061050e81612494565b915061051d9050600a83612367565b91506104fe565b6000816001600160401b0381111561054c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610576576020820181803683370190505b5090505b84156105ef5761058b6001836123f5565b9150610598600a866124ba565b6105a390603061230e565b60f81b8183815181106105c657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506105e8600a86612367565b945061057a565b949350505050565b8051606090806106175750506040805160208101909152600081526104d0565b6000600361062683600261230e565b6106309190612367565b61063b906004612391565b9050600061064a82602061230e565b6001600160401b0381111561066f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610699576020820181803683370190505b509050600060405180606001604052806040815260200161257d604091399050600181016020830160005b86811015610725576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016106c4565b50600386066001811461073f57600281146107505761075c565b613d3d60f01b60011983015261075c565b603d60f81b6000198301525b505050918152949350505050565b805160609060008060198311610786575060059050600361079b565b5060049050600261079860078461230e565b92505b856107d16002836107ad87600361230e565b6107b79190612391565b6107c29060646123f5565b6107cc9190612367565b6104d5565b6107ea836107e087600361230e565b6107cc9190612391565b6040516020016107fc93929190611fdd565b60408051601f1981840301815291905295508561081d6107cc856003612391565b610826846104d5565b8760405160200161083a9493929190611f60565b60405160208183030381529060405295508593505050505b92915050565b6000808061086784600661230e565b610873906101f4612367565b9050600060026108838684612391565b61088f906101f46123f5565b6108999190612367565b935090915050915091565b606060006108b18361048f565b90506000816001600160401b038111156108db57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610904578160200160208202803683370190505b509050600080805b84811015610946578260200187015191508183602001850152602083610932919061230e565b92508061093e81612494565b91505061090c565b509195945050505050565b606060005b835160ff16811015610cd857608083015160c0840152606060005b855160ff16811015610bba5761098f85604001518660800151610e0d565b60011480156109a2575060008560800151115b80156109c957506109c78560400151600187608001516109c291906123f5565b610e0d565b155b15610b3e5760a085018051906109de82612494565b9052508451865160c0870151610b3792859290916109ff9160ff16906124ba565b610a099190612391565b8760200151610a18919061230e565b8751895160c08a0151610a2e9160ff1690612367565b610a389190612391565b8860200151610a47919061230e565b885160c08a015160808b0151610a5d91906123f5565b610a679190612391565b895160208c0151600090610a7c9060046123c6565b610a8790600161233c565b60ff1660188110610aa857634e487b7160e01b600052603260045260246000fd5b018054610ab490612467565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae090612467565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050610e88565b9150610b95565b610b5085604001518660800151610e0d565b158015610b61575060008560800151115b8015610b855750610b818560400151600187608001516109c291906123f5565b6001145b15610b9557608085015160c08601525b60808501805190610ba582612494565b90525080610bb281612494565b915050610971565b50610bd48460400151600186608001516109c291906123f5565b610c895760a08401805190610be882612494565b9052508351855160c0860151610c869284929091610c099160ff16906124ba565b610c139190612391565b8660200151610c22919061230e565b8651885160c0890151610c389160ff1690612367565b610c429190612391565b8760200151610c51919061230e565b875160c089015160808a0151610c6791906123f5565b610c719190612391565b885160208b0151600090610a7c9060046123c6565b90505b836060015181604051602001610ca0929190611f19565b60408051601f198184030181529181526060860191909152805160208101909152600090525080610cd081612494565b915050610956565b505060600151919050565b60608060005b8551811015610e0257610dee82856000015187600001518b8581518110610d2057634e487b7160e01b600052603260045260246000fd5b6020026020010151610d3291906124e4565b60ff16610d3f9190612391565b8660200151610d4e919061230e565b86600001518a8581518110610d7357634e487b7160e01b600052603260045260246000fd5b602002602001015160ff16610d889190612391565b8760200151610d97919061230e565b87518a5181906000908d9089908110610dc057634e487b7160e01b600052603260045260246000fd5b60200260200101518c602001516004610dd991906123c6565b610de490600261233c565b610a87919061233c565b915080610dfa81612494565b915050610ce9565b509695505050505050565b6000806000610e1e846101006100ce565b9092509050610e2f82610100612391565b610e3a9060ff61230e565b841115610e4657600080fd5b610e518160ff6123f5565b858381518110610e7157634e487b7160e01b600052603260045260246000fd5b6020026020010151901c6001169250505092915050565b606086610e94876104d5565b610e9d876104d5565b610ea6876104d5565b610eaf876104d5565b86604051602001610ec596959493929190612022565b60408051601f19818403018152919052979650505050505050565b6000610ef3610eee846122a2565b612279565b90508083825260208201905082856020860282011115610f1257600080fd5b60005b85811015610f3e5781610f28888261124b565b8452506020928301929190910190600101610f15565b5050509392505050565b6000610f56610eee846122a2565b90508083825260208201905082856020860282011115610f7557600080fd5b60005b85811015610f3e5781610f8b8882611256565b8452506020928301929190910190600101610f78565b6000610faf610eee846122c5565b905082815260208101848484011115610fc757600080fd5b610fd284828561242b565b509392505050565b6000610fe8610eee846122c5565b90508281526020810184848401111561100057600080fd5b610fd2848285612437565b600082601f83011261101c57600080fd5b81356105ef848260208601610ee0565b600082601f83011261103d57600080fd5b81356105ef848260208601610f48565b600082601f83011261105e57600080fd5b81356105ef848260208601610fa1565b600082601f83011261107f57600080fd5b81516105ef848260208601610fda565b600061010082840312156110a257600080fd5b6110ad610100612279565b905060006110bb8484611256565b82525060206110cc84848301611256565b60208301525060406110e084828501611256565b60408301525060606110f484828501611256565b60608301525060808201356001600160401b0381111561111357600080fd5b61111f8482850161104d565b60808301525060a08201356001600160401b0381111561113e57600080fd5b61114a848285016111ac565b60a08301525060c08201356001600160401b0381111561116957600080fd5b6111758482850161104d565b60c08301525060e08201356001600160401b0381111561119457600080fd5b6111a08482850161104d565b60e08301525092915050565b6000606082840312156111be57600080fd5b6111c86060612279565b905081356001600160401b038111156111e057600080fd5b6111ec8482850161102c565b82525060208201356001600160401b0381111561120857600080fd5b6112148482850161102c565b60208301525060408201356001600160401b0381111561123357600080fd5b61123f8482850161102c565b60408301525092915050565b80356108528161255c565b803561085281612573565b60006020828403121561127357600080fd5b81356001600160401b0381111561128957600080fd5b6105ef8482850161104d565b6000602082840312156112a757600080fd5b81516001600160401b038111156112bd57600080fd5b6105ef8482850161106e565b600080600080608085870312156112df57600080fd5b84356001600160401b038111156112f557600080fd5b6113018782880161108f565b94505060208501356001600160401b0381111561131d57600080fd5b6113298782880161102c565b93505060408501356001600160401b0381111561134557600080fd5b6113518782880161102c565b92505060608501356001600160401b0381111561136d57600080fd5b6113798782880161102c565b91505092959194509250565b60008060006060848603121561139a57600080fd5b60006113a6868661124b565b93505060208401356001600160401b038111156113c257600080fd5b6113ce8682870161108f565b92505060408401356001600160401b038111156113ea57600080fd5b6113f68682870161100b565b9150509250925092565b6000806040838503121561141357600080fd5b600061141f858561124b565b92505060206114308582860161124b565b9150509250929050565b60006114468383611f10565b505060200190565b600061145982612301565b6114638185612305565b935061146e836122ef565b8060005b8381101561149c578151611486888261143a565b9750611491836122ef565b925050600101611472565b509495945050505050565b60006114b282612301565b6114bc8185612305565b93506114c7836122ef565b8060005b8381101561149c5781516114df888261143a565b97506114ea836122ef565b9250506001016114cb565b600061150082612301565b61150a8185612305565b935061151a818560208601612437565b61152381612552565b9093019392505050565b600061153882612301565b61154281856104d0565b9350611552818560208601612437565b9290920192915050565b6000815461156981612467565b61157381866104d0565b945060018216801561158c576001811461159d576115cd565b60ff198316865281860193506115cd565b6115a6856122f5565b60005b838110156115c5578154888201526001909101906020016115a9565b838801955050505b50505092915050565b60006115e36028836104d0565b7f227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c8152670ed8985cd94d8d0b60c21b602082015260280192915050565b600061162d600b836104d0565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b0192915050565b6000611654602a836104d0565b7f227d2c207b2274726169745f74797065223a20226c6567656e64617279222c20815269113b30b63ab2911d101160b11b6020820152602a0192915050565b60006116a06009836104d0565b68222066696c6c3d222360b81b815260090192915050565b60006116c661011f836104d0565b7f222c20226465736372697074696f6e223a202243727970747320616e6420436181527f7665726e7320697320616e206f6e636861696e206d61702067656e657261746f60208201527f7220746861742070726f647563657320616e20696e66696e697465207365742060408201527f6f662064756e67656f6e732e20456e656d6965732c2074726561737572652c2060608201527f65746320696e74656e74696f6e616c6c79206f6d697474656420666f72206f7460808201527f6865727320746f20696e746572707265742e204665656c206672656520746f2060a08201527f7573652043727970747320616e642043617665726e7320696e20616e7920776160c08201527f7920796f752077616e742e222c202261747472696275746573223a205b207b2260e08201527f74726169745f74797065223a20226e616d65222c202276616c7565223a20220061010082015261011f0192915050565b6000611831602a836104d0565b7f227d2c207b2274726169745f74797065223a2022737472756374757265222c20815269113b30b63ab2911d101160b11b6020820152602a0192915050565b600061187d6010836104d0565b6f11103c9e91169891103bb4b23a341e9160811b815260100192915050565b60006118a9602c836104d0565b7f227d2c207b2274726169745f74797065223a2022656e7669726f6e6d656e742281526b1610113b30b63ab2911d101160a11b6020820152602c0192915050565b60006118f7600a836104d0565b6911103432b4b3b43a1e9160b11b8152600a0192915050565b600061191d601c836104d0565b7f3c7465787420783d2235302220793d22352e35222077696474683d22000000008152601c0192915050565b60006119566040836104d0565b7f22206865696768743d223922207374726f6b652d77696474683d22302e33222081527f7374726f6b653d22626c61636b222066696c6c3d222346464138303022202f3e602082015260400192915050565b60006119b56004836104d0565b631110179f60e11b815260040192915050565b60006119d56001836104d0565b600f60fb1b815260010192915050565b60006119f26033836104d0565b7f227d2c207b2274726169745f74797065223a2022706f696e7473206f6620696e8152723a32b932b9ba111610113b30b63ab2911d101160691b602082015260330192915050565b6000611a476002836104d0565b61227d60f01b815260020192915050565b6000611a656026836104d0565b7f227d2c207b2274726169745f74797065223a2022646f6f7273222c202276616c8152653ab2911d101160d11b602082015260260192915050565b6000611aad6024836104d0565b7f3c67207472616e73666f726d3d227363616c65202835203529223e3c72656374815263103c1e9160e11b602082015260240192915050565b6000611af360c1836104d0565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203530302035303060408201527f222073686170652d72656e646572696e673d226372697370456467657322207460608201527f72616e73666f726d2d6f726967696e3d2263656e746572223e3c72656374207760808201527f696474683d223130302522206865696768743d2231303025222066696c6c3d2260a0820152602360f81b60c082015260c10192915050565b6000611bf4601d836104d0565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152601d0192915050565b6000611c2d6005836104d0565b6411103c9e9160d91b815260050192915050565b6000611c4e601e836104d0565b7f7b226e616d65223a202243727970747320616e642043617665726e73202300008152601e0192915050565b6000611c876025836104d0565b7f227d2c207b2274726169745f74797065223a202273697a65222c202276616c7581526432911d101160d91b602082015260250192915050565b6000611cce6029836104d0565b7f227d2c207b2274726169745f74797065223a2022616666696e697479222c20228152683b30b63ab2911d101160b91b602082015260290192915050565b6000611d196009836104d0565b681e3932b1ba103c1e9160b91b815260090192915050565b6000611d3e6006836104d0565b651e17b9bb339f60d11b815260060192915050565b6000611d606009836104d0565b6811103bb4b23a341e9160b91b815260090192915050565b6000611d856017836104d0565b7f2220746578742d616e63686f723d226d6964646c65223e000000000000000000815260170192915050565b6000611dbe6025836104d0565b7f2220666f6e742d66616d696c793d226d6f6e6f73706163652220666f6e742d7381526434bd329e9160d91b602082015260250192915050565b8051600090610100840190611e0d8582611f10565b506020830151611e206020860182611f10565b506040830151611e336040860182611f10565b506060830151611e466060860182611f10565b5060808301518482036080860152611e5e82826114f5565b91505060a083015184820360a0860152611e788282611eb5565b91505060c083015184820360c0860152611e9282826114f5565b91505060e083015184820360e0860152611eac82826114f5565b95945050505050565b8051606080845260009190840190611ecd828261144e565b91505060208301518482036020860152611ee7828261144e565b91505060408301518482036040860152611eac828261144e565b611f0a81612422565b82525050565b611f0a81612425565b6000611f25828561152d565b91506105ef828461152d565b6000611f3d828661152d565b9150611f49828561152d565b9150611f55828461152d565b9150611eac82611d31565b6000611f6c828761152d565b9150611f7782611910565b9150611f83828661152d565b9150611f8e82611db1565b9150611f9a828561152d565b9150611fa582611d78565b9150611fb1828461152d565b9150611fbc82611620565b9695505050505050565b6000611fd2828561152d565b9150611f25826119c8565b6000611fe9828661152d565b9150611ff482611aa0565b9150612000828561152d565b915061200b82611870565b9150612017828461152d565b9150611eac82611949565b600061202e828961152d565b915061203982611d0c565b9150612045828861152d565b915061205082611c20565b915061205c828761152d565b915061206782611d53565b9150612073828661152d565b915061207e826118ea565b915061208a828561152d565b915061209582611693565b91506120a1828461152d565b91506120ac826119a8565b98975050505050505050565b60006120c382611ae6565b91506120cf828461155c565b915061036c826119a8565b60006120e582611be7565b915061036c828461152d565b60006120fc82611c41565b9150612108828d61152d565b9150612113826116b8565b915061211f828c61152d565b915061212a82611c7a565b9150612136828b61152d565b91506121418261189c565b915061214d828a61155c565b915061215882611a58565b9150612164828961152d565b915061216f826119e5565b915061217b828861152d565b915061218682611cc1565b9150612192828761152d565b915061219d82611647565b91506121a9828661152d565b91506121b482611824565b91506121c0828561152d565b91506121cb826115d6565b91506121d7828461152d565b91506121e282611a3a565b9c9b505050505050505050505050565b6020808252810161036c81846114f5565b608080825281016122148187611df8565b9050818103602083015261222881866114a7565b9050818103604083015261223c81856114a7565b90508181036060830152611fbc81846114a7565b602081016108528284611f01565b6040810161226c8285611f01565b61036c6020830184611f01565b6040518181016001600160401b038111828210171561229a5761229a61253c565b604052919050565b60006001600160401b038211156122bb576122bb61253c565b5060209081020190565b60006001600160401b038211156122de576122de61253c565b506020601f91909101601f19160190565b60200190565b60009081526020902090565b5190565b90815260200190565b600061231982612422565b915061232483612422565b92508219821115612337576123376124fa565b500190565b600061234782612425565b915061235283612425565b92508260ff03821115612337576123376124fa565b600061237282612422565b915061237d83612422565b92508261238c5761238c612510565b500490565b600061239c82612422565b91506123a783612422565b92508160001904831182151516156123c1576123c16124fa565b500290565b60006123d182612425565b91506123dc83612425565b92508160ff04831182151516156123c1576123c16124fa565b600061240082612422565b915061240b83612422565b92508282101561241d5761241d6124fa565b500390565b90565b60ff1690565b82818337506000910152565b60005b8381101561245257818101518382015260200161243a565b83811115612461576000848401525b50505050565b60028104600182168061247b57607f821691505b6020821081141561248e5761248e612526565b50919050565b600061249f82612422565b91506000198214156124b3576124b36124fa565b5060010190565b60006124c582612422565b91506124d083612422565b9250826124df576124df612510565b500690565b60006124ef82612425565b91506124d083612425565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f191690565b61256581612422565b811461257057600080fd5b50565b6125658161242556fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220a0925f54042f2d355438bbb46bd84e71c234426ce1f21076d2fbcff8683d77d864736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063194d02d71461005157806319db2b2f1461007b57806329010f431461009b578063a662e0f4146100ae575b600080fd5b61006461005f366004611400565b6100ce565b60405161007292919061225e565b60405180910390f35b61008e610089366004611385565b610107565b60405161007291906121f2565b61008e6100a93660046112c9565b610373565b6100c16100bc366004611261565b61048f565b6040516100729190612250565b600080600083116100de57600080fd5b6100e88385612367565b91506100f48284612391565b6100fe90856123f5565b90509250929050565b60a08201518051602082015160409283015192516329010f4360e01b8152606093849330936329010f4393610142938a939291600401612203565b60006040518083038186803b15801561015a57600080fd5b505afa15801561016e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101969190810190611295565b905060006101aa856000015160ff166104d5565b85516101b89060ff166104d5565b6040516020016101c9929190611fc6565b604051602081830303815290604052905060006103436101e8886104d5565b8760e001518460188a6020015160ff166006811061021657634e487b7160e01b600052603260045260246000fd5b016102488a60018151811061023b57634e487b7160e01b600052603260045260246000fd5b60200260200101516104d5565b61026c8b60008151811061023b57634e487b7160e01b600052603260045260246000fd5b8c60c001518d6060015160ff166001146102a057604051806040016040528060028152602001614e6f60f01b8152506102bd565b6040518060400160405280600381526020016259657360e81b8152505b60408f015160ff16156102ee576040518060400160405280600681526020016521b0bb32b93760d11b81525061030d565b6040518060400160405280600581526020016410dc9e5c1d60da1b8152505b6103168d6105f7565b60405160200161032f9a999897969594939291906120f1565b6040516020818303038152906040526105f7565b90508060405160200161035691906120da565b60408051601f1981840301815291905293505050505b9392505050565b60608060008660200151600461038991906123c6565b60ff16601881106103aa57634e487b7160e01b600052603260045260246000fd5b016040516020016103bb91906120b8565b60405160208183030381529060405290506103da818760e0015161076a565b90506000806103ef886000015160ff16610858565b9150915060006040518060e001604052808381526020018481526020016104198b608001516108a4565b8152602001604051806020016040528060008152508152602001600081526020016000815260200160008152509050836104538a83610951565b6104608a8a8a8e87610ce3565b60405160200161047293929190611f31565b60408051808303601f190181529190529998505050505050505050565b60008082511161049e57600080fd5b6000806104ad845160206100ce565b909250905080156104cc576104c382600161230e565b925050506104d0565b5090505b919050565b6060816104fa57506040805180820190915260018152600360fc1b60208201526104d0565b8160005b8115610524578061050e81612494565b915061051d9050600a83612367565b91506104fe565b6000816001600160401b0381111561054c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610576576020820181803683370190505b5090505b84156105ef5761058b6001836123f5565b9150610598600a866124ba565b6105a390603061230e565b60f81b8183815181106105c657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506105e8600a86612367565b945061057a565b949350505050565b8051606090806106175750506040805160208101909152600081526104d0565b6000600361062683600261230e565b6106309190612367565b61063b906004612391565b9050600061064a82602061230e565b6001600160401b0381111561066f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610699576020820181803683370190505b509050600060405180606001604052806040815260200161257d604091399050600181016020830160005b86811015610725576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016106c4565b50600386066001811461073f57600281146107505761075c565b613d3d60f01b60011983015261075c565b603d60f81b6000198301525b505050918152949350505050565b805160609060008060198311610786575060059050600361079b565b5060049050600261079860078461230e565b92505b856107d16002836107ad87600361230e565b6107b79190612391565b6107c29060646123f5565b6107cc9190612367565b6104d5565b6107ea836107e087600361230e565b6107cc9190612391565b6040516020016107fc93929190611fdd565b60408051601f1981840301815291905295508561081d6107cc856003612391565b610826846104d5565b8760405160200161083a9493929190611f60565b60405160208183030381529060405295508593505050505b92915050565b6000808061086784600661230e565b610873906101f4612367565b9050600060026108838684612391565b61088f906101f46123f5565b6108999190612367565b935090915050915091565b606060006108b18361048f565b90506000816001600160401b038111156108db57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610904578160200160208202803683370190505b509050600080805b84811015610946578260200187015191508183602001850152602083610932919061230e565b92508061093e81612494565b91505061090c565b509195945050505050565b606060005b835160ff16811015610cd857608083015160c0840152606060005b855160ff16811015610bba5761098f85604001518660800151610e0d565b60011480156109a2575060008560800151115b80156109c957506109c78560400151600187608001516109c291906123f5565b610e0d565b155b15610b3e5760a085018051906109de82612494565b9052508451865160c0870151610b3792859290916109ff9160ff16906124ba565b610a099190612391565b8760200151610a18919061230e565b8751895160c08a0151610a2e9160ff1690612367565b610a389190612391565b8860200151610a47919061230e565b885160c08a015160808b0151610a5d91906123f5565b610a679190612391565b895160208c0151600090610a7c9060046123c6565b610a8790600161233c565b60ff1660188110610aa857634e487b7160e01b600052603260045260246000fd5b018054610ab490612467565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae090612467565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050610e88565b9150610b95565b610b5085604001518660800151610e0d565b158015610b61575060008560800151115b8015610b855750610b818560400151600187608001516109c291906123f5565b6001145b15610b9557608085015160c08601525b60808501805190610ba582612494565b90525080610bb281612494565b915050610971565b50610bd48460400151600186608001516109c291906123f5565b610c895760a08401805190610be882612494565b9052508351855160c0860151610c869284929091610c099160ff16906124ba565b610c139190612391565b8660200151610c22919061230e565b8651885160c0890151610c389160ff1690612367565b610c429190612391565b8760200151610c51919061230e565b875160c089015160808a0151610c6791906123f5565b610c719190612391565b885160208b0151600090610a7c9060046123c6565b90505b836060015181604051602001610ca0929190611f19565b60408051601f198184030181529181526060860191909152805160208101909152600090525080610cd081612494565b915050610956565b505060600151919050565b60608060005b8551811015610e0257610dee82856000015187600001518b8581518110610d2057634e487b7160e01b600052603260045260246000fd5b6020026020010151610d3291906124e4565b60ff16610d3f9190612391565b8660200151610d4e919061230e565b86600001518a8581518110610d7357634e487b7160e01b600052603260045260246000fd5b602002602001015160ff16610d889190612391565b8760200151610d97919061230e565b87518a5181906000908d9089908110610dc057634e487b7160e01b600052603260045260246000fd5b60200260200101518c602001516004610dd991906123c6565b610de490600261233c565b610a87919061233c565b915080610dfa81612494565b915050610ce9565b509695505050505050565b6000806000610e1e846101006100ce565b9092509050610e2f82610100612391565b610e3a9060ff61230e565b841115610e4657600080fd5b610e518160ff6123f5565b858381518110610e7157634e487b7160e01b600052603260045260246000fd5b6020026020010151901c6001169250505092915050565b606086610e94876104d5565b610e9d876104d5565b610ea6876104d5565b610eaf876104d5565b86604051602001610ec596959493929190612022565b60408051601f19818403018152919052979650505050505050565b6000610ef3610eee846122a2565b612279565b90508083825260208201905082856020860282011115610f1257600080fd5b60005b85811015610f3e5781610f28888261124b565b8452506020928301929190910190600101610f15565b5050509392505050565b6000610f56610eee846122a2565b90508083825260208201905082856020860282011115610f7557600080fd5b60005b85811015610f3e5781610f8b8882611256565b8452506020928301929190910190600101610f78565b6000610faf610eee846122c5565b905082815260208101848484011115610fc757600080fd5b610fd284828561242b565b509392505050565b6000610fe8610eee846122c5565b90508281526020810184848401111561100057600080fd5b610fd2848285612437565b600082601f83011261101c57600080fd5b81356105ef848260208601610ee0565b600082601f83011261103d57600080fd5b81356105ef848260208601610f48565b600082601f83011261105e57600080fd5b81356105ef848260208601610fa1565b600082601f83011261107f57600080fd5b81516105ef848260208601610fda565b600061010082840312156110a257600080fd5b6110ad610100612279565b905060006110bb8484611256565b82525060206110cc84848301611256565b60208301525060406110e084828501611256565b60408301525060606110f484828501611256565b60608301525060808201356001600160401b0381111561111357600080fd5b61111f8482850161104d565b60808301525060a08201356001600160401b0381111561113e57600080fd5b61114a848285016111ac565b60a08301525060c08201356001600160401b0381111561116957600080fd5b6111758482850161104d565b60c08301525060e08201356001600160401b0381111561119457600080fd5b6111a08482850161104d565b60e08301525092915050565b6000606082840312156111be57600080fd5b6111c86060612279565b905081356001600160401b038111156111e057600080fd5b6111ec8482850161102c565b82525060208201356001600160401b0381111561120857600080fd5b6112148482850161102c565b60208301525060408201356001600160401b0381111561123357600080fd5b61123f8482850161102c565b60408301525092915050565b80356108528161255c565b803561085281612573565b60006020828403121561127357600080fd5b81356001600160401b0381111561128957600080fd5b6105ef8482850161104d565b6000602082840312156112a757600080fd5b81516001600160401b038111156112bd57600080fd5b6105ef8482850161106e565b600080600080608085870312156112df57600080fd5b84356001600160401b038111156112f557600080fd5b6113018782880161108f565b94505060208501356001600160401b0381111561131d57600080fd5b6113298782880161102c565b93505060408501356001600160401b0381111561134557600080fd5b6113518782880161102c565b92505060608501356001600160401b0381111561136d57600080fd5b6113798782880161102c565b91505092959194509250565b60008060006060848603121561139a57600080fd5b60006113a6868661124b565b93505060208401356001600160401b038111156113c257600080fd5b6113ce8682870161108f565b92505060408401356001600160401b038111156113ea57600080fd5b6113f68682870161100b565b9150509250925092565b6000806040838503121561141357600080fd5b600061141f858561124b565b92505060206114308582860161124b565b9150509250929050565b60006114468383611f10565b505060200190565b600061145982612301565b6114638185612305565b935061146e836122ef565b8060005b8381101561149c578151611486888261143a565b9750611491836122ef565b925050600101611472565b509495945050505050565b60006114b282612301565b6114bc8185612305565b93506114c7836122ef565b8060005b8381101561149c5781516114df888261143a565b97506114ea836122ef565b9250506001016114cb565b600061150082612301565b61150a8185612305565b935061151a818560208601612437565b61152381612552565b9093019392505050565b600061153882612301565b61154281856104d0565b9350611552818560208601612437565b9290920192915050565b6000815461156981612467565b61157381866104d0565b945060018216801561158c576001811461159d576115cd565b60ff198316865281860193506115cd565b6115a6856122f5565b60005b838110156115c5578154888201526001909101906020016115a9565b838801955050505b50505092915050565b60006115e36028836104d0565b7f227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c8152670ed8985cd94d8d0b60c21b602082015260280192915050565b600061162d600b836104d0565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b0192915050565b6000611654602a836104d0565b7f227d2c207b2274726169745f74797065223a20226c6567656e64617279222c20815269113b30b63ab2911d101160b11b6020820152602a0192915050565b60006116a06009836104d0565b68222066696c6c3d222360b81b815260090192915050565b60006116c661011f836104d0565b7f222c20226465736372697074696f6e223a202243727970747320616e6420436181527f7665726e7320697320616e206f6e636861696e206d61702067656e657261746f60208201527f7220746861742070726f647563657320616e20696e66696e697465207365742060408201527f6f662064756e67656f6e732e20456e656d6965732c2074726561737572652c2060608201527f65746320696e74656e74696f6e616c6c79206f6d697474656420666f72206f7460808201527f6865727320746f20696e746572707265742e204665656c206672656520746f2060a08201527f7573652043727970747320616e642043617665726e7320696e20616e7920776160c08201527f7920796f752077616e742e222c202261747472696275746573223a205b207b2260e08201527f74726169745f74797065223a20226e616d65222c202276616c7565223a20220061010082015261011f0192915050565b6000611831602a836104d0565b7f227d2c207b2274726169745f74797065223a2022737472756374757265222c20815269113b30b63ab2911d101160b11b6020820152602a0192915050565b600061187d6010836104d0565b6f11103c9e91169891103bb4b23a341e9160811b815260100192915050565b60006118a9602c836104d0565b7f227d2c207b2274726169745f74797065223a2022656e7669726f6e6d656e742281526b1610113b30b63ab2911d101160a11b6020820152602c0192915050565b60006118f7600a836104d0565b6911103432b4b3b43a1e9160b11b8152600a0192915050565b600061191d601c836104d0565b7f3c7465787420783d2235302220793d22352e35222077696474683d22000000008152601c0192915050565b60006119566040836104d0565b7f22206865696768743d223922207374726f6b652d77696474683d22302e33222081527f7374726f6b653d22626c61636b222066696c6c3d222346464138303022202f3e602082015260400192915050565b60006119b56004836104d0565b631110179f60e11b815260040192915050565b60006119d56001836104d0565b600f60fb1b815260010192915050565b60006119f26033836104d0565b7f227d2c207b2274726169745f74797065223a2022706f696e7473206f6620696e8152723a32b932b9ba111610113b30b63ab2911d101160691b602082015260330192915050565b6000611a476002836104d0565b61227d60f01b815260020192915050565b6000611a656026836104d0565b7f227d2c207b2274726169745f74797065223a2022646f6f7273222c202276616c8152653ab2911d101160d11b602082015260260192915050565b6000611aad6024836104d0565b7f3c67207472616e73666f726d3d227363616c65202835203529223e3c72656374815263103c1e9160e11b602082015260240192915050565b6000611af360c1836104d0565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203530302035303060408201527f222073686170652d72656e646572696e673d226372697370456467657322207460608201527f72616e73666f726d2d6f726967696e3d2263656e746572223e3c72656374207760808201527f696474683d223130302522206865696768743d2231303025222066696c6c3d2260a0820152602360f81b60c082015260c10192915050565b6000611bf4601d836104d0565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152601d0192915050565b6000611c2d6005836104d0565b6411103c9e9160d91b815260050192915050565b6000611c4e601e836104d0565b7f7b226e616d65223a202243727970747320616e642043617665726e73202300008152601e0192915050565b6000611c876025836104d0565b7f227d2c207b2274726169745f74797065223a202273697a65222c202276616c7581526432911d101160d91b602082015260250192915050565b6000611cce6029836104d0565b7f227d2c207b2274726169745f74797065223a2022616666696e697479222c20228152683b30b63ab2911d101160b91b602082015260290192915050565b6000611d196009836104d0565b681e3932b1ba103c1e9160b91b815260090192915050565b6000611d3e6006836104d0565b651e17b9bb339f60d11b815260060192915050565b6000611d606009836104d0565b6811103bb4b23a341e9160b91b815260090192915050565b6000611d856017836104d0565b7f2220746578742d616e63686f723d226d6964646c65223e000000000000000000815260170192915050565b6000611dbe6025836104d0565b7f2220666f6e742d66616d696c793d226d6f6e6f73706163652220666f6e742d7381526434bd329e9160d91b602082015260250192915050565b8051600090610100840190611e0d8582611f10565b506020830151611e206020860182611f10565b506040830151611e336040860182611f10565b506060830151611e466060860182611f10565b5060808301518482036080860152611e5e82826114f5565b91505060a083015184820360a0860152611e788282611eb5565b91505060c083015184820360c0860152611e9282826114f5565b91505060e083015184820360e0860152611eac82826114f5565b95945050505050565b8051606080845260009190840190611ecd828261144e565b91505060208301518482036020860152611ee7828261144e565b91505060408301518482036040860152611eac828261144e565b611f0a81612422565b82525050565b611f0a81612425565b6000611f25828561152d565b91506105ef828461152d565b6000611f3d828661152d565b9150611f49828561152d565b9150611f55828461152d565b9150611eac82611d31565b6000611f6c828761152d565b9150611f7782611910565b9150611f83828661152d565b9150611f8e82611db1565b9150611f9a828561152d565b9150611fa582611d78565b9150611fb1828461152d565b9150611fbc82611620565b9695505050505050565b6000611fd2828561152d565b9150611f25826119c8565b6000611fe9828661152d565b9150611ff482611aa0565b9150612000828561152d565b915061200b82611870565b9150612017828461152d565b9150611eac82611949565b600061202e828961152d565b915061203982611d0c565b9150612045828861152d565b915061205082611c20565b915061205c828761152d565b915061206782611d53565b9150612073828661152d565b915061207e826118ea565b915061208a828561152d565b915061209582611693565b91506120a1828461152d565b91506120ac826119a8565b98975050505050505050565b60006120c382611ae6565b91506120cf828461155c565b915061036c826119a8565b60006120e582611be7565b915061036c828461152d565b60006120fc82611c41565b9150612108828d61152d565b9150612113826116b8565b915061211f828c61152d565b915061212a82611c7a565b9150612136828b61152d565b91506121418261189c565b915061214d828a61155c565b915061215882611a58565b9150612164828961152d565b915061216f826119e5565b915061217b828861152d565b915061218682611cc1565b9150612192828761152d565b915061219d82611647565b91506121a9828661152d565b91506121b482611824565b91506121c0828561152d565b91506121cb826115d6565b91506121d7828461152d565b91506121e282611a3a565b9c9b505050505050505050505050565b6020808252810161036c81846114f5565b608080825281016122148187611df8565b9050818103602083015261222881866114a7565b9050818103604083015261223c81856114a7565b90508181036060830152611fbc81846114a7565b602081016108528284611f01565b6040810161226c8285611f01565b61036c6020830184611f01565b6040518181016001600160401b038111828210171561229a5761229a61253c565b604052919050565b60006001600160401b038211156122bb576122bb61253c565b5060209081020190565b60006001600160401b038211156122de576122de61253c565b506020601f91909101601f19160190565b60200190565b60009081526020902090565b5190565b90815260200190565b600061231982612422565b915061232483612422565b92508219821115612337576123376124fa565b500190565b600061234782612425565b915061235283612425565b92508260ff03821115612337576123376124fa565b600061237282612422565b915061237d83612422565b92508261238c5761238c612510565b500490565b600061239c82612422565b91506123a783612422565b92508160001904831182151516156123c1576123c16124fa565b500290565b60006123d182612425565b91506123dc83612425565b92508160ff04831182151516156123c1576123c16124fa565b600061240082612422565b915061240b83612422565b92508282101561241d5761241d6124fa565b500390565b90565b60ff1690565b82818337506000910152565b60005b8381101561245257818101518382015260200161243a565b83811115612461576000848401525b50505050565b60028104600182168061247b57607f821691505b6020821081141561248e5761248e612526565b50919050565b600061249f82612422565b91506000198214156124b3576124b36124fa565b5060010190565b60006124c582612422565b91506124d083612422565b9250826124df576124df612510565b500690565b60006124ef82612425565b91506124d083612425565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f191690565b61256581612422565b811461257057600080fd5b50565b6125658161242556fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220a0925f54042f2d355438bbb46bd84e71c234426ce1f21076d2fbcff8683d77d864736f6c63430008000033

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.