Contract 0x09e8f21494e1ee1e166adb740811dd6dc648ea42

Contract Overview

Balance:
0 MATIC
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0c314de358c027aa7746972e3ec585ab9dd2afa14ef5121e511b0294a437707fSet Signer Addre...223760422021-12-07 21:52:29206 days 11 hrs ago0xddd03afed2230d22d331d22b96cfe71b3f617875 IN  0x09e8f21494e1ee1e166adb740811dd6dc648ea420 MATIC0.0004604410
0xe737fe6b6de4f17b3830fd601e994ef927f063601590be9a6be9735efa8211420x60806040220625692021-11-29 12:14:57214 days 20 hrs ago0xddd03afed2230d22d331d22b96cfe71b3f617875 IN  Create: DPSRandom0 MATIC0.0613691394554.35
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DPSRandom

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 2 of 5 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 5 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 4 of 5 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";

contract DPSRandom is Ownable {
    using ECDSA for bytes32;

    address private signerAddress;

    function setSignerAddress(address _address) external onlyOwner {
        signerAddress = _address;
    }

    function getRandomUnverified(
        address _address,
        uint256 _blockNumber,
        bytes32 _hash1,
        bytes32 _hash2,
        uint256 _blockTimestamp,
        string memory _entropy,
        uint256 _min,
        uint256 _max
    ) public pure returns (uint256) {
        require(_min < _max, "Min has to be smaller than max");

        return
            (uint256(
                keccak256(
                    abi.encodePacked(
                        _address,
                        _blockNumber,
                        _hash1,
                        _hash2,
                        _blockTimestamp,
                        _entropy,
                        _min,
                        _max
                    )
                )
            ) % (_max - _min + 1)) + _min;
    }

    function getRandom(
        address _address,
        uint256 _blockNumber,
        bytes32 _hash1,
        bytes32 _hash2,
        uint256 _blockTimestamp,
        bytes memory _signature,
        string memory _entropy,
        uint256 _min,
        uint256 _max
    ) public view returns (uint256) {
        require(
            signerAddress ==
                keccak256(
                    abi.encodePacked(
                        _address,
                        _blockNumber,
                        _hash1,
                        _hash2,
                        _blockTimestamp
                    )
                ).toEthSignedMessageHash().recover(_signature),
            "Bad signature"
        );

        return
            getRandomUnverified(
                _address,
                _blockNumber,
                _hash1,
                _hash2,
                _blockTimestamp,
                _entropy,
                _min,
                _max
            );
    }

    function getRandomBatch(
        address _address,
        uint256[] memory _blockNumber,
        bytes32[] memory _hash1,
        bytes32[] memory _hash2,
        uint256[] memory _blockTimestamp,
        bytes[] memory _signature,
        string[] memory _entropy,
        uint256 _min,
        uint256 _max
    ) public view returns (uint256[] memory) {
        require(_blockNumber.length == _hash1.length, "Array length mismatch");
        require(_blockNumber.length == _hash2.length, "Array length mismatch");
        require(
            _blockNumber.length == _blockTimestamp.length,
            "Array length mismatch"
        );
        require(
            _blockNumber.length == _signature.length,
            "Array length mismatch"
        );
        require(
            _blockNumber.length == _entropy.length,
            "Array length mismatch"
        );

        uint256[] memory results = new uint256[](_blockNumber.length);
        for (uint256 i; i < _blockNumber.length; i++) {
            results[i] = getRandom(
                _address,
                _blockNumber[i],
                _hash1[i],
                _hash2[i],
                _blockTimestamp[i],
                _signature[i],
                _entropy[i],
                _min,
                _max
            );
        }
        return results;
    }

    function getRandomUnverifiedBatch(
        address _address,
        uint256[] memory _blockNumber,
        bytes32[] memory _hash1,
        bytes32[] memory _hash2,
        uint256[] memory _blockTimestamp,
        string[] memory _entropy,
        uint256 _min,
        uint256 _max
    ) public pure returns (uint256[] memory) {
        require(_blockNumber.length == _hash1.length, "Array length mismatch");
        require(_blockNumber.length == _hash2.length, "Array length mismatch");
        require(
            _blockNumber.length == _blockTimestamp.length,
            "Array length mismatch"
        );
        require(
            _blockNumber.length == _entropy.length,
            "Array length mismatch"
        );

        uint256[] memory results = new uint256[](_blockNumber.length);
        for (uint256 i; i < _blockNumber.length; i++) {
            results[i] = getRandomUnverified(
                _address,
                _blockNumber[i],
                _hash1[i],
                _hash2[i],
                _blockTimestamp[i],
                _entropy[i],
                _min,
                _max
            );
        }
        return results;
    }
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "none",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"bytes32","name":"_hash1","type":"bytes32"},{"internalType":"bytes32","name":"_hash2","type":"bytes32"},{"internalType":"uint256","name":"_blockTimestamp","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"string","name":"_entropy","type":"string"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"getRandom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256[]","name":"_blockNumber","type":"uint256[]"},{"internalType":"bytes32[]","name":"_hash1","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_hash2","type":"bytes32[]"},{"internalType":"uint256[]","name":"_blockTimestamp","type":"uint256[]"},{"internalType":"bytes[]","name":"_signature","type":"bytes[]"},{"internalType":"string[]","name":"_entropy","type":"string[]"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"getRandomBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"bytes32","name":"_hash1","type":"bytes32"},{"internalType":"bytes32","name":"_hash2","type":"bytes32"},{"internalType":"uint256","name":"_blockTimestamp","type":"uint256"},{"internalType":"string","name":"_entropy","type":"string"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"getRandomUnverified","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256[]","name":"_blockNumber","type":"uint256[]"},{"internalType":"bytes32[]","name":"_hash1","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_hash2","type":"bytes32[]"},{"internalType":"uint256[]","name":"_blockTimestamp","type":"uint256[]"},{"internalType":"string[]","name":"_entropy","type":"string[]"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"getRandomUnverifiedBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6113038061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638d91cb331161005b5780638d91cb33146100f45780638da5cb5b14610107578063983769c614610122578063f2fde38b1461013557600080fd5b8063046dc1661461008d57806362b75922146100a257806369171233146100cb578063715018a6146100ec575b600080fd5b6100a061009b366004610bab565b610148565b005b6100b56100b0366004610e13565b61019d565b6040516100c29190610f2e565b60405180910390f35b6100de6100d9366004610f72565b61037d565b6040519081526020016100c2565b6100a061049f565b6100de610102366004611002565b6104d5565b6000546040516001600160a01b0390911681526020016100c2565b6100b561013036600461108a565b610595565b6100a0610143366004610bab565b610739565b6000546001600160a01b0316331461017b5760405162461bcd60e51b815260040161017290611162565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b606087518951146101c05760405162461bcd60e51b815260040161017290611197565b86518951146101e15760405162461bcd60e51b815260040161017290611197565b85518951146102025760405162461bcd60e51b815260040161017290611197565b84518951146102235760405162461bcd60e51b815260040161017290611197565b83518951146102445760405162461bcd60e51b815260040161017290611197565b6000895167ffffffffffffffff81111561026057610260610bcd565b604051908082528060200260200182016040528015610289578160200160208202803683370190505b50905060005b8a5181101561036e5761033f8c8c83815181106102ae576102ae6111c6565b60200260200101518c84815181106102c8576102c86111c6565b60200260200101518c85815181106102e2576102e26111c6565b60200260200101518c86815181106102fc576102fc6111c6565b60200260200101518c8781518110610316576103166111c6565b60200260200101518c8881518110610330576103306111c6565b60200260200101518c8c61037d565b828281518110610351576103516111c6565b602090810291909101015280610366816111f2565b91505061028f565b509a9950505050505050505050565b6040516bffffffffffffffffffffffff1960608b901b1660208201526034810189905260548101889052607481018790526094810186905260009061043490869061042e9060b401604051602081830303815290604052805190602001206040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906107d4565b6001546001600160a01b039081169116146104815760405162461bcd60e51b815260206004820152600d60248201526c426164207369676e617475726560981b6044820152606401610172565b6104918a8a8a8a8a8989896104d5565b9a9950505050505050505050565b6000546001600160a01b031633146104c95760405162461bcd60e51b815260040161017290611162565b6104d360006107f8565b565b60008183106105265760405162461bcd60e51b815260206004820152601e60248201527f4d696e2068617320746f20626520736d616c6c6572207468616e206d617800006044820152606401610172565b82610531818461120d565b61053c906001611224565b8a8a8a8a8a8a8a8a60405160200161055b98979695949392919061123c565b6040516020818303038152906040528051906020012060001c61057e91906112be565b6105889190611224565b9998505050505050505050565b606086518851146105b85760405162461bcd60e51b815260040161017290611197565b85518851146105d95760405162461bcd60e51b815260040161017290611197565b84518851146105fa5760405162461bcd60e51b815260040161017290611197565b835188511461061b5760405162461bcd60e51b815260040161017290611197565b6000885167ffffffffffffffff81111561063757610637610bcd565b604051908082528060200260200182016040528015610660578160200160208202803683370190505b50905060005b895181101561072b576106fc8b8b8381518110610685576106856111c6565b60200260200101518b848151811061069f5761069f6111c6565b60200260200101518b85815181106106b9576106b96111c6565b60200260200101518b86815181106106d3576106d36111c6565b60200260200101518b87815181106106ed576106ed6111c6565b60200260200101518b8b6104d5565b82828151811061070e5761070e6111c6565b602090810291909101015280610723816111f2565b915050610666565b509998505050505050505050565b6000546001600160a01b031633146107635760405162461bcd60e51b815260040161017290611162565b6001600160a01b0381166107c85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610172565b6107d1816107f8565b50565b60008060006107e38585610848565b915091506107f0816108b8565b509392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008082516041141561087f5760208301516040840151606085015160001a61087387828585610a73565b945094505050506108b1565b8251604014156108a9576020830151604084015161089e868383610b60565b9350935050506108b1565b506000905060025b9250929050565b60008160048111156108cc576108cc6112e0565b14156108d55750565b60018160048111156108e9576108e96112e0565b14156109375760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610172565b600281600481111561094b5761094b6112e0565b14156109995760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610172565b60038160048111156109ad576109ad6112e0565b1415610a065760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610172565b6004816004811115610a1a57610a1a6112e0565b14156107d15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610172565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610aaa5750600090506003610b57565b8460ff16601b14158015610ac257508460ff16601c14155b15610ad35750600090506004610b57565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610b27573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610b5057600060019250925050610b57565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01610b8187828885610a73565b935093505050935093915050565b80356001600160a01b0381168114610ba657600080fd5b919050565b600060208284031215610bbd57600080fd5b610bc682610b8f565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610c0c57610c0c610bcd565b604052919050565b600067ffffffffffffffff821115610c2e57610c2e610bcd565b5060051b60200190565b600082601f830112610c4957600080fd5b81356020610c5e610c5983610c14565b610be3565b82815260059290921b84018101918181019086841115610c7d57600080fd5b8286015b84811015610c985780358352918301918301610c81565b509695505050505050565b600082601f830112610cb457600080fd5b813567ffffffffffffffff811115610cce57610cce610bcd565b610ce1601f8201601f1916602001610be3565b818152846020838601011115610cf657600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112610d2457600080fd5b81356020610d34610c5983610c14565b82815260059290921b84018101918181019086841115610d5357600080fd5b8286015b84811015610c9857803567ffffffffffffffff811115610d775760008081fd5b610d858986838b0101610ca3565b845250918301918301610d57565b600082601f830112610da457600080fd5b81356020610db4610c5983610c14565b82815260059290921b84018101918181019086841115610dd357600080fd5b8286015b84811015610c9857803567ffffffffffffffff811115610df75760008081fd5b610e058986838b0101610ca3565b845250918301918301610dd7565b60008060008060008060008060006101208a8c031215610e3257600080fd5b610e3b8a610b8f565b985060208a013567ffffffffffffffff80821115610e5857600080fd5b610e648d838e01610c38565b995060408c0135915080821115610e7a57600080fd5b610e868d838e01610c38565b985060608c0135915080821115610e9c57600080fd5b610ea88d838e01610c38565b975060808c0135915080821115610ebe57600080fd5b610eca8d838e01610c38565b965060a08c0135915080821115610ee057600080fd5b610eec8d838e01610d13565b955060c08c0135915080821115610f0257600080fd5b50610f0f8c828d01610d93565b93505060e08a013591506101008a013590509295985092959850929598565b6020808252825182820181905260009190848201906040850190845b81811015610f6657835183529284019291840191600101610f4a565b50909695505050505050565b60008060008060008060008060006101208a8c031215610f9157600080fd5b610f9a8a610b8f565b985060208a0135975060408a0135965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115610fd357600080fd5b610fdf8d838e01610ca3565b955060c08c0135915080821115610ff557600080fd5b50610f0f8c828d01610ca3565b600080600080600080600080610100898b03121561101f57600080fd5b61102889610b8f565b97506020890135965060408901359550606089013594506080890135935060a089013567ffffffffffffffff81111561106057600080fd5b61106c8b828c01610ca3565b93505060c0890135915060e089013590509295985092959890939650565b600080600080600080600080610100898b0312156110a757600080fd5b6110b089610b8f565b9750602089013567ffffffffffffffff808211156110cd57600080fd5b6110d98c838d01610c38565b985060408b01359150808211156110ef57600080fd5b6110fb8c838d01610c38565b975060608b013591508082111561111157600080fd5b61111d8c838d01610c38565b965060808b013591508082111561113357600080fd5b61113f8c838d01610c38565b955060a08b013591508082111561115557600080fd5b5061106c8b828c01610d93565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260159082015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611206576112066111dc565b5060010190565b60008282101561121f5761121f6111dc565b500390565b60008219821115611237576112376111dc565b500190565b6bffffffffffffffffffffffff198960601b1681528760148201528660348201528560548201528460748201526000845160005b8181101561128d5760208188018101516094868401015201611270565b8181111561129f576000609483860101525b5090910160948101939093525060b482015260d4019695505050505050565b6000826112db57634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052602160045260246000fdfea164736f6c6343000809000a

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