Base Sepolia Testnet

Contract

0xeB3Ba25400A4d716d091090942705aD51d04B7ea

Overview

ETH Balance

0 ETH

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount
Verify Attestati...282358692025-07-11 13:20:26151 days ago1752240026IN
0xeB3Ba254...51d04B7ea
0 ETH0.000000030.00097012
Verify Attestati...279754202025-07-05 12:38:48157 days ago1751719128IN
0xeB3Ba254...51d04B7ea
0 ETH0.000000070.00097007
Verify Attestati...278945922025-07-03 15:44:32159 days ago1751557472IN
0xeB3Ba254...51d04B7ea
0 ETH0.000000260.00120008

Latest 1 internal transaction

Parent Transaction Hash Block From To Amount
278938762025-07-03 15:20:40159 days ago1751556040
0xeB3Ba254...51d04B7ea
 Contract Creation0 ETH

Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xBbFcCf10...529797a6D
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
PlutoAttestationVerifier

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
No with 200 runs

Other Settings:
cancun EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/Ownable.sol";

/// @title Verifier
/// @notice A contract that verifies signatures
contract Verifier is Ownable {
    /// @notice Mapping of notary addresses to their validity
    mapping(address => bool) public isNotary;

    /// valid digests for a given address
    mapping(bytes32 => address) public digests;

    /// @notice Error for invalid signatures
    error InvalidSignature();
    /// @notice Error for invalid notary addresses
    error InvalidNotary();
    /// @notice Error for invalid digest
    error InvalidDigest();
    /// @notice Error for invalid signature length
    error InvalidSignatureLength();
    /// @notice Error for duplicate proof, meaning the proofs is already associated with another address
    error DuplicateProof();

    /// @notice Constructor configures the notary address
    /// @param notaryAddress The address of the notary to add
    constructor(address notaryAddress) Ownable(msg.sender) {
        isNotary[notaryAddress] = true;
    }

    /// @notice Adds a notary
    /// @param notaryAddress The address of the notary to add
    function addNotary(address notaryAddress) external onlyOwner {
        isNotary[notaryAddress] = true;
    }

    /// @notice Removes a notary
    /// @param notaryAddress The address of the notary to remove
    function removeNotary(address notaryAddress) external onlyOwner {
        isNotary[notaryAddress] = false;
    }

    // Check to see that the digest is a merkle root of a keccak256 hash of a leafs = (keccak(value), keccak(manifest))
    function verify_digest(bytes32 digest, bytes32 manifest, bytes32 value) internal pure returns (bool) {
        bytes32 root = keccak256(abi.encodePacked(value, manifest));
        return digest == root;
    }

    /// @notice Verifies a signature
    /// @param digest The hash of the data that was signed
    /// @param v The recovery id
    /// @param r The R value of the signature
    /// @param s The S value of the signature
    /// @param signer The address that signed the data
    /// @param manifest The manifest of the data
    /// @param value The value of the data
    function verifyNotarySignature(
        bytes32 digest,
        uint8 v,
        bytes32 r,
        bytes32 s,
        address signer,
        bytes32 manifest,
        bytes32 value
    ) external returns (bool) {
        // check if the signer is a notary
        if (!isNotary[signer]) {
            revert InvalidNotary();
        }
        if (!verify_digest(digest, manifest, value)) {
            revert InvalidDigest();
        }

        // r is the x-coordinate of the curve point
        // s is the y-coordinate of the curve point
        // v is 27 or 28 based on the y-value being even or odd
        // verify the signature
        address recoveredSigner = ecrecover(digest, v, r, s);
        if (recoveredSigner == address(0) || recoveredSigner != signer) {
            revert InvalidSignature();
        }

        // TODO(WJ 2025-02-20): Should check for any sender.
        if (digests[digest] == msg.sender) {
            revert DuplicateProof();
        }

        digests[digest] = msg.sender;
        return true;
    }
}

contract PlutoAttestationVerifier {
    struct ProofData {
        string key;
        string value;
    }

    struct AttestationInput {
        string version;
        string scriptRaw;
        string issuedAt;
        string nonce;
        string sessionId;
        ProofData[] data;
    }

    struct AttestationSignature {
        bytes32 digest;
        uint8 v;
        bytes32 r;
        bytes32 s;
        address expectedSigner;
    }

    Verifier public verifier;

    constructor(address notaryAddress) {
        verifier = new Verifier(notaryAddress);
    }

    /**
     * @dev Calculate script hash from version and script content
     */
    function calculateScriptHash(string memory version, string memory scriptRaw) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(version, scriptRaw));
    }

    /**
     * @dev Calculate session hash from all session components
     */
    function calculateSessionHash(
        string memory version,
        string memory issuedAt,
        string memory nonce,
        string memory sessionId,
        ProofData[] memory data
    ) public pure returns (bytes32) {
        // Build the hash incrementally
        bytes memory hashData = abi.encodePacked(version, issuedAt, nonce, sessionId);

        for (uint256 i = 0; i < data.length; i++) {
            hashData = abi.encodePacked(hashData, data[i].key, data[i].value);
        }

        return keccak256(hashData);
    }

    /**
     * @dev Calculate digest from session and script hashes
     */
    function calculateDigest(bytes32 sessionHash, bytes32 scriptHash) public pure returns (bytes32) {
        // reportData = sessionHash + scriptHash (64 bytes)
        bytes memory reportData = abi.encodePacked(sessionHash, scriptHash);
        return keccak256(reportData);
    }

    /**
     * @dev Verify complete attestation by calculating hashes and checking signature
     */
    function verifyAttestation(AttestationInput memory input, AttestationSignature memory signature)
        public
        returns (bool)
    {
        // Calculate script hash
        bytes32 scriptHash = calculateScriptHash(input.version, input.scriptRaw);

        // Calculate session hash
        bytes32 sessionHash =
            calculateSessionHash(input.version, input.issuedAt, input.nonce, input.sessionId, input.data);

        // Calculate digest
        bytes32 digest = calculateDigest(sessionHash, scriptHash);

        // Verify the digest matches
        if (digest != signature.digest) {
            return false;
        }

        // Call the signature verification contract
        bool success = verifier.verifyNotarySignature(
            signature.digest, signature.v, signature.r, signature.s, signature.expectedSigner, scriptHash, sessionHash
        );

        if (!success) {
            return false;
        }

        return success;
    }

    /**
     * @dev Batch verify multiple attestations
     */
    function verifyMultipleAttestations(AttestationInput[] memory inputs, AttestationSignature[] memory signatures)
        public
        returns (bool[] memory)
    {
        require(inputs.length == signatures.length, "Array length mismatch");

        bool[] memory results = new bool[](inputs.length);

        for (uint256 i = 0; i < inputs.length; i++) {
            results[i] = verifyAttestation(inputs[i], signatures[i]);
        }

        return results;
    }

    /**
     * @dev Get calculated hashes for debugging
     */
    function getCalculatedHashes(AttestationInput memory input)
        public
        pure
        returns (bytes32 scriptHash, bytes32 sessionHash, bytes32 digest)
    {
        scriptHash = calculateScriptHash(input.version, input.scriptRaw);
        sessionHash = calculateSessionHash(input.version, input.issuedAt, input.nonce, input.sessionId, input.data);
        digest = calculateDigest(sessionHash, scriptHash);
    }

    /**
     * @dev Helper function to create ProofData array from parallel arrays
     */
    function createProofDataArray(string[] memory keys, string[] memory values)
        public
        pure
        returns (ProofData[] memory)
    {
        require(keys.length == values.length, "Array length mismatch");

        ProofData[] memory proofData = new ProofData[](keys.length);
        for (uint256 i = 0; i < keys.length; i++) {
            proofData[i] = ProofData(keys[i], values[i]);
        }

        return proofData;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"notaryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"sessionHash","type":"bytes32"},{"internalType":"bytes32","name":"scriptHash","type":"bytes32"}],"name":"calculateDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"scriptRaw","type":"string"}],"name":"calculateScriptHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"issuedAt","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"string","name":"sessionId","type":"string"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"data","type":"tuple[]"}],"name":"calculateSessionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"createProofDataArray","outputs":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"","type":"tuple[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"scriptRaw","type":"string"},{"internalType":"string","name":"issuedAt","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"string","name":"sessionId","type":"string"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"data","type":"tuple[]"}],"internalType":"struct PlutoAttestationVerifier.AttestationInput","name":"input","type":"tuple"}],"name":"getCalculatedHashes","outputs":[{"internalType":"bytes32","name":"scriptHash","type":"bytes32"},{"internalType":"bytes32","name":"sessionHash","type":"bytes32"},{"internalType":"bytes32","name":"digest","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"contract Verifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"scriptRaw","type":"string"},{"internalType":"string","name":"issuedAt","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"string","name":"sessionId","type":"string"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"data","type":"tuple[]"}],"internalType":"struct PlutoAttestationVerifier.AttestationInput","name":"input","type":"tuple"},{"components":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address","name":"expectedSigner","type":"address"}],"internalType":"struct PlutoAttestationVerifier.AttestationSignature","name":"signature","type":"tuple"}],"name":"verifyAttestation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"scriptRaw","type":"string"},{"internalType":"string","name":"issuedAt","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"string","name":"sessionId","type":"string"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"data","type":"tuple[]"}],"internalType":"struct PlutoAttestationVerifier.AttestationInput[]","name":"inputs","type":"tuple[]"},{"components":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address","name":"expectedSigner","type":"address"}],"internalType":"struct PlutoAttestationVerifier.AttestationSignature[]","name":"signatures","type":"tuple[]"}],"name":"verifyMultipleAttestations","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"nonpayable","type":"function"}]

0x608060405234801561000f575f5ffd5b5060405161271738038061271783398181016040528101906100319190610111565b8060405161003e906100a6565b610048919061014b565b604051809103905ff080158015610061573d5f5f3e3d5ffd5b505f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610164565b610d0c80611a0b83390190565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100e0826100b7565b9050919050565b6100f0816100d6565b81146100fa575f5ffd5b50565b5f8151905061010b816100e7565b92915050565b5f60208284031215610126576101256100b3565b5b5f610133848285016100fd565b91505092915050565b610145816100d6565b82525050565b5f60208201905061015e5f83018461013c565b92915050565b61189a806101715f395ff3fe608060405234801561000f575f5ffd5b5060043610610086575f3560e01c80639e5d2fe5116100595780639e5d2fe514610138578063b2534ad514610168578063ec9e332d14610198578063f523285a146101ca57610086565b80632b7ac3f31461008a57806333c68ff8146100a857806366f778e6146100d85780638c27081814610108575b5f5ffd5b6100926101fa565b60405161009f919061079c565b60405180910390f35b6100c260048036038101906100bd9190610e81565b61021e565b6040516100cf9190610fb9565b60405180910390f35b6100f260048036038101906100ed9190610fd9565b61033a565b6040516100ff9190611042565b60405180910390f35b610122600480360381019061011d9190611139565b61046e565b60405161012f919061130b565b60405180910390f35b610152600480360381019061014d919061132b565b610599565b60405161015f919061143d565b60405180910390f35b610182600480360381019061017d9190611456565b610654565b60405161018f919061143d565b60405180910390f35b6101b260048036038101906101ad91906114cc565b610686565b6040516101c193929190611513565b60405180910390f35b6101e460048036038101906101df9190611548565b6106d1565b6040516101f1919061143d565b60405180910390f35b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114610264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025b906115e0565b60405180910390fd5b5f835167ffffffffffffffff8111156102805761027f6107da565b5b6040519080825280602002602001820160405280156102ae5781602001602082028036833780820191505090505b5090505f5f90505b845181101561032f576102fd8582815181106102d5576102d46115fe565b5b60200260200101518583815181106102f0576102ef6115fe565b5b602002602001015161033a565b8282815181106103105761030f6115fe565b5b60200260200101901515908115158152505080806001019150506102b6565b508091505092915050565b5f5f61034d845f01518560200151610654565b90505f610370855f01518660400151876060015188608001518960a00151610599565b90505f61037d82846106d1565b9050845f01518114610394575f9350505050610468565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631c39b7d7875f0151886020015189604001518a606001518b608001518a8a6040518863ffffffff1660e01b815260040161040d9796959493929190611649565b6020604051808303815f875af1158015610429573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044d91906116e0565b905080610460575f945050505050610468565b809450505050505b92915050565b606081518351146104b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ab906115e0565b60405180910390fd5b5f835167ffffffffffffffff8111156104d0576104cf6107da565b5b60405190808252806020026020018201604052801561050957816020015b6104f6610708565b8152602001906001900390816104ee5790505b5090505f5f90505b845181101561058e576040518060400160405280868381518110610538576105376115fe565b5b60200260200101518152602001858381518110610558576105576115fe565b5b6020026020010151815250828281518110610576576105756115fe565b5b60200260200101819052508080600101915050610511565b508091505092915050565b5f5f868686866040516020016105b29493929190611745565b60405160208183030381529060405290505f5f90505b835181101561063f57818482815181106105e5576105e46115fe565b5b60200260200101515f0151858381518110610603576106026115fe565b5b602002602001015160200151604051602001610621939291906117c6565b604051602081830303815290604052915080806001019150506105c8565b50808051906020012091505095945050505050565b5f82826040516020016106689291906117f6565b60405160208183030381529060405280519060200120905092915050565b5f5f5f61069a845f01518560200151610654565b92506106bc845f01518560400151866060015187608001518860a00151610599565b91506106c882846106d1565b90509193909250565b5f5f83836040516020016106e6929190611839565b6040516020818303038152906040529050808051906020012091505092915050565b604051806040016040528060608152602001606081525090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61076461075f61075a84610722565b610741565b610722565b9050919050565b5f6107758261074a565b9050919050565b5f6107868261076b565b9050919050565b6107968161077c565b82525050565b5f6020820190506107af5f83018461078d565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610810826107ca565b810181811067ffffffffffffffff8211171561082f5761082e6107da565b5b80604052505050565b5f6108416107b5565b905061084d8282610807565b919050565b5f67ffffffffffffffff82111561086c5761086b6107da565b5b602082029050602081019050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f67ffffffffffffffff8211156108a7576108a66107da565b5b6108b0826107ca565b9050602081019050919050565b828183375f83830152505050565b5f6108dd6108d88461088d565b610838565b9050828152602081018484840111156108f9576108f8610889565b5b6109048482856108bd565b509392505050565b5f82601f8301126109205761091f6107c6565b5b81356109308482602086016108cb565b91505092915050565b5f67ffffffffffffffff821115610953576109526107da565b5b602082029050602081019050919050565b5f6040828403121561097957610978610881565b5b6109836040610838565b90505f82013567ffffffffffffffff8111156109a2576109a1610885565b5b6109ae8482850161090c565b5f83015250602082013567ffffffffffffffff8111156109d1576109d0610885565b5b6109dd8482850161090c565b60208301525092915050565b5f6109fb6109f684610939565b610838565b90508083825260208201905060208402830185811115610a1e57610a1d61087d565b5b835b81811015610a6557803567ffffffffffffffff811115610a4357610a426107c6565b5b808601610a508982610964565b85526020850194505050602081019050610a20565b5050509392505050565b5f82601f830112610a8357610a826107c6565b5b8135610a938482602086016109e9565b91505092915050565b5f60c08284031215610ab157610ab0610881565b5b610abb60c0610838565b90505f82013567ffffffffffffffff811115610ada57610ad9610885565b5b610ae68482850161090c565b5f83015250602082013567ffffffffffffffff811115610b0957610b08610885565b5b610b158482850161090c565b602083015250604082013567ffffffffffffffff811115610b3957610b38610885565b5b610b458482850161090c565b604083015250606082013567ffffffffffffffff811115610b6957610b68610885565b5b610b758482850161090c565b606083015250608082013567ffffffffffffffff811115610b9957610b98610885565b5b610ba58482850161090c565b60808301525060a082013567ffffffffffffffff811115610bc957610bc8610885565b5b610bd584828501610a6f565b60a08301525092915050565b5f610bf3610bee84610852565b610838565b90508083825260208201905060208402830185811115610c1657610c1561087d565b5b835b81811015610c5d57803567ffffffffffffffff811115610c3b57610c3a6107c6565b5b808601610c488982610a9c565b85526020850194505050602081019050610c18565b5050509392505050565b5f82601f830112610c7b57610c7a6107c6565b5b8135610c8b848260208601610be1565b91505092915050565b5f67ffffffffffffffff821115610cae57610cad6107da565b5b602082029050602081019050919050565b5f819050919050565b610cd181610cbf565b8114610cdb575f5ffd5b50565b5f81359050610cec81610cc8565b92915050565b5f60ff82169050919050565b610d0781610cf2565b8114610d11575f5ffd5b50565b5f81359050610d2281610cfe565b92915050565b5f610d3282610722565b9050919050565b610d4281610d28565b8114610d4c575f5ffd5b50565b5f81359050610d5d81610d39565b92915050565b5f60a08284031215610d7857610d77610881565b5b610d8260a0610838565b90505f610d9184828501610cde565b5f830152506020610da484828501610d14565b6020830152506040610db884828501610cde565b6040830152506060610dcc84828501610cde565b6060830152506080610de084828501610d4f565b60808301525092915050565b5f610dfe610df984610c94565b610838565b90508083825260208201905060a08402830185811115610e2157610e2061087d565b5b835b81811015610e4a5780610e368882610d63565b84526020840193505060a081019050610e23565b5050509392505050565b5f82601f830112610e6857610e676107c6565b5b8135610e78848260208601610dec565b91505092915050565b5f5f60408385031215610e9757610e966107be565b5b5f83013567ffffffffffffffff811115610eb457610eb36107c2565b5b610ec085828601610c67565b925050602083013567ffffffffffffffff811115610ee157610ee06107c2565b5b610eed85828601610e54565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f8115159050919050565b610f3481610f20565b82525050565b5f610f458383610f2b565b60208301905092915050565b5f602082019050919050565b5f610f6782610ef7565b610f718185610f01565b9350610f7c83610f11565b805f5b83811015610fac578151610f938882610f3a565b9750610f9e83610f51565b925050600181019050610f7f565b5085935050505092915050565b5f6020820190508181035f830152610fd18184610f5d565b905092915050565b5f5f60c08385031215610fef57610fee6107be565b5b5f83013567ffffffffffffffff81111561100c5761100b6107c2565b5b61101885828601610a9c565b925050602061102985828601610d63565b9150509250929050565b61103c81610f20565b82525050565b5f6020820190506110555f830184611033565b92915050565b5f67ffffffffffffffff821115611075576110746107da565b5b602082029050602081019050919050565b5f6110986110938461105b565b610838565b905080838252602082019050602084028301858111156110bb576110ba61087d565b5b835b8181101561110257803567ffffffffffffffff8111156110e0576110df6107c6565b5b8086016110ed898261090c565b855260208501945050506020810190506110bd565b5050509392505050565b5f82601f8301126111205761111f6107c6565b5b8135611130848260208601611086565b91505092915050565b5f5f6040838503121561114f5761114e6107be565b5b5f83013567ffffffffffffffff81111561116c5761116b6107c2565b5b6111788582860161110c565b925050602083013567ffffffffffffffff811115611199576111986107c2565b5b6111a58582860161110c565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61120a826111d8565b61121481856111e2565b93506112248185602086016111f2565b61122d816107ca565b840191505092915050565b5f604083015f8301518482035f8601526112528282611200565b9150506020830151848203602086015261126c8282611200565b9150508091505092915050565b5f6112848383611238565b905092915050565b5f602082019050919050565b5f6112a2826111af565b6112ac81856111b9565b9350836020820285016112be856111c9565b805f5b858110156112f957848403895281516112da8582611279565b94506112e58361128c565b925060208a019950506001810190506112c1565b50829750879550505050505092915050565b5f6020820190508181035f8301526113238184611298565b905092915050565b5f5f5f5f5f60a08688031215611344576113436107be565b5b5f86013567ffffffffffffffff811115611361576113606107c2565b5b61136d8882890161090c565b955050602086013567ffffffffffffffff81111561138e5761138d6107c2565b5b61139a8882890161090c565b945050604086013567ffffffffffffffff8111156113bb576113ba6107c2565b5b6113c78882890161090c565b935050606086013567ffffffffffffffff8111156113e8576113e76107c2565b5b6113f48882890161090c565b925050608086013567ffffffffffffffff811115611415576114146107c2565b5b61142188828901610a6f565b9150509295509295909350565b61143781610cbf565b82525050565b5f6020820190506114505f83018461142e565b92915050565b5f5f6040838503121561146c5761146b6107be565b5b5f83013567ffffffffffffffff811115611489576114886107c2565b5b6114958582860161090c565b925050602083013567ffffffffffffffff8111156114b6576114b56107c2565b5b6114c28582860161090c565b9150509250929050565b5f602082840312156114e1576114e06107be565b5b5f82013567ffffffffffffffff8111156114fe576114fd6107c2565b5b61150a84828501610a9c565b91505092915050565b5f6060820190506115265f83018661142e565b611533602083018561142e565b611540604083018461142e565b949350505050565b5f5f6040838503121561155e5761155d6107be565b5b5f61156b85828601610cde565b925050602061157c85828601610cde565b9150509250929050565b5f82825260208201905092915050565b7f4172726179206c656e677468206d69736d6174636800000000000000000000005f82015250565b5f6115ca601583611586565b91506115d582611596565b602082019050919050565b5f6020820190508181035f8301526115f7816115be565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61163481610cf2565b82525050565b61164381610d28565b82525050565b5f60e08201905061165c5f83018a61142e565b611669602083018961162b565b611676604083018861142e565b611683606083018761142e565b611690608083018661163a565b61169d60a083018561142e565b6116aa60c083018461142e565b98975050505050505050565b6116bf81610f20565b81146116c9575f5ffd5b50565b5f815190506116da816116b6565b92915050565b5f602082840312156116f5576116f46107be565b5b5f611702848285016116cc565b91505092915050565b5f81905092915050565b5f61171f826111d8565b611729818561170b565b93506117398185602086016111f2565b80840191505092915050565b5f6117508287611715565b915061175c8286611715565b91506117688285611715565b91506117748284611715565b915081905095945050505050565b5f81519050919050565b5f81905092915050565b5f6117a082611782565b6117aa818561178c565b93506117ba8185602086016111f2565b80840191505092915050565b5f6117d18286611796565b91506117dd8285611715565b91506117e98284611715565b9150819050949350505050565b5f6118018285611715565b915061180d8284611715565b91508190509392505050565b5f819050919050565b61183361182e82610cbf565b611819565b82525050565b5f6118448285611822565b6020820191506118548284611822565b602082019150819050939250505056fea2646970667358221220a402f71b5be20fde0c68edf4ff51e9b2387f3452196d0baeb0b3e711b36cd56164736f6c634300081e0033608060405234801561000f575f5ffd5b50604051610d0c380380610d0c8339818101604052810190610031919061022b565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100999190610265565b60405180910390fd5b6100b18161010c60201b60201c565b506001805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505061027e565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101fa826101d1565b9050919050565b61020a816101f0565b8114610214575f5ffd5b50565b5f8151905061022581610201565b92915050565b5f602082840312156102405761023f6101cd565b5b5f61024d84828501610217565b91505092915050565b61025f816101f0565b82525050565b5f6020820190506102785f830184610256565b92915050565b610a818061028b5f395ff3fe608060405234801561000f575f5ffd5b5060043610610086575f3560e01c806386785a6f1161005957806386785a6f146101105780638da5cb5b1461012c578063f13eed971461014a578063f2fde38b1461017a57610086565b806301ac42931461008a5780630588565f146100ba5780631c39b7d7146100d6578063715018a614610106575b5f5ffd5b6100a4600480360381019061009f91906107c1565b610196565b6040516100b1919061082b565b60405180910390f35b6100d460048036038101906100cf919061086e565b6101c6565b005b6100f060048036038101906100eb91906108cf565b610225565b6040516100fd9190610986565b60405180910390f35b61010e6104c7565b005b61012a6004803603810190610125919061086e565b6104da565b005b610134610539565b604051610141919061082b565b60405180910390f35b610164600480360381019061015f919061086e565b610560565b6040516101719190610986565b60405180910390f35b610194600480360381019061018f919061086e565b61057d565b005b6002602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6101ce610601565b6001805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166102a6576040517f495b5d7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102b1888484610688565b6102e7576040517f3e78eb9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001898989896040515f815260200160405260405161030a94939291906109bd565b6020604051602081039080840390855afa15801561032a573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061039c57508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156103d3576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1660025f8b81526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610468576040517f5cf8829100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360025f8b81526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001915050979650505050505050565b6104cf610601565b6104d85f6106c2565b565b6104e2610601565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6001602052805f5260405f205f915054906101000a900460ff1681565b610585610601565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105f5575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016105ec919061082b565b60405180910390fd5b6105fe816106c2565b50565b610609610783565b73ffffffffffffffffffffffffffffffffffffffff16610627610539565b73ffffffffffffffffffffffffffffffffffffffff16146106865761064a610783565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161067d919061082b565b60405180910390fd5b565b5f5f828460405160200161069d929190610a20565b6040516020818303038152906040528051906020012090508085149150509392505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5ffd5b5f819050919050565b6107a08161078e565b81146107aa575f5ffd5b50565b5f813590506107bb81610797565b92915050565b5f602082840312156107d6576107d561078a565b5b5f6107e3848285016107ad565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610815826107ec565b9050919050565b6108258161080b565b82525050565b5f60208201905061083e5f83018461081c565b92915050565b61084d8161080b565b8114610857575f5ffd5b50565b5f8135905061086881610844565b92915050565b5f602082840312156108835761088261078a565b5b5f6108908482850161085a565b91505092915050565b5f60ff82169050919050565b6108ae81610899565b81146108b8575f5ffd5b50565b5f813590506108c9816108a5565b92915050565b5f5f5f5f5f5f5f60e0888a0312156108ea576108e961078a565b5b5f6108f78a828b016107ad565b97505060206109088a828b016108bb565b96505060406109198a828b016107ad565b955050606061092a8a828b016107ad565b945050608061093b8a828b0161085a565b93505060a061094c8a828b016107ad565b92505060c061095d8a828b016107ad565b91505092959891949750929550565b5f8115159050919050565b6109808161096c565b82525050565b5f6020820190506109995f830184610977565b92915050565b6109a88161078e565b82525050565b6109b781610899565b82525050565b5f6080820190506109d05f83018761099f565b6109dd60208301866109ae565b6109ea604083018561099f565b6109f7606083018461099f565b95945050505050565b5f819050919050565b610a1a610a158261078e565b610a00565b82525050565b5f610a2b8285610a09565b602082019150610a3b8284610a09565b602082019150819050939250505056fea2646970667358221220d21594a04c30b4942f3727c9eb51d9e95a5be997dd95e6e020a3eca45c96686064736f6c634300081e0033000000000000000000000000209af77dfdaba352890b0bc9b86a25be67ef436a

Deployed Bytecode

0x608060405234801561000f575f5ffd5b5060043610610086575f3560e01c80639e5d2fe5116100595780639e5d2fe514610138578063b2534ad514610168578063ec9e332d14610198578063f523285a146101ca57610086565b80632b7ac3f31461008a57806333c68ff8146100a857806366f778e6146100d85780638c27081814610108575b5f5ffd5b6100926101fa565b60405161009f919061079c565b60405180910390f35b6100c260048036038101906100bd9190610e81565b61021e565b6040516100cf9190610fb9565b60405180910390f35b6100f260048036038101906100ed9190610fd9565b61033a565b6040516100ff9190611042565b60405180910390f35b610122600480360381019061011d9190611139565b61046e565b60405161012f919061130b565b60405180910390f35b610152600480360381019061014d919061132b565b610599565b60405161015f919061143d565b60405180910390f35b610182600480360381019061017d9190611456565b610654565b60405161018f919061143d565b60405180910390f35b6101b260048036038101906101ad91906114cc565b610686565b6040516101c193929190611513565b60405180910390f35b6101e460048036038101906101df9190611548565b6106d1565b6040516101f1919061143d565b60405180910390f35b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114610264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025b906115e0565b60405180910390fd5b5f835167ffffffffffffffff8111156102805761027f6107da565b5b6040519080825280602002602001820160405280156102ae5781602001602082028036833780820191505090505b5090505f5f90505b845181101561032f576102fd8582815181106102d5576102d46115fe565b5b60200260200101518583815181106102f0576102ef6115fe565b5b602002602001015161033a565b8282815181106103105761030f6115fe565b5b60200260200101901515908115158152505080806001019150506102b6565b508091505092915050565b5f5f61034d845f01518560200151610654565b90505f610370855f01518660400151876060015188608001518960a00151610599565b90505f61037d82846106d1565b9050845f01518114610394575f9350505050610468565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631c39b7d7875f0151886020015189604001518a606001518b608001518a8a6040518863ffffffff1660e01b815260040161040d9796959493929190611649565b6020604051808303815f875af1158015610429573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044d91906116e0565b905080610460575f945050505050610468565b809450505050505b92915050565b606081518351146104b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ab906115e0565b60405180910390fd5b5f835167ffffffffffffffff8111156104d0576104cf6107da565b5b60405190808252806020026020018201604052801561050957816020015b6104f6610708565b8152602001906001900390816104ee5790505b5090505f5f90505b845181101561058e576040518060400160405280868381518110610538576105376115fe565b5b60200260200101518152602001858381518110610558576105576115fe565b5b6020026020010151815250828281518110610576576105756115fe565b5b60200260200101819052508080600101915050610511565b508091505092915050565b5f5f868686866040516020016105b29493929190611745565b60405160208183030381529060405290505f5f90505b835181101561063f57818482815181106105e5576105e46115fe565b5b60200260200101515f0151858381518110610603576106026115fe565b5b602002602001015160200151604051602001610621939291906117c6565b604051602081830303815290604052915080806001019150506105c8565b50808051906020012091505095945050505050565b5f82826040516020016106689291906117f6565b60405160208183030381529060405280519060200120905092915050565b5f5f5f61069a845f01518560200151610654565b92506106bc845f01518560400151866060015187608001518860a00151610599565b91506106c882846106d1565b90509193909250565b5f5f83836040516020016106e6929190611839565b6040516020818303038152906040529050808051906020012091505092915050565b604051806040016040528060608152602001606081525090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61076461075f61075a84610722565b610741565b610722565b9050919050565b5f6107758261074a565b9050919050565b5f6107868261076b565b9050919050565b6107968161077c565b82525050565b5f6020820190506107af5f83018461078d565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610810826107ca565b810181811067ffffffffffffffff8211171561082f5761082e6107da565b5b80604052505050565b5f6108416107b5565b905061084d8282610807565b919050565b5f67ffffffffffffffff82111561086c5761086b6107da565b5b602082029050602081019050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f67ffffffffffffffff8211156108a7576108a66107da565b5b6108b0826107ca565b9050602081019050919050565b828183375f83830152505050565b5f6108dd6108d88461088d565b610838565b9050828152602081018484840111156108f9576108f8610889565b5b6109048482856108bd565b509392505050565b5f82601f8301126109205761091f6107c6565b5b81356109308482602086016108cb565b91505092915050565b5f67ffffffffffffffff821115610953576109526107da565b5b602082029050602081019050919050565b5f6040828403121561097957610978610881565b5b6109836040610838565b90505f82013567ffffffffffffffff8111156109a2576109a1610885565b5b6109ae8482850161090c565b5f83015250602082013567ffffffffffffffff8111156109d1576109d0610885565b5b6109dd8482850161090c565b60208301525092915050565b5f6109fb6109f684610939565b610838565b90508083825260208201905060208402830185811115610a1e57610a1d61087d565b5b835b81811015610a6557803567ffffffffffffffff811115610a4357610a426107c6565b5b808601610a508982610964565b85526020850194505050602081019050610a20565b5050509392505050565b5f82601f830112610a8357610a826107c6565b5b8135610a938482602086016109e9565b91505092915050565b5f60c08284031215610ab157610ab0610881565b5b610abb60c0610838565b90505f82013567ffffffffffffffff811115610ada57610ad9610885565b5b610ae68482850161090c565b5f83015250602082013567ffffffffffffffff811115610b0957610b08610885565b5b610b158482850161090c565b602083015250604082013567ffffffffffffffff811115610b3957610b38610885565b5b610b458482850161090c565b604083015250606082013567ffffffffffffffff811115610b6957610b68610885565b5b610b758482850161090c565b606083015250608082013567ffffffffffffffff811115610b9957610b98610885565b5b610ba58482850161090c565b60808301525060a082013567ffffffffffffffff811115610bc957610bc8610885565b5b610bd584828501610a6f565b60a08301525092915050565b5f610bf3610bee84610852565b610838565b90508083825260208201905060208402830185811115610c1657610c1561087d565b5b835b81811015610c5d57803567ffffffffffffffff811115610c3b57610c3a6107c6565b5b808601610c488982610a9c565b85526020850194505050602081019050610c18565b5050509392505050565b5f82601f830112610c7b57610c7a6107c6565b5b8135610c8b848260208601610be1565b91505092915050565b5f67ffffffffffffffff821115610cae57610cad6107da565b5b602082029050602081019050919050565b5f819050919050565b610cd181610cbf565b8114610cdb575f5ffd5b50565b5f81359050610cec81610cc8565b92915050565b5f60ff82169050919050565b610d0781610cf2565b8114610d11575f5ffd5b50565b5f81359050610d2281610cfe565b92915050565b5f610d3282610722565b9050919050565b610d4281610d28565b8114610d4c575f5ffd5b50565b5f81359050610d5d81610d39565b92915050565b5f60a08284031215610d7857610d77610881565b5b610d8260a0610838565b90505f610d9184828501610cde565b5f830152506020610da484828501610d14565b6020830152506040610db884828501610cde565b6040830152506060610dcc84828501610cde565b6060830152506080610de084828501610d4f565b60808301525092915050565b5f610dfe610df984610c94565b610838565b90508083825260208201905060a08402830185811115610e2157610e2061087d565b5b835b81811015610e4a5780610e368882610d63565b84526020840193505060a081019050610e23565b5050509392505050565b5f82601f830112610e6857610e676107c6565b5b8135610e78848260208601610dec565b91505092915050565b5f5f60408385031215610e9757610e966107be565b5b5f83013567ffffffffffffffff811115610eb457610eb36107c2565b5b610ec085828601610c67565b925050602083013567ffffffffffffffff811115610ee157610ee06107c2565b5b610eed85828601610e54565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f8115159050919050565b610f3481610f20565b82525050565b5f610f458383610f2b565b60208301905092915050565b5f602082019050919050565b5f610f6782610ef7565b610f718185610f01565b9350610f7c83610f11565b805f5b83811015610fac578151610f938882610f3a565b9750610f9e83610f51565b925050600181019050610f7f565b5085935050505092915050565b5f6020820190508181035f830152610fd18184610f5d565b905092915050565b5f5f60c08385031215610fef57610fee6107be565b5b5f83013567ffffffffffffffff81111561100c5761100b6107c2565b5b61101885828601610a9c565b925050602061102985828601610d63565b9150509250929050565b61103c81610f20565b82525050565b5f6020820190506110555f830184611033565b92915050565b5f67ffffffffffffffff821115611075576110746107da565b5b602082029050602081019050919050565b5f6110986110938461105b565b610838565b905080838252602082019050602084028301858111156110bb576110ba61087d565b5b835b8181101561110257803567ffffffffffffffff8111156110e0576110df6107c6565b5b8086016110ed898261090c565b855260208501945050506020810190506110bd565b5050509392505050565b5f82601f8301126111205761111f6107c6565b5b8135611130848260208601611086565b91505092915050565b5f5f6040838503121561114f5761114e6107be565b5b5f83013567ffffffffffffffff81111561116c5761116b6107c2565b5b6111788582860161110c565b925050602083013567ffffffffffffffff811115611199576111986107c2565b5b6111a58582860161110c565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61120a826111d8565b61121481856111e2565b93506112248185602086016111f2565b61122d816107ca565b840191505092915050565b5f604083015f8301518482035f8601526112528282611200565b9150506020830151848203602086015261126c8282611200565b9150508091505092915050565b5f6112848383611238565b905092915050565b5f602082019050919050565b5f6112a2826111af565b6112ac81856111b9565b9350836020820285016112be856111c9565b805f5b858110156112f957848403895281516112da8582611279565b94506112e58361128c565b925060208a019950506001810190506112c1565b50829750879550505050505092915050565b5f6020820190508181035f8301526113238184611298565b905092915050565b5f5f5f5f5f60a08688031215611344576113436107be565b5b5f86013567ffffffffffffffff811115611361576113606107c2565b5b61136d8882890161090c565b955050602086013567ffffffffffffffff81111561138e5761138d6107c2565b5b61139a8882890161090c565b945050604086013567ffffffffffffffff8111156113bb576113ba6107c2565b5b6113c78882890161090c565b935050606086013567ffffffffffffffff8111156113e8576113e76107c2565b5b6113f48882890161090c565b925050608086013567ffffffffffffffff811115611415576114146107c2565b5b61142188828901610a6f565b9150509295509295909350565b61143781610cbf565b82525050565b5f6020820190506114505f83018461142e565b92915050565b5f5f6040838503121561146c5761146b6107be565b5b5f83013567ffffffffffffffff811115611489576114886107c2565b5b6114958582860161090c565b925050602083013567ffffffffffffffff8111156114b6576114b56107c2565b5b6114c28582860161090c565b9150509250929050565b5f602082840312156114e1576114e06107be565b5b5f82013567ffffffffffffffff8111156114fe576114fd6107c2565b5b61150a84828501610a9c565b91505092915050565b5f6060820190506115265f83018661142e565b611533602083018561142e565b611540604083018461142e565b949350505050565b5f5f6040838503121561155e5761155d6107be565b5b5f61156b85828601610cde565b925050602061157c85828601610cde565b9150509250929050565b5f82825260208201905092915050565b7f4172726179206c656e677468206d69736d6174636800000000000000000000005f82015250565b5f6115ca601583611586565b91506115d582611596565b602082019050919050565b5f6020820190508181035f8301526115f7816115be565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61163481610cf2565b82525050565b61164381610d28565b82525050565b5f60e08201905061165c5f83018a61142e565b611669602083018961162b565b611676604083018861142e565b611683606083018761142e565b611690608083018661163a565b61169d60a083018561142e565b6116aa60c083018461142e565b98975050505050505050565b6116bf81610f20565b81146116c9575f5ffd5b50565b5f815190506116da816116b6565b92915050565b5f602082840312156116f5576116f46107be565b5b5f611702848285016116cc565b91505092915050565b5f81905092915050565b5f61171f826111d8565b611729818561170b565b93506117398185602086016111f2565b80840191505092915050565b5f6117508287611715565b915061175c8286611715565b91506117688285611715565b91506117748284611715565b915081905095945050505050565b5f81519050919050565b5f81905092915050565b5f6117a082611782565b6117aa818561178c565b93506117ba8185602086016111f2565b80840191505092915050565b5f6117d18286611796565b91506117dd8285611715565b91506117e98284611715565b9150819050949350505050565b5f6118018285611715565b915061180d8284611715565b91508190509392505050565b5f819050919050565b61183361182e82610cbf565b611819565b82525050565b5f6118448285611822565b6020820191506118548284611822565b602082019150819050939250505056fea2646970667358221220a402f71b5be20fde0c68edf4ff51e9b2387f3452196d0baeb0b3e711b36cd56164736f6c634300081e0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0xeB3Ba25400A4d716d091090942705aD51d04B7ea
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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