APE Price: $0.16 (-0.95%)

Contract

0xcF91F658ef1f02E38d2793022720B4205868F311

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
257887342025-10-30 16:44:1292 days ago1761842652  Contract Creation0 APE

Cross-Chain Transactions
Loading...
Loading

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

Contract Name:
PackProvenanceVerifier

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

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

/**
 * @title PackProvenanceVerifier
 * @notice Verifies pack provenance proofs on-chain
 * @dev Replicates the testProof function from pack-provenance.ts
 *
 * This contract allows anyone to verify that:
 * 1. A pack contains specific cards
 * 2. The cards were hashed correctly (order-independent via sorting)
 * 3. The pack's position (tokenId) is cryptographically bound
 * 4. The secret produces the expected pack hash
 */
contract PackProvenanceVerifier {
    /// @notice Represents a card in a pack
    struct PackCard {
        uint256 cardIndex;
        uint256 serial;
    }

    /**
     * @notice Verify a pack's provenance proof with collection Merkle proof
     * @dev Cards will be sorted automatically to match off-chain sorting
     * @param tokenId The pack's token ID as uint256
     * @param cards Array of cards (will be sorted by contract)
     * @param secret The secret used to hash the pack (hex string without 0x prefix)
     * @param expectedPackHash The expected pack hash to verify against
     * @param collectionRoot The Merkle root of the entire pack collection
     * @param merkleProof Array of sibling hashes to prove pack is in collection
     * @return valid True if the proof is valid and pack is in collection
     * @return computedPackHash The pack hash computed from inputs
     */
    function verifyPackProof(
        uint256 tokenId,
        PackCard[] calldata cards,
        string calldata secret,
        bytes32 expectedPackHash,
        bytes32 collectionRoot,
        bytes32[] calldata merkleProof
    ) external pure returns (bool valid, bytes32 computedPackHash) {
        require(cards.length > 0, "Pack must contain cards");
        require(bytes(secret).length > 0, "Secret cannot be empty");

        // Sort cards to match TypeScript implementation
        PackCard[] memory sortedCards = _sortCards(cards);

        // Step 1: Hash each card individually
        bytes32[] memory cardHashes = new bytes32[](sortedCards.length);
        for (uint256 i = 0; i < sortedCards.length; i++) {
            // Hash format: sha256("cardIndex:serial")
            cardHashes[i] = sha256(
                abi.encodePacked(
                    _uint256ToString(sortedCards[i].cardIndex),
                    ":",
                    _uint256ToString(sortedCards[i].serial)
                )
            );
        }

        // Step 2: Build Merkle tree from card hashes
        bytes32 cardsMerkleRoot = _buildMerkleTree(cardHashes);

        // Step 3: Hash (cardsMerkleRoot + tokenId + secret) for final pack hash
        // Convert tokenId to string to match TypeScript implementation
        computedPackHash = sha256(
            abi.encodePacked(
                _bytes32ToHexString(cardsMerkleRoot),
                _uint256ToString(tokenId),
                secret
            )
        );

        // Step 4: Validate pack hash matches expected
        bool packHashValid = (computedPackHash == expectedPackHash);

        // Step 5: Verify pack is in collection using Merkle proof
        // Collection leaf = sha256(tokenId + packHash)
        bytes32 collectionLeaf = sha256(
            abi.encodePacked(
                _uint256ToString(tokenId),
                _bytes32ToHexString(computedPackHash)
            )
        );

        bool inCollection = _verifyMerkleProof(
            collectionLeaf,
            merkleProof,
            collectionRoot
        );

        // Both checks must pass
        valid = packHashValid && inCollection;

        return (valid, computedPackHash);
    }

    /**
     * @notice View function to compute pack hash without emitting events
     * @dev Same logic as verifyPackProof but read-only
     */
    function computePackHash(
        uint256 tokenId,
        PackCard[] calldata cards,
        string calldata secret
    ) external pure returns (bytes32 packHash) {
        require(cards.length > 0, "Pack must contain cards");
        require(bytes(secret).length > 0, "Secret cannot be empty");

        // Sort cards to match TypeScript implementation
        PackCard[] memory sortedCards = _sortCards(cards);

        // Hash each card
        bytes32[] memory cardHashes = new bytes32[](sortedCards.length);
        for (uint256 i = 0; i < sortedCards.length; i++) {
            cardHashes[i] = sha256(
                abi.encodePacked(
                    _uint256ToString(sortedCards[i].cardIndex),
                    ":",
                    _uint256ToString(sortedCards[i].serial)
                )
            );
        }

        // Build Merkle tree
        bytes32 cardsMerkleRoot = _buildMerkleTree(cardHashes);

        // Final hash
        packHash = sha256(
            abi.encodePacked(
                _bytes32ToHexString(cardsMerkleRoot),
                _uint256ToString(tokenId),
                secret
            )
        );

        return packHash;
    }

    /**
     * @notice Verify multiple packs in a single transaction
     * @dev More gas-efficient for batch verification
     */
    function verifyMultipleProofs(
        uint256[] calldata tokenIds,
        PackCard[][] calldata cardArrays,
        string[] calldata secrets,
        bytes32[] calldata expectedHashes,
        bytes32 collectionRoot,
        bytes32[][] calldata merkleProofs
    ) external view returns (bool[] memory results) {
        require(
            tokenIds.length == cardArrays.length &&
                tokenIds.length == secrets.length &&
                tokenIds.length == expectedHashes.length &&
                tokenIds.length == merkleProofs.length,
            "Array length mismatch"
        );

        results = new bool[](tokenIds.length);

        for (uint256 i = 0; i < tokenIds.length; i++) {
            bytes32 computedHash = this.computePackHash(
                tokenIds[i],
                cardArrays[i],
                secrets[i]
            );

            bool packHashValid = (computedHash == expectedHashes[i]);

            // Verify pack is in collection
            bytes32 collectionLeaf = sha256(
                abi.encodePacked(
                    _uint256ToString(tokenIds[i]),
                    _bytes32ToHexString(computedHash)
                )
            );

            bool inCollection = _verifyMerkleProof(
                collectionLeaf,
                merkleProofs[i],
                collectionRoot
            );

            results[i] = packHashValid && inCollection;
        }

        return results;
    }

    /**
     * @dev Build Merkle tree from array of hashes
     * @param leaves Array of leaf hashes
     * @return root The Merkle root hash
     */
    function _buildMerkleTree(
        bytes32[] memory leaves
    ) internal pure returns (bytes32 root) {
        require(leaves.length > 0, "Cannot build tree from empty array");

        if (leaves.length == 1) {
            return leaves[0];
        }

        // Build tree level by level
        bytes32[] memory currentLevel = leaves;

        while (currentLevel.length > 1) {
            uint256 nextLevelSize = (currentLevel.length + 1) / 2;
            bytes32[] memory nextLevel = new bytes32[](nextLevelSize);

            uint256 nextIndex = 0;
            for (uint256 i = 0; i < currentLevel.length; i += 2) {
                if (i + 1 < currentLevel.length) {
                    // Hash pair together with deterministic ordering (smaller hash first)
                    bytes32 left = currentLevel[i];
                    bytes32 right = currentLevel[i + 1];
                    nextLevel[nextIndex] = left < right
                        ? sha256(
                            abi.encodePacked(
                                _bytes32ToHexString(left),
                                _bytes32ToHexString(right)
                            )
                        )
                        : sha256(
                            abi.encodePacked(
                                _bytes32ToHexString(right),
                                _bytes32ToHexString(left)
                            )
                        );
                } else {
                    // Odd number of elements, promote the last one
                    nextLevel[nextIndex] = currentLevel[i];
                }
                nextIndex++;
            }

            currentLevel = nextLevel;
        }

        return currentLevel[0];
    }

    /**
     * @dev Sort cards array by cardIndex (primary) then serial (secondary)
     * @dev Uses insertion sort (efficient for small arrays, typical pack size ~5-15 cards)
     * @param cards Array of cards to sort
     * @return sorted Array of cards sorted by cardIndex then serial
     */
    function _sortCards(
        PackCard[] calldata cards
    ) internal pure returns (PackCard[] memory sorted) {
        sorted = new PackCard[](cards.length);

        // Copy cards to memory
        for (uint256 i = 0; i < cards.length; i++) {
            sorted[i] = cards[i];
        }

        // Insertion sort
        for (uint256 i = 1; i < sorted.length; i++) {
            PackCard memory key = sorted[i];
            uint256 j = i;

            while (j > 0 && _compareCards(sorted[j - 1], key) > 0) {
                sorted[j] = sorted[j - 1];
                j--;
            }

            sorted[j] = key;
        }

        return sorted;
    }

    /**
     * @dev Compare two cards for sorting
     * @return -1 if a < b, 0 if a == b, 1 if a > b
     */
    function _compareCards(
        PackCard memory a,
        PackCard memory b
    ) internal pure returns (int256) {
        if (a.cardIndex < b.cardIndex) {
            return -1;
        } else if (a.cardIndex > b.cardIndex) {
            return 1;
        } else {
            // Same cardIndex, compare by serial
            if (a.serial < b.serial) {
                return -1;
            } else if (a.serial > b.serial) {
                return 1;
            } else {
                return 0;
            }
        }
    }

    /**
     * @dev Verify a Merkle proof
     * @param leaf The leaf node to verify
     * @param proof Array of sibling hashes along the path to root
     * @param root The expected Merkle root
     * @return True if the proof is valid
     */
    function _verifyMerkleProof(
        bytes32 leaf,
        bytes32[] calldata proof,
        bytes32 root
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

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

            if (computedHash < proofElement) {
                // Current node is left child
                computedHash = sha256(
                    abi.encodePacked(
                        _bytes32ToHexString(computedHash),
                        _bytes32ToHexString(proofElement)
                    )
                );
            } else {
                // Current node is right child
                computedHash = sha256(
                    abi.encodePacked(
                        _bytes32ToHexString(proofElement),
                        _bytes32ToHexString(computedHash)
                    )
                );
            }
        }

        return computedHash == root;
    }

    /**
     * @dev Convert uint256 to string
     */
    function _uint256ToString(
        uint256 value
    ) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }

        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }

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

        return string(buffer);
    }

    /**
     * @dev Convert bytes32 to hex string (without 0x prefix)
     * @dev Matches the JavaScript .toString("hex") format
     */
    function _bytes32ToHexString(
        bytes32 data
    ) internal pure returns (string memory) {
        bytes memory hexChars = "0123456789abcdef";
        bytes memory result = new bytes(64);

        for (uint256 i = 0; i < 32; i++) {
            result[i * 2] = hexChars[uint8(data[i] >> 4)];
            result[i * 2 + 1] = hexChars[uint8(data[i] & 0x0f)];
        }

        return string(result);
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"cardIndex","type":"uint256"},{"internalType":"uint256","name":"serial","type":"uint256"}],"internalType":"struct PackProvenanceVerifier.PackCard[]","name":"cards","type":"tuple[]"},{"internalType":"string","name":"secret","type":"string"}],"name":"computePackHash","outputs":[{"internalType":"bytes32","name":"packHash","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"cardIndex","type":"uint256"},{"internalType":"uint256","name":"serial","type":"uint256"}],"internalType":"struct PackProvenanceVerifier.PackCard[][]","name":"cardArrays","type":"tuple[][]"},{"internalType":"string[]","name":"secrets","type":"string[]"},{"internalType":"bytes32[]","name":"expectedHashes","type":"bytes32[]"},{"internalType":"bytes32","name":"collectionRoot","type":"bytes32"},{"internalType":"bytes32[][]","name":"merkleProofs","type":"bytes32[][]"}],"name":"verifyMultipleProofs","outputs":[{"internalType":"bool[]","name":"results","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"cardIndex","type":"uint256"},{"internalType":"uint256","name":"serial","type":"uint256"}],"internalType":"struct PackProvenanceVerifier.PackCard[]","name":"cards","type":"tuple[]"},{"internalType":"string","name":"secret","type":"string"},{"internalType":"bytes32","name":"expectedPackHash","type":"bytes32"},{"internalType":"bytes32","name":"collectionRoot","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"verifyPackProof","outputs":[{"internalType":"bool","name":"valid","type":"bool"},{"internalType":"bytes32","name":"computedPackHash","type":"bytes32"}],"stateMutability":"pure","type":"function"}]

0x60808060405234601557610fe6908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806340ff6f551461064f578063b80c2b22146102165763dd299e881461003d57600080fd5b34610211576060366003190112610211576024356001600160401b0381116102115761006d9036906004016107db565b906044356001600160401b038111610211576100906100ae91369060040161080b565b93909261009e821515610868565b6100a98515156108b4565b6109e8565b6100b88151610962565b9260005b825181101561018657602060006101566100e06100d985886109a1565b5151610b9f565b8361014560016100fc836100f48a8d6109a1565b510151610b9f565b6040519384918161011681850198898151938492016109b5565b8301601d60f91b8382015261013482518093856021850191016109b5565b01010301601f19810183528261092a565b6040519283928392519283916109b5565b8101039060025afa1561017a5760019060005161017382886109a1565b52016100bc565b6040513d6000823e3d90fd5b602060006101f78483610145896101a461019f8d610c63565b610dec565b936101b0600435610b9f565b9181604051958694816101cc8188019a8b8151938492016109b5565b86016101e0825180938580850191016109b5565b01019182370186815203601f19810183528261092a565b8101039060025afa1561017a576020600051604051908152f35b600080fd5b346102115760c0366003190112610211576004356001600160401b03811161021157610246903690600401610838565b906024356001600160401b03811161021157610266903690600401610838565b916044356001600160401b03811161021157610286903690600401610838565b90946064356001600160401b038111610211576102a7903690600401610838565b95909160a4356001600160401b038111610211576102c9903690600401610838565b97909483831480610646575b8061063d575b80610634575b156105f7576102ef8361094b565b996102fd6040519b8c61092a565b838b526103098461094b565b601f19013660208d013760005b848110610365578b60405180916020820160208352815180915260206040840192019060005b81811061034a575050500390f35b8251151584528594506020938401939092019160010161033c565b61037081868b6109d8565b35908681101561057b578060051b8b0135601e198c360301811215610211578b016001600160401b0381351161021157803560061b36036020820113610211578482101561057b578160051b840135601e19853603018112156102115784016001600160401b038135116102115780353603602082011361021157604051631ba533d160e31b8152600481019490945260606024850152813560648501526020820191849160848301916000905b803582106105d1575050602093508391839160031983830301604484015280358252803584820185840137600084823584010152601f80199135011601030181305afa801561017a5786868a8d95600094610591575b509260206101456104ac6104a66104a089600098610497826104ea9a899d6109d8565b3588149c6109d8565b35610b9f565b93610dec565b604051928391816104c681850197888151938492016109b5565b83016104da825180938580850191016109b5565b010103601f19810183528261092a565b8101039060025afa1561017a576000518c82101561057b57601e198a3603018260051b8b01351215610211578160051b8a01358a01928335936001600160401b03851161021157602001938060051b36038513610211578f9261055590859260019760843592610ed5565b82610571575b5061056691926109a1565b901515905201610316565b915061056661055b565b634e487b7160e01b600052603260045260246000fd5b9495505050506020823d82116105c9575b816105af6020938361092a565b810103126105c657505189919086868a6020610474565b80fd5b3d91506105a2565b85358452602080870135908501526040958601958895509093019260019091019061041e565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b508883146102e1565b508183146102db565b508083146102d5565b346102115760c0366003190112610211576004356024356001600160401b038111610211576106829036906004016107db565b6044929192356001600160401b038111610211576106a490369060040161080b565b93909260a4356001600160401b038111610211576106c96106e2913690600401610838565b9490936106d7821515610868565b6100a98815156108b4565b926106ed8451610962565b9560005b85518110156107475760206000610723888361014560016100fc836100f48a61071d6100d9828a6109a1565b976109a1565b8101039060025afa1561017a57600190600051610740828b6109a1565b52016106f1565b50600061076b602092836101458a61076161019f8e610c63565b936101b08a610b9f565b8101039060025afa1561017a57600051906020600061079e610791606435861496610b9f565b836101456104ac88610dec565b8101039060025afa1561017a576040936107be9160843591600051610ed5565b826107d3575b50825191151582526020820152f35b9150836107c4565b9181601f84011215610211578235916001600160401b038311610211576020808501948460061b01011161021157565b9181601f84011215610211578235916001600160401b038311610211576020838186019501011161021157565b9181601f84011215610211578235916001600160401b038311610211576020808501948460051b01011161021157565b1561086f57565b60405162461bcd60e51b815260206004820152601760248201527f5061636b206d75737420636f6e7461696e2063617264730000000000000000006044820152606490fd5b156108bb57565b60405162461bcd60e51b81526020600482015260166024820152755365637265742063616e6e6f7420626520656d70747960501b6044820152606490fd5b604081019081106001600160401b0382111761091457604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b0382111761091457604052565b6001600160401b0381116109145760051b60200190565b9061096c8261094b565b610979604051918261092a565b828152809261098a601f199161094b565b0190602036910137565b80511561057b5760200190565b805182101561057b5760209160051b010190565b60005b8381106109c85750506000910152565b81810151838201526020016109b8565b919081101561057b5760051b0190565b6109f18261094b565b926109ff604051948561092a565b828452601f19610a0e8461094b565b0160005b818110610b3f57505060005b83811015610a745760008160061b8401906040823603126105c6575090600191602060405191610a4d836108f9565b8035835201356020820152610a6282886109a1565b52610a6d81876109a1565b5001610a1e565b509150506001915b8051831015610b3b57610a8f83826109a1565b5191835b8015801580610b12575b15610aec57600019820191808311610ad657610acf90610abd84876109a1565b51610ac882886109a1565b52856109a1565b5015610a93575b634e487b7160e01b600052601160045260246000fd5b50610b099060019394959295610b0282876109a1565b52846109a1565b50019190610a7c565b506000198201828111610ad657610b3586610b2f600093886109a1565b51610f62565b13610a9d565b9150565b602090604051610b4e816108f9565b6000815260008382015282828901015201610a12565b6001600160401b03811161091457601f01601f191660200190565b6000198114610ad65760010190565b90815181101561057b570160200190565b8015610c435780816000925b610c2d5750610bb982610b64565b91610bc7604051938461092a565b80835281601f19610bd783610b64565b013660208601375b610be857505090565b6000198101908111610ad6578091600a81066030019182603011610ad657600a9260f81b6001600160f81b03191660001a90610c249086610b8e565b53049081610bdf565b9091610c3a600a91610b7f565b92910480610bab565b50604051610c5260408261092a565b60018152600360fc1b602082015290565b805115610d9c576001815114610d9357905b81516001811115610d845760018101809111610ad657610c979060011c610962565b906000805b8451821015610d7a5760018201808311610ad6578551811015610d60576020610cd591610cc985896109a1565b5160009384928a6109a1565b519081811015610d355790836101456104ac6104a6610cf395610dec565b8101039060025afa15610d295790610d1791515b610d1182876109a1565b52610b7f565b9060028101809111610ad65790610c9c565b604051903d90823e3d90fd5b836101456104ac6104a6610d4895610dec565b8101039060025afa15610d295790610d179151610d07565b50610d1790610d6f83876109a1565b51610d1182876109a1565b5050915090610c75565b5090610d8f90610994565b5190565b610d8f90610994565b60405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74206275696c6420747265652066726f6d20656d70747920617272604482015261617960f01b6064820152608490fd5b604090815190610dfc838361092a565b601082526f181899199a1a9b1b9c1cb0b131b232b360811b6020830152825192610e2760608561092a565b8352604036602085013760005b60208110610e425750505090565b81811a6001600160f81b0319610e5f600483901c600f1686610b8e565b5116908260011b9183830460021484151715610ad65760001a610e828388610b8e565b536001600160f81b031990610e9a90600f1686610b8e565b5116600060018301809311610ec1576001939291610eba911a9187610b8e565b5301610e34565b634e487b7160e01b81526011600452602490fd5b91906000915b808310610ee9575050501490565b9091926000602091610efc8685876109d8565b35908181108314610f375790836101456104ac6104a6610f1b95610dec565b8101039060025afa1561017a576001600051935b019190610edb565b836101456104ac6104a6610f4a95610dec565b8101039060025afa1561017a57600160005193610f2f565b805182519081811015610f79575050505060001990565b1115610f86575050600190565b6020908101519101519081811015610fa057505060001990565b1115610fab57600190565b60009056fea26469706673582212207ef25be3f79795ccf66e11b6581126fd7d7d90e084686c20a869c9c093e07f4a64736f6c634300081b0033

Deployed Bytecode

0x6080604052600436101561001257600080fd5b60003560e01c806340ff6f551461064f578063b80c2b22146102165763dd299e881461003d57600080fd5b34610211576060366003190112610211576024356001600160401b0381116102115761006d9036906004016107db565b906044356001600160401b038111610211576100906100ae91369060040161080b565b93909261009e821515610868565b6100a98515156108b4565b6109e8565b6100b88151610962565b9260005b825181101561018657602060006101566100e06100d985886109a1565b5151610b9f565b8361014560016100fc836100f48a8d6109a1565b510151610b9f565b6040519384918161011681850198898151938492016109b5565b8301601d60f91b8382015261013482518093856021850191016109b5565b01010301601f19810183528261092a565b6040519283928392519283916109b5565b8101039060025afa1561017a5760019060005161017382886109a1565b52016100bc565b6040513d6000823e3d90fd5b602060006101f78483610145896101a461019f8d610c63565b610dec565b936101b0600435610b9f565b9181604051958694816101cc8188019a8b8151938492016109b5565b86016101e0825180938580850191016109b5565b01019182370186815203601f19810183528261092a565b8101039060025afa1561017a576020600051604051908152f35b600080fd5b346102115760c0366003190112610211576004356001600160401b03811161021157610246903690600401610838565b906024356001600160401b03811161021157610266903690600401610838565b916044356001600160401b03811161021157610286903690600401610838565b90946064356001600160401b038111610211576102a7903690600401610838565b95909160a4356001600160401b038111610211576102c9903690600401610838565b97909483831480610646575b8061063d575b80610634575b156105f7576102ef8361094b565b996102fd6040519b8c61092a565b838b526103098461094b565b601f19013660208d013760005b848110610365578b60405180916020820160208352815180915260206040840192019060005b81811061034a575050500390f35b8251151584528594506020938401939092019160010161033c565b61037081868b6109d8565b35908681101561057b578060051b8b0135601e198c360301811215610211578b016001600160401b0381351161021157803560061b36036020820113610211578482101561057b578160051b840135601e19853603018112156102115784016001600160401b038135116102115780353603602082011361021157604051631ba533d160e31b8152600481019490945260606024850152813560648501526020820191849160848301916000905b803582106105d1575050602093508391839160031983830301604484015280358252803584820185840137600084823584010152601f80199135011601030181305afa801561017a5786868a8d95600094610591575b509260206101456104ac6104a66104a089600098610497826104ea9a899d6109d8565b3588149c6109d8565b35610b9f565b93610dec565b604051928391816104c681850197888151938492016109b5565b83016104da825180938580850191016109b5565b010103601f19810183528261092a565b8101039060025afa1561017a576000518c82101561057b57601e198a3603018260051b8b01351215610211578160051b8a01358a01928335936001600160401b03851161021157602001938060051b36038513610211578f9261055590859260019760843592610ed5565b82610571575b5061056691926109a1565b901515905201610316565b915061056661055b565b634e487b7160e01b600052603260045260246000fd5b9495505050506020823d82116105c9575b816105af6020938361092a565b810103126105c657505189919086868a6020610474565b80fd5b3d91506105a2565b85358452602080870135908501526040958601958895509093019260019091019061041e565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b508883146102e1565b508183146102db565b508083146102d5565b346102115760c0366003190112610211576004356024356001600160401b038111610211576106829036906004016107db565b6044929192356001600160401b038111610211576106a490369060040161080b565b93909260a4356001600160401b038111610211576106c96106e2913690600401610838565b9490936106d7821515610868565b6100a98815156108b4565b926106ed8451610962565b9560005b85518110156107475760206000610723888361014560016100fc836100f48a61071d6100d9828a6109a1565b976109a1565b8101039060025afa1561017a57600190600051610740828b6109a1565b52016106f1565b50600061076b602092836101458a61076161019f8e610c63565b936101b08a610b9f565b8101039060025afa1561017a57600051906020600061079e610791606435861496610b9f565b836101456104ac88610dec565b8101039060025afa1561017a576040936107be9160843591600051610ed5565b826107d3575b50825191151582526020820152f35b9150836107c4565b9181601f84011215610211578235916001600160401b038311610211576020808501948460061b01011161021157565b9181601f84011215610211578235916001600160401b038311610211576020838186019501011161021157565b9181601f84011215610211578235916001600160401b038311610211576020808501948460051b01011161021157565b1561086f57565b60405162461bcd60e51b815260206004820152601760248201527f5061636b206d75737420636f6e7461696e2063617264730000000000000000006044820152606490fd5b156108bb57565b60405162461bcd60e51b81526020600482015260166024820152755365637265742063616e6e6f7420626520656d70747960501b6044820152606490fd5b604081019081106001600160401b0382111761091457604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b0382111761091457604052565b6001600160401b0381116109145760051b60200190565b9061096c8261094b565b610979604051918261092a565b828152809261098a601f199161094b565b0190602036910137565b80511561057b5760200190565b805182101561057b5760209160051b010190565b60005b8381106109c85750506000910152565b81810151838201526020016109b8565b919081101561057b5760051b0190565b6109f18261094b565b926109ff604051948561092a565b828452601f19610a0e8461094b565b0160005b818110610b3f57505060005b83811015610a745760008160061b8401906040823603126105c6575090600191602060405191610a4d836108f9565b8035835201356020820152610a6282886109a1565b52610a6d81876109a1565b5001610a1e565b509150506001915b8051831015610b3b57610a8f83826109a1565b5191835b8015801580610b12575b15610aec57600019820191808311610ad657610acf90610abd84876109a1565b51610ac882886109a1565b52856109a1565b5015610a93575b634e487b7160e01b600052601160045260246000fd5b50610b099060019394959295610b0282876109a1565b52846109a1565b50019190610a7c565b506000198201828111610ad657610b3586610b2f600093886109a1565b51610f62565b13610a9d565b9150565b602090604051610b4e816108f9565b6000815260008382015282828901015201610a12565b6001600160401b03811161091457601f01601f191660200190565b6000198114610ad65760010190565b90815181101561057b570160200190565b8015610c435780816000925b610c2d5750610bb982610b64565b91610bc7604051938461092a565b80835281601f19610bd783610b64565b013660208601375b610be857505090565b6000198101908111610ad6578091600a81066030019182603011610ad657600a9260f81b6001600160f81b03191660001a90610c249086610b8e565b53049081610bdf565b9091610c3a600a91610b7f565b92910480610bab565b50604051610c5260408261092a565b60018152600360fc1b602082015290565b805115610d9c576001815114610d9357905b81516001811115610d845760018101809111610ad657610c979060011c610962565b906000805b8451821015610d7a5760018201808311610ad6578551811015610d60576020610cd591610cc985896109a1565b5160009384928a6109a1565b519081811015610d355790836101456104ac6104a6610cf395610dec565b8101039060025afa15610d295790610d1791515b610d1182876109a1565b52610b7f565b9060028101809111610ad65790610c9c565b604051903d90823e3d90fd5b836101456104ac6104a6610d4895610dec565b8101039060025afa15610d295790610d179151610d07565b50610d1790610d6f83876109a1565b51610d1182876109a1565b5050915090610c75565b5090610d8f90610994565b5190565b610d8f90610994565b60405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74206275696c6420747265652066726f6d20656d70747920617272604482015261617960f01b6064820152608490fd5b604090815190610dfc838361092a565b601082526f181899199a1a9b1b9c1cb0b131b232b360811b6020830152825192610e2760608561092a565b8352604036602085013760005b60208110610e425750505090565b81811a6001600160f81b0319610e5f600483901c600f1686610b8e565b5116908260011b9183830460021484151715610ad65760001a610e828388610b8e565b536001600160f81b031990610e9a90600f1686610b8e565b5116600060018301809311610ec1576001939291610eba911a9187610b8e565b5301610e34565b634e487b7160e01b81526011600452602490fd5b91906000915b808310610ee9575050501490565b9091926000602091610efc8685876109d8565b35908181108314610f375790836101456104ac6104a6610f1b95610dec565b8101039060025afa1561017a576001600051935b019190610edb565b836101456104ac6104a6610f4a95610dec565b8101039060025afa1561017a57600160005193610f2f565b805182519081811015610f79575050505060001990565b1115610f86575050600190565b6020908101519101519081811015610fa057505060001990565b1115610fab57600190565b60009056fea26469706673582212207ef25be3f79795ccf66e11b6581126fd7d7d90e084686c20a869c9c093e07f4a64736f6c634300081b0033

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
0xcF91F658ef1f02E38d2793022720B4205868F311
Loading...
Loading
Loading...
Loading
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.