ETH Price: $3,241.77 (-1.37%)
Gas: 2.43 Gwei

Contract

0xd5b21584D06A6052230E1C2d049ed39796706AD3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

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

Contract Source Code Verified (Exact Match)

Contract Name:
GridArt

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 3 : GridArt.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "../interfaces/IHoneycombs.sol";
import "./Utilities.sol";

/**
@title  GridArt
@notice Generates the grid for a given Honeycomb.
*/
library GridArt {
    enum HEXAGON_TYPE { FLAT, POINTY } // prettier-ignore
    enum SHAPE { TRIANGLE, DIAMOND, HEXAGON, RANDOM } // prettier-ignore

    /// @dev The paths for a 72x72 px hexagon.
    function getHexagonPath(uint8 pathType) public pure returns (string memory path) {
        if (pathType == uint8(HEXAGON_TYPE.FLAT)) {
            return "M22.2472 7.32309L4.82457 37.5C3.93141 39.047 3.93141 40.953 4.82457 42.5L22.2472 72.6769C23.1404 74.2239 24.791 75.1769 26.5774 75.1769H61.4226C63.209 75.1769 64.8596 74.2239 65.7528 72.6769L83.1754 42.5C84.0686 40.953 84.0686 39.047 83.1754 37.5L65.7528 7.32309C64.8596 5.77608 63.209 4.82309 61.4226 4.82309H26.5774C24.791 4.82309 23.1404 5.77608 22.2472 7.32309Z"; // prettier-ignore
        } else if (pathType == uint8(HEXAGON_TYPE.POINTY)) {
            return "M72.6769 22.2472L42.5 4.82457C40.953 3.93141 39.047 3.93141 37.5 4.82457L7.32309 22.2472C5.77608 23.1404 4.82309 24.791 4.82309 26.5774V61.4226C4.82309 63.209 5.77608 64.8596 7.32309 65.7528L37.5 83.1754C39.047 84.0686 40.953 84.0686 42.5 83.1754L72.6769 65.7528C74.2239 64.8596 75.1769 63.209 75.1769 61.4226V26.5774C75.1769 24.791 74.2239 23.1404 72.6769 22.2472Z"; // prettier-ignore
        }
    }

        /// @dev Get hexagon from given grid and hexagon properties.
    /// @param grid The grid metadata.
    /// @param xIndex The x index in the grid.
    /// @param yIndex The y index in the grid.
    /// @param gradientId The gradient id for the hexagon.
    function getUpdatedHexagonsSvg(
        IHoneycombs.Grid memory grid,
        uint16 xIndex,
        uint16 yIndex,
        uint16 gradientId
    ) public pure returns (bytes memory) {
        uint16 x = grid.gridX + xIndex * grid.columnDistance;
        uint16 y = grid.gridY + yIndex * grid.rowDistance;

        // prettier-ignore
        return abi.encodePacked(grid.hexagonsSvg, abi.encodePacked(
            '<use href="#hexagon" stroke="url(#gradient', Utilities.uint2str(gradientId), ')" ',
                'x="', Utilities.uint2str(x), '" y="', Utilities.uint2str(y), '"',
            '/>'
        ));
    }

    /// @dev Add positioning to the grid (for centering on canvas).
    /// @dev Note this function appends attributes to grid object, so returned object has original grid + positioning.
    /// @param honeycomb The honeycomb data used for rendering.
    /// @param grid The grid metadata.
    function addGridPositioning(
        IHoneycombs.Honeycomb memory honeycomb,
        IHoneycombs.Grid memory grid
    ) public pure returns (IHoneycombs.Grid memory) {
        // Compute grid properties.
        grid.rowDistance = ((3 * honeycomb.canvas.hexagonSize) / 4) + 7; // 7 is a relatively arbitrary buffer
        grid.columnDistance = honeycomb.canvas.hexagonSize / 2 - 1;
        uint16 gridHeight = honeycomb.canvas.hexagonSize + 7 + ((grid.rows - 1) * grid.rowDistance);
        uint16 gridWidth = grid.longestRowCount * (honeycomb.canvas.hexagonSize - 2);

        /**
         * Swap variables if it is a flat top hexagon (this math assumes pointy top as default). Rotating a flat top
         * hexagon 90 degrees clockwise results in a pointy top hexagon. This effectively swaps the x and y axis.
         */
        if (honeycomb.baseHexagon.hexagonType == uint8(HEXAGON_TYPE.FLAT)) {
            (grid.rowDistance, grid.columnDistance) = Utilities.swap(grid.rowDistance, grid.columnDistance);
            (gridWidth, gridHeight) = Utilities.swap(gridWidth, gridHeight);
        }

        // Compute grid positioning.
        grid.gridX = (honeycomb.canvas.size - gridWidth) / 2;
        grid.gridY = (honeycomb.canvas.size - gridHeight) / 2;

        return grid;
    }

    /// @dev Get the honeycomb grid for a random shape.
    /// @dev Note: can only be called for pointy tops (flat tops are not supported as they would be redundant).
    /// @param honeycomb The honeycomb data used for rendering.
    function getRandomGrid(IHoneycombs.Honeycomb memory honeycomb) public pure returns (IHoneycombs.Grid memory) {
        IHoneycombs.Grid memory grid;

        // Get random rows from 1 to honeycomb.canvas.maxHexagonsPerline.
        grid.rows = uint8(Utilities.random(honeycomb.seed, "rows", honeycomb.canvas.maxHexagonsPerLine) + 1);

        // Get random hexagons in each row from 1 to honeycomb.canvas.maxHexagonsPerLine - 1.
        uint8[] memory hexagonsInRow = new uint8[](grid.rows);
        for (uint8 i; i < grid.rows; ) {
            hexagonsInRow[i] =
                uint8(Utilities.random(
                    honeycomb.seed,
                    abi.encodePacked("hexagonsInRow", Utilities.uint2str(i)),
                    honeycomb.canvas.maxHexagonsPerLine - 1
                ) + 1); // prettier-ignore
            grid.longestRowCount = Utilities.max(hexagonsInRow[i], grid.longestRowCount);

            unchecked {
                ++i;
            }
        }

        // Determine positioning of entire grid, which is based on the longest row.
        grid = addGridPositioning(honeycomb, grid); // appends to grid object

        int8 lastRowEvenOdd = -1; // Helps avoid overlapping hexagons: -1 = unset, 0 = even, 1 = odd
        // Create random grid. Only working with pointy tops for simplicity.
        for (uint8 i; i < grid.rows; ) {
            uint8 firstX = grid.longestRowCount - hexagonsInRow[i];

            // Increment firstX if last row's evenness/oddness is same as this rows and update with current.
            if (lastRowEvenOdd == int8(firstX % 2)) ++firstX;
            lastRowEvenOdd = int8(firstX % 2);

            // Assign indexes for each hexagon.
            for (uint8 j; j < hexagonsInRow[i]; ) {
                uint8 xIndex = firstX + (j * 2);
                grid.hexagonsSvg = getUpdatedHexagonsSvg(grid, xIndex, i, i + 1);
                unchecked {
                    ++j;
                }
            }

            unchecked {
                ++i;
            }
        }

        grid.totalGradients = grid.rows;
        return grid;
    }

    /// @dev Get the honeycomb grid for a hexagon shape.
    /// @param honeycomb The honeycomb data used for rendering.
    function getHexagonGrid(IHoneycombs.Honeycomb memory honeycomb) public pure returns (IHoneycombs.Grid memory) {
        IHoneycombs.Grid memory grid;

        // Get random rows from 3 to honeycomb.canvas.maxHexagonsPerLine, only odd.
        grid.rows = uint8(
            Utilities.random(honeycomb.seed, "rows", (honeycomb.canvas.maxHexagonsPerLine / 2) - 1) * 2 + 3
        );

        // Determine positioning of entire grid, which is based on the longest row.
        grid.longestRowCount = grid.rows;
        grid = addGridPositioning(honeycomb, grid); // appends to grid object

        // Create grid based on hexagon base type.
        if (honeycomb.baseHexagon.hexagonType == uint8(HEXAGON_TYPE.POINTY)) {
            grid.totalGradients = grid.rows;

            for (uint8 i; i < grid.rows; ) {
                // Compute hexagons in row.
                uint8 hexagonsInRow = grid.rows - Utilities.absDiff(grid.rows / 2, i);

                // Assign indexes for each hexagon.
                for (uint8 j; j < hexagonsInRow; ) {
                    uint8 xIndex = (grid.rows - hexagonsInRow) + (j * 2);
                    grid.hexagonsSvg = getUpdatedHexagonsSvg(grid, xIndex, i, i + 1);
                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
        } else if (honeycomb.baseHexagon.hexagonType == uint8(HEXAGON_TYPE.FLAT)) {
            uint8 flatTopRows = grid.rows * 2 - 1;
            grid.totalGradients = flatTopRows;
            uint8 halfRows = grid.rows / 2;

            for (uint8 i; i < flatTopRows; ) {
                // Determine hexagons in row.
                uint8 hexagonsInRow;
                if (i <= grid.rows / 2) {
                    // ascending, i.e. rows = 1 2 3 4 5 when rows = 5
                    hexagonsInRow = i + 1;
                } else if (i < flatTopRows - halfRows - 1) {
                    // alternate between rows / 2 + 1 and rows / 2 every other row
                    hexagonsInRow = (halfRows + i) % 2 == 0 ? halfRows + 1 : halfRows;
                } else {
                    // descending, i.e. rows = 5, 4, 3, 2, 1 when rows = 5
                    hexagonsInRow = flatTopRows - i;
                }

                // Assign indexes for each hexagon.
                for (uint8 j; j < hexagonsInRow; ) {
                    uint8 xIndex = (grid.rows - hexagonsInRow) - halfRows + (j * 2);
                    grid.hexagonsSvg = getUpdatedHexagonsSvg(grid, xIndex, i, i + 1);
                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
        }

        return grid;
    }

    /// @dev Get the honeycomb grid for a diamond shape.
    /// @param honeycomb The honeycomb data used for rendering.
    function getDiamondGrid(IHoneycombs.Honeycomb memory honeycomb) public pure returns (IHoneycombs.Grid memory) {
        IHoneycombs.Grid memory grid;

        // Get random rows from 3 to honeycomb.canvas.maxHexagonsPerLine, only odd.
        grid.rows = uint8(
            Utilities.random(honeycomb.seed, "rows", (honeycomb.canvas.maxHexagonsPerLine / 2) - 1) * 2 + 3
        );

        // Determine positioning of entire grid, which is based on the longest row.
        grid.longestRowCount = grid.rows / 2 + 1;
        grid = addGridPositioning(honeycomb, grid); // appends to grid object

        // Create diamond grid. Both flat top and pointy top result in the same grid, so no need to check hexagon type.
        for (uint8 i; i < grid.rows; ) {
            // Determine hexagons in row. Pattern is ascending/descending sequence, i.e 1 2 3 2 1 when rows = 5.
            uint8 hexagonsInRow = i < grid.rows / 2 ? i + 1 : grid.rows - i;
            uint8 firstXInRow = i < grid.rows / 2 ? grid.rows / 2 - i : i - grid.rows / 2;

            // Assign indexes for each hexagon.
            for (uint8 j; j < hexagonsInRow; ) {
                uint8 xIndex = firstXInRow + (j * 2);
                grid.hexagonsSvg = getUpdatedHexagonsSvg(grid, xIndex, i, i + 1);
                unchecked {
                    ++j;
                }
            }

            unchecked {
                ++i;
            }
        }

        grid.totalGradients = grid.rows;
        return grid;
    }

    /// @dev Get the honeycomb grid for a triangle shape.
    /// @param honeycomb The honeycomb data used for rendering.
    function getTriangleGrid(IHoneycombs.Honeycomb memory honeycomb) public pure returns (IHoneycombs.Grid memory) {
        IHoneycombs.Grid memory grid;

        // Get random rows from 2 to honeycomb.canvas.maxHexagonsPerLine.
        grid.rows = uint8(Utilities.random(honeycomb.seed, "rows", honeycomb.canvas.maxHexagonsPerLine - 1) + 2);

        // Determine positioning of entire grid, which is based on the longest row.
        grid.longestRowCount = grid.rows;
        grid = addGridPositioning(honeycomb, grid); // appends to grid object

        // Create grid based on hexagon base type.
        if (honeycomb.baseHexagon.hexagonType == uint8(HEXAGON_TYPE.POINTY)) {
            grid.totalGradients = grid.rows;

            // Iterate through rows - will only be north/south facing (design).
            for (uint8 i; i < grid.rows; ) {
                // Assign indexes for each hexagon. Each row has i + 1 hexagons.
                for (uint8 j; j < i + 1; ) {
                    uint8 xIndex = grid.rows - 1 - i + (j * 2);
                    grid.hexagonsSvg = getUpdatedHexagonsSvg(grid, xIndex, i, i + 1);
                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
        } else if (honeycomb.baseHexagon.hexagonType == uint8(HEXAGON_TYPE.FLAT)) {
            uint8 flatTopRows = grid.rows * 2 - 1;
            grid.totalGradients = flatTopRows;

            // Iterate through rows - will only be west/east facing (design).
            for (uint8 i; i < flatTopRows; ) {
                // Determine hexagons in row. First half is ascending. Second half is descending.
                uint8 hexagonsInRow;
                if (i <= flatTopRows / 2) {
                    // ascending with peak, i.e. rows = 1 1 2 2 3 when rows = 5
                    hexagonsInRow = i / 2 + 1;
                } else {
                    // descending with peak, i.e. rows = 2 2 1 1 when rows = 5
                    hexagonsInRow = ((flatTopRows - i - 1) / 2) + 1;
                }

                // Assign indexes for each hexagon. Each row has i + 1 hexagons.
                for (uint8 j; j < hexagonsInRow; ) {
                    uint8 xIndex = (i % 2) + (j * 2);
                    grid.hexagonsSvg = getUpdatedHexagonsSvg(grid, xIndex, i, i + 1);
                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
        }

        return grid;
    }

    /// @dev Generate the overall honeycomb grid, including the final svg.
    /// @dev Using double coordinates: https://www.redblobgames.com/grids/hexagons/#coordinates-doubled
    /// @param honeycomb The honeycomb data used for rendering.
    /// @return (bytes, uint8, uint8) The svg, totalGradients, and rows.
    function generateGrid(IHoneycombs.Honeycomb memory honeycomb) public pure returns (bytes memory, uint8, uint8) {
        // Partial grid object used to store supportive variables
        IHoneycombs.Grid memory gridData;

        // Get grid data based on shape.
        if (honeycomb.grid.shape == uint8(SHAPE.TRIANGLE)) {
            gridData = getTriangleGrid(honeycomb);
        } else if (honeycomb.grid.shape == uint8(SHAPE.DIAMOND)) {
            gridData = getDiamondGrid(honeycomb);
        } else if (honeycomb.grid.shape == uint8(SHAPE.HEXAGON)) {
            gridData = getHexagonGrid(honeycomb);
        } else if (honeycomb.grid.shape == uint8(SHAPE.RANDOM)) {
            gridData = getRandomGrid(honeycomb);
        }

        // Generate grid svg.
        // prettier-ignore
        bytes memory svg = abi.encodePacked(
            '<g transform="scale(1) rotate(', 
                    Utilities.uint2str(honeycomb.grid.rotation) ,',', 
                    Utilities.uint2str(honeycomb.canvas.size / 2) ,',', 
                    Utilities.uint2str(honeycomb.canvas.size / 2), ')">',
                gridData.hexagonsSvg,
            '</g>'
        );

        return (svg, gridData.totalGradients, gridData.rows);
    }
}

File 2 of 3 : IHoneycombs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IHoneycombs {
    /// @dev The minimal honeycomb data stored on-chain, the rest is generated.
    struct StoredHoneycomb {
        uint32 epoch; // Each honeycomb is revealed in an epoch
        uint24 day; // The days since token was created
        uint16 seed; // A unique identifier (this is the token ID since it is pre-reveal)
    }

    struct Honeycomb {
        StoredHoneycomb stored; // We carry over the honeycomb from storage
        bool isRevealed; // Whether the honeycomb is revealed
        uint256 seed; // The instantiated seed for pseudo-randomisation (post-reveal)
        bytes svg; // final svg for the honeycomb
        Canvas canvas; // all data relevant to the canvas
        BaseHexagon baseHexagon; // all data relevant to the base hexagon
        Grid grid; // all data relevant to the grid
        Gradients gradients; // all data relevant to the gradients
    }

    struct Honeycombs {
        mapping(uint256 => StoredHoneycomb) all; // All honeycombs
        uint32 maxSupply; // The maximum number of honeycombs that can be minted
        uint32 minted; // The number of honeycombs that have been minted
        uint32 burned; // The number of honeycombs that have been burned
        uint32 day0; // Marks the start of this journey
        mapping(uint256 => Epoch) epochs; // All epochs
        uint256 epoch; // The current epoch index
    }

    struct Canvas {
        string color; // background color of canvas
        uint16 size; // size or length of canvas in user units (pixels)
        uint16 hexagonSize; // size or length of hexagon in user units (pixels)
        uint16 maxHexagonsPerLine; // max number of hexagons per line
    }

    struct BaseHexagon {
        string path; // path of base hexagon
        string fillColor; // fill color of base hexagon
        uint8 strokeWidth; // stroke width size in user units (pixels)
        uint8 hexagonType; // type of base hexagon, i.e. flat or pointy
    }

    struct Grid {
        bytes hexagonsSvg; // final svg for all hexagons
        bytes svg; // final svg for the grid
        uint16 gridX; // x coordinate of the grid
        uint16 gridY; // y coordinate of the grid
        uint16 rowDistance; // distance between rows in user units (pixels)
        uint16 columnDistance; // distance between columns in user units (pixels)
        uint16 rotation; // rotation of entire shape in degrees
        uint8 shape; // shape of the grid, i.e. triangle, diamond, hexagon, random
        uint8 totalGradients; // number of gradients required based on the grid size and shape
        uint8 rows; // number of rows in the grid
        uint8 longestRowCount; // largest row size in the grid for centering purposes
    }

    struct Gradients {
        bytes svg; // final svg for the gradients
        uint16 duration; // duration of animation in seconds
        uint8 direction; // direction of animation, i.e. forward or backward
        uint8 chrome; // max number of colors in all the gradients, aka chrome
    }

    struct Epoch {
        uint128 randomness; // The source of randomness for tokens from this epoch
        uint64 revealBlock; // The block at which this epoch was / is revealed
        bool committed; // Whether the epoch has been instantiated
        bool revealed; // Whether the epoch has been revealed
    }

    event NewEpoch(uint256 indexed epoch, uint64 indexed revealBlock);

    error NotAllowed();
    error MaxSupplyReached();
    error NotExactEth();
    error MaxMintPerAddressReached();
}

File 3 of 3 : Utilities.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

library Utilities {
    /// @dev Zero-index based pseudorandom number based on one input and max bound
    function random(uint256 input, uint256 _max) internal pure returns (uint256) {
        return (uint256(keccak256(abi.encodePacked(input))) % _max);
    }

    /// @dev Zero-index based salted pseudorandom number based on two inputs and max bound
    function random(uint256 input, bytes memory salt, uint256 _max) internal pure returns (uint256) {
        return (uint256(keccak256(abi.encodePacked(input, salt))) % _max);
    }

    /// @dev Convert an integer to a string
    function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            ++len;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    /// @dev Get the larger number
    function max(uint8 one, uint8 two) internal pure returns (uint8) {
        return one > two ? one : two;
    }

    /// @dev Get the absolute difference between two numbers
    function absDiff(uint8 one, uint8 two) internal pure returns (uint8) {
        return one > two ? one - two : two - one;
    }

    /// @dev Swap two numbers
    function swap(uint16 one, uint16 two) internal pure returns (uint16, uint16) {
        return (two, one);
    }

    /// @dev Get the days since another date (input is seconds)
    function day(uint256 from, uint256 to) internal pure returns (uint24) {
        return uint24((to - from) / 24 hours + 1);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint24","name":"day","type":"uint24"},{"internalType":"uint16","name":"seed","type":"uint16"}],"internalType":"struct IHoneycombs.StoredHoneycomb","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"bytes","name":"svg","type":"bytes"},{"components":[{"internalType":"string","name":"color","type":"string"},{"internalType":"uint16","name":"size","type":"uint16"},{"internalType":"uint16","name":"hexagonSize","type":"uint16"},{"internalType":"uint16","name":"maxHexagonsPerLine","type":"uint16"}],"internalType":"struct IHoneycombs.Canvas","name":"canvas","type":"tuple"},{"components":[{"internalType":"string","name":"path","type":"string"},{"internalType":"string","name":"fillColor","type":"string"},{"internalType":"uint8","name":"strokeWidth","type":"uint8"},{"internalType":"uint8","name":"hexagonType","type":"uint8"}],"internalType":"struct IHoneycombs.BaseHexagon","name":"baseHexagon","type":"tuple"},{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"grid","type":"tuple"},{"components":[{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"duration","type":"uint16"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"chrome","type":"uint8"}],"internalType":"struct IHoneycombs.Gradients","name":"gradients","type":"tuple"}],"internalType":"struct IHoneycombs.Honeycomb","name":"honeycomb","type":"tuple"},{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"grid","type":"tuple"}],"name":"addGridPositioning","outputs":[{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint24","name":"day","type":"uint24"},{"internalType":"uint16","name":"seed","type":"uint16"}],"internalType":"struct IHoneycombs.StoredHoneycomb","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"bytes","name":"svg","type":"bytes"},{"components":[{"internalType":"string","name":"color","type":"string"},{"internalType":"uint16","name":"size","type":"uint16"},{"internalType":"uint16","name":"hexagonSize","type":"uint16"},{"internalType":"uint16","name":"maxHexagonsPerLine","type":"uint16"}],"internalType":"struct IHoneycombs.Canvas","name":"canvas","type":"tuple"},{"components":[{"internalType":"string","name":"path","type":"string"},{"internalType":"string","name":"fillColor","type":"string"},{"internalType":"uint8","name":"strokeWidth","type":"uint8"},{"internalType":"uint8","name":"hexagonType","type":"uint8"}],"internalType":"struct IHoneycombs.BaseHexagon","name":"baseHexagon","type":"tuple"},{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"grid","type":"tuple"},{"components":[{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"duration","type":"uint16"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"chrome","type":"uint8"}],"internalType":"struct IHoneycombs.Gradients","name":"gradients","type":"tuple"}],"internalType":"struct IHoneycombs.Honeycomb","name":"honeycomb","type":"tuple"}],"name":"generateGrid","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint24","name":"day","type":"uint24"},{"internalType":"uint16","name":"seed","type":"uint16"}],"internalType":"struct IHoneycombs.StoredHoneycomb","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"bytes","name":"svg","type":"bytes"},{"components":[{"internalType":"string","name":"color","type":"string"},{"internalType":"uint16","name":"size","type":"uint16"},{"internalType":"uint16","name":"hexagonSize","type":"uint16"},{"internalType":"uint16","name":"maxHexagonsPerLine","type":"uint16"}],"internalType":"struct IHoneycombs.Canvas","name":"canvas","type":"tuple"},{"components":[{"internalType":"string","name":"path","type":"string"},{"internalType":"string","name":"fillColor","type":"string"},{"internalType":"uint8","name":"strokeWidth","type":"uint8"},{"internalType":"uint8","name":"hexagonType","type":"uint8"}],"internalType":"struct IHoneycombs.BaseHexagon","name":"baseHexagon","type":"tuple"},{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"grid","type":"tuple"},{"components":[{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"duration","type":"uint16"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"chrome","type":"uint8"}],"internalType":"struct IHoneycombs.Gradients","name":"gradients","type":"tuple"}],"internalType":"struct IHoneycombs.Honeycomb","name":"honeycomb","type":"tuple"}],"name":"getDiamondGrid","outputs":[{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint24","name":"day","type":"uint24"},{"internalType":"uint16","name":"seed","type":"uint16"}],"internalType":"struct IHoneycombs.StoredHoneycomb","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"bytes","name":"svg","type":"bytes"},{"components":[{"internalType":"string","name":"color","type":"string"},{"internalType":"uint16","name":"size","type":"uint16"},{"internalType":"uint16","name":"hexagonSize","type":"uint16"},{"internalType":"uint16","name":"maxHexagonsPerLine","type":"uint16"}],"internalType":"struct IHoneycombs.Canvas","name":"canvas","type":"tuple"},{"components":[{"internalType":"string","name":"path","type":"string"},{"internalType":"string","name":"fillColor","type":"string"},{"internalType":"uint8","name":"strokeWidth","type":"uint8"},{"internalType":"uint8","name":"hexagonType","type":"uint8"}],"internalType":"struct IHoneycombs.BaseHexagon","name":"baseHexagon","type":"tuple"},{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"grid","type":"tuple"},{"components":[{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"duration","type":"uint16"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"chrome","type":"uint8"}],"internalType":"struct IHoneycombs.Gradients","name":"gradients","type":"tuple"}],"internalType":"struct IHoneycombs.Honeycomb","name":"honeycomb","type":"tuple"}],"name":"getHexagonGrid","outputs":[{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"pathType","type":"uint8"}],"name":"getHexagonPath","outputs":[{"internalType":"string","name":"path","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint24","name":"day","type":"uint24"},{"internalType":"uint16","name":"seed","type":"uint16"}],"internalType":"struct IHoneycombs.StoredHoneycomb","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"bytes","name":"svg","type":"bytes"},{"components":[{"internalType":"string","name":"color","type":"string"},{"internalType":"uint16","name":"size","type":"uint16"},{"internalType":"uint16","name":"hexagonSize","type":"uint16"},{"internalType":"uint16","name":"maxHexagonsPerLine","type":"uint16"}],"internalType":"struct IHoneycombs.Canvas","name":"canvas","type":"tuple"},{"components":[{"internalType":"string","name":"path","type":"string"},{"internalType":"string","name":"fillColor","type":"string"},{"internalType":"uint8","name":"strokeWidth","type":"uint8"},{"internalType":"uint8","name":"hexagonType","type":"uint8"}],"internalType":"struct IHoneycombs.BaseHexagon","name":"baseHexagon","type":"tuple"},{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"grid","type":"tuple"},{"components":[{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"duration","type":"uint16"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"chrome","type":"uint8"}],"internalType":"struct IHoneycombs.Gradients","name":"gradients","type":"tuple"}],"internalType":"struct IHoneycombs.Honeycomb","name":"honeycomb","type":"tuple"}],"name":"getRandomGrid","outputs":[{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint24","name":"day","type":"uint24"},{"internalType":"uint16","name":"seed","type":"uint16"}],"internalType":"struct IHoneycombs.StoredHoneycomb","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"bytes","name":"svg","type":"bytes"},{"components":[{"internalType":"string","name":"color","type":"string"},{"internalType":"uint16","name":"size","type":"uint16"},{"internalType":"uint16","name":"hexagonSize","type":"uint16"},{"internalType":"uint16","name":"maxHexagonsPerLine","type":"uint16"}],"internalType":"struct IHoneycombs.Canvas","name":"canvas","type":"tuple"},{"components":[{"internalType":"string","name":"path","type":"string"},{"internalType":"string","name":"fillColor","type":"string"},{"internalType":"uint8","name":"strokeWidth","type":"uint8"},{"internalType":"uint8","name":"hexagonType","type":"uint8"}],"internalType":"struct IHoneycombs.BaseHexagon","name":"baseHexagon","type":"tuple"},{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"grid","type":"tuple"},{"components":[{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"duration","type":"uint16"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"chrome","type":"uint8"}],"internalType":"struct IHoneycombs.Gradients","name":"gradients","type":"tuple"}],"internalType":"struct IHoneycombs.Honeycomb","name":"honeycomb","type":"tuple"}],"name":"getTriangleGrid","outputs":[{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"hexagonsSvg","type":"bytes"},{"internalType":"bytes","name":"svg","type":"bytes"},{"internalType":"uint16","name":"gridX","type":"uint16"},{"internalType":"uint16","name":"gridY","type":"uint16"},{"internalType":"uint16","name":"rowDistance","type":"uint16"},{"internalType":"uint16","name":"columnDistance","type":"uint16"},{"internalType":"uint16","name":"rotation","type":"uint16"},{"internalType":"uint8","name":"shape","type":"uint8"},{"internalType":"uint8","name":"totalGradients","type":"uint8"},{"internalType":"uint8","name":"rows","type":"uint8"},{"internalType":"uint8","name":"longestRowCount","type":"uint8"}],"internalType":"struct IHoneycombs.Grid","name":"grid","type":"tuple"},{"internalType":"uint16","name":"xIndex","type":"uint16"},{"internalType":"uint16","name":"yIndex","type":"uint16"},{"internalType":"uint16","name":"gradientId","type":"uint16"}],"name":"getUpdatedHexagonsSvg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"}]

612e4f610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100925760003560e01c806384645d8b1161006557806384645d8b146101575780638a96513e14610187578063d9e3455e146101b9578063ee2ede62146101e957610092565b806315e97f84146100975780635c5ae0bb146100c7578063613ae4df146100f7578063823c317514610127575b600080fd5b6100b160048036038101906100ac919061158c565b610219565b6040516100be9190611649565b60405180910390f35b6100e160048036038101906100dc9190611e42565b6102a6565b6040516100ee9190611ff4565b60405180910390f35b610111600480360381019061010c9190611e42565b6105a9565b60405161011e9190611ff4565b60405180910390f35b610141600480360381019061013c9190612016565b61093a565b60405161014e9190611ff4565b60405180910390f35b610171600480360381019061016c9190611e42565b610b09565b60405161017e9190611ff4565b60405180910390f35b6101a1600480360381019061019c9190611e42565b610e21565b6040516101b0939291906120e7565b60405180910390f35b6101d360048036038101906101ce9190611e42565b610faa565b6040516101e09190611ff4565b60405180910390f35b61020360048036038101906101fe9190612125565b6111d8565b60405161021091906121a8565b60405180910390f35b60606000600181111561022f5761022e6121ca565b5b60ff168260ff160361025e57604051806101a0016040528061016d8152602001612cad61016d913990506102a1565b600180811115610271576102706121ca565b5b60ff168260ff16036102a057604051806101a0016040528061016d8152602001612b4061016d913990506102a1565b5b919050565b6102ae6114c5565b6102b66114c5565b600261031484604001516040518060400160405280600481526020017f726f777300000000000000000000000000000000000000000000000000000000815250600187608001516060015161030b9190612228565b61ffff16611299565b61031e919061225e565b81610120019060ff16908160ff168152505080610120015181610140019060ff16908160ff1681525050610352838261093a565b9050600180811115610367576103666121ca565b5b60ff168360a001516060015160ff16036104455780610120015181610100019060ff16908160ff168152505060005b81610120015160ff168160ff16101561043f5760005b6001826103b99190612292565b60ff168160ff1610156104335760006002826103d591906122c7565b8360018661012001516103e89190612304565b6103f29190612304565b6103fc9190612292565b905061041f848260ff168560ff166001876104179190612292565b60ff166111d8565b8460000181905250816001019150506103ac565b50806001019050610396565b506105a0565b60006001811115610459576104586121ca565b5b60ff168360a001516060015160ff160361059f5760006001600283610120015161048391906122c7565b61048d9190612304565b90508082610100019060ff16908160ff168152505060005b8160ff168160ff16101561059c5760006002836104c29190612368565b60ff168260ff16116104ee5760016002836104dd9190612368565b6104e79190612292565b9050610521565b60016002600184866105009190612304565b61050a9190612304565b6105149190612368565b61051e9190612292565b90505b60005b8160ff168160ff16101561058f57600060028261054191906122c7565b60028561054e9190612399565b6105589190612292565b905061057b868260ff168660ff166001886105739190612292565b60ff166111d8565b866000018190525081600101915050610524565b50816001019150506104a5565b50505b5b80915050919050565b6105b16114c5565b6105b96114c5565b6003600261062585604001516040518060400160405280600481526020017f726f7773000000000000000000000000000000000000000000000000000000008152506001600289608001516060015161061291906123ca565b61061c9190612228565b61ffff16611299565b61062f91906123fb565b610639919061225e565b81610120019060ff16908160ff168152505080610120015181610140019060ff16908160ff168152505061066d838261093a565b9050600180811115610682576106816121ca565b5b60ff168360a001516060015160ff16036107785780610120015181610100019060ff16908160ff168152505060005b81610120015160ff168160ff1610156107725760006106e160028461012001516106db9190612368565b836112db565b8361012001516106f19190612304565b905060005b8160ff168160ff16101561076557600060028261071391906122c7565b838661012001516107249190612304565b61072e9190612292565b9050610751858260ff168660ff166001886107499190612292565b60ff166111d8565b8560000181905250816001019150506106f6565b50816001019150506106b1565b50610931565b6000600181111561078c5761078b6121ca565b5b60ff168360a001516060015160ff1603610930576000600160028361012001516107b691906122c7565b6107c09190612304565b90508082610100019060ff16908160ff1681525050600060028361012001516107e99190612368565b905060005b8260ff168160ff16101561092c57600060028561012001516108109190612368565b60ff168260ff1611610830576001826108299190612292565b90506108a2565b6001838561083e9190612304565b6108489190612304565b60ff168260ff161015610892576000600283856108659190612292565b61086f9190612399565b60ff161461087d578261088b565b60018361088a9190612292565b5b90506108a1565b818461089e9190612304565b90505b5b60005b8160ff168160ff16101561091f5760006002826108c291906122c7565b85848961012001516108d49190612304565b6108de9190612304565b6108e89190612292565b905061090b878260ff168660ff166001886109039190612292565b60ff166111d8565b8760000181905250816001019150506108a5565b50816001019150506107ee565b5050505b5b80915050919050565b6109426114c5565b60076004846080015160400151600361095b919061243d565b61096591906123ca565b61096f919061247a565b826080019061ffff16908161ffff16815250506001600284608001516040015161099991906123ca565b6109a39190612228565b8260a0019061ffff16908161ffff16815250506000826080015160018461012001516109cf9190612304565b60ff166109dc919061243d565b60078560800151604001516109f1919061247a565b6109fb919061247a565b905060006002856080015160400151610a149190612228565b84610140015160ff16610a27919061243d565b905060006001811115610a3d57610a3c6121ca565b5b60ff168560a001516060015160ff1603610a9857610a6384608001518560a00151611310565b856080018660a0018261ffff1661ffff168152508261ffff1661ffff168152505050610a8f8183611310565b80935081925050505b600281866080015160200151610aae9190612228565b610ab891906123ca565b846040019061ffff16908161ffff1681525050600282866080015160200151610ae19190612228565b610aeb91906123ca565b846060019061ffff16908161ffff1681525050839250505092915050565b610b116114c5565b610b196114c5565b6001610b6b84604001516040518060400160405280600481526020017f726f77730000000000000000000000000000000000000000000000000000000081525086608001516060015161ffff16611299565b610b75919061225e565b81610120019060ff16908160ff1681525050600081610120015160ff1667ffffffffffffffff811115610bab57610baa611670565b5b604051908082528060200260200182016040528015610bd95781602001602082028036833780820191505090505b50905060005b82610120015160ff168160ff161015610cc2576001610c458660400151610c088460ff16611320565b604051602001610c189190612538565b6040516020818303038152906040526001896080015160600151610c3c9190612228565b61ffff16611299565b610c4f919061225e565b828260ff1681518110610c6557610c6461255a565b5b602002602001019060ff16908160ff1681525050610ca5828260ff1681518110610c9257610c9161255a565b5b60200260200101518461014001516114a6565b83610140019060ff16908160ff1681525050806001019050610bdf565b50610ccd848361093a565b915060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905060005b83610120015160ff168160ff161015610dfd576000838260ff1681518110610d2257610d2161255a565b5b6020026020010151856101400151610d3a9190612304565b9050600281610d499190612399565b60000b8360000b03610d625780610d5f90612589565b90505b600281610d6f9190612399565b925060005b848360ff1681518110610d8a57610d8961255a565b5b602002602001015160ff168160ff161015610df0576000600282610dae91906122c7565b83610db99190612292565b9050610ddc878260ff168660ff16600188610dd49190612292565b60ff166111d8565b876000018190525081600101915050610d74565b5081600101915050610cf7565b5082610120015183610100019060ff16908160ff1681525050829350505050919050565b6060600080610e2e6114c5565b60006003811115610e4257610e416121ca565b5b60ff168560c0015160e0015160ff1603610e6657610e5f856102a6565b9050610f0c565b60016003811115610e7a57610e796121ca565b5b60ff168560c0015160e0015160ff1603610e9e57610e9785610faa565b9050610f0b565b60026003811115610eb257610eb16121ca565b5b60ff168560c0015160e0015160ff1603610ed657610ecf856105a9565b9050610f0a565b600380811115610ee957610ee86121ca565b5b60ff168560c0015160e0015160ff1603610f0957610f0685610b09565b90505b5b5b5b6000610f238660c0015160c0015161ffff16611320565b610f446002886080015160200151610f3b91906123ca565b61ffff16611320565b610f656002896080015160200151610f5c91906123ca565b61ffff16611320565b8460000151604051602001610f7d949392919061271e565b60405160208183030381529060405290508082610100015183610120015194509450945050509193909250565b610fb26114c5565b610fba6114c5565b6003600261102685604001516040518060400160405280600481526020017f726f7773000000000000000000000000000000000000000000000000000000008152506001600289608001516060015161101391906123ca565b61101d9190612228565b61ffff16611299565b61103091906123fb565b61103a919061225e565b81610120019060ff16908160ff1681525050600160028261012001516110609190612368565b61106a9190612292565b81610140019060ff16908160ff1681525050611086838261093a565b905060005b81610120015160ff168160ff1610156111b657600060028361012001516110b29190612368565b60ff168260ff16106110d457818361012001516110cf9190612304565b6110e2565b6001826110e19190612292565b5b9050600060028461012001516110f89190612368565b60ff168360ff16106111265760028461012001516111169190612368565b836111219190612304565b611144565b8260028561012001516111399190612368565b6111439190612304565b5b905060005b8260ff168160ff1610156111a857600060028261116691906122c7565b836111719190612292565b9050611194868260ff168760ff1660018961118c9190612292565b60ff166111d8565b866000018190525081600101915050611149565b50826001019250505061108b565b5080610120015181610100019060ff16908160ff168152505080915050919050565b606060008560a00151856111ec919061243d565b86604001516111fb919061247a565b9050600086608001518561120f919061243d565b876060015161121e919061247a565b905086600001516112328561ffff16611320565b61123f8461ffff16611320565b61124c8461ffff16611320565b60405160200161125e93929190612981565b60405160208183030381529060405260405160200161127e9291906129f4565b60405160208183030381529060405292505050949350505050565b60008184846040516020016112af929190612a39565b6040516020818303038152906040528051906020012060001c6112d29190612a61565b90509392505050565b60008160ff168360ff16116112fb5782826112f69190612304565b611308565b81836113079190612304565b5b905092915050565b6000808284915091509250929050565b606060008203611367576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506114a1565b600082905060005b60008214611397578061138190612a92565b9050600a826113909190612ada565b915061136f565b60008167ffffffffffffffff8111156113b3576113b2611670565b5b6040519080825280601f01601f1916602001820160405280156113e55781602001600182028036833780820191505090505b50905060008290505b60008614611499576001816114039190612b0b565b90506000600a80886114159190612ada565b61141f91906123fb565b8761142a9190612b0b565b60306114369190612292565b905060008160f81b9050808484815181106114545761145361255a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886114909190612ada565b975050506113ee565b819450505050505b919050565b60008160ff168360ff16116114bb57816114bd565b825b905092915050565b6040518061016001604052806060815260200160608152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b61156981611553565b811461157457600080fd5b50565b60008135905061158681611560565b92915050565b6000602082840312156115a2576115a1611549565b5b60006115b084828501611577565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156115f35780820151818401526020810190506115d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061161b826115b9565b61162581856115c4565b93506116358185602086016115d5565b61163e816115ff565b840191505092915050565b600060208201905081810360008301526116638184611610565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6116a8826115ff565b810181811067ffffffffffffffff821117156116c7576116c6611670565b5b80604052505050565b60006116da61153f565b90506116e6828261169f565b919050565b600080fd5b600063ffffffff82169050919050565b611709816116f0565b811461171457600080fd5b50565b60008135905061172681611700565b92915050565b600062ffffff82169050919050565b6117448161172c565b811461174f57600080fd5b50565b6000813590506117618161173b565b92915050565b600061ffff82169050919050565b61177e81611767565b811461178957600080fd5b50565b60008135905061179b81611775565b92915050565b6000606082840312156117b7576117b661166b565b5b6117c160606116d0565b905060006117d184828501611717565b60008301525060206117e584828501611752565b60208301525060406117f98482850161178c565b60408301525092915050565b60008115159050919050565b61181a81611805565b811461182557600080fd5b50565b60008135905061183781611811565b92915050565b6000819050919050565b6118508161183d565b811461185b57600080fd5b50565b60008135905061186d81611847565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff82111561189857611897611670565b5b6118a1826115ff565b9050602081019050919050565b82818337600083830152505050565b60006118d06118cb8461187d565b6116d0565b9050828152602081018484840111156118ec576118eb611878565b5b6118f78482856118ae565b509392505050565b600082601f83011261191457611913611873565b5b81356119248482602086016118bd565b91505092915050565b600067ffffffffffffffff82111561194857611947611670565b5b611951826115ff565b9050602081019050919050565b600061197161196c8461192d565b6116d0565b90508281526020810184848401111561198d5761198c611878565b5b6119988482856118ae565b509392505050565b600082601f8301126119b5576119b4611873565b5b81356119c584826020860161195e565b91505092915050565b6000608082840312156119e4576119e361166b565b5b6119ee60806116d0565b9050600082013567ffffffffffffffff811115611a0e57611a0d6116eb565b5b611a1a848285016119a0565b6000830152506020611a2e8482850161178c565b6020830152506040611a428482850161178c565b6040830152506060611a568482850161178c565b60608301525092915050565b600060808284031215611a7857611a7761166b565b5b611a8260806116d0565b9050600082013567ffffffffffffffff811115611aa257611aa16116eb565b5b611aae848285016119a0565b600083015250602082013567ffffffffffffffff811115611ad257611ad16116eb565b5b611ade848285016119a0565b6020830152506040611af284828501611577565b6040830152506060611b0684828501611577565b60608301525092915050565b60006101608284031215611b2957611b2861166b565b5b611b346101606116d0565b9050600082013567ffffffffffffffff811115611b5457611b536116eb565b5b611b60848285016118ff565b600083015250602082013567ffffffffffffffff811115611b8457611b836116eb565b5b611b90848285016118ff565b6020830152506040611ba48482850161178c565b6040830152506060611bb88482850161178c565b6060830152506080611bcc8482850161178c565b60808301525060a0611be08482850161178c565b60a08301525060c0611bf48482850161178c565b60c08301525060e0611c0884828501611577565b60e083015250610100611c1d84828501611577565b61010083015250610120611c3384828501611577565b61012083015250610140611c4984828501611577565b6101408301525092915050565b600060808284031215611c6c57611c6b61166b565b5b611c7660806116d0565b9050600082013567ffffffffffffffff811115611c9657611c956116eb565b5b611ca2848285016118ff565b6000830152506020611cb68482850161178c565b6020830152506040611cca84828501611577565b6040830152506060611cde84828501611577565b60608301525092915050565b60006101408284031215611d0157611d0061166b565b5b611d0c6101006116d0565b90506000611d1c848285016117a1565b6000830152506060611d3084828501611828565b6020830152506080611d448482850161185e565b60408301525060a082013567ffffffffffffffff811115611d6857611d676116eb565b5b611d74848285016118ff565b60608301525060c082013567ffffffffffffffff811115611d9857611d976116eb565b5b611da4848285016119ce565b60808301525060e082013567ffffffffffffffff811115611dc857611dc76116eb565b5b611dd484828501611a62565b60a08301525061010082013567ffffffffffffffff811115611df957611df86116eb565b5b611e0584828501611b12565b60c08301525061012082013567ffffffffffffffff811115611e2a57611e296116eb565b5b611e3684828501611c56565b60e08301525092915050565b600060208284031215611e5857611e57611549565b5b600082013567ffffffffffffffff811115611e7657611e7561154e565b5b611e8284828501611cea565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611eb282611e8b565b611ebc8185611e96565b9350611ecc8185602086016115d5565b611ed5816115ff565b840191505092915050565b611ee981611767565b82525050565b611ef881611553565b82525050565b6000610160830160008301518482036000860152611f1c8282611ea7565b91505060208301518482036020860152611f368282611ea7565b9150506040830151611f4b6040860182611ee0565b506060830151611f5e6060860182611ee0565b506080830151611f716080860182611ee0565b5060a0830151611f8460a0860182611ee0565b5060c0830151611f9760c0860182611ee0565b5060e0830151611faa60e0860182611eef565b50610100830151611fbf610100860182611eef565b50610120830151611fd4610120860182611eef565b50610140830151611fe9610140860182611eef565b508091505092915050565b6000602082019050818103600083015261200e8184611efe565b905092915050565b6000806040838503121561202d5761202c611549565b5b600083013567ffffffffffffffff81111561204b5761204a61154e565b5b61205785828601611cea565b925050602083013567ffffffffffffffff8111156120785761207761154e565b5b61208485828601611b12565b9150509250929050565b600082825260208201905092915050565b60006120aa82611e8b565b6120b4818561208e565b93506120c48185602086016115d5565b6120cd816115ff565b840191505092915050565b6120e181611553565b82525050565b60006060820190508181036000830152612101818661209f565b905061211060208301856120d8565b61211d60408301846120d8565b949350505050565b6000806000806080858703121561213f5761213e611549565b5b600085013567ffffffffffffffff81111561215d5761215c61154e565b5b61216987828801611b12565b945050602061217a8782880161178c565b935050604061218b8782880161178c565b925050606061219c8782880161178c565b91505092959194509250565b600060208201905081810360008301526121c2818461209f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061223382611767565b915061223e83611767565b9250828203905061ffff811115612258576122576121f9565b5b92915050565b60006122698261183d565b91506122748361183d565b925082820190508082111561228c5761228b6121f9565b5b92915050565b600061229d82611553565b91506122a883611553565b9250828201905060ff8111156122c1576122c06121f9565b5b92915050565b60006122d282611553565b91506122dd83611553565b92508282026122eb81611553565b91508082146122fd576122fc6121f9565b5b5092915050565b600061230f82611553565b915061231a83611553565b9250828203905060ff811115612333576123326121f9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061237382611553565b915061237e83611553565b92508261238e5761238d612339565b5b828204905092915050565b60006123a482611553565b91506123af83611553565b9250826123bf576123be612339565b5b828206905092915050565b60006123d582611767565b91506123e083611767565b9250826123f0576123ef612339565b5b828204905092915050565b60006124068261183d565b91506124118361183d565b925082820261241f8161183d565b91508282048414831517612436576124356121f9565b5b5092915050565b600061244882611767565b915061245383611767565b925082820261246181611767565b9150808214612473576124726121f9565b5b5092915050565b600061248582611767565b915061249083611767565b9250828201905061ffff8111156124aa576124a96121f9565b5b92915050565b600081905092915050565b7f68657861676f6e73496e526f7700000000000000000000000000000000000000600082015250565b60006124f1600d836124b0565b91506124fc826124bb565b600d82019050919050565b6000612512826115b9565b61251c81856124b0565b935061252c8185602086016115d5565b80840191505092915050565b6000612543826124e4565b915061254f8284612507565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061259482611553565b915060ff82036125a7576125a66121f9565b5b600182019050919050565b7f3c67207472616e73666f726d3d227363616c6528312920726f74617465280000600082015250565b60006125e8601e836124b0565b91506125f3826125b2565b601e82019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b60006126346001836124b0565b915061263f826125fe565b600182019050919050565b7f29223e0000000000000000000000000000000000000000000000000000000000600082015250565b60006126806003836124b0565b915061268b8261264a565b600382019050919050565b600081905092915050565b60006126ac82611e8b565b6126b68185612696565b93506126c68185602086016115d5565b80840191505092915050565b7f3c2f673e00000000000000000000000000000000000000000000000000000000600082015250565b60006127086004836124b0565b9150612713826126d2565b600482019050919050565b6000612729826125db565b91506127358287612507565b915061274082612627565b915061274c8286612507565b915061275782612627565b91506127638285612507565b915061276e82612673565b915061277a82846126a1565b9150612785826126fb565b915081905095945050505050565b7f3c75736520687265663d222368657861676f6e22207374726f6b653d2275726c60008201527f28236772616469656e7400000000000000000000000000000000000000000000602082015250565b60006127ef602a836124b0565b91506127fa82612793565b602a82019050919050565b7f2922200000000000000000000000000000000000000000000000000000000000600082015250565b600061283b6003836124b0565b915061284682612805565b600382019050919050565b7f783d220000000000000000000000000000000000000000000000000000000000600082015250565b60006128876003836124b0565b915061289282612851565b600382019050919050565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b60006128d36005836124b0565b91506128de8261289d565b600582019050919050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b600061291f6001836124b0565b915061292a826128e9565b600182019050919050565b7f2f3e000000000000000000000000000000000000000000000000000000000000600082015250565b600061296b6002836124b0565b915061297682612935565b600282019050919050565b600061298c826127e2565b91506129988286612507565b91506129a38261282e565b91506129ae8261287a565b91506129ba8285612507565b91506129c5826128c6565b91506129d18284612507565b91506129dc82612912565b91506129e78261295e565b9150819050949350505050565b6000612a0082856126a1565b9150612a0c82846126a1565b91508190509392505050565b6000819050919050565b612a33612a2e8261183d565b612a18565b82525050565b6000612a458285612a22565b602082019150612a5582846126a1565b91508190509392505050565b6000612a6c8261183d565b9150612a778361183d565b925082612a8757612a86612339565b5b828206905092915050565b6000612a9d8261183d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612acf57612ace6121f9565b5b600182019050919050565b6000612ae58261183d565b9150612af08361183d565b925082612b0057612aff612339565b5b828204905092915050565b6000612b168261183d565b9150612b218361183d565b9250828203905081811115612b3957612b386121f9565b5b9291505056fe4d37322e363736392032322e323437324c34322e3520342e38323435374334302e39353320332e39333134312033392e30343720332e39333134312033372e3520342e38323435374c372e33323330392032322e3234373243352e37373630382032332e3134303420342e38323330392032342e37393120342e38323330392032362e353737345636312e3432323643342e38323330392036332e32303920352e37373630382036342e3835393620372e33323330392036352e373532384c33372e352038332e313735344333392e3034372038342e303638362034302e3935332038342e303638362034322e352038332e313735344c37322e363736392036352e373532384337342e323233392036342e383539362037352e313736392036332e3230392037352e313736392036312e343232365632362e353737344337352e313736392032342e3739312037342e323233392032332e313430342037322e363736392032322e323437325a4d32322e3234373220372e33323330394c342e38323435372033372e3543332e39333134312033392e30343720332e39333134312034302e39353320342e38323435372034322e354c32322e323437322037322e363736394332332e313430342037342e323233392032342e3739312037352e313736392032362e353737342037352e313736394836312e343232364336332e3230392037352e313736392036342e383539362037342e323233392036352e373532382037322e363736394c38332e313735342034322e354338342e303638362034302e3935332038342e303638362033392e3034372038332e313735342033372e354c36352e3735323820372e33323330394336342e3835393620352e37373630382036332e32303920342e38323330392036312e3432323620342e38323330394832362e353737344332342e37393120342e38323330392032332e3134303420352e37373630382032322e3234373220372e33323330395aa2646970667358221220ca149cb2112d00791785fa3345d9c8c45cf1930892fcd26316f89d78dc9eaa1f64736f6c63430008110033

Deployed Bytecode

0x73d5b21584d06a6052230e1c2d049ed39796706ad330146080604052600436106100925760003560e01c806384645d8b1161006557806384645d8b146101575780638a96513e14610187578063d9e3455e146101b9578063ee2ede62146101e957610092565b806315e97f84146100975780635c5ae0bb146100c7578063613ae4df146100f7578063823c317514610127575b600080fd5b6100b160048036038101906100ac919061158c565b610219565b6040516100be9190611649565b60405180910390f35b6100e160048036038101906100dc9190611e42565b6102a6565b6040516100ee9190611ff4565b60405180910390f35b610111600480360381019061010c9190611e42565b6105a9565b60405161011e9190611ff4565b60405180910390f35b610141600480360381019061013c9190612016565b61093a565b60405161014e9190611ff4565b60405180910390f35b610171600480360381019061016c9190611e42565b610b09565b60405161017e9190611ff4565b60405180910390f35b6101a1600480360381019061019c9190611e42565b610e21565b6040516101b0939291906120e7565b60405180910390f35b6101d360048036038101906101ce9190611e42565b610faa565b6040516101e09190611ff4565b60405180910390f35b61020360048036038101906101fe9190612125565b6111d8565b60405161021091906121a8565b60405180910390f35b60606000600181111561022f5761022e6121ca565b5b60ff168260ff160361025e57604051806101a0016040528061016d8152602001612cad61016d913990506102a1565b600180811115610271576102706121ca565b5b60ff168260ff16036102a057604051806101a0016040528061016d8152602001612b4061016d913990506102a1565b5b919050565b6102ae6114c5565b6102b66114c5565b600261031484604001516040518060400160405280600481526020017f726f777300000000000000000000000000000000000000000000000000000000815250600187608001516060015161030b9190612228565b61ffff16611299565b61031e919061225e565b81610120019060ff16908160ff168152505080610120015181610140019060ff16908160ff1681525050610352838261093a565b9050600180811115610367576103666121ca565b5b60ff168360a001516060015160ff16036104455780610120015181610100019060ff16908160ff168152505060005b81610120015160ff168160ff16101561043f5760005b6001826103b99190612292565b60ff168160ff1610156104335760006002826103d591906122c7565b8360018661012001516103e89190612304565b6103f29190612304565b6103fc9190612292565b905061041f848260ff168560ff166001876104179190612292565b60ff166111d8565b8460000181905250816001019150506103ac565b50806001019050610396565b506105a0565b60006001811115610459576104586121ca565b5b60ff168360a001516060015160ff160361059f5760006001600283610120015161048391906122c7565b61048d9190612304565b90508082610100019060ff16908160ff168152505060005b8160ff168160ff16101561059c5760006002836104c29190612368565b60ff168260ff16116104ee5760016002836104dd9190612368565b6104e79190612292565b9050610521565b60016002600184866105009190612304565b61050a9190612304565b6105149190612368565b61051e9190612292565b90505b60005b8160ff168160ff16101561058f57600060028261054191906122c7565b60028561054e9190612399565b6105589190612292565b905061057b868260ff168660ff166001886105739190612292565b60ff166111d8565b866000018190525081600101915050610524565b50816001019150506104a5565b50505b5b80915050919050565b6105b16114c5565b6105b96114c5565b6003600261062585604001516040518060400160405280600481526020017f726f7773000000000000000000000000000000000000000000000000000000008152506001600289608001516060015161061291906123ca565b61061c9190612228565b61ffff16611299565b61062f91906123fb565b610639919061225e565b81610120019060ff16908160ff168152505080610120015181610140019060ff16908160ff168152505061066d838261093a565b9050600180811115610682576106816121ca565b5b60ff168360a001516060015160ff16036107785780610120015181610100019060ff16908160ff168152505060005b81610120015160ff168160ff1610156107725760006106e160028461012001516106db9190612368565b836112db565b8361012001516106f19190612304565b905060005b8160ff168160ff16101561076557600060028261071391906122c7565b838661012001516107249190612304565b61072e9190612292565b9050610751858260ff168660ff166001886107499190612292565b60ff166111d8565b8560000181905250816001019150506106f6565b50816001019150506106b1565b50610931565b6000600181111561078c5761078b6121ca565b5b60ff168360a001516060015160ff1603610930576000600160028361012001516107b691906122c7565b6107c09190612304565b90508082610100019060ff16908160ff1681525050600060028361012001516107e99190612368565b905060005b8260ff168160ff16101561092c57600060028561012001516108109190612368565b60ff168260ff1611610830576001826108299190612292565b90506108a2565b6001838561083e9190612304565b6108489190612304565b60ff168260ff161015610892576000600283856108659190612292565b61086f9190612399565b60ff161461087d578261088b565b60018361088a9190612292565b5b90506108a1565b818461089e9190612304565b90505b5b60005b8160ff168160ff16101561091f5760006002826108c291906122c7565b85848961012001516108d49190612304565b6108de9190612304565b6108e89190612292565b905061090b878260ff168660ff166001886109039190612292565b60ff166111d8565b8760000181905250816001019150506108a5565b50816001019150506107ee565b5050505b5b80915050919050565b6109426114c5565b60076004846080015160400151600361095b919061243d565b61096591906123ca565b61096f919061247a565b826080019061ffff16908161ffff16815250506001600284608001516040015161099991906123ca565b6109a39190612228565b8260a0019061ffff16908161ffff16815250506000826080015160018461012001516109cf9190612304565b60ff166109dc919061243d565b60078560800151604001516109f1919061247a565b6109fb919061247a565b905060006002856080015160400151610a149190612228565b84610140015160ff16610a27919061243d565b905060006001811115610a3d57610a3c6121ca565b5b60ff168560a001516060015160ff1603610a9857610a6384608001518560a00151611310565b856080018660a0018261ffff1661ffff168152508261ffff1661ffff168152505050610a8f8183611310565b80935081925050505b600281866080015160200151610aae9190612228565b610ab891906123ca565b846040019061ffff16908161ffff1681525050600282866080015160200151610ae19190612228565b610aeb91906123ca565b846060019061ffff16908161ffff1681525050839250505092915050565b610b116114c5565b610b196114c5565b6001610b6b84604001516040518060400160405280600481526020017f726f77730000000000000000000000000000000000000000000000000000000081525086608001516060015161ffff16611299565b610b75919061225e565b81610120019060ff16908160ff1681525050600081610120015160ff1667ffffffffffffffff811115610bab57610baa611670565b5b604051908082528060200260200182016040528015610bd95781602001602082028036833780820191505090505b50905060005b82610120015160ff168160ff161015610cc2576001610c458660400151610c088460ff16611320565b604051602001610c189190612538565b6040516020818303038152906040526001896080015160600151610c3c9190612228565b61ffff16611299565b610c4f919061225e565b828260ff1681518110610c6557610c6461255a565b5b602002602001019060ff16908160ff1681525050610ca5828260ff1681518110610c9257610c9161255a565b5b60200260200101518461014001516114a6565b83610140019060ff16908160ff1681525050806001019050610bdf565b50610ccd848361093a565b915060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905060005b83610120015160ff168160ff161015610dfd576000838260ff1681518110610d2257610d2161255a565b5b6020026020010151856101400151610d3a9190612304565b9050600281610d499190612399565b60000b8360000b03610d625780610d5f90612589565b90505b600281610d6f9190612399565b925060005b848360ff1681518110610d8a57610d8961255a565b5b602002602001015160ff168160ff161015610df0576000600282610dae91906122c7565b83610db99190612292565b9050610ddc878260ff168660ff16600188610dd49190612292565b60ff166111d8565b876000018190525081600101915050610d74565b5081600101915050610cf7565b5082610120015183610100019060ff16908160ff1681525050829350505050919050565b6060600080610e2e6114c5565b60006003811115610e4257610e416121ca565b5b60ff168560c0015160e0015160ff1603610e6657610e5f856102a6565b9050610f0c565b60016003811115610e7a57610e796121ca565b5b60ff168560c0015160e0015160ff1603610e9e57610e9785610faa565b9050610f0b565b60026003811115610eb257610eb16121ca565b5b60ff168560c0015160e0015160ff1603610ed657610ecf856105a9565b9050610f0a565b600380811115610ee957610ee86121ca565b5b60ff168560c0015160e0015160ff1603610f0957610f0685610b09565b90505b5b5b5b6000610f238660c0015160c0015161ffff16611320565b610f446002886080015160200151610f3b91906123ca565b61ffff16611320565b610f656002896080015160200151610f5c91906123ca565b61ffff16611320565b8460000151604051602001610f7d949392919061271e565b60405160208183030381529060405290508082610100015183610120015194509450945050509193909250565b610fb26114c5565b610fba6114c5565b6003600261102685604001516040518060400160405280600481526020017f726f7773000000000000000000000000000000000000000000000000000000008152506001600289608001516060015161101391906123ca565b61101d9190612228565b61ffff16611299565b61103091906123fb565b61103a919061225e565b81610120019060ff16908160ff1681525050600160028261012001516110609190612368565b61106a9190612292565b81610140019060ff16908160ff1681525050611086838261093a565b905060005b81610120015160ff168160ff1610156111b657600060028361012001516110b29190612368565b60ff168260ff16106110d457818361012001516110cf9190612304565b6110e2565b6001826110e19190612292565b5b9050600060028461012001516110f89190612368565b60ff168360ff16106111265760028461012001516111169190612368565b836111219190612304565b611144565b8260028561012001516111399190612368565b6111439190612304565b5b905060005b8260ff168160ff1610156111a857600060028261116691906122c7565b836111719190612292565b9050611194868260ff168760ff1660018961118c9190612292565b60ff166111d8565b866000018190525081600101915050611149565b50826001019250505061108b565b5080610120015181610100019060ff16908160ff168152505080915050919050565b606060008560a00151856111ec919061243d565b86604001516111fb919061247a565b9050600086608001518561120f919061243d565b876060015161121e919061247a565b905086600001516112328561ffff16611320565b61123f8461ffff16611320565b61124c8461ffff16611320565b60405160200161125e93929190612981565b60405160208183030381529060405260405160200161127e9291906129f4565b60405160208183030381529060405292505050949350505050565b60008184846040516020016112af929190612a39565b6040516020818303038152906040528051906020012060001c6112d29190612a61565b90509392505050565b60008160ff168360ff16116112fb5782826112f69190612304565b611308565b81836113079190612304565b5b905092915050565b6000808284915091509250929050565b606060008203611367576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506114a1565b600082905060005b60008214611397578061138190612a92565b9050600a826113909190612ada565b915061136f565b60008167ffffffffffffffff8111156113b3576113b2611670565b5b6040519080825280601f01601f1916602001820160405280156113e55781602001600182028036833780820191505090505b50905060008290505b60008614611499576001816114039190612b0b565b90506000600a80886114159190612ada565b61141f91906123fb565b8761142a9190612b0b565b60306114369190612292565b905060008160f81b9050808484815181106114545761145361255a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886114909190612ada565b975050506113ee565b819450505050505b919050565b60008160ff168360ff16116114bb57816114bd565b825b905092915050565b6040518061016001604052806060815260200160608152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b61156981611553565b811461157457600080fd5b50565b60008135905061158681611560565b92915050565b6000602082840312156115a2576115a1611549565b5b60006115b084828501611577565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156115f35780820151818401526020810190506115d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061161b826115b9565b61162581856115c4565b93506116358185602086016115d5565b61163e816115ff565b840191505092915050565b600060208201905081810360008301526116638184611610565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6116a8826115ff565b810181811067ffffffffffffffff821117156116c7576116c6611670565b5b80604052505050565b60006116da61153f565b90506116e6828261169f565b919050565b600080fd5b600063ffffffff82169050919050565b611709816116f0565b811461171457600080fd5b50565b60008135905061172681611700565b92915050565b600062ffffff82169050919050565b6117448161172c565b811461174f57600080fd5b50565b6000813590506117618161173b565b92915050565b600061ffff82169050919050565b61177e81611767565b811461178957600080fd5b50565b60008135905061179b81611775565b92915050565b6000606082840312156117b7576117b661166b565b5b6117c160606116d0565b905060006117d184828501611717565b60008301525060206117e584828501611752565b60208301525060406117f98482850161178c565b60408301525092915050565b60008115159050919050565b61181a81611805565b811461182557600080fd5b50565b60008135905061183781611811565b92915050565b6000819050919050565b6118508161183d565b811461185b57600080fd5b50565b60008135905061186d81611847565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff82111561189857611897611670565b5b6118a1826115ff565b9050602081019050919050565b82818337600083830152505050565b60006118d06118cb8461187d565b6116d0565b9050828152602081018484840111156118ec576118eb611878565b5b6118f78482856118ae565b509392505050565b600082601f83011261191457611913611873565b5b81356119248482602086016118bd565b91505092915050565b600067ffffffffffffffff82111561194857611947611670565b5b611951826115ff565b9050602081019050919050565b600061197161196c8461192d565b6116d0565b90508281526020810184848401111561198d5761198c611878565b5b6119988482856118ae565b509392505050565b600082601f8301126119b5576119b4611873565b5b81356119c584826020860161195e565b91505092915050565b6000608082840312156119e4576119e361166b565b5b6119ee60806116d0565b9050600082013567ffffffffffffffff811115611a0e57611a0d6116eb565b5b611a1a848285016119a0565b6000830152506020611a2e8482850161178c565b6020830152506040611a428482850161178c565b6040830152506060611a568482850161178c565b60608301525092915050565b600060808284031215611a7857611a7761166b565b5b611a8260806116d0565b9050600082013567ffffffffffffffff811115611aa257611aa16116eb565b5b611aae848285016119a0565b600083015250602082013567ffffffffffffffff811115611ad257611ad16116eb565b5b611ade848285016119a0565b6020830152506040611af284828501611577565b6040830152506060611b0684828501611577565b60608301525092915050565b60006101608284031215611b2957611b2861166b565b5b611b346101606116d0565b9050600082013567ffffffffffffffff811115611b5457611b536116eb565b5b611b60848285016118ff565b600083015250602082013567ffffffffffffffff811115611b8457611b836116eb565b5b611b90848285016118ff565b6020830152506040611ba48482850161178c565b6040830152506060611bb88482850161178c565b6060830152506080611bcc8482850161178c565b60808301525060a0611be08482850161178c565b60a08301525060c0611bf48482850161178c565b60c08301525060e0611c0884828501611577565b60e083015250610100611c1d84828501611577565b61010083015250610120611c3384828501611577565b61012083015250610140611c4984828501611577565b6101408301525092915050565b600060808284031215611c6c57611c6b61166b565b5b611c7660806116d0565b9050600082013567ffffffffffffffff811115611c9657611c956116eb565b5b611ca2848285016118ff565b6000830152506020611cb68482850161178c565b6020830152506040611cca84828501611577565b6040830152506060611cde84828501611577565b60608301525092915050565b60006101408284031215611d0157611d0061166b565b5b611d0c6101006116d0565b90506000611d1c848285016117a1565b6000830152506060611d3084828501611828565b6020830152506080611d448482850161185e565b60408301525060a082013567ffffffffffffffff811115611d6857611d676116eb565b5b611d74848285016118ff565b60608301525060c082013567ffffffffffffffff811115611d9857611d976116eb565b5b611da4848285016119ce565b60808301525060e082013567ffffffffffffffff811115611dc857611dc76116eb565b5b611dd484828501611a62565b60a08301525061010082013567ffffffffffffffff811115611df957611df86116eb565b5b611e0584828501611b12565b60c08301525061012082013567ffffffffffffffff811115611e2a57611e296116eb565b5b611e3684828501611c56565b60e08301525092915050565b600060208284031215611e5857611e57611549565b5b600082013567ffffffffffffffff811115611e7657611e7561154e565b5b611e8284828501611cea565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611eb282611e8b565b611ebc8185611e96565b9350611ecc8185602086016115d5565b611ed5816115ff565b840191505092915050565b611ee981611767565b82525050565b611ef881611553565b82525050565b6000610160830160008301518482036000860152611f1c8282611ea7565b91505060208301518482036020860152611f368282611ea7565b9150506040830151611f4b6040860182611ee0565b506060830151611f5e6060860182611ee0565b506080830151611f716080860182611ee0565b5060a0830151611f8460a0860182611ee0565b5060c0830151611f9760c0860182611ee0565b5060e0830151611faa60e0860182611eef565b50610100830151611fbf610100860182611eef565b50610120830151611fd4610120860182611eef565b50610140830151611fe9610140860182611eef565b508091505092915050565b6000602082019050818103600083015261200e8184611efe565b905092915050565b6000806040838503121561202d5761202c611549565b5b600083013567ffffffffffffffff81111561204b5761204a61154e565b5b61205785828601611cea565b925050602083013567ffffffffffffffff8111156120785761207761154e565b5b61208485828601611b12565b9150509250929050565b600082825260208201905092915050565b60006120aa82611e8b565b6120b4818561208e565b93506120c48185602086016115d5565b6120cd816115ff565b840191505092915050565b6120e181611553565b82525050565b60006060820190508181036000830152612101818661209f565b905061211060208301856120d8565b61211d60408301846120d8565b949350505050565b6000806000806080858703121561213f5761213e611549565b5b600085013567ffffffffffffffff81111561215d5761215c61154e565b5b61216987828801611b12565b945050602061217a8782880161178c565b935050604061218b8782880161178c565b925050606061219c8782880161178c565b91505092959194509250565b600060208201905081810360008301526121c2818461209f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061223382611767565b915061223e83611767565b9250828203905061ffff811115612258576122576121f9565b5b92915050565b60006122698261183d565b91506122748361183d565b925082820190508082111561228c5761228b6121f9565b5b92915050565b600061229d82611553565b91506122a883611553565b9250828201905060ff8111156122c1576122c06121f9565b5b92915050565b60006122d282611553565b91506122dd83611553565b92508282026122eb81611553565b91508082146122fd576122fc6121f9565b5b5092915050565b600061230f82611553565b915061231a83611553565b9250828203905060ff811115612333576123326121f9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061237382611553565b915061237e83611553565b92508261238e5761238d612339565b5b828204905092915050565b60006123a482611553565b91506123af83611553565b9250826123bf576123be612339565b5b828206905092915050565b60006123d582611767565b91506123e083611767565b9250826123f0576123ef612339565b5b828204905092915050565b60006124068261183d565b91506124118361183d565b925082820261241f8161183d565b91508282048414831517612436576124356121f9565b5b5092915050565b600061244882611767565b915061245383611767565b925082820261246181611767565b9150808214612473576124726121f9565b5b5092915050565b600061248582611767565b915061249083611767565b9250828201905061ffff8111156124aa576124a96121f9565b5b92915050565b600081905092915050565b7f68657861676f6e73496e526f7700000000000000000000000000000000000000600082015250565b60006124f1600d836124b0565b91506124fc826124bb565b600d82019050919050565b6000612512826115b9565b61251c81856124b0565b935061252c8185602086016115d5565b80840191505092915050565b6000612543826124e4565b915061254f8284612507565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061259482611553565b915060ff82036125a7576125a66121f9565b5b600182019050919050565b7f3c67207472616e73666f726d3d227363616c6528312920726f74617465280000600082015250565b60006125e8601e836124b0565b91506125f3826125b2565b601e82019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b60006126346001836124b0565b915061263f826125fe565b600182019050919050565b7f29223e0000000000000000000000000000000000000000000000000000000000600082015250565b60006126806003836124b0565b915061268b8261264a565b600382019050919050565b600081905092915050565b60006126ac82611e8b565b6126b68185612696565b93506126c68185602086016115d5565b80840191505092915050565b7f3c2f673e00000000000000000000000000000000000000000000000000000000600082015250565b60006127086004836124b0565b9150612713826126d2565b600482019050919050565b6000612729826125db565b91506127358287612507565b915061274082612627565b915061274c8286612507565b915061275782612627565b91506127638285612507565b915061276e82612673565b915061277a82846126a1565b9150612785826126fb565b915081905095945050505050565b7f3c75736520687265663d222368657861676f6e22207374726f6b653d2275726c60008201527f28236772616469656e7400000000000000000000000000000000000000000000602082015250565b60006127ef602a836124b0565b91506127fa82612793565b602a82019050919050565b7f2922200000000000000000000000000000000000000000000000000000000000600082015250565b600061283b6003836124b0565b915061284682612805565b600382019050919050565b7f783d220000000000000000000000000000000000000000000000000000000000600082015250565b60006128876003836124b0565b915061289282612851565b600382019050919050565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b60006128d36005836124b0565b91506128de8261289d565b600582019050919050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b600061291f6001836124b0565b915061292a826128e9565b600182019050919050565b7f2f3e000000000000000000000000000000000000000000000000000000000000600082015250565b600061296b6002836124b0565b915061297682612935565b600282019050919050565b600061298c826127e2565b91506129988286612507565b91506129a38261282e565b91506129ae8261287a565b91506129ba8285612507565b91506129c5826128c6565b91506129d18284612507565b91506129dc82612912565b91506129e78261295e565b9150819050949350505050565b6000612a0082856126a1565b9150612a0c82846126a1565b91508190509392505050565b6000819050919050565b612a33612a2e8261183d565b612a18565b82525050565b6000612a458285612a22565b602082019150612a5582846126a1565b91508190509392505050565b6000612a6c8261183d565b9150612a778361183d565b925082612a8757612a86612339565b5b828206905092915050565b6000612a9d8261183d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612acf57612ace6121f9565b5b600182019050919050565b6000612ae58261183d565b9150612af08361183d565b925082612b0057612aff612339565b5b828204905092915050565b6000612b168261183d565b9150612b218361183d565b9250828203905081811115612b3957612b386121f9565b5b9291505056fe4d37322e363736392032322e323437324c34322e3520342e38323435374334302e39353320332e39333134312033392e30343720332e39333134312033372e3520342e38323435374c372e33323330392032322e3234373243352e37373630382032332e3134303420342e38323330392032342e37393120342e38323330392032362e353737345636312e3432323643342e38323330392036332e32303920352e37373630382036342e3835393620372e33323330392036352e373532384c33372e352038332e313735344333392e3034372038342e303638362034302e3935332038342e303638362034322e352038332e313735344c37322e363736392036352e373532384337342e323233392036342e383539362037352e313736392036332e3230392037352e313736392036312e343232365632362e353737344337352e313736392032342e3739312037342e323233392032332e313430342037322e363736392032322e323437325a4d32322e3234373220372e33323330394c342e38323435372033372e3543332e39333134312033392e30343720332e39333134312034302e39353320342e38323435372034322e354c32322e323437322037322e363736394332332e313430342037342e323233392032342e3739312037352e313736392032362e353737342037352e313736394836312e343232364336332e3230392037352e313736392036342e383539362037342e323233392036352e373532382037322e363736394c38332e313735342034322e354338342e303638362034302e3935332038342e303638362033392e3034372038332e313735342033372e354c36352e3735323820372e33323330394336342e3835393620352e37373630382036332e32303920342e38323330392036312e3432323620342e38323330394832362e353737344332342e37393120342e38323330392032332e3134303420352e37373630382032322e3234373220372e33323330395aa2646970667358221220ca149cb2112d00791785fa3345d9c8c45cf1930892fcd26316f89d78dc9eaa1f64736f6c63430008110033

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

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.