ETH Price: $3,763.47 (+2.86%)
Gas: 6 Gwei

Contract

0x42000421dd80D1e90E56E87e6eE18D7770b9F8cC
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Freeze Contract171807772023-05-03 14:26:35384 days ago1683123995IN
LUKSO: Genesis Validators
0 ETH0.0039507987.49209193

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To Value
170804762023-04-19 11:53:23398 days ago1681905203  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LUKSOGenesisValidatorsDepositContract

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 3 : LUKSOGenesisValidatorsDepositContract.sol
//  _    _   _ _  ______   ___     ____                      _      __     __    _ _     _       _
// | |  | | | | |/ / ___| / _ \   / ___| ___ _ __   ___  ___(_)___  \ \   / /_ _| (_) __| | __ _| |_ ___  _ __ ___
// | |  | | | | ' /\___ \| | | | | |  _ / _ \ '_ \ / _ \/ __| / __|  \ \ / / _` | | |/ _` |/ _` | __/ _ \| '__/ __|
// | |__| |_| | . \ ___) | |_| | | |_| |  __/ | | |  __/\__ \ \__ \   \ V / (_| | | | (_| | (_| | || (_) | |  \__ \
// |_____\___/|_|\_\____/ \___/   \____|\___|_| |_|\___||___/_|___/    \_/ \__,_|_|_|\__,_|\__,_|\__\___/|_|  |___/

// SPDX-License-Identifier: CC0-1.0
pragma solidity 0.8.15;

import {IERC165} from "./interfaces/IERC165.sol";
import {IERC1820Registry} from "./interfaces/IERC1820Registry.sol";

/**
 * @title LUKSO Genesis Validators Deposit Contract
 * @author LUKSO
 * 
 * @notice This contract allows anyone to register as Genesis Validators for the LUKSO Blockchain.
 * To become a Genesis Validator, a participant must send 32 LYXe to this contract alongside its validator data 
 * (public key, withdrawal credentials, signature, deposit data root and initial supply vote).
 *
 * This smart contract allows deposits from 2023-04-20 at 04:20pm UTC on. They will revert before that time.
 *
 * Once enough Genesis Validator keys are present, the `FREEZER` can initiate the freeze of this contract,
 * which will happen exactly 46,523 blocks after the initiation (~1 week).
 * After this contract is frozen, it only functions as a historical reference and all LYXe in it will be forever locked.
 *
 * The `genesis.szz` for the LUKSO Blockchain, will be generated out of this smart contract using the `getDepositData()` function and
 * Genesis Validators will have their LYX balance on the LUKSO Blockchain after the network start.
 * 
 * @dev The LUKSO Genesis Validators Deposit Contract will be deployed on the Ethereum network.
 * The contract automatically registers deposits and their related deposit validator data when receiving 
 * the callback from the LYXe token contract via the `tokensReceived` function.
 * 
 * Once the contract is frozen, no more deposits can be made.
 *
 */
contract LUKSOGenesisValidatorsDepositContract is IERC165 {

    /**
     * @dev The `FREEZER` of the contract can freeze the contract via the `freezeContract()` function
     */
    address public constant FREEZER = 0x6109dcd72b8a2485A5b3Ac4E76965159e9893aB7;

    // The address of the LYXe token contract.
    address public constant LYX_TOKEN_CONTRACT_ADDRESS = 0xA8b919680258d369114910511cc87595aec0be6D;

    // The address of the registry contract (ERC1820 Registry)
    address public constant ERC1820_REGISTRY_ADDRESS = 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24;

    // The hash of the interface of the contract that receives tokens
    bytes32 public constant TOKENS_RECIPIENT_INTERFACE_HASH =
        0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b;

    // _to_little_endian_64(uint64(32 ether / 1 gwei))
    bytes constant AMOUNT_TO_LITTLE_ENDIAN_64 = hex"0040597307000000";

    // Timestamp from which the deposits are accepted (2023-04-20 04:20PM UTC)
    uint256 public constant DEPOSIT_START_TIMESTAMP = 1682007600;

    // The current number of deposits in the contract
    uint256 internal deposit_count;

    // The delay in blocks for the contract to be frozen (46,523 blocks ~ 1 week)
    uint256 public constant FREEZE_DELAY = 46_523;

    // The block number when the contract will be frozen
    uint256 public freezeBlockNumber;

    /**
     * @notice New LYXe deposit made
     * @dev Emitted when an address made a deposit of 32 LYXe to become a genesis validator on LUKSO
     * @param pubkey the public key of the genesis validator
     * @param withdrawal_credentials the withdrawal credentials of the genesis validator
     * @param amount the amount of LYXe deposited (32 LYXe)
     * @param signature the BLS signature of the genesis validator
     * @param index the deposit number for this deposit
     */
    event DepositEvent(
        bytes pubkey,
        bytes withdrawal_credentials,
        uint256 amount,
        bytes signature,
        uint256 index
    );

    /**
     * @dev Emitted when the `FREEZER` of the contract freezes the contract
     * @param initiatedAt the block number when freezing the contract was initiated
     * @param freezeAt the block number when the contract will be frozen
     */
    event FreezeInitiated(uint256 initiatedAt, uint256 freezeAt);

    /**
     * @dev Storing all the deposit data which should be sliced
     * in order to get the following parameters:
     * - pubkey - the first 48 bytes
     * - withdrawal_credentials - the following 32 bytes
     * - signature - the following 96 bytes
     * - deposit_data_root - the following 32 bytes
     * - initial_supply_vote - the last byte is the initial supply of LYX (in millions)
     *   the genesis validator voted for (0 means non-vote)
     */
    mapping(uint256 => bytes) internal deposit_data;

    /**
     * @dev Storing the amount of votes for each supply where the index is the initial supply of LYX in million
     */
    mapping(uint256 => uint256) public supplyVoteCounter;

    /**
     * @dev Storing the hash of the public key in order to check if it is already registered
     */
    mapping(bytes32 => bool) private _registeredPubKeyHash;

    /**
     * @dev Set the `TOKENS_RECIPIENT_INTERFACE_HASH` for the deposit contract
     */
    constructor() {
        // Set this contract as the implementer of the tokens recipient interface in the registry contract
        IERC1820Registry(ERC1820_REGISTRY_ADDRESS).setInterfaceImplementer(
            address(this),
            TOKENS_RECIPIENT_INTERFACE_HASH,
            address(this)
        );
    }

    /**
     * @dev Whenever this contract receives LYXe tokens, it must be for the reason of becoming a Genesis Validator.
     *
     * Requirements:
     * - `amount` MUST be exactly 32 LYXe
     * - `depositData` MUST be encoded properly
     * - `depositData` MUST contain:
     *   • pubkey - the first 48 bytes
     *   • withdrawal_credentials - the following 32 bytes
     *   • signature - the following 96 bytes
     *   • deposit_data_root - the following 32 bytes
     *   • supply - that last byte is the initial supply of LYX in million where 0 means non-vote
     */
    function tokensReceived(
        address /* operator */,
        address /* from */,
        address /* to */,
        uint256 amount,
        bytes calldata depositData,
        bytes calldata /* operatorData */
    ) external {

        // Check that the current timestamp is after the deposit start timestamp (2023-04-20 04:20PM UTC)
        require(block.timestamp >= DEPOSIT_START_TIMESTAMP, "LUKSOGenesisValidatorsDepositContract: Deposits not yet allowed");

        uint256 freezeBlockNumberValue = freezeBlockNumber;

        // Check the contract is not frozen
        require(
            freezeBlockNumberValue == 0 || block.number < freezeBlockNumberValue,
            "LUKSOGenesisValidatorsDepositContract: Contract is frozen"
        );

        // Check the calls can only come from the LYXe token contract
        require(
            msg.sender == LYX_TOKEN_CONTRACT_ADDRESS,
            "LUKSOGenesisValidatorsDepositContract: Not called on LYXe transfer"
        );

        // Check the amount received is exactly 32 LYXe
        require(
            amount == 32 ether,
            "LUKSOGenesisValidatorsDepositContract: Cannot send an amount different from 32 LYXe"
        );

        /**
         * Check the deposit data has the correct length (209 bytes)
         *  - 48 bytes for the pubkey 
         *  - 32 bytes for the withdrawal_credentials 
         *  - 96 bytes for the BLS signature
         *  - 32 bytes for the deposit_data_root 
         *  - 1 byte for the initialSupplyVote 
         */
        require(
            depositData.length == 209,
            "LUKSOGenesisValidatorsDepositContract: depositData not encoded properly"
        );

        uint256 initialSupplyVote = uint256(uint8(depositData[208]));

        // Check the `initialSupplyVote` is a value between 0 and 100 (inclusive), where 0 is a non-vote
        require(
            initialSupplyVote <= 100,
            "LUKSOGenesisValidatorsDepositContract: Invalid initialSupplyVote vote"
        );

        // increment the counter for the given initial supply vote
        supplyVoteCounter[initialSupplyVote]++;

        // Store the deposit data in the contract state
        deposit_data[deposit_count] = depositData;

        // Extract the validator deposit data from the `depositData`
        bytes calldata pubkey = depositData[:48];
        bytes calldata withdrawal_credentials = depositData[48:80];
        bytes calldata signature = depositData[80:176];
        bytes32 deposit_data_root = bytes32(depositData[176:208]);

        // Compute the SHA256 hash of the pubkey
        bytes32 pubKeyHash = sha256(pubkey);

        // Prevent depositing twice for the same pubkey
        require(
            !_registeredPubKeyHash[pubKeyHash],
            "LUKSOGenesisValidatorsDepositContract: Deposit already processed"
        );

        // Mark the pubkey as registered
        _registeredPubKeyHash[pubKeyHash] = true;

        // Compute deposit data root (`DepositData` hash tree root)
        bytes32 pubkey_root = sha256(abi.encodePacked(pubkey, bytes16(0)));

        // Compute the root of the BLS signature data
        bytes32 signature_root = sha256(
            abi.encodePacked(
                sha256(abi.encodePacked(signature[:64])),
                sha256(abi.encodePacked(signature[64:], bytes32(0)))
            )
        );

        // Compute the root of the deposit data
        bytes32 computedDataRoot = sha256(
            abi.encodePacked(
                sha256(abi.encodePacked(pubkey_root, withdrawal_credentials)),
                sha256(abi.encodePacked(AMOUNT_TO_LITTLE_ENDIAN_64, bytes24(0), signature_root))
            )
        );

        // Verify computed and expected deposit data roots match
        require(
            computedDataRoot == deposit_data_root,
            "LUKSOGenesisValidatorsDepositContract: reconstructed DepositData does not match supplied deposit_data_root"
        );

        // Emit `DepositEvent` log
        emit DepositEvent(
            pubkey,
            withdrawal_credentials,
            32 ether,
            signature,
            deposit_count
        );

        deposit_count++;
    }

    /**
     * @dev This function will freeze the LUKSO Genesis Deposit Contract after 46,523 blocks (~ 1 week).
     * This function can only be called by the `FREEZER` once!
     */
    function freezeContract() external {
        // Check the contract is not already frozen
        require(
            freezeBlockNumber == 0,
            "LUKSOGenesisValidatorsDepositContract: Contract is already frozen"
        );

        // Check this function can only be called by the `FREEZER`
        require(msg.sender == FREEZER, "LUKSOGenesisValidatorsDepositContract: Caller is not the freezer");

        // Set the freeze block number to the current block number + FREEZE_DELAY
        uint256 freezeAt = block.number + FREEZE_DELAY;
        freezeBlockNumber = freezeAt;
        emit FreezeInitiated(block.number, freezeAt);
    }

    /**
     * @dev Returns whether the public key is registered or not
     *
     * @param pubkey The public key of the genesis validator
     * @return bool `true` if the public key is registered, `false` otherwise
     */
    function isPubkeyRegistered(bytes calldata pubkey) external view returns (bool) {
        return _registeredPubKeyHash[sha256(pubkey)];
    }

    /**
     * @dev Returns the current number of deposits
     *
     * @return The number of deposits at the time the function was called
     */
    function depositCount() external view returns (uint256) {
        return deposit_count;
    }

    /**
     * @dev Retrieves an array of votes per supply and the total number of votes
     */
    function getsVotesPerSupply()
        external
        view
        returns (uint256[101] memory votesPerSupply, uint256 totalVotes)
    {
        for (uint256 i = 0; i <= 100; i++) {
            votesPerSupply[i] = supplyVoteCounter[i];
        }
        return (votesPerSupply, deposit_count);
    }

    /**
     * @dev Get an array of all encoded deposit data
     */
    function getDepositData() external view returns (bytes[] memory returnedArray) {
        returnedArray = new bytes[](deposit_count);
        for (uint256 i = 0; i < deposit_count; i++) returnedArray[i] = deposit_data[i];
    }

    /**
     * @dev Get the encoded deposit data at a given `index`
     */
    function getDepositDataByIndex(uint256 index) external view returns (bytes memory) {
        return deposit_data[index];
    }

    /**
     * @dev Determines whether the contract supports a given interface
     *
     * @param interfaceId The interface ID to check
     * @return `true` if the contract supports the interface, `false` otherwise
     */
    function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 2 of 3 : IERC165.sol
// SPDX-License-Identifier: CC0-1.0
pragma solidity 0.8.15;

// Based on official specification in https://eips.ethereum.org/EIPS/eip-165
interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceId The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceId` and
    ///  `interfaceId` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceId) external pure returns (bool);
}

File 3 of 3 : IERC1820Registry.sol
// SPDX-License-Identifier: CC0-1.0
pragma solidity 0.8.15;

interface IERC1820Registry {
    function setInterfaceImplementer(
        address _addr,
        bytes32 _interfaceHash,
        address _implementer
    ) external;
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"withdrawal_credentials","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"signature","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"DepositEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initiatedAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeAt","type":"uint256"}],"name":"FreezeInitiated","type":"event"},{"inputs":[],"name":"DEPOSIT_START_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC1820_REGISTRY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREEZER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREEZE_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LYX_TOKEN_CONTRACT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKENS_RECIPIENT_INTERFACE_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDepositData","outputs":[{"internalType":"bytes[]","name":"returnedArray","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getDepositDataByIndex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getsVotesPerSupply","outputs":[{"internalType":"uint256[101]","name":"votesPerSupply","type":"uint256[101]"},{"internalType":"uint256","name":"totalVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"pubkey","type":"bytes"}],"name":"isPubkeyRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyVoteCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"depositData","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60001b306040518463ffffffff1660e01b8152600401620000889392919062000122565b600060405180830381600087803b158015620000a357600080fd5b505af1158015620000b8573d6000803e3d6000fd5b505050506200015f565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ef82620000c2565b9050919050565b6200010181620000e2565b82525050565b6000819050919050565b6200011c8162000107565b82525050565b6000606082019050620001396000830186620000f6565b62000148602083018562000111565b620001576040830184620000f6565b949350505050565b6125dc806200016f6000396000f3fe608060405234801561001057600080fd5b50600436106100ff5760003560e01c80637e84159a11610097578063a584a9b511610066578063a584a9b51461028f578063d7ae894214610299578063e0197c7e146102b7578063f0cd185e146102e7576100ff565b80637e84159a146102045780638614d41114610223578063a427989d14610253578063a46a3cf614610271576100ff565b806338a42159116100d357806338a421591461018c5780633c9fc5f7146101aa5780636807ca94146101c857806372581cc0146101e6576100ff565b806223de291461010457806301ffc9a71461012057806327db25d5146101505780632dfdf0b51461016e575b600080fd5b61011e60048036038101906101199190611127565b610317565b005b61013a6004803603810190610135919061124e565b610b1c565b6040516101479190611296565b60405180910390f35b610158610b86565b60405161016591906112c0565b60405180910390f35b610176610b9e565b60405161018391906112ea565b60405180910390f35b610194610ba7565b6040516101a19190611460565b60405180910390f35b6101b2610cd9565b6040516101bf91906112c0565b60405180910390f35b6101d0610cf1565b6040516101dd91906112ea565b60405180910390f35b6101ee610cf7565b6040516101fb919061149b565b60405180910390f35b61020c610d1e565b60405161021a929190611561565b60405180910390f35b61023d6004803603810190610238919061158c565b610d86565b60405161024a9190611296565b60405180910390f35b61025b610e02565b60405161026891906112ea565b60405180910390f35b610279610e0a565b60405161028691906112c0565b60405180910390f35b610297610e22565b005b6102a1610f3e565b6040516102ae91906112ea565b60405180910390f35b6102d160048036038101906102cc91906115d9565b610f44565b6040516102de91906112ea565b60405180910390f35b61030160048036038101906102fc91906115d9565b610f5c565b60405161030e9190611650565b60405180910390f35b636441663042101561035e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610355906116f5565b60405180910390fd5b60006001549050600081148061037357508043105b6103b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a990611787565b60405180910390fd5b73a8b919680258d369114910511cc87595aec0be6d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042b9061183f565b60405180910390fd5b6801bc16d674ec800000861461047f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610476906118f7565b60405180910390fd5b60d185859050146104c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104bc906119af565b60405180910390fd5b6000858560d08181106104db576104da6119cf565b5b9050013560f81c60f81b60f81c60ff1690506064811115610531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052890611a96565b60405180910390fd5b60036000828152602001908152602001600020600081548092919061055590611ae5565b919050555085856002600080548152602001908152602001600020918261057d929190611d73565b50366000878760009060309261059593929190611e4d565b9150915036600089896030906050926105b093929190611e4d565b915091503660008b8b60509060b0926105cb93929190611e4d565b9150915060008c8c60b09060d0926105e593929190611e4d565b906105f09190611e88565b9050600060028888604051610606929190611f26565b602060405180830381855afa158015610623573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906106469190611f6b565b90506004600082815260200190815260200160002060009054906101000a900460ff16156106a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a09061200a565b60405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060028989600060801b6040516020016106f293929190612077565b60405160208183030381529060405260405161070e91906120d2565b602060405180830381855afa15801561072b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061074e9190611f6b565b90506000600280878760009060409261076993929190611e4d565b60405160200161077a9291906120e9565b60405160208183030381529060405260405161079691906120d2565b602060405180830381855afa1580156107b3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906107d69190611f6b565b6002888860409080926107eb93929190611e4d565b6000801b60405160200161080193929190612123565b60405160208183030381529060405260405161081d91906120d2565b602060405180830381855afa15801561083a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061085d9190611f6b565b60405160200161086e92919061214d565b60405160208183030381529060405260405161088a91906120d2565b602060405180830381855afa1580156108a7573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906108ca9190611f6b565b90506000600280848b8b6040516020016108e693929190612179565b60405160208183030381529060405260405161090291906120d2565b602060405180830381855afa15801561091f573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906109429190611f6b565b60026040518060400160405280600881526020017e40597307000000000000000000000000000000000000000000000000000000815250600060401b86604051602001610991939291906121f0565b6040516020818303038152906040526040516109ad91906120d2565b602060405180830381855afa1580156109ca573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906109ed9190611f6b565b6040516020016109fe92919061214d565b604051602081830303815290604052604051610a1a91906120d2565b602060405180830381855afa158015610a37573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610a5a9190611f6b565b9050848114610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a95906122e7565b60405180910390fd5b7fa57fd2bfae1c46ee48e66e9b1168c6cb20be3fbed56cc46f58c300d6654fe6f38b8b8b8b6801bc16d674ec8000008c8c600054604051610ae698979695949392919061236f565b60405180910390a1600080815480929190610b0090611ae5565b9190505550505050505050505050505050505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b73a8b919680258d369114910511cc87595aec0be6d81565b60008054905090565b606060005467ffffffffffffffff811115610bc557610bc4611b38565b5b604051908082528060200260200182016040528015610bf857816020015b6060815260200190600190039081610be35790505b50905060005b600054811015610cd557600260008281526020019081526020016000208054610c2690611b96565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5290611b96565b8015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b5050505050828281518110610cb757610cb66119cf565b5b60200260200101819052508080610ccd90611ae5565b915050610bfe565b5090565b731820a4b7618bde71dce8cdc73aab6c95905fad2481565b60015481565b7fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60001b81565b610d26611001565b600080600090505b60648111610d79576003600082815260200190815260200160002054838260658110610d5d57610d5c6119cf565b5b6020020181815250508080610d7190611ae5565b915050610d2e565b5081600054915091509091565b60006004600060028585604051610d9e929190611f26565b602060405180830381855afa158015610dbb573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610dde9190611f6b565b815260200190815260200160002060009054906101000a900460ff16905092915050565b636441663081565b736109dcd72b8a2485a5b3ac4e76965159e9893ab781565b600060015414610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e90612475565b60405180910390fd5b736109dcd72b8a2485a5b3ac4e76965159e9893ab773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090612507565b60405180910390fd5b600061b5bb43610ef99190612527565b9050806001819055507ffa4968f0ab3792f416cf3811c8227cc4ca8747011d859851e27df9a0b8287bdd4382604051610f3392919061257d565b60405180910390a150565b61b5bb81565b60036020528060005260406000206000915090505481565b6060600260008381526020019081526020016000208054610f7c90611b96565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa890611b96565b8015610ff55780601f10610fca57610100808354040283529160200191610ff5565b820191906000526020600020905b815481529060010190602001808311610fd857829003601f168201915b50505050509050919050565b60405180610ca00160405280606590602082028036833780820191505090505090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110598261102e565b9050919050565b6110698161104e565b811461107457600080fd5b50565b60008135905061108681611060565b92915050565b6000819050919050565b61109f8161108c565b81146110aa57600080fd5b50565b6000813590506110bc81611096565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126110e7576110e66110c2565b5b8235905067ffffffffffffffff811115611104576111036110c7565b5b6020830191508360018202830111156111205761111f6110cc565b5b9250929050565b60008060008060008060008060c0898b03121561114757611146611024565b5b60006111558b828c01611077565b98505060206111668b828c01611077565b97505060406111778b828c01611077565b96505060606111888b828c016110ad565b955050608089013567ffffffffffffffff8111156111a9576111a8611029565b5b6111b58b828c016110d1565b945094505060a089013567ffffffffffffffff8111156111d8576111d7611029565b5b6111e48b828c016110d1565b92509250509295985092959890939650565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61122b816111f6565b811461123657600080fd5b50565b60008135905061124881611222565b92915050565b60006020828403121561126457611263611024565b5b600061127284828501611239565b91505092915050565b60008115159050919050565b6112908161127b565b82525050565b60006020820190506112ab6000830184611287565b92915050565b6112ba8161104e565b82525050565b60006020820190506112d560008301846112b1565b92915050565b6112e48161108c565b82525050565b60006020820190506112ff60008301846112db565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561136b578082015181840152602081019050611350565b8381111561137a576000848401525b50505050565b6000601f19601f8301169050919050565b600061139c82611331565b6113a6818561133c565b93506113b681856020860161134d565b6113bf81611380565b840191505092915050565b60006113d68383611391565b905092915050565b6000602082019050919050565b60006113f682611305565b6114008185611310565b93508360208202850161141285611321565b8060005b8581101561144e578484038952815161142f85826113ca565b945061143a836113de565b925060208a01995050600181019050611416565b50829750879550505050505092915050565b6000602082019050818103600083015261147a81846113eb565b905092915050565b6000819050919050565b61149581611482565b82525050565b60006020820190506114b0600083018461148c565b92915050565b600060659050919050565b600081905092915050565b6000819050919050565b6114df8161108c565b82525050565b60006114f183836114d6565b60208301905092915050565b6000602082019050919050565b611513816114b6565b61151d81846114c1565b9250611528826114cc565b8060005b8381101561155957815161154087826114e5565b965061154b836114fd565b92505060018101905061152c565b505050505050565b6000610cc082019050611577600083018561150a565b611585610ca08301846112db565b9392505050565b600080602083850312156115a3576115a2611024565b5b600083013567ffffffffffffffff8111156115c1576115c0611029565b5b6115cd858286016110d1565b92509250509250929050565b6000602082840312156115ef576115ee611024565b5b60006115fd848285016110ad565b91505092915050565b600082825260208201905092915050565b600061162282611331565b61162c8185611606565b935061163c81856020860161134d565b61164581611380565b840191505092915050565b6000602082019050818103600083015261166a8184611617565b905092915050565b600082825260208201905092915050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a204465706f73697473206e6f742079657420616c6c6f77656400602082015250565b60006116df603f83611672565b91506116ea82611683565b604082019050919050565b6000602082019050818103600083015261170e816116d2565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a20436f6e74726163742069732066726f7a656e00000000000000602082015250565b6000611771603983611672565b915061177c82611715565b604082019050919050565b600060208201905081810360008301526117a081611764565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a204e6f742063616c6c6564206f6e204c595865207472616e736660208201527f6572000000000000000000000000000000000000000000000000000000000000604082015250565b6000611829604283611672565b9150611834826117a7565b606082019050919050565b600060208201905081810360008301526118588161181c565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a2043616e6e6f742073656e6420616e20616d6f756e742064696660208201527f666572656e742066726f6d203332204c59586500000000000000000000000000604082015250565b60006118e1605383611672565b91506118ec8261185f565b606082019050919050565b60006020820190508181036000830152611910816118d4565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a206465706f73697444617461206e6f7420656e636f646564207060208201527f726f7065726c7900000000000000000000000000000000000000000000000000604082015250565b6000611999604783611672565b91506119a482611917565b606082019050919050565b600060208201905081810360008301526119c88161198c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a20496e76616c696420696e697469616c537570706c79566f746560208201527f20766f7465000000000000000000000000000000000000000000000000000000604082015250565b6000611a80604583611672565b9150611a8b826119fe565b606082019050919050565b60006020820190508181036000830152611aaf81611a73565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611af08261108c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b2257611b21611ab6565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611bae57607f821691505b602082108103611bc157611bc0611b67565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611c297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611bec565b611c338683611bec565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611c70611c6b611c668461108c565b611c4b565b61108c565b9050919050565b6000819050919050565b611c8a83611c55565b611c9e611c9682611c77565b848454611bf9565b825550505050565b600090565b611cb3611ca6565b611cbe818484611c81565b505050565b5b81811015611ce257611cd7600082611cab565b600181019050611cc4565b5050565b601f821115611d2757611cf881611bc7565b611d0184611bdc565b81016020851015611d10578190505b611d24611d1c85611bdc565b830182611cc3565b50505b505050565b600082821c905092915050565b6000611d4a60001984600802611d2c565b1980831691505092915050565b6000611d638383611d39565b9150826002028217905092915050565b611d7d8383611b2d565b67ffffffffffffffff811115611d9657611d95611b38565b5b611da08254611b96565b611dab828285611ce6565b6000601f831160018114611dda5760008415611dc8578287013590505b611dd28582611d57565b865550611e3a565b601f198416611de886611bc7565b60005b82811015611e1057848901358255600182019150602085019450602081019050611deb565b86831015611e2d5784890135611e29601f891682611d39565b8355505b6001600288020188555050505b50505050505050565b600080fd5b600080fd5b60008085851115611e6157611e60611e43565b5b83861115611e7257611e71611e48565b5b6001850283019150848603905094509492505050565b6000611e948383611b2d565b82611e9f8135611482565b92506020821015611edf57611eda7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802611bec565b831692505b505092915050565b600081905092915050565b82818337600083830152505050565b6000611f0d8385611ee7565b9350611f1a838584611ef2565b82840190509392505050565b6000611f33828486611f01565b91508190509392505050565b611f4881611482565b8114611f5357600080fd5b50565b600081519050611f6581611f3f565b92915050565b600060208284031215611f8157611f80611024565b5b6000611f8f84828501611f56565b91505092915050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a204465706f73697420616c72656164792070726f636573736564602082015250565b6000611ff4604083611672565b9150611fff82611f98565b604082019050919050565b6000602082019050818103600083015261202381611fe7565b9050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000819050919050565b61207161206c8261202a565b612056565b82525050565b6000612084828587611f01565b91506120908284612060565b601082019150819050949350505050565b60006120ac82611331565b6120b68185611ee7565b93506120c681856020860161134d565b80840191505092915050565b60006120de82846120a1565b915081905092915050565b60006120f6828486611f01565b91508190509392505050565b6000819050919050565b61211d61211882611482565b612102565b82525050565b6000612130828587611f01565b915061213c828461210c565b602082019150819050949350505050565b6000612159828561210c565b602082019150612169828461210c565b6020820191508190509392505050565b6000612185828661210c565b602082019150612196828486611f01565b9150819050949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082169050919050565b6000819050919050565b6121ea6121e5826121a3565b6121cf565b82525050565b60006121fc82866120a1565b915061220882856121d9565b601882019150612218828461210c565b602082019150819050949350505050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a207265636f6e7374727563746564204465706f7369744461746160208201527f20646f6573206e6f74206d6174636820737570706c696564206465706f73697460408201527f5f646174615f726f6f7400000000000000000000000000000000000000000000606082015250565b60006122d1606a83611672565b91506122dc82612229565b608082019050919050565b60006020820190508181036000830152612300816122c4565b9050919050565b60006123138385611606565b9350612320838584611ef2565b61232983611380565b840190509392505050565b6000819050919050565b600061235961235461234f84612334565b611c4b565b61108c565b9050919050565b6123698161233e565b82525050565b600060a082019050818103600083015261238a818a8c612307565b9050818103602083015261239f81888a612307565b90506123ae6040830187612360565b81810360608301526123c1818587612307565b90506123d060808301846112db565b9998505050505050505050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a20436f6e747261637420697320616c72656164792066726f7a6560208201527f6e00000000000000000000000000000000000000000000000000000000000000604082015250565b600061245f604183611672565b915061246a826123dd565b606082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a2043616c6c6572206973206e6f742074686520667265657a6572602082015250565b60006124f1604083611672565b91506124fc82612495565b604082019050919050565b60006020820190508181036000830152612520816124e4565b9050919050565b60006125328261108c565b915061253d8361108c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561257257612571611ab6565b5b828201905092915050565b600060408201905061259260008301856112db565b61259f60208301846112db565b939250505056fea2646970667358221220ff55c424fcc726367c42b4c4fb0d2b77db383da098efa7e604b296c45ca7d7ee64736f6c634300080f0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ff5760003560e01c80637e84159a11610097578063a584a9b511610066578063a584a9b51461028f578063d7ae894214610299578063e0197c7e146102b7578063f0cd185e146102e7576100ff565b80637e84159a146102045780638614d41114610223578063a427989d14610253578063a46a3cf614610271576100ff565b806338a42159116100d357806338a421591461018c5780633c9fc5f7146101aa5780636807ca94146101c857806372581cc0146101e6576100ff565b806223de291461010457806301ffc9a71461012057806327db25d5146101505780632dfdf0b51461016e575b600080fd5b61011e60048036038101906101199190611127565b610317565b005b61013a6004803603810190610135919061124e565b610b1c565b6040516101479190611296565b60405180910390f35b610158610b86565b60405161016591906112c0565b60405180910390f35b610176610b9e565b60405161018391906112ea565b60405180910390f35b610194610ba7565b6040516101a19190611460565b60405180910390f35b6101b2610cd9565b6040516101bf91906112c0565b60405180910390f35b6101d0610cf1565b6040516101dd91906112ea565b60405180910390f35b6101ee610cf7565b6040516101fb919061149b565b60405180910390f35b61020c610d1e565b60405161021a929190611561565b60405180910390f35b61023d6004803603810190610238919061158c565b610d86565b60405161024a9190611296565b60405180910390f35b61025b610e02565b60405161026891906112ea565b60405180910390f35b610279610e0a565b60405161028691906112c0565b60405180910390f35b610297610e22565b005b6102a1610f3e565b6040516102ae91906112ea565b60405180910390f35b6102d160048036038101906102cc91906115d9565b610f44565b6040516102de91906112ea565b60405180910390f35b61030160048036038101906102fc91906115d9565b610f5c565b60405161030e9190611650565b60405180910390f35b636441663042101561035e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610355906116f5565b60405180910390fd5b60006001549050600081148061037357508043105b6103b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a990611787565b60405180910390fd5b73a8b919680258d369114910511cc87595aec0be6d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042b9061183f565b60405180910390fd5b6801bc16d674ec800000861461047f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610476906118f7565b60405180910390fd5b60d185859050146104c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104bc906119af565b60405180910390fd5b6000858560d08181106104db576104da6119cf565b5b9050013560f81c60f81b60f81c60ff1690506064811115610531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052890611a96565b60405180910390fd5b60036000828152602001908152602001600020600081548092919061055590611ae5565b919050555085856002600080548152602001908152602001600020918261057d929190611d73565b50366000878760009060309261059593929190611e4d565b9150915036600089896030906050926105b093929190611e4d565b915091503660008b8b60509060b0926105cb93929190611e4d565b9150915060008c8c60b09060d0926105e593929190611e4d565b906105f09190611e88565b9050600060028888604051610606929190611f26565b602060405180830381855afa158015610623573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906106469190611f6b565b90506004600082815260200190815260200160002060009054906101000a900460ff16156106a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a09061200a565b60405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060028989600060801b6040516020016106f293929190612077565b60405160208183030381529060405260405161070e91906120d2565b602060405180830381855afa15801561072b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061074e9190611f6b565b90506000600280878760009060409261076993929190611e4d565b60405160200161077a9291906120e9565b60405160208183030381529060405260405161079691906120d2565b602060405180830381855afa1580156107b3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906107d69190611f6b565b6002888860409080926107eb93929190611e4d565b6000801b60405160200161080193929190612123565b60405160208183030381529060405260405161081d91906120d2565b602060405180830381855afa15801561083a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061085d9190611f6b565b60405160200161086e92919061214d565b60405160208183030381529060405260405161088a91906120d2565b602060405180830381855afa1580156108a7573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906108ca9190611f6b565b90506000600280848b8b6040516020016108e693929190612179565b60405160208183030381529060405260405161090291906120d2565b602060405180830381855afa15801561091f573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906109429190611f6b565b60026040518060400160405280600881526020017e40597307000000000000000000000000000000000000000000000000000000815250600060401b86604051602001610991939291906121f0565b6040516020818303038152906040526040516109ad91906120d2565b602060405180830381855afa1580156109ca573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906109ed9190611f6b565b6040516020016109fe92919061214d565b604051602081830303815290604052604051610a1a91906120d2565b602060405180830381855afa158015610a37573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610a5a9190611f6b565b9050848114610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a95906122e7565b60405180910390fd5b7fa57fd2bfae1c46ee48e66e9b1168c6cb20be3fbed56cc46f58c300d6654fe6f38b8b8b8b6801bc16d674ec8000008c8c600054604051610ae698979695949392919061236f565b60405180910390a1600080815480929190610b0090611ae5565b9190505550505050505050505050505050505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b73a8b919680258d369114910511cc87595aec0be6d81565b60008054905090565b606060005467ffffffffffffffff811115610bc557610bc4611b38565b5b604051908082528060200260200182016040528015610bf857816020015b6060815260200190600190039081610be35790505b50905060005b600054811015610cd557600260008281526020019081526020016000208054610c2690611b96565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5290611b96565b8015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b5050505050828281518110610cb757610cb66119cf565b5b60200260200101819052508080610ccd90611ae5565b915050610bfe565b5090565b731820a4b7618bde71dce8cdc73aab6c95905fad2481565b60015481565b7fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60001b81565b610d26611001565b600080600090505b60648111610d79576003600082815260200190815260200160002054838260658110610d5d57610d5c6119cf565b5b6020020181815250508080610d7190611ae5565b915050610d2e565b5081600054915091509091565b60006004600060028585604051610d9e929190611f26565b602060405180830381855afa158015610dbb573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610dde9190611f6b565b815260200190815260200160002060009054906101000a900460ff16905092915050565b636441663081565b736109dcd72b8a2485a5b3ac4e76965159e9893ab781565b600060015414610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e90612475565b60405180910390fd5b736109dcd72b8a2485a5b3ac4e76965159e9893ab773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090612507565b60405180910390fd5b600061b5bb43610ef99190612527565b9050806001819055507ffa4968f0ab3792f416cf3811c8227cc4ca8747011d859851e27df9a0b8287bdd4382604051610f3392919061257d565b60405180910390a150565b61b5bb81565b60036020528060005260406000206000915090505481565b6060600260008381526020019081526020016000208054610f7c90611b96565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa890611b96565b8015610ff55780601f10610fca57610100808354040283529160200191610ff5565b820191906000526020600020905b815481529060010190602001808311610fd857829003601f168201915b50505050509050919050565b60405180610ca00160405280606590602082028036833780820191505090505090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110598261102e565b9050919050565b6110698161104e565b811461107457600080fd5b50565b60008135905061108681611060565b92915050565b6000819050919050565b61109f8161108c565b81146110aa57600080fd5b50565b6000813590506110bc81611096565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126110e7576110e66110c2565b5b8235905067ffffffffffffffff811115611104576111036110c7565b5b6020830191508360018202830111156111205761111f6110cc565b5b9250929050565b60008060008060008060008060c0898b03121561114757611146611024565b5b60006111558b828c01611077565b98505060206111668b828c01611077565b97505060406111778b828c01611077565b96505060606111888b828c016110ad565b955050608089013567ffffffffffffffff8111156111a9576111a8611029565b5b6111b58b828c016110d1565b945094505060a089013567ffffffffffffffff8111156111d8576111d7611029565b5b6111e48b828c016110d1565b92509250509295985092959890939650565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61122b816111f6565b811461123657600080fd5b50565b60008135905061124881611222565b92915050565b60006020828403121561126457611263611024565b5b600061127284828501611239565b91505092915050565b60008115159050919050565b6112908161127b565b82525050565b60006020820190506112ab6000830184611287565b92915050565b6112ba8161104e565b82525050565b60006020820190506112d560008301846112b1565b92915050565b6112e48161108c565b82525050565b60006020820190506112ff60008301846112db565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561136b578082015181840152602081019050611350565b8381111561137a576000848401525b50505050565b6000601f19601f8301169050919050565b600061139c82611331565b6113a6818561133c565b93506113b681856020860161134d565b6113bf81611380565b840191505092915050565b60006113d68383611391565b905092915050565b6000602082019050919050565b60006113f682611305565b6114008185611310565b93508360208202850161141285611321565b8060005b8581101561144e578484038952815161142f85826113ca565b945061143a836113de565b925060208a01995050600181019050611416565b50829750879550505050505092915050565b6000602082019050818103600083015261147a81846113eb565b905092915050565b6000819050919050565b61149581611482565b82525050565b60006020820190506114b0600083018461148c565b92915050565b600060659050919050565b600081905092915050565b6000819050919050565b6114df8161108c565b82525050565b60006114f183836114d6565b60208301905092915050565b6000602082019050919050565b611513816114b6565b61151d81846114c1565b9250611528826114cc565b8060005b8381101561155957815161154087826114e5565b965061154b836114fd565b92505060018101905061152c565b505050505050565b6000610cc082019050611577600083018561150a565b611585610ca08301846112db565b9392505050565b600080602083850312156115a3576115a2611024565b5b600083013567ffffffffffffffff8111156115c1576115c0611029565b5b6115cd858286016110d1565b92509250509250929050565b6000602082840312156115ef576115ee611024565b5b60006115fd848285016110ad565b91505092915050565b600082825260208201905092915050565b600061162282611331565b61162c8185611606565b935061163c81856020860161134d565b61164581611380565b840191505092915050565b6000602082019050818103600083015261166a8184611617565b905092915050565b600082825260208201905092915050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a204465706f73697473206e6f742079657420616c6c6f77656400602082015250565b60006116df603f83611672565b91506116ea82611683565b604082019050919050565b6000602082019050818103600083015261170e816116d2565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a20436f6e74726163742069732066726f7a656e00000000000000602082015250565b6000611771603983611672565b915061177c82611715565b604082019050919050565b600060208201905081810360008301526117a081611764565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a204e6f742063616c6c6564206f6e204c595865207472616e736660208201527f6572000000000000000000000000000000000000000000000000000000000000604082015250565b6000611829604283611672565b9150611834826117a7565b606082019050919050565b600060208201905081810360008301526118588161181c565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a2043616e6e6f742073656e6420616e20616d6f756e742064696660208201527f666572656e742066726f6d203332204c59586500000000000000000000000000604082015250565b60006118e1605383611672565b91506118ec8261185f565b606082019050919050565b60006020820190508181036000830152611910816118d4565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a206465706f73697444617461206e6f7420656e636f646564207060208201527f726f7065726c7900000000000000000000000000000000000000000000000000604082015250565b6000611999604783611672565b91506119a482611917565b606082019050919050565b600060208201905081810360008301526119c88161198c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a20496e76616c696420696e697469616c537570706c79566f746560208201527f20766f7465000000000000000000000000000000000000000000000000000000604082015250565b6000611a80604583611672565b9150611a8b826119fe565b606082019050919050565b60006020820190508181036000830152611aaf81611a73565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611af08261108c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b2257611b21611ab6565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611bae57607f821691505b602082108103611bc157611bc0611b67565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611c297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611bec565b611c338683611bec565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611c70611c6b611c668461108c565b611c4b565b61108c565b9050919050565b6000819050919050565b611c8a83611c55565b611c9e611c9682611c77565b848454611bf9565b825550505050565b600090565b611cb3611ca6565b611cbe818484611c81565b505050565b5b81811015611ce257611cd7600082611cab565b600181019050611cc4565b5050565b601f821115611d2757611cf881611bc7565b611d0184611bdc565b81016020851015611d10578190505b611d24611d1c85611bdc565b830182611cc3565b50505b505050565b600082821c905092915050565b6000611d4a60001984600802611d2c565b1980831691505092915050565b6000611d638383611d39565b9150826002028217905092915050565b611d7d8383611b2d565b67ffffffffffffffff811115611d9657611d95611b38565b5b611da08254611b96565b611dab828285611ce6565b6000601f831160018114611dda5760008415611dc8578287013590505b611dd28582611d57565b865550611e3a565b601f198416611de886611bc7565b60005b82811015611e1057848901358255600182019150602085019450602081019050611deb565b86831015611e2d5784890135611e29601f891682611d39565b8355505b6001600288020188555050505b50505050505050565b600080fd5b600080fd5b60008085851115611e6157611e60611e43565b5b83861115611e7257611e71611e48565b5b6001850283019150848603905094509492505050565b6000611e948383611b2d565b82611e9f8135611482565b92506020821015611edf57611eda7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802611bec565b831692505b505092915050565b600081905092915050565b82818337600083830152505050565b6000611f0d8385611ee7565b9350611f1a838584611ef2565b82840190509392505050565b6000611f33828486611f01565b91508190509392505050565b611f4881611482565b8114611f5357600080fd5b50565b600081519050611f6581611f3f565b92915050565b600060208284031215611f8157611f80611024565b5b6000611f8f84828501611f56565b91505092915050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a204465706f73697420616c72656164792070726f636573736564602082015250565b6000611ff4604083611672565b9150611fff82611f98565b604082019050919050565b6000602082019050818103600083015261202381611fe7565b9050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000819050919050565b61207161206c8261202a565b612056565b82525050565b6000612084828587611f01565b91506120908284612060565b601082019150819050949350505050565b60006120ac82611331565b6120b68185611ee7565b93506120c681856020860161134d565b80840191505092915050565b60006120de82846120a1565b915081905092915050565b60006120f6828486611f01565b91508190509392505050565b6000819050919050565b61211d61211882611482565b612102565b82525050565b6000612130828587611f01565b915061213c828461210c565b602082019150819050949350505050565b6000612159828561210c565b602082019150612169828461210c565b6020820191508190509392505050565b6000612185828661210c565b602082019150612196828486611f01565b9150819050949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082169050919050565b6000819050919050565b6121ea6121e5826121a3565b6121cf565b82525050565b60006121fc82866120a1565b915061220882856121d9565b601882019150612218828461210c565b602082019150819050949350505050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a207265636f6e7374727563746564204465706f7369744461746160208201527f20646f6573206e6f74206d6174636820737570706c696564206465706f73697460408201527f5f646174615f726f6f7400000000000000000000000000000000000000000000606082015250565b60006122d1606a83611672565b91506122dc82612229565b608082019050919050565b60006020820190508181036000830152612300816122c4565b9050919050565b60006123138385611606565b9350612320838584611ef2565b61232983611380565b840190509392505050565b6000819050919050565b600061235961235461234f84612334565b611c4b565b61108c565b9050919050565b6123698161233e565b82525050565b600060a082019050818103600083015261238a818a8c612307565b9050818103602083015261239f81888a612307565b90506123ae6040830187612360565b81810360608301526123c1818587612307565b90506123d060808301846112db565b9998505050505050505050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a20436f6e747261637420697320616c72656164792066726f7a6560208201527f6e00000000000000000000000000000000000000000000000000000000000000604082015250565b600061245f604183611672565b915061246a826123dd565b606082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b7f4c554b534f47656e6573697356616c696461746f72734465706f736974436f6e60008201527f74726163743a2043616c6c6572206973206e6f742074686520667265657a6572602082015250565b60006124f1604083611672565b91506124fc82612495565b604082019050919050565b60006020820190508181036000830152612520816124e4565b9050919050565b60006125328261108c565b915061253d8361108c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561257257612571611ab6565b5b828201905092915050565b600060408201905061259260008301856112db565b61259f60208301846112db565b939250505056fea2646970667358221220ff55c424fcc726367c42b4c4fb0d2b77db383da098efa7e604b296c45ca7d7ee64736f6c634300080f0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.