Contract 0xbb57a6e58e999b1020723e86f9ba23d73f094320

Contract Overview

Balance:
0 BNB
Txn Hash
Block
From
To
Value [Txn Fee]
0x76d826fb9689fe1c32104d121e030b6a7a0ef602743766b124553b7b95fa21e796397362021-06-11 13:02:1313 days 18 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
0x08badbb0862b21d6946ce7bb028cb8cfd106ad00d628dd041bab789e8a1e5e3f96397312021-06-11 13:01:5813 days 18 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0x490da0113fcc18b69b2fb5c597b30b0b71ca5d3772d0b00cf331ebc8d248705b96397272021-06-11 13:01:4613 days 18 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
0x3e81c02bec38f1d62394921a4fbe20037bb263cfadfcb46bc7e78643c8fba49b96397232021-06-11 13:01:3413 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0x65fd9d4a5b41b04f7d03f40d3698c9a64757ff5dc28999cedfa9fe3830ac0e5e96397212021-06-11 13:01:2813 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.0003836
0xa7666f019c207d1e9c6e8b49776aab4a1fb5e3f8e13acfafb67ff573fb8c0ffb96397162021-06-11 13:01:1313 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
0x849d9f8cd7fd29180ef9d424596961072bbad597c7e709d9a88753d811c4dd4996397112021-06-11 13:00:5813 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
0x225fb14da702f50333bd25d1c2a2fa872f62e4d92367d86f47346074f0b9682a96397072021-06-11 13:00:4613 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0x68546aeadb43224b2b924885558347c94bf0207fb6d570c894332fd8d8a78c7396397032021-06-11 13:00:3413 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0x29de0011eda18ad8a7e1ac94d719190f35648cc97341cc51555a0d841e55bd1d96397022021-06-11 13:00:3113 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0x8565fcef1eafcbe6ebc303aa569285d61e72754ed2357e5f69a5b9f43ae4b16396396982021-06-11 13:00:1913 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
0x061f39ccb61581537917d215c9aa4abdf46560c5935767201f6ae9111d26a72896396952021-06-11 13:00:1013 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038396
0x7c965b83b19a075b08abb04f938e955c7d6921dec67b54ad8df83ca410091eab96396902021-06-11 12:59:5513 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0xe789f45c9ec7b693c05193ee88bb3585b7083d970f80a1ab5bba225a0350747496396862021-06-11 12:59:4313 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
0xa5765b79c8280dc1001d25672077bb4cf18ccc22eb3d55e38459dd353db335a896396822021-06-11 12:59:3113 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038396
0xcf7b40437065eabf21b86b77c4edf8d6186b059e972d5c059f31541d2f9c1bdb96396782021-06-11 12:59:1913 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
0x63cedf504d05898ec872aa230447309326e8864e4834b3bf11f1e1e1954c8c5496396752021-06-11 12:59:1013 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038396
0xe08bc02df95bc567d232b0472ce0d47b0a6447c6d70466220ca92f588f7d0c8096396702021-06-11 12:58:5513 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0xbd37f4b0cbfe48928577eb87f0db395326462cf1c51230b59b00103c44876f6496396662021-06-11 12:58:4313 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038396
0x3a6b79b6bee48709d61f57caf9b0161225491611b2a7761d3c4607c68a49974896396622021-06-11 12:58:3113 days 19 hrs ago0x998cb7821e605cc16b6174e7c50e19adb2dd2fb0 IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
0xc5320a95ad05878ee7f75875ea9b047a67cc25995d0ae68efc727b87ca9bf60c96396612021-06-11 12:58:2813 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038396
0x2a1c2a62ba955b2459c57090c6dedaf3f1b006d792e208dfd2180addfbd8e0fb96396582021-06-11 12:58:1913 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0x72b4030c289bf4ce40a5d6de839575b199f14e61cbf271468b00a73d95098d3996396552021-06-11 12:58:1013 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0x055e42f7a2b04312a04c6503987f0aaf15320c5c83c7e716d8ed7f8216916c8796396502021-06-11 12:57:5513 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038372
0x48d9e7ea2a53038dae623c54c89dcb2874f9887f5f3ec7dc514756f3f83eb4e496396462021-06-11 12:57:4313 days 19 hrs ago0xdc3ebc37da53a644d67e5e3b5ba4eef88d969d5c IN  0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB0.00038384
[ Download CSV Export 
Latest 6 internal transactions
Parent Txn Hash Block From To Value
0x966a363b7c2301dbfe44b1b0ef67a394c2a08947306a0e3fe63f6f40d8571c0e96397302021-06-11 13:01:5513 days 18 hrs ago 0xe9cc97730a4e951bbff27bbe998282ce73579c72 0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB
0x966a363b7c2301dbfe44b1b0ef67a394c2a08947306a0e3fe63f6f40d8571c0e96397302021-06-11 13:01:5513 days 18 hrs ago 0xe9cc97730a4e951bbff27bbe998282ce73579c72 0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB
0x8d0ac5a4429b07b5d39ea2e97880bad9dd95be950e7071dc4e8dfd731694610b96379082021-06-11 11:30:4913 days 20 hrs ago 0x8f98d3b5c911206c1ac08b9938875620a03bcd59 0xbb57a6e58e999b1020723e86f9ba23d73f0943200 BNB
0x619829317a9e6dc40edc0271b7f1b109cdffbf1694b66fc42855a6b662cb554296379022021-06-11 11:30:3113 days 20 hrs ago 0xbb57a6e58e999b1020723e86f9ba23d73f094320 0x31e5f6f4e273cb9b4b2915ca1b847067f0364ed60 BNB
0x619829317a9e6dc40edc0271b7f1b109cdffbf1694b66fc42855a6b662cb554296379022021-06-11 11:30:3113 days 20 hrs ago 0xbb57a6e58e999b1020723e86f9ba23d73f094320 0x31e5f6f4e273cb9b4b2915ca1b847067f0364ed60 BNB
0x619829317a9e6dc40edc0271b7f1b109cdffbf1694b66fc42855a6b662cb554296379022021-06-11 11:30:3113 days 20 hrs ago 0xbb57a6e58e999b1020723e86f9ba23d73f094320 0x8f98d3b5c911206c1ac08b9938875620a03bcd590 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Chain

Compiler Version
v0.6.8+commit.0bbfe453

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-06-11
*/

// File: @openzeppelin/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/cryptography/MerkleProof.sol


pragma solidity ^0.6.0;

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

// File: @openzeppelin/contracts/GSN/Context.sol


pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @umb-network/toolbox/dist/contracts/lib/ValueDecoder.sol

pragma solidity >=0.6.8;

library ValueDecoder {
  function toUint(bytes memory _bytes) internal pure returns (uint256 value) {
    assembly {
      value := mload(add(_bytes, 32))
    }
  }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/interfaces/IStakingBank.sol

pragma solidity ^0.6.8;


interface IStakingBank is IERC20 {
  function receiveApproval(address _from) external returns (bool success);

  function withdraw(uint256 _value) external returns (bool success);
}

// File: contracts/interfaces/IValidatorRegistry.sol

pragma solidity ^0.6.8;

interface IValidatorRegistry {
  function create(address _id, string calldata _location) external;

  function update(address _id, string calldata _location) external;

  function addresses(uint256 _ix) external view returns (address);

  function validators(address _id) external view returns (address id, string memory location);

  function getNumberOfValidators() external view returns (uint256);

  function getName() external pure returns (bytes32);
}

// File: @openzeppelin/contracts/utils/Address.sol


pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


pragma solidity ^0.6.0;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: contracts/interfaces/IRegistry.sol

pragma solidity 0.6.8;


interface IRegistry {
    function getAddress(bytes32 name) external view returns (address);

    function requireAndGetAddress(bytes32 name) external view returns (address);
}

// File: contracts/extensions/Registrable.sol

pragma solidity 0.6.8;





abstract contract Registrable {
  IRegistry public contractRegistry;

  // ========== CONSTRUCTOR ========== //

  constructor(address _contractRegistry) internal {
    require(_contractRegistry != address(0x0), "_registry is empty");
    contractRegistry = IRegistry(_contractRegistry);
  }

  // ========== MODIFIERS ========== //

  modifier onlyFromContract(address _msgSender, bytes32 _contractName) {
    require(
      contractRegistry.getAddress(_contractName) == _msgSender,
        string(abi.encodePacked("caller is not ", _contractName))
    );
    _;
  }

  modifier withRegistrySetUp() {
    require(address(contractRegistry) != address(0x0), "_registry is empty");
    _;
  }

  // ========== VIEWS ========== //

  function getName() virtual external pure returns (bytes32);

  function validatorRegistryContract() public view returns (IValidatorRegistry) {
    return IValidatorRegistry(contractRegistry.requireAndGetAddress("ValidatorRegistry"));
  }

  function stakingBankContract() public view returns (IStakingBank) {
    return IStakingBank(contractRegistry.requireAndGetAddress("StakingBank"));
  }

  function tokenContract() public view withRegistrySetUp returns (ERC20) {
    return ERC20(contractRegistry.requireAndGetAddress("UMB"));
  }
}

// File: contracts/Registry.sol

pragma solidity 0.6.8;

// Inheritance



contract Registry is Ownable {
  mapping(bytes32 => address) public registry;

  // ========== EVENTS ========== //

  event LogRegistered(address indexed destination, bytes32 name);

  // ========== MUTATIVE FUNCTIONS ========== //

  function importAddresses(bytes32[] calldata _names, address[] calldata _destinations) external onlyOwner {
    require(_names.length == _destinations.length, "Input lengths must match");

    for (uint i = 0; i < _names.length; i++) {
      registry[_names[i]] = _destinations[i];
      emit LogRegistered(_destinations[i], _names[i]);
    }
  }

  function importContracts(address[] calldata _destinations) external onlyOwner {
    for (uint i = 0; i < _destinations.length; i++) {
      bytes32 name = Registrable(_destinations[i]).getName();
      registry[name] = _destinations[i];
      emit LogRegistered(_destinations[i], name);
    }
  }

  // ========== VIEWS ========== //

  function requireAndGetAddress(bytes32 name) external view returns (address) {
    address _foundAddress = registry[name];
    require(_foundAddress != address(0), string(abi.encodePacked("Name not registered: ", name)));
    return _foundAddress;
  }

  function getAddress(bytes32 _bytes) external view returns (address) {
    return registry[_bytes];
  }

  function getAddressByString(string memory _name) public view returns (address) {
    return registry[stringToBytes32(_name)];
  }

  function stringToBytes32(string memory _string) public pure returns (bytes32 result) {
    bytes memory tempEmptyStringTest = bytes(_string);

    if (tempEmptyStringTest.length == 0) {
      return 0x0;
    }

    assembly {
      result := mload(add(_string, 32))
    }
  }
}

// File: contracts/Chain.sol

pragma solidity ^0.6.8;
pragma experimental ABIEncoderV2;









contract Chain is Registrable, Ownable {
  using SafeMath for uint256;
  using ValueDecoder for bytes;

  // ========== STATE VARIABLES ========== //

  bytes constant public ETH_PREFIX = "\x19Ethereum Signed Message:\n32";

  struct Block {
    bytes32 root;
    uint32 dataTimestamp;
    uint128 affidavit;
  }

  struct FirstClassData {
    uint224 value;
    uint32 dataTimestamp;
  }

  mapping(uint256 => Block) public blocks;
  mapping(bytes32 => FirstClassData) public fcds;

  uint32 public blocksCount;
  uint32 public blocksCountOffset;
  uint16 public padding;

  // ========== CONSTRUCTOR ========== //

  constructor(address _contractRegistry, uint16 _padding) public Registrable(_contractRegistry) {
    padding = _padding;
    Chain oldChain = Chain(Registry(_contractRegistry).getAddress("Chain"));

    if (address(oldChain) != address(0x0)) {
      // +1 because it might be situation when tx is already in progress in old contract
      blocksCountOffset = oldChain.blocksCount() + oldChain.blocksCountOffset() + 1;
    }
  }

  // ========== MUTATIVE FUNCTIONS ========== //

  function setPadding(uint16 _padding) external onlyOwner {
    padding = _padding;
    emit LogPadding(msg.sender, _padding);
  }

  function submit(
    uint32 _dataTimestamp,
    bytes32 _root,
    bytes32[] memory _keys,
    uint256[] memory _values,
    uint8[] memory _v,
    bytes32[] memory _r,
    bytes32[] memory _s
  ) public {
    return; // BREAKING DEV
    uint32 lastBlockId = getLatestBlockId();
    require(blocks[lastBlockId].dataTimestamp + padding < block.timestamp, "do not spam");
    require(blocks[lastBlockId].dataTimestamp < _dataTimestamp, "can NOT submit older data");
    require(_dataTimestamp <= block.timestamp, "oh, so you can predict future");
    require(_keys.length == _values.length, "numbers of keys and values not the same");

    bytes memory testimony = abi.encodePacked(_dataTimestamp, _root);

    for (uint256 i = 0; i < _keys.length; i++) {
      require(uint224(_values[i]) == _values[i], "FCD overflow");
      fcds[_keys[i]] = FirstClassData(uint224(_values[i]), _dataTimestamp);
      testimony = abi.encodePacked(testimony, _keys[i], _values[i]);
    }

    bytes32 affidavit = keccak256(testimony);
    uint256 power = 0;

    IStakingBank stakingBank = stakingBankContract();
    uint256 staked = stakingBank.totalSupply();
    address prevSigner = address(0x0);

    for (uint256 i = 0; i < _v.length; i++) {
      address signer = recoverSigner(affidavit, _v[i], _r[i], _s[i]);
      uint256 balance = stakingBank.balanceOf(signer);

      require(prevSigner < signer, "validator included more than once");
      prevSigner = signer;
      if (balance == 0) continue;

      emit LogVoter(lastBlockId + 1, signer, balance);
      power = power.add(balance);
    }

    // TODO to optimise, break the loop when get enough power
    require(power.mul(100) >= staked.mul(66), "not enough power was gathered");

    blocks[lastBlockId + 1].root = _root;
    blocks[lastBlockId + 1].dataTimestamp = _dataTimestamp;
    blocks[lastBlockId + 1].affidavit = uint128(bytes16(affidavit));
    blocksCount++;

    emit LogMint(msg.sender, lastBlockId + 1, staked, power);
  }

  // ========== VIEWS ========== //

  function getName() override external pure returns (bytes32) {
    return "Chain";
  }

  function recoverSigner(bytes32 _affidavit, uint8 _v, bytes32 _r, bytes32 _s) public pure returns (address) {
    bytes32 hash = keccak256(abi.encodePacked(ETH_PREFIX, _affidavit));
    return ecrecover(hash, _v, _r, _s);
  }

  function getStatus() external view returns(
    uint256 blockNumber,
    uint16 timePadding,
    uint32 lastDataTimestamp,
    uint32 lastBlockId,
    address nextLeader,
    uint32 nextBlockId,
    address[] memory validators,
    uint256[] memory powers,
    string[] memory locations,
    uint256 staked
  ) {
    blockNumber = block.number;
    timePadding = padding;
    lastBlockId = getLatestBlockId();
    lastDataTimestamp = blocks[lastBlockId].dataTimestamp;

    IValidatorRegistry vr = validatorRegistryContract();
    uint256 numberOfValidators = vr.getNumberOfValidators();
    validators = new address[](numberOfValidators);
    locations = new string[](numberOfValidators);

    for (uint256 i = 0; i < numberOfValidators; i++) {
      validators[i] = vr.addresses(i);
      (, locations[i]) = vr.validators(validators[i]);
    }

    nextLeader = numberOfValidators > 0
      ? validators[getLeaderIndex(numberOfValidators, block.timestamp + 1)]
      : address(0);

    IStakingBank stakingBank = stakingBankContract();
    powers = new uint256[](numberOfValidators);
    staked = stakingBank.totalSupply();

    for (uint256 i = 0; i < numberOfValidators; i++) {
      powers[i] = stakingBank.balanceOf(validators[i]);
    }

    nextBlockId = getBlockId();
  }

  function getBlockId() public view returns (uint32) {
    uint32 _blocksCount = blocksCount + blocksCountOffset;

    if (_blocksCount == 0) {
      return 0;
    }

    if (blocks[_blocksCount - 1].dataTimestamp + padding < block.timestamp) {
      return _blocksCount;
    }

    return _blocksCount - 1;
  }

  function getLatestBlockId() public view returns (uint32) {
    return blocksCount + blocksCountOffset - 1;
  }

  // note: I think its time to move leader selection from Chain
  // we don't have anchor so we using timestamp, but timestamp if available without calling blockchain
  // I will leave this methods but it should be deprecated soon
  function getLeaderIndex(uint256 _numberOfValidators, uint256 _timestamp) public view returns (uint256) {
    uint32 latestBlockId = getLatestBlockId();

    // timePadding + 1 => because padding is a space between blocks, so next round starts on first block after padding
    uint256 validatorIndex = latestBlockId +
      (_timestamp - blocks[latestBlockId].dataTimestamp) / (padding + 1);

    return uint16(validatorIndex % _numberOfValidators);
  }

  function getNextLeaderAddress() public view returns (address) {
    return getLeaderAddressAtTime(block.timestamp + 1);
  }

  function getLeaderAddress() public view returns (address) {
    return getLeaderAddressAtTime(block.timestamp);
  }

  // @todo - properly handled non-enabled validators, newly added validators, and validators with low stake
  function getLeaderAddressAtTime(uint256 _timestamp) public view returns (address) {
    IValidatorRegistry validatorRegistry = validatorRegistryContract();

    uint256 numberOfValidators = validatorRegistry.getNumberOfValidators();

    if (numberOfValidators == 0) {
      return address(0x0);
    }

    uint256 validatorIndex = getLeaderIndex(numberOfValidators, _timestamp);

    return validatorRegistry.addresses(validatorIndex);
  }

  function verifyProof(bytes32[] memory _proof, bytes32 _root, bytes32 _leaf) public view returns (bool) {
    if (_root == bytes32(0)) {
      return false;
    }

    return MerkleProof.verify(_proof, _root, _leaf);
  }

  function hashLeaf(bytes memory _key, bytes memory _value) public view returns (bytes32) {
    return keccak256(abi.encodePacked(_key, _value));
  }

  function verifyProofForBlock(
    uint256 _blockId,
    bytes32[] memory _proof,
    bytes memory _key,
    bytes memory _value
  ) public view returns (bool) {
    return verifyProof(_proof, blocks[_blockId].root, keccak256(abi.encodePacked(_key, _value)));
  }

  function bytesToBytes32Array(
    bytes memory _data,
    uint256 _offset,
    uint256 _items
  ) public pure returns (bytes32[] memory) {
    bytes32[] memory dataList = new bytes32[](_items);

    for (uint256 i = 0; i < _items; i++) {
      bytes32 temp;
      uint256 idx = (i + 1 + _offset) * 32;

      assembly {
        temp := mload(add(_data, idx))
      }

      dataList[i] = temp;
    }

    return (dataList);
  }

  function verifyProofs(
    uint32[] memory _blockIds,
    bytes memory _proofs,
    uint256[] memory _proofItemsCounter,
    bytes32[] memory _leaves
  ) public view returns (bool[] memory results) {
    results = new bool[](_leaves.length);
    uint256 offset = 0;

    for (uint256 i = 0; i < _leaves.length; i++) {
      results[i] = verifyProof(
        bytesToBytes32Array(_proofs, offset, _proofItemsCounter[i]),
        blocks[_blockIds[i]].root,
        _leaves[i]
      );

      offset += _proofItemsCounter[i];
    }
  }

  function getBlockRoot(uint32 _blockId) external view returns (bytes32) {
    return blocks[_blockId].root;
  }

  function getBlockTimestamp(uint32 _blockId) external view returns (uint32) {
    return blocks[_blockId].dataTimestamp;
  }

  function getCurrentValues(bytes32[] calldata _keys)
  external view returns (uint256[] memory values, uint32[] memory timestamps) {
    timestamps = new uint32[](_keys.length);
    values = new uint256[](_keys.length);

    for (uint i=0; i<_keys.length; i++) {
      FirstClassData storage numericFCD = fcds[_keys[i]];
      values[i] = uint256(numericFCD.value);
      timestamps[i] = numericFCD.dataTimestamp;
    }
  }

  function getCurrentValue(bytes32 _key) external view returns (uint256 value, uint256 timestamp) {
    FirstClassData storage numericFCD = fcds[_key];
    return (uint256(numericFCD.value), numericFCD.dataTimestamp);
  }

  // ========== EVENTS ========== //

  event LogPadding(address indexed executor, uint16 timePadding);
  event LogMint(address indexed minter, uint256 blockId, uint256 staked, uint256 power);
  event LogVoter(uint256 indexed blockId, address indexed voter, uint256 vote);
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_contractRegistry","type":"address"},{"internalType":"uint16","name":"_padding","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"blockId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"staked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"LogMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint16","name":"timePadding","type":"uint16"}],"name":"LogPadding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"blockId","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"vote","type":"uint256"}],"name":"LogVoter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ETH_PREFIX","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blocks","outputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint32","name":"dataTimestamp","type":"uint32"},{"internalType":"uint128","name":"affidavit","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksCountOffset","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_items","type":"uint256"}],"name":"bytesToBytes32Array","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractRegistry","outputs":[{"internalType":"contract IRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"fcds","outputs":[{"internalType":"uint224","name":"value","type":"uint224"},{"internalType":"uint32","name":"dataTimestamp","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_blockId","type":"uint32"}],"name":"getBlockRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_blockId","type":"uint32"}],"name":"getBlockTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"}],"name":"getCurrentValue","outputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_keys","type":"bytes32[]"}],"name":"getCurrentValues","outputs":[{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint32[]","name":"timestamps","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestBlockId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeaderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getLeaderAddressAtTime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfValidators","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getLeaderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getNextLeaderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint16","name":"timePadding","type":"uint16"},{"internalType":"uint32","name":"lastDataTimestamp","type":"uint32"},{"internalType":"uint32","name":"lastBlockId","type":"uint32"},{"internalType":"address","name":"nextLeader","type":"address"},{"internalType":"uint32","name":"nextBlockId","type":"uint32"},{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"},{"internalType":"string[]","name":"locations","type":"string[]"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_key","type":"bytes"},{"internalType":"bytes","name":"_value","type":"bytes"}],"name":"hashLeaf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"padding","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_affidavit","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_padding","type":"uint16"}],"name":"setPadding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingBankContract","outputs":[{"internalType":"contract IStakingBank","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_dataTimestamp","type":"uint32"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bytes32[]","name":"_keys","type":"bytes32[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint8[]","name":"_v","type":"uint8[]"},{"internalType":"bytes32[]","name":"_r","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_s","type":"bytes32[]"}],"name":"submit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validatorRegistryContract","outputs":[{"internalType":"contract IValidatorRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bytes32","name":"_leaf","type":"bytes32"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockId","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"bytes","name":"_key","type":"bytes"},{"internalType":"bytes","name":"_value","type":"bytes"}],"name":"verifyProofForBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"_blockIds","type":"uint32[]"},{"internalType":"bytes","name":"_proofs","type":"bytes"},{"internalType":"uint256[]","name":"_proofItemsCounter","type":"uint256[]"},{"internalType":"bytes32[]","name":"_leaves","type":"bytes32[]"}],"name":"verifyProofs","outputs":[{"internalType":"bool[]","name":"results","type":"bool[]"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200466b3803806200466b83398181016040528101906200003791906200042a565b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a290620004ff565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506000620000fe620003b160201b60201c565b905080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600460086101000a81548161ffff021916908361ffff16021790555060008273ffffffffffffffffffffffffffffffffffffffff166321f8a7216040518163ffffffff1660e01b8152600401620001f59062000521565b60206040518083038186803b1580156200020e57600080fd5b505afa15801562000223573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002499190620003fe565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620003a85760018173ffffffffffffffffffffffffffffffffffffffff166377839fe66040518163ffffffff1660e01b815260040160206040518083038186803b158015620002c957600080fd5b505afa158015620002de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030491906200046b565b8273ffffffffffffffffffffffffffffffffffffffff16637353cbcb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034b57600080fd5b505afa15801562000360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038691906200046b565b01016004806101000a81548163ffffffff021916908363ffffffff1602179055505b505050620005ed565b600033905090565b600081519050620003ca816200059f565b92915050565b600081519050620003e181620005b9565b92915050565b600081519050620003f881620005d3565b92915050565b6000602082840312156200041157600080fd5b60006200042184828501620003b9565b91505092915050565b600080604083850312156200043e57600080fd5b60006200044e85828601620003b9565b92505060206200046185828601620003d0565b9150509250929050565b6000602082840312156200047e57600080fd5b60006200048e84828501620003e7565b91505092915050565b6000620004a66012836200053c565b91507f5f726567697374727920697320656d70747900000000000000000000000000006000830152602082019050919050565b7f436861696e000000000000000000000000000000000000000000000000000000815250565b600060208201905081810360008301526200051a8162000497565b9050919050565b60006020820190506200053760008301620004d9565b919050565b600082825260208201905092915050565b60006200055a826200056f565b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600063ffffffff82169050919050565b620005aa816200054d565b8114620005b657600080fd5b50565b620005c48162000561565b8114620005d057600080fd5b50565b620005de816200058f565b8114620005ea57600080fd5b50565b61406e80620005fd6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638da5cb5b1161011a578063ca4d29d2116100ad578063e76c0b571161007c578063e76c0b5714610614578063ed9975c314610632578063ef19f3e714610650578063f25b3f9914610680578063f2fde38b146106b2576101fb565b8063ca4d29d214610565578063cbb1b2c714610595578063d3d3ea08146105c6578063d45167d0146105e4576101fb565b8063bef9f8a1116100e9578063bef9f8a1146104b7578063bf66e3ba146104e7578063c3369db814610517578063c703916714610547576101fb565b80638da5cb5b1461042c5780639f6119d71461044a578063abf410e514610468578063adf1639d14610486576101fb565b8063485e055d11610192578063637180a811610161578063637180a8146103c8578063715018a6146103e65780637353cbcb146103f057806377839fe61461040e576101fb565b8063485e055d146103375780634bc935d7146103535780634e69d5601461038357806355a373d6146103aa576101fb565b8063243b68f9116101ce578063243b68f91461029c57806324c89a49146102cc57806326f3ab8b146102ea57806340a9e5e31461031b576101fb565b80630f2acc3e146102005780631374df0b1461023057806317d7de7c1461024e578063199dadc51461026c575b600080fd5b61021a60048036038101906102159190612a9b565b6106ce565b604051610227919061371a565b60405180910390f35b610238610701565b604051610245919061398a565b60405180910390f35b610256610715565b604051610263919061371a565b60405180910390f35b61028660048036038101906102819190612be9565b61073d565b60405161029391906136ff565b60405180910390f35b6102b660048036038101906102b19190612b07565b610792565b6040516102c391906136a6565b60405180910390f35b6102d4610834565b6040516102e191906137b1565b60405180910390f35b61030460048036038101906102ff91906128a0565b61086d565b6040516103129291906136c8565b60405180910390f35b61033560048036038101906103309190612b6e565b6109f6565b005b610351600480360381019061034c9190612cf9565b610afb565b005b61036d600480360381019061036891906128e5565b611129565b60405161037a91906136ff565b60405180910390f35b61038b611154565b6040516103a19a999897969594939291906139e9565b60405180910390f35b6103b261166d565b6040516103bf91906137d3565b60405180910390f35b6103d06117ac565b6040516103dd9190613809565b60405180910390f35b6103ee61185b565b005b6103f86119b3565b6040516104059190613ac3565b60405180910390f35b6104166119c9565b6040516104239190613ac3565b60405180910390f35b6104346119de565b6040516104419190613669565b60405180910390f35b610452611a08565b60405161045f9190613669565b60405180910390f35b610470611a1b565b60405161047d91906137ee565b60405180910390f35b6104a0600480360381019061049b9190612a0f565b611a40565b6040516104ae929190613a9a565b60405180910390f35b6104d160048036038101906104cc9190612cd0565b611acd565b6040516104de919061371a565b60405180910390f35b61050160048036038101906104fc919061294c565b611af3565b60405161050e9190613684565b60405180910390f35b610531600480360381019061052c9190612cd0565b611c0a565b60405161053e9190613ac3565b60405180910390f35b61054f611c40565b60405161055c9190613824565b60405180910390f35b61057f600480360381019061057a9190612c94565b611cef565b60405161058c91906139ce565b60405180910390f35b6105af60048036038101906105aa9190612a0f565b611d75565b6040516105bd9291906139a5565b60405180910390f35b6105ce611dd1565b6040516105db9190613ac3565b60405180910390f35b6105fe60048036038101906105f99190612a38565b611e01565b60405161060b9190613669565b60405180910390f35b61061c611ebe565b6040516106299190613ac3565b60405180910390f35b61063a611f69565b6040516106479190613669565b60405180910390f35b61066a60048036038101906106659190612b97565b611f79565b6040516106779190613669565b60405180910390f35b61069a60048036038101906106959190612b97565b6120be565b6040516106a993929190613735565b60405180910390f35b6106cc60048036038101906106c791906127fa565b612114565b005b600082826040516020016106e3929190613645565b60405160208183030381529060405280519060200120905092915050565b600460089054906101000a900461ffff1681565b60007f436861696e000000000000000000000000000000000000000000000000000000905090565b6000610788846002600088815260200190815260200160002060000154858560405160200161076d929190613645565b60405160208183030381529060405280519060200120611129565b9050949350505050565b6060808267ffffffffffffffff811180156107ac57600080fd5b506040519080825280602002602001820160405280156107db5781602001602082028036833780820191505090505b50905060008090505b838110156108285760008060208760018501010290508088015191508184848151811061080d57fe5b602002602001018181525050505080806001019150506107e4565b50809150509392505050565b6040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525081565b6060808383905067ffffffffffffffff8111801561088a57600080fd5b506040519080825280602002602001820160405280156108b95781602001602082028036833780820191505090505b5090508383905067ffffffffffffffff811180156108d657600080fd5b506040519080825280602002602001820160405280156109055781602001602082028036833780820191505090505b50915060008090505b848490508110156109ee5760006003600087878581811061092b57fe5b90506020020135815260200190815260200160002090508060000160009054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1684838151811061099957fe5b60200260200101818152505080600001601c9054906101000a900463ffffffff168383815181106109c657fe5b602002602001019063ffffffff16908163ffffffff168152505050808060010191505061090e565b509250929050565b6109fe6122db565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613931565b60405180910390fd5b80600460086101000a81548161ffff021916908361ffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167f22d3c53dc5741f3378120ad17e6ae419e28fecb3c4c2572ca0de779d825f63f482604051610af0919061398a565b60405180910390a250565b611120565b8751811015610cdb57868181518110610b1557fe5b6020026020010151878281518110610b2957fe5b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1614610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061387f565b60405180910390fd5b6040518060400160405280888381518110610ba657fe5b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681526020018b63ffffffff16815250600360008a8481518110610beb57fe5b6020026020010151815260200190815260200160002060008201518160000160006101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550602082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505081888281518110610c8f57fe5b6020026020010151888381518110610ca357fe5b6020026020010151604051602001610cbd9392919061360c565b60405160208183030381529060405291508080600101915050610b00565b5060008180519060200120905060008090506000610cf76117ac565b905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d4157600080fd5b505afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190612bc0565b9050600080905060008090505b8a51811015610f63576000610dd6878d8481518110610da157fe5b60200260200101518d8581518110610db557fe5b60200260200101518d8681518110610dc957fe5b6020026020010151611e01565b905060008573ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610e139190613669565b60206040518083038186803b158015610e2b57600080fd5b505afa158015610e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e639190612bc0565b90508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906138f1565b60405180910390fd5b8193506000811415610ee6575050610f56565b8173ffffffffffffffffffffffffffffffffffffffff1660018b0163ffffffff167fbac7552ab5da8d0588709ddb75aceec28520646f54bca1cc5e6e104db61935ec83604051610f3691906139ce565b60405180910390a3610f5181886122e390919063ffffffff16565b965050505b8080600101915050610d86565b50610f7860428361233890919063ffffffff16565b610f8c60648661233890919063ffffffff16565b1015610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc490613951565b60405180910390fd5b8c6002600060018a0163ffffffff168152602001908152602001600020600001819055508d6002600060018a0163ffffffff16815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff1602179055508460801c6002600060018a0163ffffffff16815260200190815260200160002060010160046101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506004600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550503373ffffffffffffffffffffffffffffffffffffffff167f5f11830295067c4bcc7d02d4e3b048cd7427be50a3aeb6afc9d3d559ee64bcfa60018901848760405161111093929190613ade565b60405180910390a2505050505050505b50505050505050565b60008060001b83141561113f576000905061114d565b61114a8484846123a8565b90505b9392505050565b60008060008060008060608060606000439950600460089054906101000a900461ffff169850611182611dd1565b9650600260008863ffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff16975060006111bd611c40565b905060008173ffffffffffffffffffffffffffffffffffffffff16639031d9136040518163ffffffff1660e01b815260040160206040518083038186803b15801561120757600080fd5b505afa15801561121b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123f9190612bc0565b90508067ffffffffffffffff8111801561125857600080fd5b506040519080825280602002602001820160405280156112875781602001602082028036833780820191505090505b5095508067ffffffffffffffff811180156112a157600080fd5b506040519080825280602002602001820160405280156112d557816020015b60608152602001906001900390816112c05790505b50935060008090505b8181101561147c578273ffffffffffffffffffffffffffffffffffffffff1663edf26d9b826040518263ffffffff1660e01b815260040161131f91906139ce565b60206040518083038186803b15801561133757600080fd5b505afa15801561134b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136f9190612823565b87828151811061137b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1663fa52c7d88883815181106113dd57fe5b60200260200101516040518263ffffffff1660e01b81526004016114019190613669565b60006040518083038186803b15801561141957600080fd5b505afa15801561142d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611456919061284c565b905085828151811061146457fe5b602002602001018190525080806001019150506112de565b506000811161148c5760006114ad565b8561149a8260014201611cef565b815181106114a457fe5b60200260200101515b975060006114b96117ac565b90508167ffffffffffffffff811180156114d257600080fd5b506040519080825280602002602001820160405280156115015781602001602082028036833780820191505090505b5095508073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561154a57600080fd5b505afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115829190612bc0565b935060008090505b82811015611653578173ffffffffffffffffffffffffffffffffffffffff166370a082318983815181106115ba57fe5b60200260200101516040518263ffffffff1660e01b81526004016115de9190613669565b60206040518083038186803b1580156115f657600080fd5b505afa15801561160a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162e9190612bc0565b87828151811061163a57fe5b602002602001018181525050808060010191505061158a565b5061165c611ebe565b975050505090919293949596979899565b60008073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f6906138d1565b60405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346bcb49d6040518163ffffffff1660e01b815260040161175790613971565b60206040518083038186803b15801561176f57600080fd5b505afa158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a79190612823565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346bcb49d6040518163ffffffff1660e01b81526004016118069061389f565b60206040518083038186803b15801561181e57600080fd5b505afa158015611832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118569190612823565b905090565b6118636122db565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e990613931565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600460009054906101000a900463ffffffff1681565b6004809054906101000a900463ffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611a1660014201611f79565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060006003600085815260200190815260200160002090508060000160009054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681600001601c9054906101000a900463ffffffff168063ffffffff1690509250925050915091565b6000600260008363ffffffff168152602001908152602001600020600001549050919050565b6060815167ffffffffffffffff81118015611b0d57600080fd5b50604051908082528060200260200182016040528015611b3c5781602001602082028036833780820191505090505b509050600080905060008090505b8351811015611c0057611bbd611b748784888581518110611b6757fe5b6020026020010151610792565b600260008a8581518110611b8457fe5b602002602001015163ffffffff16815260200190815260200160002060000154868481518110611bb057fe5b6020026020010151611129565b838281518110611bc957fe5b602002602001019015159081151581525050848181518110611be757fe5b6020026020010151820191508080600101915050611b4a565b5050949350505050565b6000600260008363ffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346bcb49d6040518163ffffffff1660e01b8152600401611c9a906138b8565b60206040518083038186803b158015611cb257600080fd5b505afa158015611cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cea9190612823565b905090565b600080611cfa611dd1565b905060006001600460089054906101000a900461ffff160161ffff16600260008463ffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff16850381611d5257fe5b048263ffffffff16019050848181611d6657fe5b0661ffff169250505092915050565b60036020528060005260406000206000915090508060000160009054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169080600001601c9054906101000a900463ffffffff16905082565b600060016004809054906101000a900463ffffffff16600460009054906101000a900463ffffffff160103905090565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525086604051602001611e4c9291906135e4565b60405160208183030381529060405280519060200120905060018186868660405160008152602001604052604051611e87949392919061376c565b6020604051602081039080840390855afa158015611ea9573d6000803e3d6000fd5b50505060206040510351915050949350505050565b6000806004809054906101000a900463ffffffff16600460009054906101000a900463ffffffff1601905060008163ffffffff161415611f02576000915050611f66565b42600460089054906101000a900461ffff1661ffff16600260006001850363ffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff160163ffffffff161015611f5e5780915050611f66565b600181039150505b90565b6000611f7442611f79565b905090565b600080611f84611c40565b905060008173ffffffffffffffffffffffffffffffffffffffff16639031d9136040518163ffffffff1660e01b815260040160206040518083038186803b158015611fce57600080fd5b505afa158015611fe2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120069190612bc0565b9050600081141561201c576000925050506120b9565b60006120288286611cef565b90508273ffffffffffffffffffffffffffffffffffffffff1663edf26d9b826040518263ffffffff1660e01b815260040161206391906139ce565b60206040518083038186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b39190612823565b93505050505b919050565b60026020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060010160049054906101000a90046fffffffffffffffffffffffffffffffff16905083565b61211c6122db565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290613931565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561221b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122129061383f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b60008082840190508381101561232e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123259061385f565b60405180910390fd5b8091505092915050565b60008083141561234b57600090506123a2565b600082840290508284828161235c57fe5b041461239d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239490613911565b60405180910390fd5b809150505b92915050565b60008082905060008090505b85518110156124465760008682815181106123cb57fe5b6020026020010151905080831161240c5782816040516020016123ef9291906135b8565b604051602081830303815290604052805190602001209250612438565b808360405160200161241f9291906135b8565b6040516020818303038152906040528051906020012092505b5080806001019150506123b4565b508381149150509392505050565b60008135905061246381613fae565b92915050565b60008151905061247881613fae565b92915050565b60008083601f84011261249057600080fd5b8235905067ffffffffffffffff8111156124a957600080fd5b6020830191508360208202830111156124c157600080fd5b9250929050565b600082601f8301126124d957600080fd5b81356124ec6124e782613b42565b613b15565b9150818183526020840193506020810190508385602084028201111561251157600080fd5b60005b83811015612541578161252788826126d4565b845260208401935060208301925050600181019050612514565b5050505092915050565b600082601f83011261255c57600080fd5b813561256f61256a82613b6a565b613b15565b9150818183526020840193506020810190508385602084028201111561259457600080fd5b60005b838110156125c457816125aa88826127a6565b845260208401935060208301925050600181019050612597565b5050505092915050565b600082601f8301126125df57600080fd5b81356125f26125ed82613b92565b613b15565b9150818183526020840193506020810190508385602084028201111561261757600080fd5b60005b83811015612647578161262d88826127d0565b84526020840193506020830192505060018101905061261a565b5050505092915050565b600082601f83011261266257600080fd5b813561267561267082613bba565b613b15565b9150818183526020840193506020810190508385602084028201111561269a57600080fd5b60005b838110156126ca57816126b088826127e5565b84526020840193506020830192505060018101905061269d565b5050505092915050565b6000813590506126e381613fc5565b92915050565b600082601f8301126126fa57600080fd5b813561270d61270882613be2565b613b15565b9150808252602083016020830185838301111561272957600080fd5b612734838284613f47565b50505092915050565b600082601f83011261274e57600080fd5b815161276161275c82613c0e565b613b15565b9150808252602083016020830185838301111561277d57600080fd5b612788838284613f56565b50505092915050565b6000813590506127a081613fdc565b92915050565b6000813590506127b581613ff3565b92915050565b6000815190506127ca81613ff3565b92915050565b6000813590506127df8161400a565b92915050565b6000813590506127f481614021565b92915050565b60006020828403121561280c57600080fd5b600061281a84828501612454565b91505092915050565b60006020828403121561283557600080fd5b600061284384828501612469565b91505092915050565b6000806040838503121561285f57600080fd5b600061286d85828601612469565b925050602083015167ffffffffffffffff81111561288a57600080fd5b6128968582860161273d565b9150509250929050565b600080602083850312156128b357600080fd5b600083013567ffffffffffffffff8111156128cd57600080fd5b6128d98582860161247e565b92509250509250929050565b6000806000606084860312156128fa57600080fd5b600084013567ffffffffffffffff81111561291457600080fd5b612920868287016124c8565b9350506020612931868287016126d4565b9250506040612942868287016126d4565b9150509250925092565b6000806000806080858703121561296257600080fd5b600085013567ffffffffffffffff81111561297c57600080fd5b612988878288016125ce565b945050602085013567ffffffffffffffff8111156129a557600080fd5b6129b1878288016126e9565b935050604085013567ffffffffffffffff8111156129ce57600080fd5b6129da8782880161254b565b925050606085013567ffffffffffffffff8111156129f757600080fd5b612a03878288016124c8565b91505092959194509250565b600060208284031215612a2157600080fd5b6000612a2f848285016126d4565b91505092915050565b60008060008060808587031215612a4e57600080fd5b6000612a5c878288016126d4565b9450506020612a6d878288016127e5565b9350506040612a7e878288016126d4565b9250506060612a8f878288016126d4565b91505092959194509250565b60008060408385031215612aae57600080fd5b600083013567ffffffffffffffff811115612ac857600080fd5b612ad4858286016126e9565b925050602083013567ffffffffffffffff811115612af157600080fd5b612afd858286016126e9565b9150509250929050565b600080600060608486031215612b1c57600080fd5b600084013567ffffffffffffffff811115612b3657600080fd5b612b42868287016126e9565b9350506020612b53868287016127a6565b9250506040612b64868287016127a6565b9150509250925092565b600060208284031215612b8057600080fd5b6000612b8e84828501612791565b91505092915050565b600060208284031215612ba957600080fd5b6000612bb7848285016127a6565b91505092915050565b600060208284031215612bd257600080fd5b6000612be0848285016127bb565b91505092915050565b60008060008060808587031215612bff57600080fd5b6000612c0d878288016127a6565b945050602085013567ffffffffffffffff811115612c2a57600080fd5b612c36878288016124c8565b935050604085013567ffffffffffffffff811115612c5357600080fd5b612c5f878288016126e9565b925050606085013567ffffffffffffffff811115612c7c57600080fd5b612c88878288016126e9565b91505092959194509250565b60008060408385031215612ca757600080fd5b6000612cb5858286016127a6565b9250506020612cc6858286016127a6565b9150509250929050565b600060208284031215612ce257600080fd5b6000612cf0848285016127d0565b91505092915050565b600080600080600080600060e0888a031215612d1457600080fd5b6000612d228a828b016127d0565b9750506020612d338a828b016126d4565b965050604088013567ffffffffffffffff811115612d5057600080fd5b612d5c8a828b016124c8565b955050606088013567ffffffffffffffff811115612d7957600080fd5b612d858a828b0161254b565b945050608088013567ffffffffffffffff811115612da257600080fd5b612dae8a828b01612651565b93505060a088013567ffffffffffffffff811115612dcb57600080fd5b612dd78a828b016124c8565b92505060c088013567ffffffffffffffff811115612df457600080fd5b612e008a828b016124c8565b91505092959891949750929550565b6000612e1b8383612e9b565b60208301905092915050565b6000612e338383613104565b60208301905092915050565b6000612e4b8383613122565b60208301905092915050565b6000612e6383836131fd565b905092915050565b6000612e778383613547565b60208301905092915050565b6000612e8f838361358b565b60208301905092915050565b612ea481613de4565b82525050565b612eb381613de4565b82525050565b6000612ec482613c9a565b612ece8185613d40565b9350612ed983613c3a565b8060005b83811015612f0a578151612ef18882612e0f565b9750612efc83613cf2565b925050600181019050612edd565b5085935050505092915050565b6000612f2282613ca5565b612f2c8185613d51565b9350612f3783613c4a565b8060005b83811015612f68578151612f4f8882612e27565b9750612f5a83613cff565b925050600181019050612f3b565b5085935050505092915050565b6000612f8082613cb0565b612f8a8185613d62565b9350612f9583613c5a565b8060005b83811015612fc6578151612fad8882612e3f565b9750612fb883613d0c565b925050600181019050612f99565b5085935050505092915050565b6000612fde82613cbb565b612fe88185613d73565b935083602082028501612ffa85613c6a565b8060005b8581101561303657848403895281516130178582612e57565b945061302283613d19565b925060208a01995050600181019050612ffe565b50829750879550505050505092915050565b600061305382613cc6565b61305d8185613d84565b935061306883613c7a565b8060005b838110156130995781516130808882612e6b565b975061308b83613d26565b92505060018101905061306c565b5085935050505092915050565b60006130b182613cd1565b6130bb8185613d95565b93506130c683613c8a565b8060005b838110156130f75781516130de8882612e83565b97506130e983613d33565b9250506001810190506130ca565b5085935050505092915050565b61310d81613df6565b82525050565b61311c81613df6565b82525050565b61312b81613e02565b82525050565b61313a81613e02565b82525050565b61315161314c82613e02565b613f89565b82525050565b600061316282613cdc565b61316c8185613da6565b935061317c818560208601613f56565b61318581613f9d565b840191505092915050565b600061319b82613cdc565b6131a58185613db7565b93506131b5818560208601613f56565b80840191505092915050565b6131ca81613ea5565b82525050565b6131d981613ec9565b82525050565b6131e881613eed565b82525050565b6131f781613f11565b82525050565b600061320882613ce7565b6132128185613dc2565b9350613222818560208601613f56565b61322b81613f9d565b840191505092915050565b6000613243602683613dd3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a9601b83613dd3565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006132e9600c83613dd3565b91507f464344206f766572666c6f7700000000000000000000000000000000000000006000830152602082019050919050565b7f5374616b696e6742616e6b000000000000000000000000000000000000000000815250565b7f56616c696461746f725265676973747279000000000000000000000000000000815250565b6000613375601283613dd3565b91507f5f726567697374727920697320656d70747900000000000000000000000000006000830152602082019050919050565b60006133b5602183613dd3565b91507f76616c696461746f7220696e636c75646564206d6f7265207468616e206f6e6360008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061341b602183613dd3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613481602083613dd3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006134c1601d83613dd3565b91507f6e6f7420656e6f75676820706f776572207761732067617468657265640000006000830152602082019050919050565b7f554d420000000000000000000000000000000000000000000000000000000000815250565b61352381613e0c565b82525050565b61353281613e28565b82525050565b61354181613e56565b82525050565b61355081613e7e565b82525050565b61355f81613e7e565b82525050565b61357661357182613e7e565b613f93565b82525050565b61358581613f35565b82525050565b61359481613e88565b82525050565b6135a381613e88565b82525050565b6135b281613e98565b82525050565b60006135c48285613140565b6020820191506135d48284613140565b6020820191508190509392505050565b60006135f08285613190565b91506135fc8284613140565b6020820191508190509392505050565b60006136188286613190565b91506136248285613140565b6020820191506136348284613565565b602082019150819050949350505050565b60006136518285613190565b915061365d8284613190565b91508190509392505050565b600060208201905061367e6000830184612eaa565b92915050565b6000602082019050818103600083015261369e8184612f17565b905092915050565b600060208201905081810360008301526136c08184612f75565b905092915050565b600060408201905081810360008301526136e28185613048565b905081810360208301526136f681846130a6565b90509392505050565b60006020820190506137146000830184613113565b92915050565b600060208201905061372f6000830184613131565b92915050565b600060608201905061374a6000830186613131565b613757602083018561359a565b613764604083018461351a565b949350505050565b60006080820190506137816000830187613131565b61378e60208301866135a9565b61379b6040830185613131565b6137a86060830184613131565b95945050505050565b600060208201905081810360008301526137cb8184613157565b905092915050565b60006020820190506137e860008301846131c1565b92915050565b600060208201905061380360008301846131d0565b92915050565b600060208201905061381e60008301846131df565b92915050565b600060208201905061383960008301846131ee565b92915050565b6000602082019050818103600083015261385881613236565b9050919050565b600060208201905081810360008301526138788161329c565b9050919050565b60006020820190508181036000830152613898816132dc565b9050919050565b60006020820190506138b36000830161331c565b919050565b60006020820190506138cc60008301613342565b919050565b600060208201905081810360008301526138ea81613368565b9050919050565b6000602082019050818103600083015261390a816133a8565b9050919050565b6000602082019050818103600083015261392a8161340e565b9050919050565b6000602082019050818103600083015261394a81613474565b9050919050565b6000602082019050818103600083015261396a816134b4565b9050919050565b6000602082019050613985600083016134f4565b919050565b600060208201905061399f6000830184613529565b92915050565b60006040820190506139ba6000830185613538565b6139c7602083018461359a565b9392505050565b60006020820190506139e36000830184613556565b92915050565b6000610140820190506139ff600083018d613556565b613a0c602083018c613529565b613a19604083018b61359a565b613a26606083018a61359a565b613a336080830189612eaa565b613a4060a083018861359a565b81810360c0830152613a528187612eb9565b905081810360e0830152613a668186613048565b9050818103610100830152613a7b8185612fd3565b9050613a8b610120830184613556565b9b9a5050505050505050505050565b6000604082019050613aaf6000830185613556565b613abc6020830184613556565b9392505050565b6000602082019050613ad8600083018461359a565b92915050565b6000606082019050613af3600083018661357c565b613b006020830185613556565b613b0d6040830184613556565b949350505050565b6000604051905081810181811067ffffffffffffffff82111715613b3857600080fd5b8060405250919050565b600067ffffffffffffffff821115613b5957600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613b8157600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613ba957600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613bd157600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613bf957600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613c2557600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613def82613e36565b9050919050565b60008115159050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b6000613eb082613eb7565b9050919050565b6000613ec282613e36565b9050919050565b6000613ed482613edb565b9050919050565b6000613ee682613e36565b9050919050565b6000613ef882613eff565b9050919050565b6000613f0a82613e36565b9050919050565b6000613f1c82613f23565b9050919050565b6000613f2e82613e36565b9050919050565b6000613f4082613e88565b9050919050565b82818337600083830152505050565b60005b83811015613f74578082015181840152602081019050613f59565b83811115613f83576000848401525b50505050565b6000819050919050565b6000819050919050565b6000601f19601f8301169050919050565b613fb781613de4565b8114613fc257600080fd5b50565b613fce81613e02565b8114613fd957600080fd5b50565b613fe581613e28565b8114613ff057600080fd5b50565b613ffc81613e7e565b811461400757600080fd5b50565b61401381613e88565b811461401e57600080fd5b50565b61402a81613e98565b811461403557600080fd5b5056fea2646970667358221220b13bad52e13b080b7f07c371374ef70f486b2992bd4f9d289d7d965191fe227e64736f6c634300060800330000000000000000000000008f98d3b5c911206c1ac08b9938875620a03bcd59000000000000000000000000000000000000000000000000000000000000003c

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

0000000000000000000000008f98d3b5c911206c1ac08b9938875620a03bcd59000000000000000000000000000000000000000000000000000000000000003c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008f98d3b5c911206c1ac08b9938875620a03bcd59
Arg [1] : 000000000000000000000000000000000000000000000000000000000000003c


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading