ETH Price: $2,923.48 (-0.56%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Register Gradien...404395312026-01-06 3:00:0917 days ago1767668409IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000580.00377982
Register Gradien...404341312026-01-06 0:00:0917 days ago1767657609IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000840.00548613
Register Gradien...403963312026-01-05 3:00:0918 days ago1767582009IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000970.00635426
Register Gradien...403909312026-01-05 0:00:0918 days ago1767571209IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000620.00406045
Register Gradien...403531302026-01-04 3:00:0719 days ago1767495607IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000440.00287045
Register Gradien...403477332026-01-04 0:00:1319 days ago1767484813IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000480.00317185
Register Gradien...403099312026-01-03 3:00:0920 days ago1767409209IN
0x948Cd0F9...5a82c7FF3
0 ETH0.00000040.00262371
Register Gradien...403045322026-01-03 0:00:1120 days ago1767398411IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000450.00295826
Register Gradien...402667312026-01-02 3:00:0921 days ago1767322809IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000270.00180514
Register Gradien...402613322026-01-02 0:00:1121 days ago1767312011IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000350.00228909
Register Gradien...402613302026-01-02 0:00:0721 days ago1767312007IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000350.00228191
Register Gradien...402235312026-01-01 3:00:0922 days ago1767236409IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000340.00225691
Register Gradien...402181332026-01-01 0:00:1322 days ago1767225613IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000230.00151176
Register Gradien...402181322026-01-01 0:00:1122 days ago1767225611IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000230.00150619
Register Gradien...401803302025-12-31 3:00:0723 days ago1767150007IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000420.00279468
Register Gradien...401749322025-12-31 0:00:1123 days ago1767139211IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000230.0015
Register Gradien...401371302025-12-30 3:00:0724 days ago1767063607IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000230.0015
Register Gradien...401317312025-12-30 0:00:0924 days ago1767052809IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000240.00155617
Register Gradien...400939302025-12-29 3:00:0725 days ago1766977207IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000260.0017405
Register Gradien...400885312025-12-29 0:00:0925 days ago1766966409IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000230.00151407
Register Gradien...400507312025-12-28 3:00:0926 days ago1766890809IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000230.0015
Register Gradien...400453342025-12-28 0:00:1526 days ago1766880015IN
0x948Cd0F9...5a82c7FF3
0 ETH0.00000030.00196252
Register Gradien...400453322025-12-28 0:00:1126 days ago1766880011IN
0x948Cd0F9...5a82c7FF3
0 ETH0.00000030.00196395
Register Gradien...400075322025-12-27 3:00:1127 days ago1766804411IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000240.00158573
Register Gradien...400075302025-12-27 3:00:0727 days ago1766804407IN
0x948Cd0F9...5a82c7FF3
0 ETH0.000000240.00158545
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VoidlyGradientRegistry

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
 * @title VoidlyGradientRegistry
 * @notice Append-only registry for federated-learning gradient attestations (IPFS CIDs).
 * @dev Optimized for L2 (e.g., Base). Event model is indexer-friendly and on-chain reads are paginatable.
 */
contract VoidlyGradientRegistry {
    // -------------------------------------------------------------------------
    // Errors
    // -------------------------------------------------------------------------
    error NodeIdRequired();
    error IpfsHashRequired();
    error AttestationHashRequired();
    error NoAttestationsFound();
    error NotAuthorized();
    error IndexOutOfBounds();
    error InvalidNewOwner();
    error CountZero();
    error UnknownNode();

    // -------------------------------------------------------------------------
    // Types
    // -------------------------------------------------------------------------
    struct Attestation {
        // NOTE: Two dynamic fields first; fixed fields (uint64,address) follow and pack together in one slot.
        string ipfsHash;        // CID for gradient data (e.g., "Qm..."/CIDv0 or "bafy..."/CIDv1)
        string attestationHash; // CID for Ed25519 signature payload
        uint64 timestamp;       // Block timestamp (gas-lean vs uint256)
        address nodeOperator;   // submitter (msg.sender)
    }

    struct ZKProof {
        bytes32 merkleRoot;     // Merkle root of session commitments
        uint256 sessionCount;   // Claimed sessions served
        uint64 timeRangeStart;  // Proof period start
        uint64 timeRangeEnd;    // Proof period end
        uint64 timestamp;       // When proof was submitted
        address nodeOperator;   // Who submitted
    }

    // -------------------------------------------------------------------------
    // Storage
    // -------------------------------------------------------------------------
    uint256 public constant VERSION = 1;

    address public owner;
    address public pendingOwner;

    // nodeKey = keccak256(nodeId); using bytes32 key is cheaper than string mapping
    mapping(bytes32 => Attestation[]) private _attestations;
    mapping(bytes32 => ZKProof[]) private _zkProofs;
    mapping(bytes32 => bool) private _seenNode;

    uint256 public totalAttestations; // global counter
    uint256 public totalZKProofs;     // ZK proofs submitted
    uint256 public nodeCount;         // count of unique nodeIds observed

    // -------------------------------------------------------------------------
    // Events
    // -------------------------------------------------------------------------
    /**
     * @dev NOTE: `nodeId` is NON-indexed so its literal value is visible in logs.
     * We index `nodeKey` (keccak) for cheap filtering + `operator` for actor filtering.
     */
    event GradientRegistered(
        bytes32 indexed nodeKey,
        address indexed operator,
        string nodeId,
        string ipfsHash,
        string attestationHash,
        uint64 timestamp
    );

    event NodeRegistered(
        bytes32 indexed nodeKey,
        address indexed firstOperator,
        string nodeId
    );

    event NodeSlashed(
        bytes32 indexed nodeKey,
        address indexed operator,
        string nodeId,
        string reason
    );

    event ZKProofSubmitted(
        bytes32 indexed nodeKey,
        address indexed operator,
        string nodeId,
        bytes32 merkleRoot,
        uint256 sessionCount,
        uint64 timestamp
    );

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

    // -------------------------------------------------------------------------
    // Constructor / ownership
    // -------------------------------------------------------------------------
    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        if (msg.sender != owner) revert NotAuthorized();
        _;
    }

    /// @notice Start two-step ownership transfer (safer for multisigs / ops).
    function transferOwnership(address newOwner) external onlyOwner {
        if (newOwner == address(0)) revert InvalidNewOwner();
        pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner, newOwner);
    }

    /// @notice Accept ownership after `transferOwnership`.
    function acceptOwnership() external {
        if (msg.sender != pendingOwner) revert NotAuthorized();
        address prev = owner;
        owner = msg.sender;
        pendingOwner = address(0);
        emit OwnershipTransferred(prev, owner);
    }

    // -------------------------------------------------------------------------
    // Core
    // -------------------------------------------------------------------------
    /**
     * @notice Register a gradient attestation.
     * @dev Permissionless by design; the protocol layer should decide which CIDs/IDs to trust.
     */
    function registerGradient(
        string calldata nodeId,
        string calldata ipfsHash,
        string calldata attestationHash
    ) external {
        if (bytes(nodeId).length == 0) revert NodeIdRequired();
        if (bytes(ipfsHash).length == 0) revert IpfsHashRequired();
        if (bytes(attestationHash).length == 0) revert AttestationHashRequired();

        bytes32 nodeKey = _nodeKey(nodeId);

        if (!_seenNode[nodeKey]) {
            _seenNode[nodeKey] = true;
            unchecked { nodeCount += 1; }
            emit NodeRegistered(nodeKey, msg.sender, nodeId);
        }

        uint64 t = uint64(block.timestamp);
        Attestation storage a = _attestations[nodeKey].push();
        a.ipfsHash = ipfsHash;
        a.attestationHash = attestationHash;
        a.timestamp = t;
        a.nodeOperator = msg.sender;

        unchecked { totalAttestations += 1; }

        emit GradientRegistered(
            nodeKey,
            msg.sender,
            nodeId,
            ipfsHash,
            attestationHash,
            t
        );
    }

    /**
     * @notice Submit zero-knowledge proof of privacy compliance
     * @dev Proves "served N sessions, logged 0 destinations" without revealing session data
     */
    function submitZKProof(
        string calldata nodeId,
        bytes32 merkleRoot,
        uint256 sessionCount,
        uint64 timeRangeStart,
        uint64 timeRangeEnd
    ) external {
        if (bytes(nodeId).length == 0) revert NodeIdRequired();
        if (sessionCount == 0) revert CountZero();
        if (timeRangeEnd <= timeRangeStart) revert InvalidNewOwner(); // reusing error

        bytes32 nodeKey = _nodeKey(nodeId);

        if (!_seenNode[nodeKey]) {
            _seenNode[nodeKey] = true;
            unchecked { nodeCount += 1; }
            emit NodeRegistered(nodeKey, msg.sender, nodeId);
        }

        uint64 t = uint64(block.timestamp);
        ZKProof storage proof = _zkProofs[nodeKey].push();
        proof.merkleRoot = merkleRoot;
        proof.sessionCount = sessionCount;
        proof.timeRangeStart = timeRangeStart;
        proof.timeRangeEnd = timeRangeEnd;
        proof.timestamp = t;
        proof.nodeOperator = msg.sender;

        unchecked { totalZKProofs += 1; }

        emit ZKProofSubmitted(
            nodeKey,
            msg.sender,
            nodeId,
            merkleRoot,
            sessionCount,
            t
        );
    }

    // -------------------------------------------------------------------------
    // Views
    // -------------------------------------------------------------------------

    /// @notice Return the full history (prefer range pagination for large sets).
    function getNodeHistory(string calldata nodeId)
        external
        view
        returns (Attestation[] memory)
    {
        return _attestations[_nodeKey(nodeId)];
    }

    /// @notice Return the latest attestation for a node.
    function getLatestAttestation(string calldata nodeId)
        external
        view
        returns (Attestation memory)
    {
        Attestation[] storage arr = _attestations[_nodeKey(nodeId)];
        uint256 len = arr.length;
        if (len == 0) revert NoAttestationsFound();
        return arr[len - 1];
    }

    /// @notice Return the number of attestations stored for a node.
    function getAttestationCount(string calldata nodeId)
        external
        view
        returns (uint256)
    {
        return _attestations[_nodeKey(nodeId)].length;
    }

    /// @notice Return the attestation at a given index (with bounds check).
    function getAttestationAt(
        string calldata nodeId,
        uint256 index
    ) external view returns (Attestation memory) {
        Attestation[] storage arr = _attestations[_nodeKey(nodeId)];
        if (index >= arr.length) revert IndexOutOfBounds();
        return arr[index];
    }

    /// @notice Paginate results to avoid returning huge arrays via eth_call.
    /// @param start inclusive start index
    /// @param count how many to return (must be > 0). Will clamp at end of array.
    function getAttestationsRange(
        string calldata nodeId,
        uint256 start,
        uint256 count
    ) external view returns (Attestation[] memory) {
        if (count == 0) revert CountZero();
        Attestation[] storage arr = _attestations[_nodeKey(nodeId)];
        uint256 len = arr.length;
        if (start >= len) revert IndexOutOfBounds();

        uint256 end = start + count;
        if (end > len) end = len;
        uint256 n = end - start;

        Attestation[] memory out = new Attestation[](n);
        for (uint256 i = 0; i < n; ) {
            out[i] = arr[start + i];
            unchecked { ++i; }
        }
        return out;
    }

    /// @notice Whether we have ever seen this nodeId (based on keccak(nodeId)).
    function existsNode(string calldata nodeId) external view returns (bool) {
        return _seenNode[_nodeKey(nodeId)];
    }

    /// @notice Get all ZK proofs for a node
    function getZKProofs(string calldata nodeId)
        external
        view
        returns (ZKProof[] memory)
    {
        return _zkProofs[_nodeKey(nodeId)];
    }

    /// @notice Get latest ZK proof for a node
    function getLatestZKProof(string calldata nodeId)
        external
        view
        returns (ZKProof memory)
    {
        ZKProof[] storage proofs = _zkProofs[_nodeKey(nodeId)];
        uint256 len = proofs.length;
        if (len == 0) revert NoAttestationsFound();
        return proofs[len - 1];
    }

    /// @notice Get ZK proof count for a node
    function getZKProofCount(string calldata nodeId)
        external
        view
        returns (uint256)
    {
        return _zkProofs[_nodeKey(nodeId)].length;
    }

    // -------------------------------------------------------------------------
    // Slashing (event-only placeholder)
    // -------------------------------------------------------------------------

    /// @notice Record a slashing event (no funds movement; integrate real slashing later).
    function slashNode(string calldata nodeId, string calldata reason)
        external
        onlyOwner
    {
        bytes32 nodeKey = _nodeKey(nodeId);
        if (!_seenNode[nodeKey]) revert UnknownNode();
        emit NodeSlashed(nodeKey, msg.sender, nodeId, reason);
    }

    // -------------------------------------------------------------------------
    // Internal utilities
    // -------------------------------------------------------------------------

    function _nodeKey(string memory nodeId) private pure returns (bytes32) {
        return keccak256(bytes(nodeId));
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AttestationHashRequired","type":"error"},{"inputs":[],"name":"CountZero","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidNewOwner","type":"error"},{"inputs":[],"name":"IpfsHashRequired","type":"error"},{"inputs":[],"name":"NoAttestationsFound","type":"error"},{"inputs":[],"name":"NodeIdRequired","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"UnknownNode","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"nodeKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"string","name":"nodeId","type":"string"},{"indexed":false,"internalType":"string","name":"ipfsHash","type":"string"},{"indexed":false,"internalType":"string","name":"attestationHash","type":"string"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"GradientRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"nodeKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"firstOperator","type":"address"},{"indexed":false,"internalType":"string","name":"nodeId","type":"string"}],"name":"NodeRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"nodeKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"string","name":"nodeId","type":"string"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"NodeSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"nodeKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"string","name":"nodeId","type":"string"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"sessionCount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"ZKProofSubmitted","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"existsNode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAttestationAt","outputs":[{"components":[{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.Attestation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getAttestationCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getAttestationsRange","outputs":[{"components":[{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.Attestation[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getLatestAttestation","outputs":[{"components":[{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.Attestation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getLatestZKProof","outputs":[{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"sessionCount","type":"uint256"},{"internalType":"uint64","name":"timeRangeStart","type":"uint64"},{"internalType":"uint64","name":"timeRangeEnd","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.ZKProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getNodeHistory","outputs":[{"components":[{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.Attestation[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getZKProofCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getZKProofs","outputs":[{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"sessionCount","type":"uint256"},{"internalType":"uint64","name":"timeRangeStart","type":"uint64"},{"internalType":"uint64","name":"timeRangeEnd","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.ZKProof[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"}],"name":"registerGradient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"string","name":"reason","type":"string"}],"name":"slashNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"sessionCount","type":"uint256"},{"internalType":"uint64","name":"timeRangeStart","type":"uint64"},{"internalType":"uint64","name":"timeRangeEnd","type":"uint64"}],"name":"submitZKProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAttestations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalZKProofs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50600080546001600160a01b03191633179055611bb9806100326000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063d7a1420311610071578063d7a142031461028a578063e16d98b51461029d578063e30c3978146102c0578063f2fde38b146102d3578063ffa1ad74146102e657600080fd5b80638da5cb5b1461021057806395cac59f1461023b578063cc5973381461024e578063d3495fda14610257578063d666ac411461027757600080fd5b80636e02d0b9116100f45780636e02d0b9146101ad57806379ba5097146101c25780638128e6c6146101ca578063837f9ef3146101dd57806387fe3233146101f057600080fd5b8063011f12411461013157806314e4058e1461015a5780631d8fa9471461017a578063604857421461019b5780636da49b83146101a4575b600080fd5b61014461013f36600461145c565b6102ee565b604051610151919061154d565b60405180910390f35b61016d610168366004611567565b6104f2565b60405161015191906115a8565b61018d610188366004611567565b6106fc565b604051908152602001610151565b61018d60055481565b61018d60075481565b6101c06101bb366004611626565b610759565b005b6101c061097f565b6101446101d8366004611567565b610a01565b61018d6101eb366004611567565b610aa4565b6102036101fe366004611567565b610ae9565b60405161015191906116ee565b600054610223906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d61024936600461173c565b610be1565b61018d60065481565b61026a610265366004611567565b610ebe565b604051610151919061178c565b6101c061028536600461179a565b611008565b6101c0610298366004611833565b6111df565b6102b06102ab366004611567565b6112cc565b6040519015158152602001610151565b600154610223906001600160a01b031681565b6101c06102e136600461189e565b61132c565b61018d600181565b6102f66113da565b60006002600061033b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260200190815260200160002090508080549050831061036f57604051634e23d03560e01b815260040160405180910390fd5b808381548110610381576103816118c7565b90600052602060002090600302016040518060800160405290816000820180546103aa906118dd565b80601f01602080910402602001604051908101604052809291908181526020018280546103d6906118dd565b80156104235780601f106103f857610100808354040283529160200191610423565b820191906000526020600020905b81548152906001019060200180831161040657829003601f168201915b5050505050815260200160018201805461043c906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610468906118dd565b80156104b55780601f1061048a576101008083540402835291602001916104b5565b820191906000526020600020905b81548152906001019060200180831161049857829003601f168201915b5050509183525050600291909101546001600160401b0381166020830152600160401b90046001600160a01b031660409091015295945050505050565b60606002600061053785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106ef5783829060005260206000209060030201604051806080016040529081600082018054610598906118dd565b80601f01602080910402602001604051908101604052809291908181526020018280546105c4906118dd565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050815260200160018201805461062a906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610656906118dd565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050509183525050600291909101546001600160401b038116602080840191909152600160401b9091046001600160a01b03166040909201919091529082526001929092019101610565565b5050505090505b92915050565b60006003600061074185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b81526020810191909152604001600020549392505050565b600085900361077b57604051637900159560e01b815260040160405180910390fd5b8260000361079c576040516311f6547b60e21b815260040160405180910390fd5b816001600160401b0316816001600160401b0316116107ce57604051632a52b3c360e11b815260040160405180910390fd5b600061080f87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661088c5760008181526004602052604090819020805460ff1916600190811790915560078054909101905551339082907f8326de45f66576db8724d4b3fca6bd518de1924e3dd3a2a62722d49e2ed3418390610883908b908b90611940565b60405180910390a35b60008181526003602081815260408084208054600180820183559186529290942060049092029091018881558084018890556002810180546001600160401b038981166fffffffffffffffffffffffffffffffff1990921691909117600160401b898316021767ffffffffffffffff60801b1916600160801b4292831602179091559281018054336001600160a01b031990911681179091556006805490950190945590519192909184907fb9be8b0a436dc0b085b349c839065e144caf21ed4e9e757220ba670bf2cbf5f19061096c908d908d908d908d908a9061195c565b60405180910390a3505050505050505050565b6001546001600160a01b031633146109aa5760405163ea8e4eb560e01b815260040160405180910390fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610a096113da565b600060026000610a4e86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020905060008180549050905080600003610a885760405163792120e960e01b815260040160405180910390fd5b81610a946001836119ac565b81548110610381576103816118c7565b60006002600061074185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b606060036000610b2e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106ef5760008481526020908190206040805160c08101825260048602909201805483526001808201548486015260028201546001600160401b0380821694860194909452600160401b810484166060860152600160801b90049092166080840152600301546001600160a01b031660a08301529083529092019101610b5c565b606081600003610c04576040516311f6547b60e21b815260040160405180910390fd5b600060026000610c4988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260208101919091526040016000208054909150808510610c7e57604051634e23d03560e01b815260040160405180910390fd5b6000610c8a85876119bf565b905081811115610c975750805b6000610ca387836119ac565b90506000816001600160401b03811115610cbf57610cbf6119d2565b604051908082528060200260200182016040528015610cf857816020015b610ce56113da565b815260200190600190039081610cdd5790505b50905060005b82811015610eb05785610d11828b6119bf565b81548110610d2157610d216118c7565b9060005260206000209060030201604051806080016040529081600082018054610d4a906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610d76906118dd565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b50505050508152602001600182018054610ddc906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e08906118dd565b8015610e555780601f10610e2a57610100808354040283529160200191610e55565b820191906000526020600020905b815481529060010190602001808311610e3857829003601f168201915b5050509183525050600291909101546001600160401b0381166020830152600160401b90046001600160a01b03166040909101528251839083908110610e9d57610e9d6118c7565b6020908102919091010152600101610cfe565b509998505050505050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152600060036000610f3586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020905060008180549050905080600003610f6f5760405163792120e960e01b815260040160405180910390fd5b81610f7b6001836119ac565b81548110610f8b57610f8b6118c7565b60009182526020918290206040805160c08101825260049093029091018054835260018101549383019390935260028301546001600160401b0380821692840192909252600160401b810482166060840152600160801b90041660808201526003909101546001600160a01b031660a08201529250505092915050565b600085900361102a57604051637900159560e01b815260040160405180910390fd5b600083900361104c5760405163eabfb56d60e01b815260040160405180910390fd5b600081900361106e57604051638a41014160e01b815260040160405180910390fd5b60006110af87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661112c5760008181526004602052604090819020805460ff1916600190811790915560078054909101905551339082907f8326de45f66576db8724d4b3fca6bd518de1924e3dd3a2a62722d49e2ed3418390611123908b908b90611940565b60405180910390a35b60008181526002602090815260408220805460018101825590835291204291600302018061115b878983611a37565b506001810161116b858783611a37565b506002810180546001600160401b0384166001600160e01b03199091161733600160401b81029190911790915560058054600101905560405184907f783b044dce7b053b4c6530b32077a369784582a0132610e0359c9e28b69f8eea9061096c908d908d908d908d908d908d908c90611af7565b6000546001600160a01b0316331461120a5760405163ea8e4eb560e01b815260040160405180910390fd5b600061124b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661127d57604051638b7114df60e01b815260040160405180910390fd5b336001600160a01b0316817fc53877e0156390b35fbfb90b9bcef46d8f85fe9c2906f3d4130418739a02868c878787876040516112bd9493929190611b51565b60405180910390a35050505050565b60006004600061131185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260208101919091526040016000205460ff169392505050565b6000546001600160a01b031633146113575760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b03811661137e57604051632a52b3c360e11b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a350565b805160209091012090565b6040518060800160405280606081526020016060815260200160006001600160401b0316815260200160006001600160a01b031681525090565b60008083601f84011261142657600080fd5b5081356001600160401b0381111561143d57600080fd5b60208301915083602082850101111561145557600080fd5b9250929050565b60008060006040848603121561147157600080fd5b83356001600160401b0381111561148757600080fd5b61149386828701611414565b909790965060209590950135949350505050565b6000815180845260005b818110156114cd576020818501810151868301820152016114b1565b506000602082860101526020601f19601f83011685010191505092915050565b600081516080845261150260808501826114a7565b90506020830151848203602086015261151b82826114a7565b6040858101516001600160401b0316908701526060948501516001600160a01b03169490950193909352509192915050565b60208152600061156060208301846114ed565b9392505050565b6000806020838503121561157a57600080fd5b82356001600160401b0381111561159057600080fd5b61159c85828601611414565b90969095509350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156115fd57603f198886030184526115eb8583516114ed565b945092850192908501906001016115cf565b5092979650505050505050565b80356001600160401b038116811461162157600080fd5b919050565b60008060008060008060a0878903121561163f57600080fd5b86356001600160401b0381111561165557600080fd5b61166189828a01611414565b90975095505060208701359350604087013592506116816060880161160a565b915061168f6080880161160a565b90509295509295509295565b805182526020810151602083015260408101516001600160401b038082166040850152806060840151166060850152806080840151166080850152505060018060a01b0360a08201511660a08301525050565b6020808252825182820181905260009190848201906040850190845b818110156117305761171d83855161169b565b9284019260c0929092019160010161170a565b50909695505050505050565b6000806000806060858703121561175257600080fd5b84356001600160401b0381111561176857600080fd5b61177487828801611414565b90989097506020870135966040013595509350505050565b60c081016106f6828461169b565b600080600080600080606087890312156117b357600080fd5b86356001600160401b03808211156117ca57600080fd5b6117d68a838b01611414565b909850965060208901359150808211156117ef57600080fd5b6117fb8a838b01611414565b9096509450604089013591508082111561181457600080fd5b5061182189828a01611414565b979a9699509497509295939492505050565b6000806000806040858703121561184957600080fd5b84356001600160401b038082111561186057600080fd5b61186c88838901611414565b9096509450602087013591508082111561188557600080fd5b5061189287828801611414565b95989497509550505050565b6000602082840312156118b057600080fd5b81356001600160a01b038116811461156057600080fd5b634e487b7160e01b600052603260045260246000fd5b600181811c908216806118f157607f821691505b60208210810361191157634e487b7160e01b600052602260045260246000fd5b50919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000611954602083018486611917565b949350505050565b608081526000611970608083018789611917565b60208301959095525060408101929092526001600160401b031660609091015292915050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106f6576106f6611996565b808201808211156106f6576106f6611996565b634e487b7160e01b600052604160045260246000fd5b601f821115611a3257600081815260208120601f850160051c81016020861015611a0f5750805b601f850160051c820191505b81811015611a2e57828155600101611a1b565b5050505b505050565b6001600160401b03831115611a4e57611a4e6119d2565b611a6283611a5c83546118dd565b836119e8565b6000601f841160018114611a965760008515611a7e5750838201355b600019600387901b1c1916600186901b178355611af0565b600083815260209020601f19861690835b82811015611ac75786850135825560209485019460019092019101611aa7565b5086821015611ae45760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b608081526000611b0b60808301898b611917565b8281036020840152611b1e81888a611917565b90508281036040840152611b33818688611917565b9150506001600160401b038316606083015298975050505050505050565b604081526000611b65604083018688611917565b8281036020840152611b78818587611917565b97965050505050505056fea2646970667358221220e7ee3d378bada3358a20c29a809d5b0539f0e664b7285c6d102cf159234e96b764736f6c63430008140033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063d7a1420311610071578063d7a142031461028a578063e16d98b51461029d578063e30c3978146102c0578063f2fde38b146102d3578063ffa1ad74146102e657600080fd5b80638da5cb5b1461021057806395cac59f1461023b578063cc5973381461024e578063d3495fda14610257578063d666ac411461027757600080fd5b80636e02d0b9116100f45780636e02d0b9146101ad57806379ba5097146101c25780638128e6c6146101ca578063837f9ef3146101dd57806387fe3233146101f057600080fd5b8063011f12411461013157806314e4058e1461015a5780631d8fa9471461017a578063604857421461019b5780636da49b83146101a4575b600080fd5b61014461013f36600461145c565b6102ee565b604051610151919061154d565b60405180910390f35b61016d610168366004611567565b6104f2565b60405161015191906115a8565b61018d610188366004611567565b6106fc565b604051908152602001610151565b61018d60055481565b61018d60075481565b6101c06101bb366004611626565b610759565b005b6101c061097f565b6101446101d8366004611567565b610a01565b61018d6101eb366004611567565b610aa4565b6102036101fe366004611567565b610ae9565b60405161015191906116ee565b600054610223906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d61024936600461173c565b610be1565b61018d60065481565b61026a610265366004611567565b610ebe565b604051610151919061178c565b6101c061028536600461179a565b611008565b6101c0610298366004611833565b6111df565b6102b06102ab366004611567565b6112cc565b6040519015158152602001610151565b600154610223906001600160a01b031681565b6101c06102e136600461189e565b61132c565b61018d600181565b6102f66113da565b60006002600061033b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260200190815260200160002090508080549050831061036f57604051634e23d03560e01b815260040160405180910390fd5b808381548110610381576103816118c7565b90600052602060002090600302016040518060800160405290816000820180546103aa906118dd565b80601f01602080910402602001604051908101604052809291908181526020018280546103d6906118dd565b80156104235780601f106103f857610100808354040283529160200191610423565b820191906000526020600020905b81548152906001019060200180831161040657829003601f168201915b5050505050815260200160018201805461043c906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610468906118dd565b80156104b55780601f1061048a576101008083540402835291602001916104b5565b820191906000526020600020905b81548152906001019060200180831161049857829003601f168201915b5050509183525050600291909101546001600160401b0381166020830152600160401b90046001600160a01b031660409091015295945050505050565b60606002600061053785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106ef5783829060005260206000209060030201604051806080016040529081600082018054610598906118dd565b80601f01602080910402602001604051908101604052809291908181526020018280546105c4906118dd565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050815260200160018201805461062a906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610656906118dd565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050509183525050600291909101546001600160401b038116602080840191909152600160401b9091046001600160a01b03166040909201919091529082526001929092019101610565565b5050505090505b92915050565b60006003600061074185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b81526020810191909152604001600020549392505050565b600085900361077b57604051637900159560e01b815260040160405180910390fd5b8260000361079c576040516311f6547b60e21b815260040160405180910390fd5b816001600160401b0316816001600160401b0316116107ce57604051632a52b3c360e11b815260040160405180910390fd5b600061080f87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661088c5760008181526004602052604090819020805460ff1916600190811790915560078054909101905551339082907f8326de45f66576db8724d4b3fca6bd518de1924e3dd3a2a62722d49e2ed3418390610883908b908b90611940565b60405180910390a35b60008181526003602081815260408084208054600180820183559186529290942060049092029091018881558084018890556002810180546001600160401b038981166fffffffffffffffffffffffffffffffff1990921691909117600160401b898316021767ffffffffffffffff60801b1916600160801b4292831602179091559281018054336001600160a01b031990911681179091556006805490950190945590519192909184907fb9be8b0a436dc0b085b349c839065e144caf21ed4e9e757220ba670bf2cbf5f19061096c908d908d908d908d908a9061195c565b60405180910390a3505050505050505050565b6001546001600160a01b031633146109aa5760405163ea8e4eb560e01b815260040160405180910390fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610a096113da565b600060026000610a4e86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020905060008180549050905080600003610a885760405163792120e960e01b815260040160405180910390fd5b81610a946001836119ac565b81548110610381576103816118c7565b60006002600061074185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b606060036000610b2e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106ef5760008481526020908190206040805160c08101825260048602909201805483526001808201548486015260028201546001600160401b0380821694860194909452600160401b810484166060860152600160801b90049092166080840152600301546001600160a01b031660a08301529083529092019101610b5c565b606081600003610c04576040516311f6547b60e21b815260040160405180910390fd5b600060026000610c4988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260208101919091526040016000208054909150808510610c7e57604051634e23d03560e01b815260040160405180910390fd5b6000610c8a85876119bf565b905081811115610c975750805b6000610ca387836119ac565b90506000816001600160401b03811115610cbf57610cbf6119d2565b604051908082528060200260200182016040528015610cf857816020015b610ce56113da565b815260200190600190039081610cdd5790505b50905060005b82811015610eb05785610d11828b6119bf565b81548110610d2157610d216118c7565b9060005260206000209060030201604051806080016040529081600082018054610d4a906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610d76906118dd565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b50505050508152602001600182018054610ddc906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e08906118dd565b8015610e555780601f10610e2a57610100808354040283529160200191610e55565b820191906000526020600020905b815481529060010190602001808311610e3857829003601f168201915b5050509183525050600291909101546001600160401b0381166020830152600160401b90046001600160a01b03166040909101528251839083908110610e9d57610e9d6118c7565b6020908102919091010152600101610cfe565b509998505050505050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152600060036000610f3586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020905060008180549050905080600003610f6f5760405163792120e960e01b815260040160405180910390fd5b81610f7b6001836119ac565b81548110610f8b57610f8b6118c7565b60009182526020918290206040805160c08101825260049093029091018054835260018101549383019390935260028301546001600160401b0380821692840192909252600160401b810482166060840152600160801b90041660808201526003909101546001600160a01b031660a08201529250505092915050565b600085900361102a57604051637900159560e01b815260040160405180910390fd5b600083900361104c5760405163eabfb56d60e01b815260040160405180910390fd5b600081900361106e57604051638a41014160e01b815260040160405180910390fd5b60006110af87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661112c5760008181526004602052604090819020805460ff1916600190811790915560078054909101905551339082907f8326de45f66576db8724d4b3fca6bd518de1924e3dd3a2a62722d49e2ed3418390611123908b908b90611940565b60405180910390a35b60008181526002602090815260408220805460018101825590835291204291600302018061115b878983611a37565b506001810161116b858783611a37565b506002810180546001600160401b0384166001600160e01b03199091161733600160401b81029190911790915560058054600101905560405184907f783b044dce7b053b4c6530b32077a369784582a0132610e0359c9e28b69f8eea9061096c908d908d908d908d908d908d908c90611af7565b6000546001600160a01b0316331461120a5760405163ea8e4eb560e01b815260040160405180910390fd5b600061124b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661127d57604051638b7114df60e01b815260040160405180910390fd5b336001600160a01b0316817fc53877e0156390b35fbfb90b9bcef46d8f85fe9c2906f3d4130418739a02868c878787876040516112bd9493929190611b51565b60405180910390a35050505050565b60006004600061131185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260208101919091526040016000205460ff169392505050565b6000546001600160a01b031633146113575760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b03811661137e57604051632a52b3c360e11b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a350565b805160209091012090565b6040518060800160405280606081526020016060815260200160006001600160401b0316815260200160006001600160a01b031681525090565b60008083601f84011261142657600080fd5b5081356001600160401b0381111561143d57600080fd5b60208301915083602082850101111561145557600080fd5b9250929050565b60008060006040848603121561147157600080fd5b83356001600160401b0381111561148757600080fd5b61149386828701611414565b909790965060209590950135949350505050565b6000815180845260005b818110156114cd576020818501810151868301820152016114b1565b506000602082860101526020601f19601f83011685010191505092915050565b600081516080845261150260808501826114a7565b90506020830151848203602086015261151b82826114a7565b6040858101516001600160401b0316908701526060948501516001600160a01b03169490950193909352509192915050565b60208152600061156060208301846114ed565b9392505050565b6000806020838503121561157a57600080fd5b82356001600160401b0381111561159057600080fd5b61159c85828601611414565b90969095509350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156115fd57603f198886030184526115eb8583516114ed565b945092850192908501906001016115cf565b5092979650505050505050565b80356001600160401b038116811461162157600080fd5b919050565b60008060008060008060a0878903121561163f57600080fd5b86356001600160401b0381111561165557600080fd5b61166189828a01611414565b90975095505060208701359350604087013592506116816060880161160a565b915061168f6080880161160a565b90509295509295509295565b805182526020810151602083015260408101516001600160401b038082166040850152806060840151166060850152806080840151166080850152505060018060a01b0360a08201511660a08301525050565b6020808252825182820181905260009190848201906040850190845b818110156117305761171d83855161169b565b9284019260c0929092019160010161170a565b50909695505050505050565b6000806000806060858703121561175257600080fd5b84356001600160401b0381111561176857600080fd5b61177487828801611414565b90989097506020870135966040013595509350505050565b60c081016106f6828461169b565b600080600080600080606087890312156117b357600080fd5b86356001600160401b03808211156117ca57600080fd5b6117d68a838b01611414565b909850965060208901359150808211156117ef57600080fd5b6117fb8a838b01611414565b9096509450604089013591508082111561181457600080fd5b5061182189828a01611414565b979a9699509497509295939492505050565b6000806000806040858703121561184957600080fd5b84356001600160401b038082111561186057600080fd5b61186c88838901611414565b9096509450602087013591508082111561188557600080fd5b5061189287828801611414565b95989497509550505050565b6000602082840312156118b057600080fd5b81356001600160a01b038116811461156057600080fd5b634e487b7160e01b600052603260045260246000fd5b600181811c908216806118f157607f821691505b60208210810361191157634e487b7160e01b600052602260045260246000fd5b50919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000611954602083018486611917565b949350505050565b608081526000611970608083018789611917565b60208301959095525060408101929092526001600160401b031660609091015292915050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106f6576106f6611996565b808201808211156106f6576106f6611996565b634e487b7160e01b600052604160045260246000fd5b601f821115611a3257600081815260208120601f850160051c81016020861015611a0f5750805b601f850160051c820191505b81811015611a2e57828155600101611a1b565b5050505b505050565b6001600160401b03831115611a4e57611a4e6119d2565b611a6283611a5c83546118dd565b836119e8565b6000601f841160018114611a965760008515611a7e5750838201355b600019600387901b1c1916600186901b178355611af0565b600083815260209020601f19861690835b82811015611ac75786850135825560209485019460019092019101611aa7565b5086821015611ae45760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b608081526000611b0b60808301898b611917565b8281036020840152611b1e81888a611917565b90508281036040840152611b33818688611917565b9150506001600160401b038316606083015298975050505050505050565b604081526000611b65604083018688611917565b8281036020840152611b78818587611917565b97965050505050505056fea2646970667358221220e7ee3d378bada3358a20c29a809d5b0539f0e664b7285c6d102cf159234e96b764736f6c63430008140033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.