ETH Price: $3,288.65 (-0.25%)

Contract

0x4872BC4a6B29E8141868C3Fe0d4aeE70E9eA6735
 

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:
Barcode

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2023-03-28
*/

// SPDX-License-Identifier: MIT
// Author: tycoon.eth
pragma solidity ^0.8.19;

/***
___.
\_ |__ _____ _______
 | __ \\__  \\_  __ \
 | \_\ \/ __ \|  | \/
 |___  (____  /__|
     \/     \/
                 .___
  ____  ____   __| _/____
_/ ___\/  _ \ / __ |/ __ \
\  \__(  <_> ) /_/ \  ___/
 \___  >____/\____ |\___  >
     \/           \/    \/

Generate barcodes SVGs on-chain.
Limitations: Code-128 Character set C only.


**/


contract Barcode {
    using DynamicBufferLib for DynamicBufferLib.DynamicBuffer;
    mapping(bytes32 => bytes11) public barMap;

    bytes13 constant stopCode = "1100011101011";

    constructor() {
        // Lookup table of Character Set C of Code-128
        barMap["00"] = "11011001100";
        barMap["01"] = "11001101100";
        barMap["02"] = "11001100110";
        barMap["03"] = "10010011000";
        barMap["04"] = "10010001100";
        barMap["05"] = "10001001100";
        barMap["06"] = "10011001000";
        barMap["07"] = "10011000100";
        barMap["08"] = "10001100100";
        barMap["09"] = "11001001000";
        barMap["10"] = "11001000100";
        barMap["11"] = "11000100100";
        barMap["12"] = "10110011100";
        barMap["13"] = "10011011100";
        barMap["14"] = "10011001110";
        barMap["15"] = "10111001100";
        barMap["16"] = "10011101100";
        barMap["17"] = "10011100110";
        barMap["18"] = "11001110010";
        barMap["19"] = "11001011100";
        barMap["20"] = "11001001110";
        barMap["21"] = "11011100100";
        barMap["22"] = "11001110100";
        barMap["23"] = "11101101110";
        barMap["24"] = "11101001100";
        barMap["25"] = "11100101100";
        barMap["26"] = "11100100110";
        barMap["27"] = "11101100100";
        barMap["28"] = "11100110100";
        barMap["29"] = "11100110010";
        barMap["30"] = "11011011000";
        barMap["31"] = "11011000110";
        barMap["32"] = "11000110110";
        barMap["33"] = "10100011000";
        barMap["34"] = "10001011000";
        barMap["35"] = "10001000110";
        barMap["36"] = "10110001000";
        barMap["37"] = "10001101000";
        barMap["38"] = "10001100010";
        barMap["39"] = "11010001000";
        barMap["40"] = "11000101000";
        barMap["41"] = "11000100010";
        barMap["42"] = "10110111000";
        barMap["43"] = "10110001110";
        barMap["44"] = "10001101110";
        barMap["45"] = "10111011000";
        barMap["46"] = "10111000110";
        barMap["47"] = "10001110110";
        barMap["48"] = "11101110110";
        barMap["49"] = "11010001110";
        barMap["50"] = "11000101110";
        barMap["51"] = "11011101000";
        barMap["52"] = "11011100010";
        barMap["53"] = "11011101110";
        barMap["54"] = "11101011000";
        barMap["55"] = "11101000110";
        barMap["56"] = "11100010110";
        barMap["57"] = "11101101000";
        barMap["58"] = "11101100010";
        barMap["59"] = "11100011010";
        barMap["60"] = "11101111010";
        barMap["61"] = "11001000010";
        barMap["62"] = "11110001010";
        barMap["63"] = "10100110000";
        barMap["64"] = "10100001100";
        barMap["65"] = "10010110000";
        barMap["66"] = "10010000110";
        barMap["67"] = "10000101100";
        barMap["68"] = "10000100110";
        barMap["69"] = "10110010000";
        barMap["70"] = "10110000100";
        barMap["71"] = "10011010000";
        barMap["72"] = "10011000010";
        barMap["73"] = "10000110100";
        barMap["74"] = "10000110010";
        barMap["75"] = "11000010010";
        barMap["76"] = "11001010000";
        barMap["77"] = "11110111010";
        barMap["78"] = "11000010100";
        barMap["79"] = "10001111010";
        barMap["80"] = "10100111100";
        barMap["81"] = "10010111100";
        barMap["82"] = "10010011110";
        barMap["83"] = "10111100100";
        barMap["84"] = "10011110100";
        barMap["85"] = "10011110010";
        barMap["86"] = "11110100100";
        barMap["87"] = "11110010100";
        barMap["88"] = "11110010010";
        barMap["89"] = "11011011110";
        barMap["90"] = "11011110110";
        barMap["91"] = "11110110110";
        barMap["92"] = "10101111000";
        barMap["93"] = "10100011110";
        barMap["94"] = "10001011110";
        barMap["95"] = "10111101000";
        barMap["96"] = "10111100010";
        barMap["97"] = "11110101000";
        barMap["98"] = "11110100010";
        barMap["99"] = "10111011110";
        barMap["100"] = "10111101110";  // code B
        barMap["101"] = "11101011110";  // code A
        barMap["102"] = "11110101110";  // FNC1
        barMap["103"] = "11010000100";  // START A
        barMap["104"] = "11010010000";  // START B
        barMap["105"] = "11010011100";  // START C

    }

    /**
    * @dev draw returns the SVG string that renders a barcode
    * @param _in the number to draw as a barcode
    * @param _x x position of the SVG
    * @param _y y position of the SVG
    * @param _color a 3 byte hex code of the background color
    * @param _height height in pixels, min 20
    * @param _barWidth width of bars, recommended: 2
    */
    function draw(
        uint256 _in,
        string memory _x,
        string memory _y,
        string memory _color,
        uint16 _height,
        uint8 _barWidth) view external returns (string memory) {
        bytes memory digits = bytes(toString(_in));
        bytes memory out =
            abi.encodePacked(barMap["105"]);   // charset-C
        if (digits.length % 2 == 1) {
            digits = abi.encodePacked(
                "0", digits);                  // prepend 0 so that it's even
        }
        uint256 pos;                           // position when parsing digits
        uint256 n;                             // value of character
        uint256 sum = 105;                     // checksum, starting with set-C code, 105
        uint256 i = 1;                         // position, used for the checksum
        bytes32 k;                             // lookup key
        bytes memory b = "00";                 // buffer used to build the lookup-key
        while (pos < digits.length) {
            b[0] = digits[pos];
            b[1] = digits[pos+1];
            assembly {
                k := mload(add(b, 32))         // convert b to k (bytes32)
            }
            out = abi.encodePacked(
                out, barMap[k]);
            n = (uint8(digits[pos]) - 48) * 10;// convert to int, big
            n += uint8(digits[pos+1]) - 48;    // convert to int, small
            sum = sum + (n*i);                 // add to checksum
            pos+=2;
            i++;
        }
        sum = sum % 103; // checksum
        b = bytes(toString(sum));
        if (sum < 10) {
            b = abi.encodePacked("0", b);      // pad with "0"
        }
        assembly {
            k := mload(add(b, 32))             // convert b to k (bytes32)
        }
        out = abi.encodePacked(
            out, barMap[k], stopCode);
        return string(_render(
            out,
            bytes(_x),
            bytes(_y),
            bytes(_color),
            _height,
            _barWidth)
        );
    }

    /**
    * _render
    */
    function _render(
        bytes memory _in,
        bytes memory _x,
        bytes memory _y,
        bytes memory _color,
        uint16 _height,
        uint8 _barWidth
) internal pure returns (bytes memory) {
        require (_height > 19, "_height too small");
        DynamicBufferLib.DynamicBuffer memory result;
        uint256 pos = 0;
        uint256 i = 0;
        uint256 n = 0;
        bytes memory width = bytes(toString((_in.length * _barWidth) + 24)); // auto-width
        bytes memory height = bytes(toString(uint256(_height)));
        result.append('<svg id="solbarcode" x="', _x, 'px" y="');
        result.append(_y, 'px" width="', width);
        result.append('px" height="', height,'px" viewBox="0 0 ');
        result.append(width,' ', height);
        result.append('" xmlns="http://www.w3.org/2000/svg" version="1.1"><rect x="0" y="0" width="');
        result.append(width,'" height="', height);
        result.append('" style="fill:#',_color,';"/> <g transform="translate(12, 10)" style="fill:#0;">');
        while (pos < _in.length) {
            if (_in[pos] == "1") {
                i++;     // count the black bars
                if (n > 0) {
                    n =0;
                }
            } else {
                if (i>0) { //
                    result.append(
                        ' <rect x="',
                        bytes(toString(pos * _barWidth - (i * _barWidth))),
                        '" y="0" width="');
                    result.append(
                        bytes(toString(i * _barWidth)),
                        '" height="',
                        bytes(toString(_height - 20)));
                    result.append('"/>');
                    i=0;
                }
                n++;
            }
            pos++;
        }
        if (i>0) {
            result.append(
                ' <rect x="',
                bytes(toString(pos * _barWidth - (i * _barWidth))),
                '" y="0" width="');
            result.append(
                bytes(toString(i * _barWidth)),
                '" height="',
                bytes(toString(_height - 20)));
            result.append('"/>');
        }
        result.append('</g></svg>');
        return (result.data);
    }

    function toString(uint256 value) public pure returns (string memory) {
        // Inspired by openzeppelin's implementation - MIT licence
        // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol#L15
        // this version removes the decimals counting
        uint8 count;
        if (value == 0) {
            return "0";
        }
        uint256 digits = 31;
        // bytes and strings are big endian, so working on the buffer from right to left
        // this means we won't need to reverse the string later
        bytes memory buffer = new bytes(32);
        while (value != 0) {
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
            digits -= 1;
            count++;
        }
        uint256 temp;
        assembly {
            temp := mload(add(buffer, 32))
            temp := shl(mul(sub(32,count),8), temp)
            mstore(add(buffer, 32), temp)
            mstore(buffer, count)
        }
        return string(buffer);
    }
}

/**
* DynamicBufferLib adapted from
* https://github.com/Vectorized/solady/blob/main/src/utils/DynamicBufferLib.sol
*/
library DynamicBufferLib {
    /// @dev Type to represent a dynamic buffer in memory.
    /// You can directly assign to `data`, and the `append` function will
    /// take care of the memory allocation.
    struct DynamicBuffer {
        bytes data;
    }

    /// @dev Appends `data` to `buffer`.
    /// Returns the same buffer, so that it can be used for function chaining.
    function append(DynamicBuffer memory buffer, bytes memory data)
    internal
    pure
    returns (DynamicBuffer memory)
    {
        /// @solidity memory-safe-assembly
        assembly {
            if mload(data) {
                let w := not(31)
                let bufferData := mload(buffer)
                let bufferDataLength := mload(bufferData)
                let newBufferDataLength := add(mload(data), bufferDataLength)
            // Some random prime number to multiply `capacity`, so that
            // we know that the `capacity` is for a dynamic buffer.
            // Selected to be larger than any memory pointer realistically.
                let prime := 1621250193422201
                let capacity := mload(add(bufferData, w))

            // Extract `capacity`, and set it to 0, if it is not a multiple of `prime`.
                capacity := mul(div(capacity, prime), iszero(mod(capacity, prime)))

            // Expand / Reallocate memory if required.
            // Note that we need to allocate an exta word for the length, and
            // and another extra word as a safety word (giving a total of 0x40 bytes).
            // Without the safety word, the data at the next free memory word can be overwritten,
            // because the backwards copying can exceed the buffer space used for storage.
                for {} iszero(lt(newBufferDataLength, capacity)) {} {
                // Approximately double the memory with a heuristic,
                // ensuring more than enough space for the combined data,
                // rounding up to the next multiple of 32.
                    let newCapacity :=
                    and(add(capacity, add(or(capacity, newBufferDataLength), 32)), w)

                // If next word after current buffer is not eligible for use.
                    if iszero(eq(mload(0x40), add(bufferData, add(0x40, capacity)))) {
                    // Set the `newBufferData` to point to the word after capacity.
                        let newBufferData := add(mload(0x40), 0x20)
                    // Reallocate the memory.
                        mstore(0x40, add(newBufferData, add(0x40, newCapacity)))
                    // Store the `newBufferData`.
                        mstore(buffer, newBufferData)
                    // Copy `bufferData` one word at a time, backwards.
                        for { let o := and(add(bufferDataLength, 32), w) } 1 {} {
                            mstore(add(newBufferData, o), mload(add(bufferData, o)))
                            o := add(o, w) // `sub(o, 0x20)`.
                            if iszero(o) { break }
                        }
                    // Store the `capacity` multiplied by `prime` in the word before the `length`.
                        mstore(add(newBufferData, w), mul(prime, newCapacity))
                    // Assign `newBufferData` to `bufferData`.
                        bufferData := newBufferData
                        break
                    }
                // Expand the memory.
                    mstore(0x40, add(bufferData, add(0x40, newCapacity)))
                // Store the `capacity` multiplied by `prime` in the word before the `length`.
                    mstore(add(bufferData, w), mul(prime, newCapacity))
                    break
                }
            // Initalize `output` to the next empty position in `bufferData`.
                let output := add(bufferData, bufferDataLength)
            // Copy `data` one word at a time, backwards.
                for { let o := and(add(mload(data), 32), w) } 1 {} {
                    mstore(add(output, o), mload(add(data, o)))
                    o := add(o, w) // `sub(o, 0x20)`.
                    if iszero(o) { break }
                }
            // Zeroize the word after the buffer.
                mstore(add(add(bufferData, 0x20), newBufferDataLength), 0)
            // Store the `newBufferDataLength`.
                mstore(bufferData, newBufferDataLength)
            }
        }
        return buffer;
    }
    /*
        /// @dev Appends `data0`, `data1` to `buffer`.
    /// Returns the same buffer, so that it can be used for function chaining.
    function append(DynamicBuffer memory buffer, bytes memory data0, bytes memory data1)
    internal
    pure
    returns (DynamicBuffer memory)
    {
        return append(append(buffer, data0), data1);
    }
*/
    /// @dev Appends `data0`, `data1`, `data2` to `buffer`.
    /// Returns the same buffer, so that it can be used for function chaining.
    function append(
        DynamicBuffer memory buffer,
        bytes memory data0,
        bytes memory data1,
        bytes memory data2
    ) internal pure returns (DynamicBuffer memory) {
        return append(append(append(buffer, data0), data1), data2);
    }
    /*

        /// @dev Appends `data0`, `data1`, `data2`, `data3` to `buffer`.
    /// Returns the same buffer, so that it can be used for function chaining.
    function append(
        DynamicBuffer memory buffer,
        bytes memory data0,
        bytes memory data1,
        bytes memory data2,
        bytes memory data3
    ) internal pure returns (DynamicBuffer memory) {
        return append(append(append(append(buffer, data0), data1), data2), data3);
    }

    /// @dev Appends `data0`, `data1`, `data2`, `data3`, `data4` to `buffer`.
    /// Returns the same buffer, so that it can be used for function chaining.
    function append(
        DynamicBuffer memory buffer,
        bytes memory data0,
        bytes memory data1,
        bytes memory data2,
        bytes memory data3,
        bytes memory data4
    ) internal pure returns (DynamicBuffer memory) {
        append(append(append(append(buffer, data0), data1), data2), data3);
        return append(buffer, data4);
    }

    /// @dev Appends `data0`, `data1`, `data2`, `data3`, `data4`, `data5` to `buffer`.
    /// Returns the same buffer, so that it can be used for function chaining.
    function append(
        DynamicBuffer memory buffer,
        bytes memory data0,
        bytes memory data1,
        bytes memory data2,
        bytes memory data3,
        bytes memory data4,
        bytes memory data5
    ) internal pure returns (DynamicBuffer memory) {
        append(append(append(append(buffer, data0), data1), data2), data3);
        return append(append(buffer, data4), data5);
    }

    /// @dev Appends `data0`, `data1`, `data2`, `data3`, `data4`, `data5`, `data6` to `buffer`.
    /// Returns the same buffer, so that it can be used for function chaining.
    function append(
        DynamicBuffer memory buffer,
        bytes memory data0,
        bytes memory data1,
        bytes memory data2,
        bytes memory data3,
        bytes memory data4,
        bytes memory data5,
        bytes memory data6
    ) internal pure returns (DynamicBuffer memory) {
        append(append(append(append(buffer, data0), data1), data2), data3);
        return append(append(append(buffer, data4), data5), data6);
    }
    */
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"barMap","outputs":[{"internalType":"bytes11","name":"","type":"bytes11"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"string","name":"_x","type":"string"},{"internalType":"string","name":"_y","type":"string"},{"internalType":"string","name":"_color","type":"string"},{"internalType":"uint16","name":"_height","type":"uint16"},{"internalType":"uint8","name":"_barWidth","type":"uint8"}],"name":"draw","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

608060405234801561001057600080fd5b50600060208190527fda5eac8ddc4124069287d1d89cadf786b4eff362b013902aadcd7305d548d0a980546001600160581b03199081166a3131303131303031313030179091557fc6ec34ed29344609ae53eead5e1ad0638f7703a6865d024bc3f968e5348f4be1805482166a31313030313130313130301790557facaa7019ee7c48409c807fcb6ecad36613e62b5d8bb5909d20a47722c76042b6805482166a31313030313130303131301790557fdcfc64a378eaa1cbdd8aa8db174c870e892aacffe3a40e5e2487c7487aec928f805482166a31303031303031313030301790557fb6fc6fa2f7bd903fcfe7c54cb856cc15c9474f450728131092e461bae42070ee805482166a31303031303030313130301790557f45a9dbad1845c3c1736710ce99b18dce30f439494295dfd509fe3354713205ea805482166a31303030313030313130301790557f0fb8ba52584d32e595b1f19ed62ad86e914beae218fece37034df08b41693ab0805482166a31303031313030313030301790557fe6883c7abc337b957dcce1462c72510fd1d69be0638af73626982d1815a9efca805482166a31303031313030303130301790557fac96fcfe1f0166ae42f54b8741f01619df7a5a81afca726e0f1fbc3071c5e9a0805482166a31303030313130303130301790557feb4f460b075774bd1bfe169f3e5f0cf293df0be9312abc97e7a990a404fd33f6805482166a31313030313030313030301790557fd5719d08f2bc7524618438daee5023d2ee13c4096f9502706d21f05a062b476d805482166a31313030313030303130301790557feffa5881d09a2971a5a4f5b9fee8e91193c34e19e71bb90a99f533359813a9f6805482166a31313030303130303130301790557f94c2f5f5539b23babc5a5c52ad9ead08c5b13d11b18a2db251c1cc7fd0fdcb40805482166a31303131303031313130301790557f17a86bcb0e27e09828027a2d0710ed284d6f24ee092b9f90af7c4ff397a419c8805482166a31303031313031313130301790557f836d11624bfa94333019e1697bd2d4bc80684ab5d8341233b16728f1606207d9805482166a31303031313030313131301790557fe76c7fd19fb69d9cbc96c4b6d0eb7503c4a4c04e0ad4a54eb2549187653c94ff805482166a31303131313030313130301790557fcb874c43a592bf8c51160c059523e1cd2862db6db91b0f52ae336a98e93621be805482166a31303031313130313130301790557fe4ce2b34e6936dbc805a4302371621d887deb2686315a11d77357f9bce8f1c44805482166a31303031313130303131301790557f4a5372265c337d807cb2bddb2de265b5910240ad9b70731b3b5d96f5d2376e99805482166a31313030313131303031301790557fccf21eeb9445378242d90c097d430c98b02a39fc77f14fbfdd7cd8d5df5adffd805482166a31313030313031313130301790557fd8d1fe366415c1f7477b7da02378bd14b85929dff53e1edf86bbbc896303b221805482166a31313030313030313131301790557f8cb5c72e644b44f4abe0ddcb3772f0f88618d6f97a153fff16cbd81fe137774d805482166a31313031313130303130301790557f0779ebf05217971a883c1c7f1d44dc4b09ab27e491c59b2267e2a267e8ff6fef805482166a31313030313131303130301790557f917a9a7213abe17bf33a0450bd0a9cae3670c4846a4822e199e1afce8b2ab7b2805482166a31313130313130313131301790557f067c4736ddeca90c7006cc172b153c6e8fc9aa6c9f0aa723afcc747a3294227b805482166a31313130313030313130301790557fdb3502e37fb35a52293afcc10c0f1a3ec384e293f2f0c303f655ace549f63748805482166a31313130303130313130301790557ffbea51d597db6325487bdbd38d989a2e69f54a5e9bc7d86335e13be2372af4bb805482166a31313130303130303131301790557f644f930ae12a4cc9359ebd0e20c8ade1297bfc05cec7403fb54ae72c5796cd7d805482166a31313130313130303130301790557f37089ce624bca8bcd38fe35dbf5bf8299a4d4a8e60b3769fb608290b6772b1ec805482166a31313130303131303130301790557f51a35cdd6accf761f8ec867f374a946c2a2d4922ec5d98daf3f48b329b2077f4805482166a31313130303131303031301790557f5ef00ac9f1eaf1889d0c2906f7f1ee9e90461d078431a8ec594757d5924b8c77805482166a31313031313031313030301790557f6bb3c3bb02019ff44a21eb2ea9d3692207fd5ae1000c007f2ccf6d7705205a03805482166a31313031313030303131301790557f15cf172891e5e8976171c598239bf006a0525edcfead3c11a89bcb585b9533f9805482166a31313030303131303131301790557f5e6ff77b013e919763c2873e4e80c4f936a576d1103d0708e4323b50cc5bfe06805482166a31303130303031313030301790557f1a1208b7664853a0e6165a4b8988195ea86088febd9649ce793750d85cc688f7805482166a31303030313031313030301790557f58ebae74e5e6d04224ad71156844211fd9cccd946ef77d796e22a26a4c4698f5805482166a31303030313030303131301790557f18f0ec316620bfd30edc5d5cbb9a371aee7021294cd632e94c1568f928c7de03805482166a31303131303030313030301790557fc0cfa494df28d722d558598edd98ae4580a846ff985c26ef9dcd99ba4b62be6c805482166a31303030313130313030301790557f3d27ebf52142a4348e66ce1cedcaa9da21f032f8a2bca1192f8c59ba07161838805482166a31303030313130303031301790557f4686205d07411075652cf58aa96df401a34988ffc586b325d49202bfc28eb9a8805482166a31313031303030313030301790557f1a23c05b03ac3b4bf5fe0319ed9aac636d699b3bd0c0db04d93cbed3dd6994aa805482166a31313030303130313030301790557f639f887baeb6f8a3d87706b6a77ee460fb3e6a43465d1c2f02b20439669bd6a5805482166a31313030303130303031301790557fa7ee27ab715a3f3a73ebc36ae3e5f6927c1b62f0a1b715752239bda0490c6a10805482166a31303131303131313030301790557f3e9e18aa58476b809f44f684e6ff5e520319d7203ef4e401c3eac6d1f8593baa805482166a31303131303030313131301790557f695550e90126e381b8e9efaaacc1f785f22aed06f3a95a54ce618f5da99be93d805482166a31303030313130313131301790557fab9c9330b25da96cf3a317e6b9c0fdf31992115fe7ba2ded084e64f2ae3fe2f0805482166a31303131313031313030301790557fb53854f5372c2a8f0a8e8a4757ebed388dad183a75a3daa0c536acdff2e1c423805482166a31303131313030303131301790557ff14d1b9dece8d9bd4c27f614071dd858d32e3aa5d74d33f6a66668924ea4661c805482166a31303030313131303131301790557f2384487f0f38aa9f4e931a4b0e0eb12f89b75c5e5c1b3c710ead7ad979a6fac5805482166a31313130313131303131301790557f97dc22a7408d4ce108dbebe75b7232ea4e4af9d357239c83eb2d44ed5dd5b3bc805482166a31313031303030313131301790557f80b2045fe7df63e911469d8aa8a5e9c8778b66a59ca595ff7ddf57dc341d029f805482166a31313030303130313131301790557f82df37241b6eaffc0cfb1744bb4bf4977cb63a6864b6f9c38cfebe7b28642954805482166a31313031313130313030301790557f1da19ae930df586a10221ba0972fef40d934ad2e4089e4df55165dcf427bbe6f805482166a31313031313130303031301790557fce77a70e06e8bfbed4eb00f7560cf092f71cedd016b04a7e673090f2b56e5c45805482166a31313031313130313131301790557f0ce841940881fca25815b3295ac6d078bc10630a9ea92ea471b4710e7c52cb4a805482166a31313130313031313030301790557f6184f314ef140b377b4d5681aea795d107bd115b5bc034c6ccf793ce5c59fceb805482166a31313130313030303131301790557f77eec4bae365550a7cfff9a3e22f538234fde74e00375dcd494b58b682d40511805482166a31313130303031303131301790557f9482cbbd4163c4cb87d0be292a0a91ec81f666221124fafea39932b6b64ac1eb805482166a31313130313130313030301790557fba0be93a1df0860ad96404736a89ea43634832e225882f9e86dc34bdc493ff9c80546a31313130313130303031309083161790557f396b4b8fbfcc6772ffcaf074f6b33fd17426fc2d62535d280d56f2cb5ca1841e805482166a31313130303031313031301790557f52e63a232e3bf422d34967ffd6bdecc81e47af77ff9772dbc5146c8ecf0134c0805482166a31313130313131313031301790557f0c67191292e8036f424d7e8dcd83c172d4633aec3001953a931e8926d6cc8d89805482166a31313030313030303031301790557fda97e01b241ed48199b69fcb168418a74ad3164c0468e4f75c44196fe5b65707805482166a31313131303030313031301790557f194d3addc9dd908d61a13ecb9d0efbec05c1285e5870b4d01874a3cbb3bea470805482166a31303130303131303030301790557faef0b6d86d250d3957f2673c14e85377f59d73c8c82fc4c4e625eedd0867265b805482166a31303130303030313130301790557fc6104dacf81804a2628dbea0859f17f5f84c08c67683b5727fd902ca93af1b9c805482166a31303031303131303030301790557f5a2fa7195073f08573f7a24d2c0085275cd26eb6e3fe658d96de188b42e3f230805482166a31303031303030303131301790557f0e5b9872d5b4e7bbefd05f5c519bb66abf1862b275df3f6aa087ae6de66bfd93805482166a31303030303130313130301790557fbbf788ca626349288dbe7769c6f0e62a7d28b9b91be8bd0c7fea9ec368c138b1805482166a31303030303130303131301790557fced084f0651de812c0b677a36137d5bad6ef3d24098909716ab7814cf31842b2805482166a31303131303031303030301790557fb6a0d908b8a7d4609b62feb09adbd6969f0cddbb137d28b59a7d7e01e3ef67a4805482166a31303131303030303130301790557f7edc12e84aef553661d7a4ddf6f8f0900cd7936fbfc7d4a070278143792eb845805482166a31303031313031303030301790557f6d05537c1b700c394d789ba924e37b6cace0488a04abbbeada4db4259a6420fd805482166a31303031313030303031301790557fc74f198f31d5559bec6f92fd085fd9d85778a9130f097931f88fd6a576df7062805482166a31303030303131303130301790557f6a141c3bdc5d0fcc2bad0c1e614dd145c793faccb7729952b10a032068b61a9c805482166a31303030303131303031301790557fc8f06a088fb7182851e40a23a29168c415a6b37ac863804965c8095080f1113c805482166a31313030303031303031301790557fb13727bb0996df8866ecd2d17c8de3a600563cc67eadb3e97b4ac0e5c60b29b8805482166a31313030313031303030301790557f12073fbe61c0b72805458c0bc0d4b2c1c2c7c778042f9f1f3bab64a2c249725e805482166a31313131303131313031301790557f48eb5df2f0d6292db0deda644e0e1976c3e05552394029a200202c9a6d64b45f805482166a31313030303031303130301790557f78f9d794c679503ccba2bdaf8166038a616a4ea39d9eccbcecde2d1c154f2e2a805482166a31303030313131313031301790557f08a6ac83c67a9cfa1a8fb48cc11497c39558a644352603e23e0ef62d9f3454e1805482166a31303130303131313130301790557f1f7a55db325fb660275f7689ece34aeb5ad5d477781c1a2ef38981992fed133e805482166a31303031303131313130301790557fc19ab865929c1b149b696dd8c9b1d483c37db8a044defee60f3c695e77b4920c805482166a31303031303031313131301790557f7c2b5dcbca672f8de143756fc8ebc66e07dfb9c0aae91c1bddce49fba0803b6a805482166a31303131313130303130301790557f4160e02c0be568c6171e3cfc3a9752aefa0a30c564ab5cb829bba13b97c6c502805482166a31303031313131303130301790557f146592dbc99345dcc3d81f9f9dcaa0ecd9a463e9aa8a502422e6168360093e49805482166a31303031313131303031301790557f48600bc714c006a7d3e475229eaceee750f0f37ad9cfec1c6ab08da83707f0f0805482166a31313131303130303130301790557f1d711cdc7bb97de71efa352a9dbfff1f451d04ae2bfc4ce6e5807921926d75ec805482166a31313131303031303130301790557fb7ce03b049d9989bc89b8c65483eacf0d88c4fd915f282aca7bc03d5eaff89bc805482166a31313131303031303031301790557f4c601714fc8adc14f491b311674711c4085f807dce8005a5cee95a4b726e76ae805482166a31313031313031313131301790557f0364f94e181ce90621c0469e5016060e0ed2fa93f8a6d1fb10a5dded391908bb805482166a31313031313131303131301790557fd3007f67315a3dab659abc0ba46add5dea6f8b38937b0284082c40e6d482be7c805482166a31313131303131303131301790557f3bdcf1bb487f72fdcb8ce70ff1928c39065ce3ef1e77e0db7c699d4925cef7b9805482166a31303130313131313030301790557fe7927f18273f915741c0a145130542f820f985590729aa0af5c08ada6480452a805482166a31303130303031313131301790557f8ccf818fe4ccbd6c62eb5b85f15caba3963466bafd36f2bd2122c16943cba317805482166a31303030313031313131301790557fc8407e33b1f7c8935f5c9855ba832d3f91641d04ebddb2753561d6dcbc7b8cdc805482166a31303131313130313030301790557fe4cd42e6e3abb8014d3b44dbbb8ab943fb7373582dd42d29f78e4e26511f98b3805482166a31303131313130303031301790557fa178d97cb76ca4cdbb58094825c340064f8a730b442bcd9bb2408f6526ca08c4805482166a31313131303130313030301790557fe5d223f70807c797d236fca72e8a48a07900c7422a0f807ef9a14ba450d8dc50805482166a31313131303130303031301790557fa22001102b0d8a093bbd76b83b36219a5da3e89632f0220e6d2cc15b7e608f1b805482166a31303131313031313131301790557f359583f6bdb70b11dce508fc42159c65a6ad27e4bd875c8a146a5300f4aafae0805482166a31303131313130313131301790557edeca629bdbce4905735140e174899c5f2bf39dbbae9e3dadc481d24a1025ac805482166a31313130313031313131301790557fcf137d94488fdf28d747b6df1c6029740c8864f3e53139e4f1925c322ebeb02a805482166a31313131303130313131301790557f285da429954831dd9613ae41279d17b57b06868b0c2270121b0a63c867c5ecdd805482166a31313031303030303130301790557f541922dd5ef162f04ffa9e56539f67d2691ef54acad32253163bca0562a88640805482166a31313031303031303030301790556231303560e81b82527f5a47718f65604cde3d716158c35e67477f84358d1ddec12b5042b570b52de19380549091166a3131303130303131313030179055610ec09081906115c590396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80636900a3ae146100465780639b0ab2511461006f578063b01ec9aa14610082575b600080fd5b610059610054366004610a48565b6100be565b6040516100669190610a85565b60405180910390f35b61005961007d366004610b71565b6101a1565b6100a5610090366004610a48565b60006020819052908152604090205460a81b81565b6040516001600160a81b03199091168152602001610066565b60606000826000036100e95750506040805180820190915260018152600360fc1b6020820152919050565b604080516020808252818301909252601f91600091906020820181803683370190505090505b841561018357610120600a86610c42565b61012b906030610c6c565b60f81b81838151811061014057610140610c7f565b60200101906001600160f81b031916908160001a905350610162600a86610c95565b945061016f600183610ca9565b91508261017b81610cbc565b93505061010f565b60208181018051918590036008029190911b90529182525092915050565b606060006101ae886100be565b6231303560e81b600090815260208181527f5a47718f65604cde3d716158c35e67477f84358d1ddec12b5042b570b52de1935460405193945091926102079260a81b91016001600160a81b0319919091168152600b0190565b6040516020818303038152906040529050600282516102269190610c42565b600103610250578160405160200161023e9190610cdb565b60405160208183030381529060405291505b604080518082019091526002815261030360f41b6020820152600090819060699060019083905b87518610156104005787868151811061029257610292610c7f565b602001015160f81c60f81b816000815181106102b0576102b0610c7f565b60200101906001600160f81b031916908160001a905350876102d3876001610c6c565b815181106102e3576102e3610c7f565b602001015160f81c60f81b8160018151811061030157610301610c7f565b60200101906001600160f81b031916908160001a9053506020818101516000818152808352604090819020549051919450610345928a9260a89290921b9101610d04565b6040516020818303038152906040529650603088878151811061036a5761036a610c7f565b016020015161037c919060f81c610d33565b61038790600a610d4c565b60ff16945060308861039a886001610c6c565b815181106103aa576103aa610c7f565b01602001516103bc919060f81c610d33565b6103c99060ff1686610c6c565b94506103d58386610d6f565b6103df9085610c6c565b93506103ec600287610c6c565b9550826103f881610d86565b935050610277565b61040b606785610c42565b9350610416846100be565b9050600a84101561044457806040516020016104329190610cdb565b60405160208183030381529060405290505b6020818101516000818152808352604090819020549051919450610483928a9260a89290921b916c3131303030313131303130313160981b9101610d9f565b60405160208183030381529060405296506104a2878f8f8f8f8f6104b5565b9f9e505050505050505050505050505050565b606060138361ffff16116105035760405162461bcd60e51b815260206004820152601160248201527017da195a59da1d081d1bdbc81cdb585b1b607a1b604482015260640160405180910390fd5b6040805160208101909152606081526000806000806105368760ff168d5161052b9190610d6f565b610054906018610c6c565b905060006105478961ffff166100be565b90506105b46040518060400160405280601881526020017f3c7376672069643d22736f6c626172636f64652220783d2200000000000000008152508d60405180604001604052806007815260200166383c11103c9e9160c91b8152508961093f909392919063ffffffff16565b5060408051808201909152600b81526a383c11103bb4b23a341e9160a91b60208201526105e59087908d908561093f565b5061064a6040518060400160405280600c81526020016b383c11103432b4b3b43a1e9160a11b81525082604051806040016040528060118152602001700383c11103b34b2bba137bc1e911810181607d1b8152508961093f909392919063ffffffff16565b506040805180820190915260018152600160fd1b602082015261067190879084908461093f565b506106956040518060800160405280604c8152602001610e08604c91398790610973565b5060408051808201909152600a81526911103432b4b3b43a1e9160b11b60208201526106c590879084908461093f565b506107146040518060400160405280600f81526020016e22207374796c653d2266696c6c3a2360881b8152508b604051806060016040528060378152602001610e54603791398992919061093f565b505b8c51851015610889578c858151811061073157610731610c7f565b01602001516001600160f81b031916603160f81b03610767578361075481610d86565b945050821561076257600092505b610877565b83156108695760408051808201909152600a815269101e3932b1ba103c1e9160b11b60208201526107e8906107b96107a260ff8c1688610d6f565b6107af60ff8d168a610d6f565b6100549190610ca9565b60408051808201909152600f81526e11103c9e911811103bb4b23a341e9160891b60208201528992919061093f565b5061083d6107fc61005460ff8b1687610d6f565b60408051808201909152600a81526911103432b4b3b43a1e9160b11b602082015261083461082b60148e610dec565b61ffff166100be565b8992919061093f565b5060408051808201909152600381526211179f60e91b6020820152610863908790610973565b50600093505b8261087381610d86565b9350505b8461088181610d86565b955050610716565b83156109005760408051808201909152600a815269101e3932b1ba103c1e9160b11b60208201526108c4906107b96107a260ff8c1688610d6f565b506108d86107fc61005460ff8b1687610d6f565b5060408051808201909152600381526211179f60e91b60208201526108fe908790610973565b505b60408051808201909152600a8152691e17b39f1e17b9bb339f60b11b602082015261092c908790610973565b505093519b9a5050505050505050505050565b60408051602081019091526060815261096a61096461095e8787610973565b85610973565b83610973565b95945050505050565b604080516020810190915260608152815115610a3f57601f1983518051808551016605c284b9def7798484015181810615828204029050808310610a12578560208483170182011681604001860160405114610a0057602060405101816040018101604052808b528760208701165b87810151828201528801806109e25750908302818801529450610a12565b80604001860160405280830287870152505b505085519183019160200184165b8681015183820152840180610a20575060008382016020015290915250505b50815b92915050565b600060208284031215610a5a57600080fd5b5035919050565b60005b83811015610a7c578181015183820152602001610a64565b50506000910152565b6020815260008251806020840152610aa4816040850160208701610a61565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610adf57600080fd5b813567ffffffffffffffff80821115610afa57610afa610ab8565b604051601f8301601f19908116603f01168101908282118183101715610b2257610b22610ab8565b81604052838152866020858801011115610b3b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff81168114610b6c57600080fd5b919050565b60008060008060008060c08789031215610b8a57600080fd5b86359550602087013567ffffffffffffffff80821115610ba957600080fd5b610bb58a838b01610ace565b96506040890135915080821115610bcb57600080fd5b610bd78a838b01610ace565b95506060890135915080821115610bed57600080fd5b50610bfa89828a01610ace565b935050608087013561ffff81168114610c1257600080fd5b9150610c2060a08801610b5b565b90509295509295509295565b634e487b7160e01b600052601260045260246000fd5b600082610c5157610c51610c2c565b500690565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a4257610a42610c56565b634e487b7160e01b600052603260045260246000fd5b600082610ca457610ca4610c2c565b500490565b81810381811115610a4257610a42610c56565b600060ff821660ff8103610cd257610cd2610c56565b60010192915050565b600360fc1b815260008251610cf7816001850160208701610a61565b9190910160010192915050565b60008351610d16818460208801610a61565b6001600160a81b03199390931691909201908152600b0192915050565b60ff8281168282160390811115610a4257610a42610c56565b60ff8181168382160290811690818114610d6857610d68610c56565b5092915050565b8082028115828204841417610a4257610a42610c56565b600060018201610d9857610d98610c56565b5060010190565b60008451610db1818460208901610a61565b6001600160a81b0319949094169190930190815272ffffffffffffffffffffffffffffffffffffff1991909116600b82015260180192915050565b61ffff828116828216039080821115610d6857610d68610c5656fe2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076657273696f6e3d22312e31223e3c7265637420783d22302220793d2230222077696474683d223b222f3e203c67207472616e73666f726d3d227472616e736c6174652831322c2031302922207374796c653d2266696c6c3a23303b223ea2646970667358221220cd943455c4012394483f0cd29b818aa1538c03ce6e4e79bdce50bdb1bfa7834364736f6c63430008130033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100415760003560e01c80636900a3ae146100465780639b0ab2511461006f578063b01ec9aa14610082575b600080fd5b610059610054366004610a48565b6100be565b6040516100669190610a85565b60405180910390f35b61005961007d366004610b71565b6101a1565b6100a5610090366004610a48565b60006020819052908152604090205460a81b81565b6040516001600160a81b03199091168152602001610066565b60606000826000036100e95750506040805180820190915260018152600360fc1b6020820152919050565b604080516020808252818301909252601f91600091906020820181803683370190505090505b841561018357610120600a86610c42565b61012b906030610c6c565b60f81b81838151811061014057610140610c7f565b60200101906001600160f81b031916908160001a905350610162600a86610c95565b945061016f600183610ca9565b91508261017b81610cbc565b93505061010f565b60208181018051918590036008029190911b90529182525092915050565b606060006101ae886100be565b6231303560e81b600090815260208181527f5a47718f65604cde3d716158c35e67477f84358d1ddec12b5042b570b52de1935460405193945091926102079260a81b91016001600160a81b0319919091168152600b0190565b6040516020818303038152906040529050600282516102269190610c42565b600103610250578160405160200161023e9190610cdb565b60405160208183030381529060405291505b604080518082019091526002815261030360f41b6020820152600090819060699060019083905b87518610156104005787868151811061029257610292610c7f565b602001015160f81c60f81b816000815181106102b0576102b0610c7f565b60200101906001600160f81b031916908160001a905350876102d3876001610c6c565b815181106102e3576102e3610c7f565b602001015160f81c60f81b8160018151811061030157610301610c7f565b60200101906001600160f81b031916908160001a9053506020818101516000818152808352604090819020549051919450610345928a9260a89290921b9101610d04565b6040516020818303038152906040529650603088878151811061036a5761036a610c7f565b016020015161037c919060f81c610d33565b61038790600a610d4c565b60ff16945060308861039a886001610c6c565b815181106103aa576103aa610c7f565b01602001516103bc919060f81c610d33565b6103c99060ff1686610c6c565b94506103d58386610d6f565b6103df9085610c6c565b93506103ec600287610c6c565b9550826103f881610d86565b935050610277565b61040b606785610c42565b9350610416846100be565b9050600a84101561044457806040516020016104329190610cdb565b60405160208183030381529060405290505b6020818101516000818152808352604090819020549051919450610483928a9260a89290921b916c3131303030313131303130313160981b9101610d9f565b60405160208183030381529060405296506104a2878f8f8f8f8f6104b5565b9f9e505050505050505050505050505050565b606060138361ffff16116105035760405162461bcd60e51b815260206004820152601160248201527017da195a59da1d081d1bdbc81cdb585b1b607a1b604482015260640160405180910390fd5b6040805160208101909152606081526000806000806105368760ff168d5161052b9190610d6f565b610054906018610c6c565b905060006105478961ffff166100be565b90506105b46040518060400160405280601881526020017f3c7376672069643d22736f6c626172636f64652220783d2200000000000000008152508d60405180604001604052806007815260200166383c11103c9e9160c91b8152508961093f909392919063ffffffff16565b5060408051808201909152600b81526a383c11103bb4b23a341e9160a91b60208201526105e59087908d908561093f565b5061064a6040518060400160405280600c81526020016b383c11103432b4b3b43a1e9160a11b81525082604051806040016040528060118152602001700383c11103b34b2bba137bc1e911810181607d1b8152508961093f909392919063ffffffff16565b506040805180820190915260018152600160fd1b602082015261067190879084908461093f565b506106956040518060800160405280604c8152602001610e08604c91398790610973565b5060408051808201909152600a81526911103432b4b3b43a1e9160b11b60208201526106c590879084908461093f565b506107146040518060400160405280600f81526020016e22207374796c653d2266696c6c3a2360881b8152508b604051806060016040528060378152602001610e54603791398992919061093f565b505b8c51851015610889578c858151811061073157610731610c7f565b01602001516001600160f81b031916603160f81b03610767578361075481610d86565b945050821561076257600092505b610877565b83156108695760408051808201909152600a815269101e3932b1ba103c1e9160b11b60208201526107e8906107b96107a260ff8c1688610d6f565b6107af60ff8d168a610d6f565b6100549190610ca9565b60408051808201909152600f81526e11103c9e911811103bb4b23a341e9160891b60208201528992919061093f565b5061083d6107fc61005460ff8b1687610d6f565b60408051808201909152600a81526911103432b4b3b43a1e9160b11b602082015261083461082b60148e610dec565b61ffff166100be565b8992919061093f565b5060408051808201909152600381526211179f60e91b6020820152610863908790610973565b50600093505b8261087381610d86565b9350505b8461088181610d86565b955050610716565b83156109005760408051808201909152600a815269101e3932b1ba103c1e9160b11b60208201526108c4906107b96107a260ff8c1688610d6f565b506108d86107fc61005460ff8b1687610d6f565b5060408051808201909152600381526211179f60e91b60208201526108fe908790610973565b505b60408051808201909152600a8152691e17b39f1e17b9bb339f60b11b602082015261092c908790610973565b505093519b9a5050505050505050505050565b60408051602081019091526060815261096a61096461095e8787610973565b85610973565b83610973565b95945050505050565b604080516020810190915260608152815115610a3f57601f1983518051808551016605c284b9def7798484015181810615828204029050808310610a12578560208483170182011681604001860160405114610a0057602060405101816040018101604052808b528760208701165b87810151828201528801806109e25750908302818801529450610a12565b80604001860160405280830287870152505b505085519183019160200184165b8681015183820152840180610a20575060008382016020015290915250505b50815b92915050565b600060208284031215610a5a57600080fd5b5035919050565b60005b83811015610a7c578181015183820152602001610a64565b50506000910152565b6020815260008251806020840152610aa4816040850160208701610a61565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610adf57600080fd5b813567ffffffffffffffff80821115610afa57610afa610ab8565b604051601f8301601f19908116603f01168101908282118183101715610b2257610b22610ab8565b81604052838152866020858801011115610b3b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff81168114610b6c57600080fd5b919050565b60008060008060008060c08789031215610b8a57600080fd5b86359550602087013567ffffffffffffffff80821115610ba957600080fd5b610bb58a838b01610ace565b96506040890135915080821115610bcb57600080fd5b610bd78a838b01610ace565b95506060890135915080821115610bed57600080fd5b50610bfa89828a01610ace565b935050608087013561ffff81168114610c1257600080fd5b9150610c2060a08801610b5b565b90509295509295509295565b634e487b7160e01b600052601260045260246000fd5b600082610c5157610c51610c2c565b500690565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a4257610a42610c56565b634e487b7160e01b600052603260045260246000fd5b600082610ca457610ca4610c2c565b500490565b81810381811115610a4257610a42610c56565b600060ff821660ff8103610cd257610cd2610c56565b60010192915050565b600360fc1b815260008251610cf7816001850160208701610a61565b9190910160010192915050565b60008351610d16818460208801610a61565b6001600160a81b03199390931691909201908152600b0192915050565b60ff8281168282160390811115610a4257610a42610c56565b60ff8181168382160290811690818114610d6857610d68610c56565b5092915050565b8082028115828204841417610a4257610a42610c56565b600060018201610d9857610d98610c56565b5060010190565b60008451610db1818460208901610a61565b6001600160a81b0319949094169190930190815272ffffffffffffffffffffffffffffffffffffff1991909116600b82015260180192915050565b61ffff828116828216039080821115610d6857610d68610c5656fe2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076657273696f6e3d22312e31223e3c7265637420783d22302220793d2230222077696474683d223b222f3e203c67207472616e73666f726d3d227472616e736c6174652831322c2031302922207374796c653d2266696c6c3a23303b223ea2646970667358221220cd943455c4012394483f0cd29b818aa1538c03ce6e4e79bdce50bdb1bfa7834364736f6c63430008130033

Deployed Bytecode Sourcemap

457:10384:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9764:1074;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5314:2094;;;;;;:::i;:::-;;:::i;545:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3270:47:1;;;3252:66;;3240:2;3225:18;545:41:0;3106:218:1;9764:1074:0;9818:13;10078:11;10104:5;10113:1;10104:10;10100:53;;-1:-1:-1;;10131:10:0;;;;;;;;;;;;-1:-1:-1;;;10131:10:0;;;;;9764:1074;-1:-1:-1;9764:1074:0:o;10100:53::-;10370:13;;;10380:2;10370:13;;;;;;;;;10180:2;;10163:14;;10370:13;;;;;;;;;;;-1:-1:-1;10370:13:0;10348:35;;10394:176;10401:10;;10394:176;;10471:10;10479:2;10471:5;:10;:::i;:::-;10458:24;;:2;:24;:::i;:::-;10445:39;;10428:6;10435;10428:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10428:56:0;;;;;;;;-1:-1:-1;10499:11:0;10508:2;10499:11;;:::i;:::-;;-1:-1:-1;10525:11:0;10535:1;10525:11;;:::i;:::-;;-1:-1:-1;10551:7:0;;;;:::i;:::-;;;;10394:176;;;10653:2;10641:15;;;10635:22;;10687:13;;;;10701:1;10683:20;10679:31;;;;10724:29;;10767:21;;;-1:-1:-1;10645:6:0;9764:1074;-1:-1:-1;;9764:1074:0:o;5314:2094::-;5510:13;5536:19;5564:13;5573:3;5564:8;:13::i;:::-;-1:-1:-1;;;5589:16:0;5638:13;;;;;;;;;;5621:31;5536:42;;-1:-1:-1;5589:16:0;;5621:31;;5638:13;;;5621:31;-1:-1:-1;;;;;;4551:47:1;;;;4539:60;;4624:2;4615:12;;4410:223;5621:31:0;;;;;;;;;;;;;5589:63;;5698:1;5682:6;:13;:17;;;;:::i;:::-;5703:1;5682:22;5678:159;;5770:6;5730:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;5721:56;;5678:159;6233:21;;;;;;;;;;;;-1:-1:-1;;;6233:21:0;;;;5847:11;;;;6011:3;;6100:1;;5847:11;;6320:544;6333:6;:13;6327:3;:19;6320:544;;;6370:6;6377:3;6370:11;;;;;;;;:::i;:::-;;;;;;;;;6363:1;6365;6363:4;;;;;;;;:::i;:::-;;;;:18;-1:-1:-1;;;;;6363:18:0;;;;;;;;-1:-1:-1;6403:6:0;6410:5;:3;6414:1;6410:5;:::i;:::-;6403:13;;;;;;;;:::i;:::-;;;;;;;;;6396:1;6398;6396:4;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;6396:20:0;;;;;;;;-1:-1:-1;6477:2:0;6470:10;;;6464:17;6592:6;:9;;;;;;;;;;;;6552:50;;6464:17;;-1:-1:-1;6552:50:0;;6587:3;;6592:9;;;;;;6552:50;;:::i;:::-;;;;;;;;;;;;;6546:56;;6643:2;6628:6;6635:3;6628:11;;;;;;;;:::i;:::-;;;;;6622:23;;;6628:11;;6622:23;:::i;:::-;6621:30;;6649:2;6621:30;:::i;:::-;6617:34;;;-1:-1:-1;6716:2:0;6699:6;6706:5;:3;6710:1;6706:5;:::i;:::-;6699:13;;;;;;;;:::i;:::-;;;;;6693:25;;;6699:13;;6693:25;:::i;:::-;6688:30;;;;;;:::i;:::-;;-1:-1:-1;6774:3:0;6776:1;6688:30;6774:3;:::i;:::-;6767:11;;:3;:11;:::i;:::-;6761:17;-1:-1:-1;6828:6:0;6833:1;6828:6;;:::i;:::-;;-1:-1:-1;6849:3:0;;;;:::i;:::-;;;;6320:544;;;6880:9;6886:3;6880;:9;:::i;:::-;6874:15;;6922:13;6931:3;6922:8;:13::i;:::-;6912:24;;6957:2;6951:3;:8;6947:90;;;7002:1;6980:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;6976:28;;6947:90;7089:2;7082:10;;;7076:17;7196:6;:9;;;;;;;;;;;;7160:56;;7076:17;;-1:-1:-1;7160:56:0;;7191:3;;7196:9;;;;;;-1:-1:-1;;;7207:8:0;7160:56;;:::i;:::-;;;;;;;;;;;;;7154:62;;7241:148;7263:3;7287:2;7311;7335:6;7357:7;7379:9;7241:7;:148::i;:::-;7227:173;5314:2094;-1:-1:-1;;;;;;;;;;;;;;;5314:2094:0:o;7448:2308::-;7651:12;7695:2;7685:7;:12;;;7676:43;;;;-1:-1:-1;;;7676:43:0;;6939:2:1;7676:43:0;;;6921:21:1;6978:2;6958:18;;;6951:30;-1:-1:-1;;;6997:18:1;;;6990:47;7054:18;;7676:43:0;;;;;;;;-1:-1:-1;;;;;;;;;;;;7785:11:0;7811:9;7835;7859:18;7886:39;7909:9;7896:22;;:3;:10;:22;;;;:::i;:::-;7895:29;;7922:2;7895:29;:::i;7886:39::-;7859:67;;7951:19;7979:26;7996:7;7988:16;;7979:8;:26::i;:::-;7951:55;;8017:56;;;;;;;;;;;;;;;;;;8059:2;8017:56;;;;;;;;;;;;;-1:-1:-1;;;8017:56:0;;;:6;:13;;:56;;;;;;:::i;:::-;-1:-1:-1;8084:39:0;;;;;;;;;;;;-1:-1:-1;;;8084:39:0;;;;;;:6;;8098:2;;8117:5;8084:13;:39::i;:::-;;8134:57;;;;;;;;;;;;;;-1:-1:-1;;;8134:57:0;;;8164:6;8134:57;;;;;;;;;;;;;-1:-1:-1;;;8134:57:0;;;:6;:13;;:57;;;;;;:::i;:::-;-1:-1:-1;8202:32:0;;;;;;;;;;;;-1:-1:-1;;;8202:32:0;;;;;;:6;;8216:5;;8227:6;8202:13;:32::i;:::-;;8245:93;;;;;;;;;;;;;;;;;;:6;;:13;:93::i;:::-;-1:-1:-1;8349:41:0;;;;;;;;;;;;-1:-1:-1;;;8349:41:0;;;;;;:6;;8363:5;;8383:6;8349:13;:41::i;:::-;;8401:97;;;;;;;;;;;;;;-1:-1:-1;;;8401:97:0;;;8433:6;8401:97;;;;;;;;;;;;;;;;;:6;;:97;;:13;:97::i;:::-;;8509:783;8522:3;:10;8516:3;:16;8509:783;;;8553:3;8557;8553:8;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;8553:8:0;-1:-1:-1;;;8553:15:0;8549:712;;8589:3;;;;:::i;:::-;;-1:-1:-1;;8643:5:0;;8639:58;;8676:1;8673:4;;8639:58;8549:712;;;8741:3;;8737:487;;8772:174;;;;;;;;;;;;-1:-1:-1;;;8772:174:0;;;;;;8857:43;8885:13;;;;:1;:13;:::i;:::-;8866:15;;;;:3;:15;:::i;:::-;:33;;;;:::i;8857:43::-;8772:174;;;;;;;;;;;;-1:-1:-1;;;8772:174:0;;;;:6;;:174;;:13;:174::i;:::-;-1:-1:-1;8969:166:0;9015:23;9024:13;;;;:1;:13;:::i;9015:23::-;8969:166;;;;;;;;;;;;-1:-1:-1;;;8969:166:0;;;;9111:22;9120:12;9130:2;9120:7;:12;:::i;:::-;9111:22;;:8;:22::i;:::-;8969:6;;:166;;:13;:166::i;:::-;-1:-1:-1;9158:20:0;;;;;;;;;;;;-1:-1:-1;;;9158:20:0;;;;;;:6;;:13;:20::i;:::-;;9203:1;9201:3;;8737:487;9242:3;;;;:::i;:::-;;;;8549:712;9275:5;;;;:::i;:::-;;;;8509:783;;;9306:3;;9302:378;;9326:150;;;;;;;;;;;;-1:-1:-1;;;9326:150:0;;;;;;9395:43;9423:13;;;;:1;:13;:::i;9326:150::-;-1:-1:-1;9491:142:0;9529:23;9538:13;;;;:1;:13;:::i;9491:142::-;-1:-1:-1;9648:20:0;;;;;;;;;;;;-1:-1:-1;;;9648:20:0;;;;;;:6;;:13;:20::i;:::-;;9302:378;9690:27;;;;;;;;;;;;-1:-1:-1;;;9690:27:0;;;;;;:6;;:13;:27::i;:::-;-1:-1:-1;;9736:11:0;;;7448:2308;-1:-1:-1;;;;;;;;;;;7448:2308:0:o;16006:270::-;-1:-1:-1;;;;;;;;;;;;16217:51:0;16224:36;16231:21;16238:6;16246:5;16231:6;:21::i;:::-;16254:5;16224:6;:36::i;:::-;16262:5;16217:6;:51::i;:::-;16210:58;16006:270;-1:-1:-1;;;;;16006:270:0:o;11360:4133::-;-1:-1:-1;;;;;;;;;;;;11577:4:0;11571:11;11568:3883;;;11615:2;11611:7;11660:6;11654:13;11715:10;11709:17;11788:16;11781:4;11775:11;11771:34;12055:16;12127:1;12115:10;12111:18;12105:25;12298:5;12288:8;12284:20;12277:28;12269:5;12259:8;12255:20;12251:55;12239:67;;12778:8;12757:19;12754:33;12740:2007;;13123:1;13117:2;13095:19;13085:8;13082:33;13078:42;13068:8;13064:57;13060:65;13280:8;13274:4;13270:19;13258:10;13254:36;13247:4;13241:11;13238:53;13228:1190;;13443:4;13436;13430:11;13426:22;13563:11;13557:4;13553:22;13538:13;13534:42;13528:4;13521:56;13669:13;13661:6;13654:29;13828:1;13823:2;13805:16;13801:25;13797:33;13782:285;13905:18;;;13899:25;13876:21;;;13869:56;13960:9;;14018:22;13782:285;14018:22;-1:-1:-1;14223:23:0;;;14200:21;;;14193:54;14204:13;-1:-1:-1;14390:5:0;;13228:1190;14518:11;14512:4;14508:22;14496:10;14492:39;14486:4;14479:53;14688:11;14681:5;14677:23;14673:1;14661:10;14657:18;14650:51;;12740:2007;-1:-1:-1;;14991:11:0;;14858:33;;;;15004:2;14987:20;14983:28;;14968:235;15071:12;;;15065:19;15049:14;;;15042:43;15112:9;;15162:22;14968:235;15162:22;-1:-1:-1;15328:1:0;15279:47;;;15299:4;15279:47;15272:58;15397:39;;;-1:-1:-1;;11568:3883:0;-1:-1:-1;15479:6:0;11360:4133;;;;;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:250::-;284:1;294:113;308:6;305:1;302:13;294:113;;;384:11;;;378:18;365:11;;;358:39;330:2;323:10;294:113;;;-1:-1:-1;;441:1:1;423:16;;416:27;199:250::o;454:396::-;603:2;592:9;585:21;566:4;635:6;629:13;678:6;673:2;662:9;658:18;651:34;694:79;766:6;761:2;750:9;746:18;741:2;733:6;729:15;694:79;:::i;:::-;834:2;813:15;-1:-1:-1;;809:29:1;794:45;;;;841:2;790:54;;454:396;-1:-1:-1;;454:396:1:o;855:127::-;916:10;911:3;907:20;904:1;897:31;947:4;944:1;937:15;971:4;968:1;961:15;987:719;1030:5;1083:3;1076:4;1068:6;1064:17;1060:27;1050:55;;1101:1;1098;1091:12;1050:55;1137:6;1124:20;1163:18;1200:2;1196;1193:10;1190:36;;;1206:18;;:::i;:::-;1281:2;1275:9;1249:2;1335:13;;-1:-1:-1;;1331:22:1;;;1355:2;1327:31;1323:40;1311:53;;;1379:18;;;1399:22;;;1376:46;1373:72;;;1425:18;;:::i;:::-;1465:10;1461:2;1454:22;1500:2;1492:6;1485:18;1546:3;1539:4;1534:2;1526:6;1522:15;1518:26;1515:35;1512:55;;;1563:1;1560;1553:12;1512:55;1627:2;1620:4;1612:6;1608:17;1601:4;1593:6;1589:17;1576:54;1674:1;1667:4;1662:2;1654:6;1650:15;1646:26;1639:37;1694:6;1685:15;;;;;;987:719;;;;:::o;1711:156::-;1777:20;;1837:4;1826:16;;1816:27;;1806:55;;1857:1;1854;1847:12;1806:55;1711:156;;;:::o;1872:1044::-;2003:6;2011;2019;2027;2035;2043;2096:3;2084:9;2075:7;2071:23;2067:33;2064:53;;;2113:1;2110;2103:12;2064:53;2149:9;2136:23;2126:33;;2210:2;2199:9;2195:18;2182:32;2233:18;2274:2;2266:6;2263:14;2260:34;;;2290:1;2287;2280:12;2260:34;2313:50;2355:7;2346:6;2335:9;2331:22;2313:50;:::i;:::-;2303:60;;2416:2;2405:9;2401:18;2388:32;2372:48;;2445:2;2435:8;2432:16;2429:36;;;2461:1;2458;2451:12;2429:36;2484:52;2528:7;2517:8;2506:9;2502:24;2484:52;:::i;:::-;2474:62;;2589:2;2578:9;2574:18;2561:32;2545:48;;2618:2;2608:8;2605:16;2602:36;;;2634:1;2631;2624:12;2602:36;;2657:52;2701:7;2690:8;2679:9;2675:24;2657:52;:::i;:::-;2647:62;;;2759:3;2748:9;2744:19;2731:33;2804:6;2797:5;2793:18;2786:5;2783:29;2773:57;;2826:1;2823;2816:12;2773:57;2849:5;-1:-1:-1;2873:37:1;2905:3;2890:19;;2873:37;:::i;:::-;2863:47;;1872:1044;;;;;;;;:::o;3329:127::-;3390:10;3385:3;3381:20;3378:1;3371:31;3421:4;3418:1;3411:15;3445:4;3442:1;3435:15;3461:112;3493:1;3519;3509:35;;3524:18;;:::i;:::-;-1:-1:-1;3558:9:1;;3461:112::o;3578:127::-;3639:10;3634:3;3630:20;3627:1;3620:31;3670:4;3667:1;3660:15;3694:4;3691:1;3684:15;3710:125;3775:9;;;3796:10;;;3793:36;;;3809:18;;:::i;3840:127::-;3901:10;3896:3;3892:20;3889:1;3882:31;3932:4;3929:1;3922:15;3956:4;3953:1;3946:15;3972:120;4012:1;4038;4028:35;;4043:18;;:::i;:::-;-1:-1:-1;4077:9:1;;3972:120::o;4097:128::-;4164:9;;;4185:11;;;4182:37;;;4199:18;;:::i;4230:175::-;4267:3;4311:4;4304:5;4300:16;4340:4;4331:7;4328:17;4325:43;;4348:18;;:::i;:::-;4397:1;4384:15;;4230:175;-1:-1:-1;;4230:175:1:o;4638:429::-;-1:-1:-1;;;4893:3:1;4886:16;4868:3;4931:6;4925:13;4947:74;5014:6;5010:1;5005:3;5001:11;4994:4;4986:6;4982:17;4947:74;:::i;:::-;5041:16;;;;5059:1;5037:24;;4638:429;-1:-1:-1;;4638:429:1:o;5072:422::-;5229:3;5267:6;5261:13;5283:66;5342:6;5337:3;5330:4;5322:6;5318:17;5283:66;:::i;:::-;-1:-1:-1;;;;;;5410:47:1;;;;5371:16;;;;5396:62;;;5485:2;5474:14;;5072:422;-1:-1:-1;;5072:422:1:o;5499:151::-;5589:4;5582:12;;;5568;;;5564:31;;5607:14;;5604:40;;;5624:18;;:::i;5655:225::-;5759:4;5738:12;;;5752;;;5734:31;5785:22;;;;5826:24;;;5816:58;;5854:18;;:::i;:::-;5816:58;5655:225;;;;:::o;5885:168::-;5958:9;;;5989;;6006:15;;;6000:22;;5986:37;5976:71;;6027:18;;:::i;6058:135::-;6097:3;6118:17;;;6115:43;;6138:18;;:::i;:::-;-1:-1:-1;6185:1:1;6174:13;;6058:135::o;6198:534::-;6383:3;6421:6;6415:13;6437:66;6496:6;6491:3;6484:4;6476:6;6472:17;6437:66;:::i;:::-;-1:-1:-1;;;;;;6564:47:1;;;;6525:16;;;;6550:62;;;-1:-1:-1;;6644:51:1;;;;6639:2;6628:14;;6621:75;6723:2;6712:14;;6198:534;-1:-1:-1;;6198:534:1:o;7083:171::-;7151:6;7190:10;;;7178;;;7174:27;;7213:12;;;7210:38;;;7228:18;;:::i

Swarm Source

ipfs://cd943455c4012394483f0cd29b818aa1538c03ce6e4e79bdce50bdb1bfa78343

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.