Scroll Sepolia Testnet

Contract

0x3b41d0A5E90d46c26361885D4562D6aB71E67380

Overview

ETH Balance

Scroll Sepolia LogoScroll Sepolia LogoScroll Sepolia Logo0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To

There are no matching entries

> 10 Internal Transactions found.

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
84840892025-03-13 7:00:3035 days ago1741849230
0x3b41d0A5...B71E67380
0 ETH
84840892025-03-13 7:00:3035 days ago1741849230
0x3b41d0A5...B71E67380
0 ETH
84840892025-03-13 7:00:3035 days ago1741849230
0x3b41d0A5...B71E67380
0 ETH
84840892025-03-13 7:00:3035 days ago1741849230
0x3b41d0A5...B71E67380
0 ETH
84840892025-03-13 7:00:3035 days ago1741849230
0x3b41d0A5...B71E67380
0 ETH
84840892025-03-13 7:00:3035 days ago1741849230
0x3b41d0A5...B71E67380
0 ETH
84840872025-03-13 7:00:1235 days ago1741849212
0x3b41d0A5...B71E67380
0 ETH
84840872025-03-13 7:00:1235 days ago1741849212
0x3b41d0A5...B71E67380
0 ETH
84840872025-03-13 7:00:1235 days ago1741849212
0x3b41d0A5...B71E67380
0 ETH
84840772025-03-13 6:59:2035 days ago1741849160
0x3b41d0A5...B71E67380
0 ETH
84840772025-03-13 6:59:2035 days ago1741849160
0x3b41d0A5...B71E67380
0 ETH
84840772025-03-13 6:59:2035 days ago1741849160
0x3b41d0A5...B71E67380
0 ETH
84840772025-03-13 6:59:2035 days ago1741849160
0x3b41d0A5...B71E67380
0 ETH
84840772025-03-13 6:59:2035 days ago1741849160
0x3b41d0A5...B71E67380
0 ETH
84840772025-03-13 6:59:2035 days ago1741849160
0x3b41d0A5...B71E67380
0 ETH
84840772025-03-13 6:59:2035 days ago1741849160
0x3b41d0A5...B71E67380
0 ETH
84840742025-03-13 6:58:5035 days ago1741849130
0x3b41d0A5...B71E67380
0 ETH
84840742025-03-13 6:58:5035 days ago1741849130
0x3b41d0A5...B71E67380
0 ETH
84840742025-03-13 6:58:5035 days ago1741849130
0x3b41d0A5...B71E67380
0 ETH
84840672025-03-13 6:57:5035 days ago1741849070
0x3b41d0A5...B71E67380
0 ETH
84840672025-03-13 6:57:5035 days ago1741849070
0x3b41d0A5...B71E67380
0 ETH
84840672025-03-13 6:57:5035 days ago1741849070
0x3b41d0A5...B71E67380
0 ETH
84840672025-03-13 6:57:5035 days ago1741849070
0x3b41d0A5...B71E67380
0 ETH
84840672025-03-13 6:57:5035 days ago1741849070
0x3b41d0A5...B71E67380
0 ETH
84840672025-03-13 6:57:5035 days ago1741849070
0x3b41d0A5...B71E67380
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DrandBeacon

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : DrandBeacon.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

import {BLS} from "@kevincharm/bls-bn254/contracts/BLS.sol";
import {SSTORE2} from "solady/src/utils/SSTORE2.sol";
import {IDrandBeacon} from "../interfaces/IDrandBeacon.sol";

/// @title DrandBeacon
/// @author Kevin Charm <[email protected]>
/// @notice Contract containing immutable information about a drand beacon.
contract DrandBeacon is IDrandBeacon {
    /// @notice Domain separation tag
    bytes public constant DST =
        bytes("BLS_SIG_BN254G1_XMD:KECCAK-256_SVDW_RO_NUL_");

    /**
     * ---------------------+-------+
     * var                  |  size |
     * ---------------------+-------+
     * publicKey            |   128 |
     * genesisTimestamp     |    32 |
     * period               |    32 |
     * ---------------------+-------+
     */
    uint256 private constant PTR_PUBLIC_KEY = 0;
    uint256 private constant LEN_PUBLIC_KEY = 128;
    uint256 private constant PTR_GENESIS_TIMESTAMP = 128;
    uint256 private constant LEN_GENESIS_TIMESTAMP = 32;
    uint256 private constant PTR_PERIOD = 160;
    uint256 private constant LEN_PERIOD = 32;

    /// @notice Pointer to immutable data
    address public immutable data;

    error InvalidPublicKey(uint256[4] pubKey);
    error InvalidBeaconConfiguration(uint256 genesisTimestamp, uint256 period);
    error InvalidSignature(
        uint256[4] pubKey,
        uint256[2] message,
        uint256[2] signature
    );

    constructor(
        uint256[4] memory publicKey_,
        uint256 genesisTimestamp_,
        uint256 period_
    ) {
        if (!BLS.isValidPublicKey(publicKey_)) {
            revert InvalidPublicKey(publicKey_);
        }
        bytes memory pubKey = abi.encodePacked(
            publicKey_[0],
            publicKey_[1],
            publicKey_[2],
            publicKey_[3]
        );

        if (genesisTimestamp_ == 0 || period_ == 0) {
            revert InvalidBeaconConfiguration(genesisTimestamp_, period_);
        }

        data = SSTORE2.write(
            abi.encodePacked(pubKey, genesisTimestamp_, period_)
        );

        // Sanity checks
        assert(keccak256(publicKey()) == keccak256(pubKey));
        assert(genesisTimestamp() == genesisTimestamp_);
        assert(period() == period_);
    }

    /// @notice Get the public key of the beacon
    function publicKey() public view returns (bytes memory) {
        return
            SSTORE2.read(data, PTR_PUBLIC_KEY, PTR_PUBLIC_KEY + LEN_PUBLIC_KEY);
    }

    /// @notice Get the public key hash of the beacon
    function publicKeyHash() public view returns (bytes32) {
        return keccak256(publicKey());
    }

    /// @notice Get the genesis timestamp of the beacon
    function genesisTimestamp() public view returns (uint256) {
        return
            abi.decode(
                SSTORE2.read(
                    data,
                    PTR_GENESIS_TIMESTAMP,
                    PTR_GENESIS_TIMESTAMP + LEN_GENESIS_TIMESTAMP
                ),
                (uint256)
            );
    }

    /// @notice Get the period of the beacon
    function period() public view returns (uint256) {
        return
            abi.decode(
                SSTORE2.read(data, PTR_PERIOD, PTR_PERIOD + LEN_PERIOD),
                (uint256)
            );
    }

    /// @notice Deserialise the public key from raw bytes for ecpairing
    function _deserialisePublicKey() private view returns (uint256[4] memory) {
        (
            uint256 pubKey0,
            uint256 pubKey1,
            uint256 pubKey2,
            uint256 pubKey3
        ) = abi.decode(publicKey(), (uint256, uint256, uint256, uint256));
        return [pubKey0, pubKey1, pubKey2, pubKey3];
    }

    /// @notice Verify the signature produced by a drand beacon round against
    ///     the known public key. Reverts if the signature is invalid.
    /// @param round The beacon round to verify
    /// @param signature The signature to verify
    function verifyBeaconRound(
        uint256 round,
        uint256[2] memory signature
    ) external view {
        // Encode round for hash-to-point
        bytes memory hashedRoundBytes = new bytes(32);
        assembly {
            mstore(0x00, round)
            let hashedRound := keccak256(0x18, 0x08) // hash the last 8 bytes (uint64) of `round`
            mstore(add(0x20, hashedRoundBytes), hashedRound)
        }

        uint256[4] memory pubKey = _deserialisePublicKey();
        uint256[2] memory message = BLS.hashToPoint(DST, hashedRoundBytes);
        bool isValidSignature = BLS.isValidSignature(signature);
        if (!isValidSignature) {
            revert InvalidSignature(pubKey, message, signature);
        }

        (bool pairingSuccess, bool callSuccess) = BLS.verifySingle(
            signature,
            pubKey,
            message
        );
        // From EIP-197: If the length of the input is incorrect or any of the
        // inputs are not elements of the respective group or are not encoded
        // correctly, the call fails.
        // Ergo, this must never revert. Otherwise we have a bug.
        assert(callSuccess);
        if (!pairingSuccess) {
            revert InvalidSignature(pubKey, message, signature);
        }
    }
}

File 2 of 5 : BLS.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;

import {ModexpInverse, ModexpSqrt} from "./ModExp.sol";

/// @title  Boneh–Lynn–Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)
/// @notice We use BLS signature aggregation to reduce the size of signature data to store on chain.
/// @dev We use G1 points for signatures and messages, and G2 points for public keys
/// @dev Adapted from https://github.com/thehubbleproject/hubble-contracts
library BLS {
    // Field order
    // prettier-ignore
    uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;

    // Negated generator of G2
    // prettier-ignore
    uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
    // prettier-ignore
    uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
    // prettier-ignore
    uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;
    // prettier-ignore
    uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;

    // prettier-ignore
    uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000;
    // prettier-ignore
    uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff;

    /// @notice Param A of BN254
    uint256 private constant A = 0;
    /// @notice Param B of BN254
    uint256 private constant B = 3;
    /// @notice Param Z for SVDW over E
    uint256 private constant Z = 1;
    /// @notice g(Z) where g(x) = x^3 + 3
    uint256 private constant C1 = 0x4;
    /// @notice -Z / 2 (mod N)
    uint256 private constant C2 =
        0x183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3;
    /// @notice C3 = sqrt(-g(Z) * (3 * Z^2 + 4 * A)) (mod N)
    ///     and sgn0(C3) == 0
    uint256 private constant C3 =
        0x16789af3a83522eb353c98fc6b36d713d5d8d1cc5dffffffa;
    /// @notice 4 * -g(Z) / (3 * Z^2 + 4 * A) (mod N)
    uint256 private constant C4 =
        0x10216f7ba065e00de81ac1e7808072c9dd2b2385cd7b438469602eb24829a9bd;
    /// @notice (N - 1) / 2
    uint256 private constant C5 =
        0x183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3;

    error BNAddFailed(uint256[4] input);
    error InvalidFieldElement(uint256 x);
    error MapToPointFailed(uint256 noSqrt);
    error InvalidDSTLength(bytes dst);
    error ModExpFailed(uint256 base, uint256 exponent, uint256 modulus);

    function verifySingle(
        uint256[2] memory signature,
        uint256[4] memory pubkey,
        uint256[2] memory message
    ) internal view returns (bool pairingSuccess, bool callSuccess) {
        uint256[12] memory input = [
            signature[0],
            signature[1],
            N_G2_X1,
            N_G2_X0,
            N_G2_Y1,
            N_G2_Y0,
            message[0],
            message[1],
            pubkey[1],
            pubkey[0],
            pubkey[3],
            pubkey[2]
        ];
        uint256[1] memory out;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            callSuccess := staticcall(
                sub(gas(), 2000),
                8,
                input,
                384,
                out,
                0x20
            )
        }
        return (out[0] != 0, callSuccess);
    }

    /// @notice Hash to BN254 G1
    /// @param domain Domain separation tag
    /// @param message Message to hash
    /// @return Point in G1
    function hashToPoint(
        bytes memory domain,
        bytes memory message
    ) internal view returns (uint256[2] memory) {
        uint256[2] memory u = hashToField(domain, message);
        uint256[2] memory p0 = mapToPoint(u[0]);
        uint256[2] memory p1 = mapToPoint(u[1]);
        uint256[4] memory bnAddInput;
        bnAddInput[0] = p0[0];
        bnAddInput[1] = p0[1];
        bnAddInput[2] = p1[0];
        bnAddInput[3] = p1[1];
        bool success;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            success := staticcall(sub(gas(), 2000), 6, bnAddInput, 128, p0, 64)
        }
        if (!success) revert BNAddFailed(bnAddInput);
        return p0;
    }

    /// @notice Check if `signature` is a valid signature
    /// @param signature Signature to check
    function isValidSignature(
        uint256[2] memory signature
    ) internal pure returns (bool) {
        if ((signature[0] >= N) || (signature[1] >= N)) {
            return false;
        } else {
            return isOnCurveG1(signature);
        }
    }

    /// @notice Check if `publicKey` is a valid public key
    /// @param publicKey PK to check
    function isValidPublicKey(
        uint256[4] memory publicKey
    ) internal pure returns (bool) {
        if (
            (publicKey[0] >= N) ||
            (publicKey[1] >= N) ||
            (publicKey[2] >= N || (publicKey[3] >= N))
        ) {
            return false;
        } else {
            return isOnCurveG2(publicKey);
        }
    }

    /// @notice Check if `point` is in G1
    /// @param point Point to check
    function isOnCurveG1(
        uint256[2] memory point
    ) internal pure returns (bool _isOnCurve) {
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let t0 := mload(point)
            let t1 := mload(add(point, 32))
            let t2 := mulmod(t0, t0, N)
            t2 := mulmod(t2, t0, N)
            t2 := addmod(t2, 3, N)
            t1 := mulmod(t1, t1, N)
            _isOnCurve := eq(t1, t2)
        }
    }

    /// @notice Check if `point` is in G2
    /// @param point Point to check
    function isOnCurveG2(
        uint256[4] memory point
    ) internal pure returns (bool _isOnCurve) {
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            // x0, x1
            let t0 := mload(point)
            let t1 := mload(add(point, 32))
            // x0 ^ 2
            let t2 := mulmod(t0, t0, N)
            // x1 ^ 2
            let t3 := mulmod(t1, t1, N)
            // 3 * x0 ^ 2
            let t4 := add(add(t2, t2), t2)
            // 3 * x1 ^ 2
            let t5 := addmod(add(t3, t3), t3, N)
            // x0 * (x0 ^ 2 - 3 * x1 ^ 2)
            t2 := mulmod(add(t2, sub(N, t5)), t0, N)
            // x1 * (3 * x0 ^ 2 - x1 ^ 2)
            t3 := mulmod(add(t4, sub(N, t3)), t1, N)

            // x ^ 3 + b
            t0 := addmod(
                t2,
                0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5,
                N
            )
            t1 := addmod(
                t3,
                0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2,
                N
            )

            // y0, y1
            t2 := mload(add(point, 64))
            t3 := mload(add(point, 96))
            // y ^ 2
            t4 := mulmod(addmod(t2, t3, N), addmod(t2, sub(N, t3), N), N)
            t3 := mulmod(shl(1, t2), t3, N)

            // y ^ 2 == x ^ 3 + b
            _isOnCurve := and(eq(t0, t4), eq(t1, t3))
        }
    }

    /// @notice sqrt(xx) mod N
    /// @param xx Input
    function sqrt(uint256 xx) internal pure returns (uint256 x, bool hasRoot) {
        x = ModexpSqrt.run(xx);
        hasRoot = mulmod(x, x, N) == xx;
    }

    /// @notice a^{-1} mod N
    /// @param a Input
    function inverse(uint256 a) internal pure returns (uint256) {
        return ModexpInverse.run(a);
    }

    /// @notice Hash a message to the field
    /// @param domain Domain separation tag
    /// @param message Message to hash
    function hashToField(
        bytes memory domain,
        bytes memory message
    ) internal pure returns (uint256[2] memory) {
        bytes memory _msg = expandMsgTo96(domain, message);
        uint256 u0;
        uint256 u1;
        uint256 a0;
        uint256 a1;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let p := add(_msg, 24)
            u1 := and(mload(p), MASK24)
            p := add(_msg, 48)
            u0 := and(mload(p), MASK24)
            a0 := addmod(mulmod(u1, T24, N), u0, N)
            p := add(_msg, 72)
            u1 := and(mload(p), MASK24)
            p := add(_msg, 96)
            u0 := and(mload(p), MASK24)
            a1 := addmod(mulmod(u1, T24, N), u0, N)
        }
        return [a0, a1];
    }

    /// @notice Expand arbitrary message to 96 pseudorandom bytes, as described
    ///     in rfc9380 section 5.3.1, using H = keccak256.
    /// @param DST Domain separation tag
    /// @param message Message to expand
    function expandMsgTo96(
        bytes memory DST,
        bytes memory message
    ) internal pure returns (bytes memory) {
        uint256 domainLen = DST.length;
        if (domainLen > 255) {
            revert InvalidDSTLength(DST);
        }
        bytes memory zpad = new bytes(136);
        bytes memory b_0 = abi.encodePacked(
            zpad,
            message,
            uint8(0),
            uint8(96),
            uint8(0),
            DST,
            uint8(domainLen)
        );
        bytes32 b0 = keccak256(b_0);

        bytes memory b_i = abi.encodePacked(
            b0,
            uint8(1),
            DST,
            uint8(domainLen)
        );
        bytes32 bi = keccak256(b_i);

        bytes memory out = new bytes(96);
        uint256 ell = 3;
        for (uint256 i = 1; i < ell; i++) {
            b_i = abi.encodePacked(
                b0 ^ bi,
                uint8(1 + i),
                DST,
                uint8(domainLen)
            );
            assembly {
                let p := add(32, out)
                p := add(p, mul(32, sub(i, 1)))
                mstore(p, bi)
            }
            bi = keccak256(b_i);
        }
        assembly {
            let p := add(32, out)
            p := add(p, mul(32, sub(ell, 1)))
            mstore(p, bi)
        }
        return out;
    }

    /// @notice Map field element to E using SvdW
    /// @param u Field element to map
    /// @return p Point on curve
    function mapToPoint(uint256 u) internal view returns (uint256[2] memory p) {
        if (u >= N) revert InvalidFieldElement(u);

        uint256 tv1 = mulmod(mulmod(u, u, N), C1, N);
        uint256 tv2 = addmod(1, tv1, N);
        tv1 = addmod(1, N - tv1, N);
        uint256 tv3 = inverse(mulmod(tv1, tv2, N));
        uint256 tv5 = mulmod(mulmod(mulmod(u, tv1, N), tv3, N), C3, N);
        uint256 x1 = addmod(C2, N - tv5, N);
        uint256 x2 = addmod(C2, tv5, N);
        uint256 tv7 = mulmod(tv2, tv2, N);
        uint256 tv8 = mulmod(tv7, tv3, N);
        uint256 x3 = addmod(Z, mulmod(C4, mulmod(tv8, tv8, N), N), N);

        bool hasRoot;
        uint256 gx;
        if (legendre(g(x1)) == 1) {
            p[0] = x1;
            gx = g(x1);
            (p[1], hasRoot) = sqrt(gx);
            if (!hasRoot) revert MapToPointFailed(gx);
        } else if (legendre(g(x2)) == 1) {
            p[0] = x2;
            gx = g(x2);
            (p[1], hasRoot) = sqrt(gx);
            if (!hasRoot) revert MapToPointFailed(gx);
        } else {
            p[0] = x3;
            gx = g(x3);
            (p[1], hasRoot) = sqrt(gx);
            if (!hasRoot) revert MapToPointFailed(gx);
        }
        if (sgn0(u) != sgn0(p[1])) {
            p[1] = N - p[1];
        }
    }

    /// @notice g(x) = y^2 = x^3 + 3
    function g(uint256 x) private pure returns (uint256) {
        return addmod(mulmod(mulmod(x, x, N), x, N), B, N);
    }

    /// @notice https://datatracker.ietf.org/doc/html/rfc9380#name-the-sgn0-function
    function sgn0(uint256 x) private pure returns (uint256) {
        return x % 2;
    }

    /// @notice Compute Legendre symbol of u
    /// @param u Field element
    /// @return 1 if u is a quadratic residue, -1 if not, or 0 if u = 0 (mod p)
    function legendre(uint256 u) private view returns (int8) {
        uint256 x = modexpLegendre(u);
        if (x == N - 1) {
            return -1;
        }
        if (x != 0 && x != 1) {
            revert MapToPointFailed(u);
        }
        return int8(int256(x));
    }

    /// @notice This is cheaper than an addchain for exponent (N-1)/2
    function modexpLegendre(uint256 u) private view returns (uint256 output) {
        bytes memory input = new bytes(192);
        bool success;
        assembly {
            let p := add(input, 32)
            mstore(p, 32) // len(u)
            p := add(p, 32)
            mstore(p, 32) // len(exp)
            p := add(p, 32)
            mstore(p, 32) // len(mod)
            p := add(p, 32)
            mstore(p, u) // u
            p := add(p, 32)
            mstore(p, C5) // (N-1)/2
            p := add(p, 32)
            mstore(p, N) // N

            success := staticcall(
                gas(),
                5,
                add(input, 32),
                192,
                0x00, // scratch space <- result
                32
            )
            output := mload(0x00) // output <- result
        }
        if (!success) {
            revert ModExpFailed(u, C5, N);
        }
    }
}

File 3 of 5 : ModExp.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;

/**
    @title Compute Inverse by Modular Exponentiation
    @notice Compute $input^(N - 2) mod N$ using Addition Chain method.
    Where     N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47
    and   N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45
    @dev the function body is generated with the modified addchain script
    see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f
 */
library ModexpInverse {
    function run(uint256 t2) internal pure returns (uint256 t0) {
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let
                n
            := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47
            t0 := mulmod(t2, t2, n)
            let t5 := mulmod(t0, t2, n)
            let t1 := mulmod(t5, t0, n)
            let t3 := mulmod(t5, t5, n)
            let t8 := mulmod(t1, t0, n)
            let t4 := mulmod(t3, t5, n)
            let t6 := mulmod(t3, t1, n)
            t0 := mulmod(t3, t3, n)
            let t7 := mulmod(t8, t3, n)
            t3 := mulmod(t4, t3, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t7, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t7, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t7, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t3, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t3, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t3, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
        }
    }
}

/**
    @title Compute Square Root by Modular Exponentiation
    @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.
    Where           N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47
    and   (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52
 */
library ModexpSqrt {
    function run(uint256 t6) internal pure returns (uint256 t0) {
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let
                n
            := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47

            t0 := mulmod(t6, t6, n)
            let t4 := mulmod(t0, t6, n)
            let t2 := mulmod(t4, t0, n)
            let t3 := mulmod(t4, t4, n)
            let t8 := mulmod(t2, t0, n)
            let t1 := mulmod(t3, t4, n)
            let t5 := mulmod(t3, t2, n)
            t0 := mulmod(t3, t3, n)
            let t7 := mulmod(t8, t3, n)
            t3 := mulmod(t1, t3, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t7, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t7, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t8, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t7, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t3, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t6, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t5, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t4, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t3, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t3, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t2, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t0, n)
            t0 := mulmod(t0, t1, n)
            t0 := mulmod(t0, t0, n)
        }
    }
}

File 4 of 5 : IDrandBeacon.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;

/// @title IDrandBeacon
/// @author Kevin Charm ([email protected])
/// @notice Contract containing immutable information about a drand beacon.
interface IDrandBeacon {
    /// @notice Get the public key of the beacon
    function publicKey() external view returns (bytes memory);

    /// @notice Get the public key hash of the beacon
    function publicKeyHash() external view returns (bytes32);

    /// @notice Get the genesis timestamp of the beacon
    function genesisTimestamp() external view returns (uint256);

    /// @notice Get the period of the beacon
    function period() external view returns (uint256);

    /// @notice Verify the signature produced by a drand beacon round against
    ///     the known public key. Should revert if the signature is invalid.
    /// @param round The beacon round to verify
    /// @param signature The signature to verify
    function verifyBeaconRound(
        uint256 round,
        uint256[2] memory signature
    ) external;
}

File 5 of 5 : SSTORE2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Read and write to persistent storage at a fraction of the cost.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SSTORE2.sol)
/// @author Saw-mon-and-Natalie (https://github.com/Saw-mon-and-Natalie)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol)
/// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol)
/// @author Modified from SSTORE3 (https://github.com/Philogy/sstore3)
library SSTORE2 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The proxy initialization code.
    uint256 private constant _CREATE3_PROXY_INITCODE = 0x67363d3d37363d34f03d5260086018f3;

    /// @dev Hash of the `_CREATE3_PROXY_INITCODE`.
    /// Equivalent to `keccak256(abi.encodePacked(hex"67363d3d37363d34f03d5260086018f3"))`.
    bytes32 internal constant CREATE3_PROXY_INITCODE_HASH =
        0x21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                        CUSTOM ERRORS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Unable to deploy the storage contract.
    error DeploymentFailed();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         WRITE LOGIC                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Writes `data` into the bytecode of a storage contract and returns its address.
    function write(bytes memory data) internal returns (address pointer) {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data) // Let `l` be `n + 1`. +1 as we prefix a STOP opcode.
            /**
             * ---------------------------------------------------+
             * Opcode | Mnemonic       | Stack     | Memory       |
             * ---------------------------------------------------|
             * 61 l   | PUSH2 l        | l         |              |
             * 80     | DUP1           | l l       |              |
             * 60 0xa | PUSH1 0xa      | 0xa l l   |              |
             * 3D     | RETURNDATASIZE | 0 0xa l l |              |
             * 39     | CODECOPY       | l         | [0..l): code |
             * 3D     | RETURNDATASIZE | 0 l       | [0..l): code |
             * F3     | RETURN         |           | [0..l): code |
             * 00     | STOP           |           |              |
             * ---------------------------------------------------+
             * @dev Prefix the bytecode with a STOP opcode to ensure it cannot be called.
             * Also PUSH2 is used since max contract size cap is 24,576 bytes which is less than 2 ** 16.
             */
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            // Deploy a new contract with the generated creation code.
            pointer := create(0, add(data, 0x15), add(n, 0xb))
            if iszero(pointer) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Writes `data` into the bytecode of a storage contract with `salt`
    /// and returns its normal CREATE2 deterministic address.
    function writeCounterfactual(bytes memory data, bytes32 salt)
        internal
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            // Deploy a new contract with the generated creation code.
            pointer := create2(0, add(data, 0x15), add(n, 0xb), salt)
            if iszero(pointer) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Writes `data` into the bytecode of a storage contract and returns its address.
    /// This uses the so-called "CREATE3" workflow,
    /// which means that `pointer` is agnostic to `data, and only depends on `salt`.
    function writeDeterministic(bytes memory data, bytes32 salt)
        internal
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            mstore(0x00, _CREATE3_PROXY_INITCODE) // Store the `_PROXY_INITCODE`.
            let proxy := create2(0, 0x10, 0x10, salt)
            if iszero(proxy) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x14, proxy) // Store the proxy's address.
            // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
            // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
            mstore(0x00, 0xd694)
            mstore8(0x34, 0x01) // Nonce of the proxy contract (1).
            pointer := keccak256(0x1e, 0x17)

            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            if iszero(
                mul( // The arguments of `mul` are evaluated last to first.
                    extcodesize(pointer),
                    call(gas(), proxy, 0, add(data, 0x15), add(n, 0xb), codesize(), 0x00)
                )
            ) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                    ADDRESS CALCULATIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the initialization code hash of the storage contract for `data`.
    /// Used for mining vanity addresses with create2crunch.
    function initCodeHash(bytes memory data) internal pure returns (bytes32 hash) {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            returndatacopy(returndatasize(), returndatasize(), gt(n, 0xfffe))
            mstore(data, add(0x61000180600a3d393df300, shl(0x40, n)))
            hash := keccak256(add(data, 0x15), add(n, 0xb))
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Equivalent to `predictCounterfactualAddress(data, salt, address(this))`
    function predictCounterfactualAddress(bytes memory data, bytes32 salt)
        internal
        view
        returns (address pointer)
    {
        pointer = predictCounterfactualAddress(data, salt, address(this));
    }

    /// @dev Returns the CREATE2 address of the storage contract for `data`
    /// deployed with `salt` by `deployer`.
    /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.
    function predictCounterfactualAddress(bytes memory data, bytes32 salt, address deployer)
        internal
        pure
        returns (address predicted)
    {
        bytes32 hash = initCodeHash(data);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and store the bytecode hash.
            mstore8(0x00, 0xff) // Write the prefix.
            mstore(0x35, hash)
            mstore(0x01, shl(96, deployer))
            mstore(0x15, salt)
            predicted := keccak256(0x00, 0x55)
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x35, 0)
        }
    }

    /// @dev Equivalent to `predictDeterministicAddress(salt, address(this))`.
    function predictDeterministicAddress(bytes32 salt) internal view returns (address pointer) {
        pointer = predictDeterministicAddress(salt, address(this));
    }

    /// @dev Returns the "CREATE3" deterministic address for `salt` with `deployer`.
    function predictDeterministicAddress(bytes32 salt, address deployer)
        internal
        pure
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, deployer) // Store `deployer`.
            mstore8(0x0b, 0xff) // Store the prefix.
            mstore(0x20, salt) // Store the salt.
            mstore(0x40, CREATE3_PROXY_INITCODE_HASH) // Store the bytecode hash.

            mstore(0x14, keccak256(0x0b, 0x55)) // Store the proxy's address.
            mstore(0x40, m) // Restore the free memory pointer.
            // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
            // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
            mstore(0x00, 0xd694)
            mstore8(0x34, 0x01) // Nonce of the proxy contract (1).
            pointer := keccak256(0x1e, 0x17)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         READ LOGIC                         */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Equivalent to `read(pointer, 0, 2 ** 256 - 1)`.
    function read(address pointer) internal view returns (bytes memory data) {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            let n := and(sub(extcodesize(pointer), 0x01), 0xffffffffff)
            extcodecopy(pointer, add(data, 0x1f), 0x00, add(n, 0x21))
            mstore(data, n) // Store the length.
            mstore(0x40, add(n, add(data, 0x40))) // Allocate memory.
        }
    }

    /// @dev Equivalent to `read(pointer, start, 2 ** 256 - 1)`.
    function read(address pointer, uint256 start) internal view returns (bytes memory data) {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            let n := and(sub(extcodesize(pointer), 0x01), 0xffffffffff)
            extcodecopy(pointer, add(data, 0x1f), start, add(n, 0x21))
            mstore(data, mul(sub(n, start), lt(start, n))) // Store the length.
            mstore(0x40, add(data, add(0x40, mload(data)))) // Allocate memory.
        }
    }

    /// @dev Returns a slice of the data on `pointer` from `start` to `end`.
    /// `start` and `end` will be clamped to the range `[0, args.length]`.
    /// The `pointer` MUST be deployed via the SSTORE2 write functions.
    /// Otherwise, the behavior is undefined.
    /// Out-of-gas reverts if `pointer` does not have any code.
    function read(address pointer, uint256 start, uint256 end)
        internal
        view
        returns (bytes memory data)
    {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            if iszero(lt(end, 0xffff)) { end := 0xffff }
            let d := mul(sub(end, start), lt(start, end))
            extcodecopy(pointer, add(data, 0x1f), start, add(d, 0x01))
            if iszero(and(0xff, mload(add(data, d)))) {
                let n := sub(extcodesize(pointer), 0x01)
                returndatacopy(returndatasize(), returndatasize(), shr(64, n))
                d := mul(gt(n, start), sub(d, mul(gt(end, n), sub(end, n))))
            }
            mstore(data, d) // Store the length.
            mstore(add(add(data, 0x20), d), 0) // Zeroize the slot after the bytes.
            mstore(0x40, add(add(data, 0x40), d)) // Allocate memory.
        }
    }
}

Settings
{
  "viaIR": false,
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract ABI

API
[{"inputs":[{"internalType":"uint256[4]","name":"publicKey_","type":"uint256[4]"},{"internalType":"uint256","name":"genesisTimestamp_","type":"uint256"},{"internalType":"uint256","name":"period_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[4]","name":"input","type":"uint256[4]"}],"name":"BNAddFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"genesisTimestamp","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"InvalidBeaconConfiguration","type":"error"},{"inputs":[{"internalType":"bytes","name":"dst","type":"bytes"}],"name":"InvalidDSTLength","type":"error"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"InvalidFieldElement","type":"error"},{"inputs":[{"internalType":"uint256[4]","name":"pubKey","type":"uint256[4]"}],"name":"InvalidPublicKey","type":"error"},{"inputs":[{"internalType":"uint256[4]","name":"pubKey","type":"uint256[4]"},{"internalType":"uint256[2]","name":"message","type":"uint256[2]"},{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"}],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"noSqrt","type":"uint256"}],"name":"MapToPointFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"exponent","type":"uint256"},{"internalType":"uint256","name":"modulus","type":"uint256"}],"name":"ModExpFailed","type":"error"},{"inputs":[],"name":"DST","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"data","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicKey","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicKeyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"round","type":"uint256"},{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"}],"name":"verifyBeaconRound","outputs":[],"stateMutability":"view","type":"function"}]

60a060405234801561001057600080fd5b5060405161271f38038061271f83398101604081905261002f91610483565b6100388361016c565b610060578260405163c7728ee960e01b8152600401610057919061050f565b60405180910390fd5b825160208085015160408087015160608089015183519586019690965291840192909252820152608081019190915260009060a001604051602081830303815290604052905082600014806100b3575081155b156100db57604051634b55885360e11b81526004810184905260248101839052604401610057565b6101088184846040516020016100f393929190610540565b60408051601f198184030181529190526101f4565b6001600160a01b031660805280516020820120610123610238565b805190602001201461013757610137610577565b8261014061025a565b1461014d5761014d610577565b81610156610285565b1461016357610163610577565b505050506105c7565b80516000906000805160206126ff83398151915211158061019f575060208201516000805160206126ff83398151915211155b806101d8575060408201516000805160206126ff8339815191521115806101d8575060608201516000805160206126ff83398151915211155b156101e557506000919050565b6101ee8261029d565b92915050565b600081518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584016000f09150816102325763301164256000526004601cfd5b90915290565b6060610255608051600060806000610250919061058d565b610404565b905090565b6000610272608051608060206080610250919061058d565b80602001905181019061025591906105ae565b600061027260805160a0602060a0610250919061058d565b6000815160208301516000805160206126ff8339815191528283096000805160206126ff83398151915282830981828301016000805160206126ff83398151915282838401086000805160206126ff83398151915286826000805160206126ff833981519152038601099350506000805160206126ff83398151915284836000805160206126ff8339815191520383010991506000805160206126ff8339815191527f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5840894506000805160206126ff8339815191527e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d28308935060408701519250606087015191506000805160206126ff83398151915280836000805160206126ff8339815191520385086000805160206126ff8339815191528486080990506000805160206126ff833981519152828460011b0994149290931491909116949350505050565b60405161ffff82106104165761ffff91505b818310838303026001810184601f8401873c8082015160ff16610450576001853b038060401c3d3d3e808403818511028203858211029150505b808252600081602084010152806040830101604052509392505050565b634e487b7160e01b600052604160045260246000fd5b600080600060c0848603121561049857600080fd5b84601f8501126104a757600080fd5b604051608081016001600160401b03811182821017156104c9576104c961046d565b6040528060808601878111156104de57600080fd5b865b818110156104f85780518352602092830192016104e0565b505160a09690960151919795965090949350505050565b60808101818360005b6004811015610537578151835260209283019290910190600101610518565b50505092915050565b6000845160005b818110156105615760208188018101518583015201610547565b5091909101928352506020820152604001919050565b634e487b7160e01b600052600160045260246000fd5b808201808211156101ee57634e487b7160e01b600052601160045260246000fd5b6000602082840312156105c057600080fd5b5051919050565b6080516121096105f66000396000818160bf01528181610164015281816101a101526102ce01526121096000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806373d4a13a1161005b57806373d4a13a146100ba578063cacf66ab14610106578063e3d4ff161461010e578063ef78d4fd1461012357600080fd5b80635e7e3416146100825780635f7c75221461009d57806363ffab31146100b2575b600080fd5b61008a61012b565b6040519081526020015b60405180910390f35b6100a5610141565b6040516100949190611d5e565b6100a561015d565b6100e17f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610094565b61008a61019a565b61012161011c366004611da7565b6101e0565b005b61008a6102c7565b600061013561015d565b80519060200120905090565b6040518060600160405280602b81526020016120a9602b913981565b60606101957f00000000000000000000000000000000000000000000000000000000000000006000610190608082611e46565b6102fa565b905090565b60006101cd7f00000000000000000000000000000000000000000000000000000000000000006080610190602082611e46565b8060200190518101906101959190611e59565b604080516020808252818301909252600091602082018180368337505050600084815260086018206020830152909150610218610363565b9050600061023e6040518060600160405280602b81526020016120a9602b9139846103b3565b9050600061024b8561046e565b90508061027a57828286604051630b8cf7d360e41b815260040161027193929190611ebe565b60405180910390fd5b6000806102888786866104b7565b915091508061029957610299611eef565b816102bd57848488604051630b8cf7d360e41b815260040161027193929190611ebe565b5050505050505050565b60006101cd7f000000000000000000000000000000000000000000000000000000000000000060a0610190602082611e46565b60405161ffff821061030c5761ffff91505b818310838303026001810184601f8401873c8082015160ff16610346576001853b038060401c3d3d3e808403818511028203858211029150505b808252600081602084010152806040830101604052509392505050565b61036b611ce0565b60008060008061037961015d565b80602001905181019061038c9190611f05565b60408051608081018252948552602085019390935291830152606082015295945050505050565b6103bb611cfe565b60006103c7848461066e565b905060006103db82825b602002015161075c565b905060006103ea8360016103d1565b90506103f4611ce0565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa90508061046057816040517f128e3f080000000000000000000000000000000000000000000000000000000081526004016102719190611f51565b509193505050505b92915050565b80516000906000805160206120898339815191521115806104a15750602082015160008051602061208983398151915211155b156104ae57506000919050565b61046882610a9a565b6000806000604051806101800160405280876000600281106104db576104db611f3b565b60200201518152602001876001600281106104f8576104f8611f3b565b602002015181526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8152602001856000600281106105ad576105ad611f3b565b60200201518152602001856001600281106105ca576105ca611f3b565b60200201518152602001866001600481106105e7576105e7611f3b565b602002015181526020018660006004811061060457610604611f3b565b602002015181526020018660036004811061062157610621611f3b565b602002015181526020018660026004811061063e5761063e611f3b565b60200201519052905061064f611d1c565b6020816101808460086107d05a03fa9051151597909650945050505050565b610676611cfe565b60006106828484610af9565b90506000806000806018850177ffffffffffffffffffffffffffffffffffffffffffffffff815116935060308601905077ffffffffffffffffffffffffffffffffffffffffffffffff815116945060008051602061208983398151915285600080516020612089833981519152600160c01b8709086048870151606088015177ffffffffffffffffffffffffffffffffffffffffffffffff9081169750169450925060008051602061208983398151915290508481600160c01b860908604080518082019091529283526020830152509695505050505050565b610764611cfe565b60008051602061208983398151915282106107ae576040517fd53e941500000000000000000000000000000000000000000000000000000000815260048101839052602401610271565b60006000805160206120898339815191526004600080516020612089833981519152858609099050600060008051602061208983398151915282600108905060008051602061208983398151915261081483600080516020612089833981519152611f5f565b60010891506000610835600080516020612089833981519152838509610c72565b9050600060008051602061208983398151915278016789af3a83522eb353c98fc6b36d713d5d8d1cc5dffffffa60008051602061208983398151915284600080516020612089833981519152888b090909905060006000805160206120898339815191526108b183600080516020612089833981519152611f5f565b7f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea30890506000600080516020612089833981519152837f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea308905060006000805160206120898339815191528687099050600060008051602061208983398151915286830990506000600080516020612089833981519152806000805160206120898339815191528485097f10216f7ba065e00de81ac1e7808072c9dd2b2385cd7b438469602eb24829a9bd09600108905060008061099661099188610c7d565b610cba565b60000b6001036109e757868c526109ac87610c7d565b90506109b781610d22565b60208e01919091529150816109e25760405163396ec77160e01b815260048101829052602401610271565b610a4b565b6109f361099187610c7d565b60000b600103610a0957858c526109ac86610c7d565b828c52610a1583610c7d565b9050610a2081610d22565b60208e0191909152915081610a4b5760405163396ec77160e01b815260048101829052602401610271565b60208c0151610a5990610d4b565b610a628e610d4b565b14610a8a5760208c0151610a8490600080516020612089833981519152611f5f565b60208d01525b5050505050505050505050919050565b600081516020830151600080516020612089833981519152828309600080516020612089833981519152838209905060008051602061208983398151915260038208905060008051602061208983398151915282830914949350505050565b815160609060ff811115610b3b57836040517f26e4f9ba0000000000000000000000000000000000000000000000000000000081526004016102719190611d5e565b60408051608880825260c08201909252600091602082018180368337019050509050600081856000606060008a88604051602001610b7f9796959493929190611f72565b604051602081830303815290604052905060008180519060200120905060008160018987604051602001610bb69493929190612013565b60408051808303601f190181528282528051602082012060608085526080850190935290935091600091602082018180368337019050509050600360015b81811015610c5457858418610c0a826001611e46565b8d8b604051602001610c1f9493929190612013565b60408051808303601f190181529190526020600019830181028501810195909552805194810194909420939450600101610bf4565b50600019016020908102820101919091529550505050505092915050565b600061046882610d58565b6000600080516020612089833981519152600360008051602061208983398151915284600080516020612089833981519152868709090892915050565b600080610cc68361149f565b9050610ce16001600080516020612089833981519152611f5f565b8103610cf1575060001992915050565b8015801590610d01575080600114155b156104685760405163396ec77160e01b815260048101849052602401610271565b600080610d2e836115ab565b915082600080516020612089833981519152838409149050915091565b6000610468600283612066565b60006000805160206120898339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b6040805160c080825260e082019092526000918291906020820181803683370190505060208082018181526040830182905260608301829052608083018690527f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea360a084015260008051602061208983398151915260c080850191909152929350600092839160055afa90506000519250806115a4576040517fc6daf7ab000000000000000000000000000000000000000000000000000000008152600481018590527f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea360248201526000805160206120898339815191526044820152606401610271565b5050919050565b60006000805160206120898339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60005b83811015611d55578181015183820152602001611d3d565b50506000910152565b6020815260008251806020840152611d7d816040850160208701611d3a565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b60008060608385031215611dba57600080fd5b82359150603f83018413611dcd57600080fd5b6040516040810181811067ffffffffffffffff82111715611df057611df0611d91565b604052806060850186811115611e0557600080fd5b602086015b81811015611e22578035835260209283019201611e0a565b505050809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561046857610468611e30565b600060208284031215611e6b57600080fd5b5051919050565b8060005b6004811015611e95578151845260209384019390910190600101611e76565b50505050565b8060005b6002811015611e95578151845260209384019390910190600101611e9f565b6101008101611ecd8286611e72565b611eda6080830185611e9b565b611ee760c0830184611e9b565b949350505050565b634e487b7160e01b600052600160045260246000fd5b60008060008060808587031215611f1b57600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052603260045260246000fd5b608081016104688284611e72565b8181038181111561046857610468611e30565b60008851611f84818460208d01611d3a565b885190830190611f98818360208d01611d3a565b8082019150506001600160f81b03198860f81b1681526001600160f81b03198760f81b1660018201526001600160f81b03198660f81b1660028201528451611fe7816003840160208901611d3a565b8082019150506001600160f81b03198460f81b1660038201526004810191505098975050505050505050565b8481526001600160f81b03198460f81b1660208201526000835161203e816021850160208801611d3a565b80830190506001600160f81b03198460f81b1660218201526022810191505095945050505050565b60008261208357634e487b7160e01b600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535f5349475f424e32353447315f584d443a4b454343414b2d3235365f535644575f524f5f4e554c5fa26469706673582212201ffc0da30ba6942682e5429b8347d6cf43d2e9ab45fda42101ba0a29da06976064736f6c634300081c003330644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470557ec32c2ad488e4d4f6008f89a346f18492092ccc0d594610de2732c8b808f07e1d1d335df83fa98462005690372c643340060d205306a9aa8106b6bd0b382297d3a4f9749b33eb2d904c9d9ebf17224150ddd7abd7567a9bec6c74480ee0b0095685ae3a85ba243747b1b2f426049010f6b73a0cf1d389351d5aaaa1047f60000000000000000000000000000000000000000000000000000000066f7e1330000000000000000000000000000000000000000000000000000000000000003

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806373d4a13a1161005b57806373d4a13a146100ba578063cacf66ab14610106578063e3d4ff161461010e578063ef78d4fd1461012357600080fd5b80635e7e3416146100825780635f7c75221461009d57806363ffab31146100b2575b600080fd5b61008a61012b565b6040519081526020015b60405180910390f35b6100a5610141565b6040516100949190611d5e565b6100a561015d565b6100e17f0000000000000000000000006ff198788e339ec256d8c82ca03b791887e31e9c81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610094565b61008a61019a565b61012161011c366004611da7565b6101e0565b005b61008a6102c7565b600061013561015d565b80519060200120905090565b6040518060600160405280602b81526020016120a9602b913981565b60606101957f0000000000000000000000006ff198788e339ec256d8c82ca03b791887e31e9c6000610190608082611e46565b6102fa565b905090565b60006101cd7f0000000000000000000000006ff198788e339ec256d8c82ca03b791887e31e9c6080610190602082611e46565b8060200190518101906101959190611e59565b604080516020808252818301909252600091602082018180368337505050600084815260086018206020830152909150610218610363565b9050600061023e6040518060600160405280602b81526020016120a9602b9139846103b3565b9050600061024b8561046e565b90508061027a57828286604051630b8cf7d360e41b815260040161027193929190611ebe565b60405180910390fd5b6000806102888786866104b7565b915091508061029957610299611eef565b816102bd57848488604051630b8cf7d360e41b815260040161027193929190611ebe565b5050505050505050565b60006101cd7f0000000000000000000000006ff198788e339ec256d8c82ca03b791887e31e9c60a0610190602082611e46565b60405161ffff821061030c5761ffff91505b818310838303026001810184601f8401873c8082015160ff16610346576001853b038060401c3d3d3e808403818511028203858211029150505b808252600081602084010152806040830101604052509392505050565b61036b611ce0565b60008060008061037961015d565b80602001905181019061038c9190611f05565b60408051608081018252948552602085019390935291830152606082015295945050505050565b6103bb611cfe565b60006103c7848461066e565b905060006103db82825b602002015161075c565b905060006103ea8360016103d1565b90506103f4611ce0565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa90508061046057816040517f128e3f080000000000000000000000000000000000000000000000000000000081526004016102719190611f51565b509193505050505b92915050565b80516000906000805160206120898339815191521115806104a15750602082015160008051602061208983398151915211155b156104ae57506000919050565b61046882610a9a565b6000806000604051806101800160405280876000600281106104db576104db611f3b565b60200201518152602001876001600281106104f8576104f8611f3b565b602002015181526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8152602001856000600281106105ad576105ad611f3b565b60200201518152602001856001600281106105ca576105ca611f3b565b60200201518152602001866001600481106105e7576105e7611f3b565b602002015181526020018660006004811061060457610604611f3b565b602002015181526020018660036004811061062157610621611f3b565b602002015181526020018660026004811061063e5761063e611f3b565b60200201519052905061064f611d1c565b6020816101808460086107d05a03fa9051151597909650945050505050565b610676611cfe565b60006106828484610af9565b90506000806000806018850177ffffffffffffffffffffffffffffffffffffffffffffffff815116935060308601905077ffffffffffffffffffffffffffffffffffffffffffffffff815116945060008051602061208983398151915285600080516020612089833981519152600160c01b8709086048870151606088015177ffffffffffffffffffffffffffffffffffffffffffffffff9081169750169450925060008051602061208983398151915290508481600160c01b860908604080518082019091529283526020830152509695505050505050565b610764611cfe565b60008051602061208983398151915282106107ae576040517fd53e941500000000000000000000000000000000000000000000000000000000815260048101839052602401610271565b60006000805160206120898339815191526004600080516020612089833981519152858609099050600060008051602061208983398151915282600108905060008051602061208983398151915261081483600080516020612089833981519152611f5f565b60010891506000610835600080516020612089833981519152838509610c72565b9050600060008051602061208983398151915278016789af3a83522eb353c98fc6b36d713d5d8d1cc5dffffffa60008051602061208983398151915284600080516020612089833981519152888b090909905060006000805160206120898339815191526108b183600080516020612089833981519152611f5f565b7f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea30890506000600080516020612089833981519152837f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea308905060006000805160206120898339815191528687099050600060008051602061208983398151915286830990506000600080516020612089833981519152806000805160206120898339815191528485097f10216f7ba065e00de81ac1e7808072c9dd2b2385cd7b438469602eb24829a9bd09600108905060008061099661099188610c7d565b610cba565b60000b6001036109e757868c526109ac87610c7d565b90506109b781610d22565b60208e01919091529150816109e25760405163396ec77160e01b815260048101829052602401610271565b610a4b565b6109f361099187610c7d565b60000b600103610a0957858c526109ac86610c7d565b828c52610a1583610c7d565b9050610a2081610d22565b60208e0191909152915081610a4b5760405163396ec77160e01b815260048101829052602401610271565b60208c0151610a5990610d4b565b610a628e610d4b565b14610a8a5760208c0151610a8490600080516020612089833981519152611f5f565b60208d01525b5050505050505050505050919050565b600081516020830151600080516020612089833981519152828309600080516020612089833981519152838209905060008051602061208983398151915260038208905060008051602061208983398151915282830914949350505050565b815160609060ff811115610b3b57836040517f26e4f9ba0000000000000000000000000000000000000000000000000000000081526004016102719190611d5e565b60408051608880825260c08201909252600091602082018180368337019050509050600081856000606060008a88604051602001610b7f9796959493929190611f72565b604051602081830303815290604052905060008180519060200120905060008160018987604051602001610bb69493929190612013565b60408051808303601f190181528282528051602082012060608085526080850190935290935091600091602082018180368337019050509050600360015b81811015610c5457858418610c0a826001611e46565b8d8b604051602001610c1f9493929190612013565b60408051808303601f190181529190526020600019830181028501810195909552805194810194909420939450600101610bf4565b50600019016020908102820101919091529550505050505092915050565b600061046882610d58565b6000600080516020612089833981519152600360008051602061208983398151915284600080516020612089833981519152868709090892915050565b600080610cc68361149f565b9050610ce16001600080516020612089833981519152611f5f565b8103610cf1575060001992915050565b8015801590610d01575080600114155b156104685760405163396ec77160e01b815260048101849052602401610271565b600080610d2e836115ab565b915082600080516020612089833981519152838409149050915091565b6000610468600283612066565b60006000805160206120898339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b6040805160c080825260e082019092526000918291906020820181803683370190505060208082018181526040830182905260608301829052608083018690527f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea360a084015260008051602061208983398151915260c080850191909152929350600092839160055afa90506000519250806115a4576040517fc6daf7ab000000000000000000000000000000000000000000000000000000008152600481018590527f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea360248201526000805160206120898339815191526044820152606401610271565b5050919050565b60006000805160206120898339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60005b83811015611d55578181015183820152602001611d3d565b50506000910152565b6020815260008251806020840152611d7d816040850160208701611d3a565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b60008060608385031215611dba57600080fd5b82359150603f83018413611dcd57600080fd5b6040516040810181811067ffffffffffffffff82111715611df057611df0611d91565b604052806060850186811115611e0557600080fd5b602086015b81811015611e22578035835260209283019201611e0a565b505050809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561046857610468611e30565b600060208284031215611e6b57600080fd5b5051919050565b8060005b6004811015611e95578151845260209384019390910190600101611e76565b50505050565b8060005b6002811015611e95578151845260209384019390910190600101611e9f565b6101008101611ecd8286611e72565b611eda6080830185611e9b565b611ee760c0830184611e9b565b949350505050565b634e487b7160e01b600052600160045260246000fd5b60008060008060808587031215611f1b57600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052603260045260246000fd5b608081016104688284611e72565b8181038181111561046857610468611e30565b60008851611f84818460208d01611d3a565b885190830190611f98818360208d01611d3a565b8082019150506001600160f81b03198860f81b1681526001600160f81b03198760f81b1660018201526001600160f81b03198660f81b1660028201528451611fe7816003840160208901611d3a565b8082019150506001600160f81b03198460f81b1660038201526004810191505098975050505050505050565b8481526001600160f81b03198460f81b1660208201526000835161203e816021850160208801611d3a565b80830190506001600160f81b03198460f81b1660218201526022810191505095945050505050565b60008261208357634e487b7160e01b600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535f5349475f424e32353447315f584d443a4b454343414b2d3235365f535644575f524f5f4e554c5fa26469706673582212201ffc0da30ba6942682e5429b8347d6cf43d2e9ab45fda42101ba0a29da06976064736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0557ec32c2ad488e4d4f6008f89a346f18492092ccc0d594610de2732c8b808f07e1d1d335df83fa98462005690372c643340060d205306a9aa8106b6bd0b382297d3a4f9749b33eb2d904c9d9ebf17224150ddd7abd7567a9bec6c74480ee0b0095685ae3a85ba243747b1b2f426049010f6b73a0cf1d389351d5aaaa1047f60000000000000000000000000000000000000000000000000000000066f7e1330000000000000000000000000000000000000000000000000000000000000003

-----Decoded View---------------
Arg [0] : publicKey_ (uint256[4]): 2416910118189096557713698606232949750075245832257361418817199221841198809231,3565178688866727608783247307855519961161197286613423629330948765523825963906,18766085122067595057703228467555884757373773082319035490740181099798629248523,263980444642394177375858669180402387903005329333277938776544051059273779190
Arg [1] : genesisTimestamp_ (uint256): 1727521075
Arg [2] : period_ (uint256): 3

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0557ec32c2ad488e4d4f6008f89a346f18492092ccc0d594610de2732c8b808f
Arg [1] : 07e1d1d335df83fa98462005690372c643340060d205306a9aa8106b6bd0b382
Arg [2] : 297d3a4f9749b33eb2d904c9d9ebf17224150ddd7abd7567a9bec6c74480ee0b
Arg [3] : 0095685ae3a85ba243747b1b2f426049010f6b73a0cf1d389351d5aaaa1047f6
Arg [4] : 0000000000000000000000000000000000000000000000000000000066f7e133
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003


Block Transaction Gas Used Reward
view all blocks sequenced

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
Loading...
Loading
[ Download: CSV Export  ]

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