false
false
0
The new Blockscout UI is now open source! Learn how to deploy it here

Contract Address Details

0x3Cb17d8E4339529e7b815BaB56B2F57B1daAFd7d

Contract Name
DevnetVerifier
Creator
0x4779d1–4df7b8 at 0xe7f8a3–cde5e9
Balance
0 ETH
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
24636
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
DevnetVerifier




Optimization enabled
true
Compiler version
v0.8.30+commit.73712a01




Optimization runs
200
EVM Version
cancun




Verified at
2026-06-25T02:55:54.108315Z

Constructor Arguments

0x000000000000000000000000cfd3759b83d8567e869e7584acfa83d9bc93e41e000000000000000000000000a048f803ddd1ef3eec93c8a14d66d14a5105690c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Arg [0] (address) : 0xcfd3759b83d8567e869e7584acfa83d9bc93e41e
Arg [1] (address) : 0xa048f803ddd1ef3eec93c8a14d66d14a5105690c
Arg [2] (address) : 0x0000000000000000000000000000000000000000
Arg [3] (address) : 0x0000000000000000000000000000000000000000

              

contracts/layer1/devnet/DevnetVerifier.sol

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

import "../verifiers/compose/ComposeVerifier.sol";

/// @title DevnetVerifier
/// @notice SGX + (OP or RISC0 or SP1) verifier for devnet
/// @dev In production, use AnyTwoVerifier. This is for testing with OpVerifier support.
/// @custom:security-contact security@taiko.xyz
contract DevnetVerifier is ComposeVerifier {
    constructor(
        address _sgxGethVerifier,
        address _sgxRethVerifier,
        address _risc0RethVerifier,
        address _sp1RethVerifier
    )
        ComposeVerifier(
            _sgxGethVerifier,
            address(0),
            address(0),
            _sgxRethVerifier,
            _risc0RethVerifier,
            _sp1RethVerifier
        )
    { }

    /// @notice Check if the provided verifiers are sufficient
    /// @dev Requires exactly 2 verifiers: SGX + (OP or RISC0 or SP1)
    function areVerifiersSufficient(address[] memory _verifiers)
        internal
        view
        override
        returns (bool)
    {
        if (_verifiers.length != 2) return false;

        // Determine which verifier is SGX and which is the second verifier
        uint256 secondVerifierIdx;
        if (_verifiers[0] == sgxGethVerifier) {
            secondVerifierIdx = 1;
        } else if (_verifiers[1] == sgxGethVerifier) {
            secondVerifierIdx = 0;
        } else {
            // One of the verifiers MUST be SGX
            return false;
        }

        // The second verifier must be one of: OP, RISC0, or SP1
        return _verifiers[secondVerifierIdx] == sgxRethVerifier
            || _verifiers[secondVerifierIdx] == risc0RethVerifier
            || _verifiers[secondVerifierIdx] == sp1RethVerifier;
    }
}
        

contracts/layer1/verifiers/IProofVerifier.sol

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

/// @title IProofVerifier
/// @notice Interface for verifying validity proofs for state transitions
/// @custom:security-contact security@taiko.xyz
interface IProofVerifier {
    /// @notice Verifies a validity proof for a state transition
    /// @dev This function must revert if the proof is invalid
    /// @param _proposalAge The age in seconds of the proposal being proven. Only set for
    ///        single-proposal proofs (calculated as block.timestamp - proposal.timestamp).
    ///        For multi-proposal batches, this is always 0, meaning "not applicable".
    ///        Verifiers should interpret _proposalAge == 0 as "not applicable" rather than
    ///        "instant proof". This parameter enables age-based verification logic, such as
    ///        detecting and handling prover-killer proposals differently.
    /// @param _commitmentHash Hash of the last proposal hash and commitment data
    /// @param _proof The proof data
    function verifyProof(
        uint256 _proposalAge,
        bytes32 _commitmentHash,
        bytes calldata _proof
    )
        external
        view;
}
          

contracts/layer1/verifiers/compose/ComposeVerifier.sol

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

import "../IProofVerifier.sol";

/// @title ComposeVerifier
/// @notice This contract is an abstract verifier that composes multiple sub-verifiers to validate
/// proofs.
/// It ensures that a set of sub-proofs are verified by their respective verifiers before
/// considering the overall proof as valid.
/// @custom:security-contact security@taiko.xyz
abstract contract ComposeVerifier is IProofVerifier {
    enum VerifierType {
        NONE,
        SGX_GETH,
        TDX_GETH,
        OP,
        SGX_RETH,
        RISC0_RETH,
        SP1_RETH
    }

    struct SubProof {
        VerifierType verifierId;
        bytes proof;
    }

    /// @notice Immutable verifier addresses
    /// The sgx/tdx-GethVerifier is the core verifier required in every proof.
    /// All other proofs share its status root, despite different public inputs
    /// due to different verification types.
    /// proofs come from geth client
    address public immutable sgxGethVerifier;
    address public immutable tdxGethVerifier;
    /// op for test purpose
    address public immutable opVerifier;
    /// proofs come from reth client
    address public immutable sgxRethVerifier;
    address public immutable risc0RethVerifier;
    address public immutable sp1RethVerifier;

    constructor(
        address _sgxGethVerifier,
        address _tdxGethVerifier,
        address _opVerifier,
        address _sgxRethVerifier,
        address _risc0RethVerifier,
        address _sp1RethVerifier
    ) {
        sgxGethVerifier = _sgxGethVerifier;
        tdxGethVerifier = _tdxGethVerifier;
        opVerifier = _opVerifier;
        sgxRethVerifier = _sgxRethVerifier;
        risc0RethVerifier = _risc0RethVerifier;
        sp1RethVerifier = _sp1RethVerifier;
    }

    /// @inheritdoc IProofVerifier
    function verifyProof(
        uint256 _proposalAge,
        bytes32 _commitmentHash,
        bytes calldata _proof
    )
        external
        view
    {
        SubProof[] memory subProofs = abi.decode(_proof, (SubProof[]));
        uint256 size = subProofs.length;
        address[] memory verifiers = new address[](size);

        VerifierType lastVerifierId;

        for (uint256 i; i < size; ++i) {
            VerifierType verifierId = subProofs[i].verifierId;

            require(verifierId != VerifierType.NONE, CV_INVALID_SUB_VERIFIER());
            require(verifierId > lastVerifierId, CV_INVALID_SUB_VERIFIER_ORDER());

            address verifier = getVerifierAddress(verifierId);
            require(verifier != address(0), CV_INVALID_SUB_VERIFIER());

            IProofVerifier(verifier).verifyProof(_proposalAge, _commitmentHash, subProofs[i].proof);

            verifiers[i] = verifier;
            lastVerifierId = verifierId;
        }

        require(areVerifiersSufficient(verifiers), CV_VERIFIERS_INSUFFICIENT());
    }

    /// @notice Returns the verifier address for a given verifier ID
    /// @param _verifierId The verifier ID to query
    /// @return The address of the verifier (or address(0) if invalid)
    function getVerifierAddress(VerifierType _verifierId) public view returns (address) {
        if (_verifierId == VerifierType.SGX_GETH) return sgxGethVerifier;
        if (_verifierId == VerifierType.TDX_GETH) return tdxGethVerifier;
        if (_verifierId == VerifierType.OP) return opVerifier;
        if (_verifierId == VerifierType.SGX_RETH) return sgxRethVerifier;
        if (_verifierId == VerifierType.RISC0_RETH) return risc0RethVerifier;
        if (_verifierId == VerifierType.SP1_RETH) return sp1RethVerifier;
        return address(0);
    }

    /// @dev Checks if the provided verifiers are sufficient
    /// NOTE: Verifier addresses are provided in ascending order of their IDs
    function areVerifiersSufficient(address[] memory _verifiers)
        internal
        view
        virtual
        returns (bool);

    error CV_INVALID_SUB_VERIFIER();
    error CV_INVALID_SUB_VERIFIER_ORDER();
    error CV_VERIFIERS_INSUFFICIENT();
}
          

Compiler Settings

{"viaIR":false,"remappings":["openzeppelin/=node_modules/@openzeppelin/","@openzeppelin/=node_modules/@openzeppelin/","@openzeppelin-upgrades/contracts/=node_modules/@openzeppelin/contracts-upgradeable/","@risc0/contracts/=node_modules/risc0-ethereum/contracts/src/","@solady/=node_modules/solady/","solady/src/=node_modules/solady/src/","solady/utils/=node_modules/solady/src/utils/","@optimism/=node_modules/optimism/","@sp1-contracts/=node_modules/sp1-contracts/contracts/","forge-std/=node_modules/forge-std/","@p256-verifier/contracts/=node_modules/p256-verifier/src/","@eth-fabric/urc/=node_modules/urc/src/","ds-test/=node_modules/ds-test/","src/=contracts/","test/=test/","script/=script/","optimism/=node_modules/optimism/","p256-verifier/=node_modules/p256-verifier/","risc0-ethereum/=node_modules/risc0-ethereum/","sp1-contracts/=node_modules/sp1-contracts/","urc/=node_modules/urc/"],"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"libraries":{},"evmVersion":"cancun"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_sgxGethVerifier","internalType":"address"},{"type":"address","name":"_sgxRethVerifier","internalType":"address"},{"type":"address","name":"_risc0RethVerifier","internalType":"address"},{"type":"address","name":"_sp1RethVerifier","internalType":"address"}]},{"type":"error","name":"CV_INVALID_SUB_VERIFIER","inputs":[]},{"type":"error","name":"CV_INVALID_SUB_VERIFIER_ORDER","inputs":[]},{"type":"error","name":"CV_VERIFIERS_INSUFFICIENT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getVerifierAddress","inputs":[{"type":"uint8","name":"_verifierId","internalType":"enum ComposeVerifier.VerifierType"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"opVerifier","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"risc0RethVerifier","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sgxGethVerifier","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sgxRethVerifier","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sp1RethVerifier","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tdxGethVerifier","inputs":[]},{"type":"function","stateMutability":"view","outputs":[],"name":"verifyProof","inputs":[{"type":"uint256","name":"_proposalAge","internalType":"uint256"},{"type":"bytes32","name":"_commitmentHash","internalType":"bytes32"},{"type":"bytes","name":"_proof","internalType":"bytes"}]}]
              

Contract Creation Code

0x610140604052348015610010575f5ffd5b50604051610b9e380380610b9e83398101604081905261002f91610077565b6001600160a01b039384166080525f60a081905260c05291831660e05282166101005216610120526100c8565b80516001600160a01b0381168114610072575f5ffd5b919050565b5f5f5f5f6080858703121561008a575f5ffd5b6100938561005c565b93506100a16020860161005c565b92506100af6040860161005c565b91506100bd6060860161005c565b905092959194509250565b60805160a05160c05160e0516101005161012051610a4461015a5f395f81816101200152818161051e01526106c201525f8181610147015281816104de015261066d01525f818160a30152818161049e015261061901525f8181610195015261045e01525f818161016e015261041e01525f818160f9015281816103de0152818161055d01526105b70152610a445ff3fe608060405234801561000f575f5ffd5b5060043610610085575f3560e01c80638d732463116100585780638d7324631461011b57806397b56f5714610142578063a936fa7114610169578063d09aed4814610190575f5ffd5b806314bcf3dd146100895780634185d4221461009e57806342b57409146100e1578063680bca47146100f4575b5f5ffd5b61009c610097366004610716565b6101b7565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100c56100ef3660046107a5565b6103c1565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b5f6101c48284018461082c565b80519091505f8167ffffffffffffffff8111156101e3576101e36107be565b60405190808252806020026020018201604052801561020c578160200160208202803683370190505b5090505f5f5b83811015610390575f85828151811061022d5761022d6109a3565b60209081029190910101515190505f81600681111561024e5761024e6109b7565b0361026c57604051632699817960e01b815260040160405180910390fd5b82600681111561027e5761027e6109b7565b816006811115610290576102906109b7565b116102ae57604051636d14c6cd60e01b815260040160405180910390fd5b5f6102b8826103c1565b90506001600160a01b0381166102e157604051632699817960e01b815260040160405180910390fd5b806001600160a01b03166314bcf3dd8c8c8a8781518110610304576103046109a3565b6020026020010151602001516040518463ffffffff1660e01b815260040161032e939291906109cb565b5f6040518083038186803b158015610344575f5ffd5b505afa158015610356573d5f5f3e3d5ffd5b505050508085848151811061036d5761036d6109a3565b6001600160a01b0390921660209283029190910190910152509150600101610212565b5061039a82610549565b6103b757604051634148652760e11b815260040160405180910390fd5b5050505050505050565b5f60018260068111156103d6576103d66109b7565b0361040257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6002826006811115610416576104166109b7565b0361044257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6003826006811115610456576104566109b7565b0361048257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6004826006811115610496576104966109b7565b036104c257507f0000000000000000000000000000000000000000000000000000000000000000919050565b60058260068111156104d6576104d66109b7565b0361050257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6006826006811115610516576105166109b7565b0361054257507f0000000000000000000000000000000000000000000000000000000000000000919050565b505f919050565b5f815160021461055a57505f919050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316835f81518110610597576105976109a3565b60200260200101516001600160a01b0316036105b557506001610617565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001815181106105f2576105f26109a3565b60200260200101516001600160a01b03160361060f57505f610617565b505f92915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316838281518110610653576106536109a3565b60200260200101516001600160a01b031614806106ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168382815181106106a7576106a76109a3565b60200260200101516001600160a01b0316145b8061070f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168382815181106106fc576106fc6109a3565b60200260200101516001600160a01b0316145b9392505050565b5f5f5f5f60608587031215610729575f5ffd5b8435935060208501359250604085013567ffffffffffffffff81111561074d575f5ffd5b8501601f8101871361075d575f5ffd5b803567ffffffffffffffff811115610773575f5ffd5b876020828401011115610784575f5ffd5b949793965060200194505050565b8035600781106107a0575f5ffd5b919050565b5f602082840312156107b5575f5ffd5b61070f82610792565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156107f5576107f56107be565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610824576108246107be565b604052919050565b5f6020828403121561083c575f5ffd5b813567ffffffffffffffff811115610852575f5ffd5b8201601f81018413610862575f5ffd5b803567ffffffffffffffff81111561087c5761087c6107be565b8060051b61088c602082016107fb565b918252602081840181019290810190878411156108a7575f5ffd5b6020850192505b8383101561099857823567ffffffffffffffff8111156108cc575f5ffd5b85016040818a03601f190112156108e1575f5ffd5b6108e96107d2565b6108f560208301610792565b8152604082013567ffffffffffffffff811115610910575f5ffd5b60208184010192505089601f830112610927575f5ffd5b813567ffffffffffffffff811115610941576109416107be565b610954601f8201601f19166020016107fb565b8181528b6020838601011115610968575f5ffd5b816020850160208301375f60208383010152806020840152505080845250506020820191506020830192506108ae565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b838152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f83011684010191505094935050505056fea2646970667358221220edb186652ca81e5e516771c6c3c766548a7a8dabf4b2da6193d5ba377973c84564736f6c634300081e0033000000000000000000000000cfd3759b83d8567e869e7584acfa83d9bc93e41e000000000000000000000000a048f803ddd1ef3eec93c8a14d66d14a5105690c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x608060405234801561000f575f5ffd5b5060043610610085575f3560e01c80638d732463116100585780638d7324631461011b57806397b56f5714610142578063a936fa7114610169578063d09aed4814610190575f5ffd5b806314bcf3dd146100895780634185d4221461009e57806342b57409146100e1578063680bca47146100f4575b5f5ffd5b61009c610097366004610716565b6101b7565b005b6100c57f000000000000000000000000a048f803ddd1ef3eec93c8a14d66d14a5105690c81565b6040516001600160a01b03909116815260200160405180910390f35b6100c56100ef3660046107a5565b6103c1565b6100c57f000000000000000000000000cfd3759b83d8567e869e7584acfa83d9bc93e41e81565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b5f6101c48284018461082c565b80519091505f8167ffffffffffffffff8111156101e3576101e36107be565b60405190808252806020026020018201604052801561020c578160200160208202803683370190505b5090505f5f5b83811015610390575f85828151811061022d5761022d6109a3565b60209081029190910101515190505f81600681111561024e5761024e6109b7565b0361026c57604051632699817960e01b815260040160405180910390fd5b82600681111561027e5761027e6109b7565b816006811115610290576102906109b7565b116102ae57604051636d14c6cd60e01b815260040160405180910390fd5b5f6102b8826103c1565b90506001600160a01b0381166102e157604051632699817960e01b815260040160405180910390fd5b806001600160a01b03166314bcf3dd8c8c8a8781518110610304576103046109a3565b6020026020010151602001516040518463ffffffff1660e01b815260040161032e939291906109cb565b5f6040518083038186803b158015610344575f5ffd5b505afa158015610356573d5f5f3e3d5ffd5b505050508085848151811061036d5761036d6109a3565b6001600160a01b0390921660209283029190910190910152509150600101610212565b5061039a82610549565b6103b757604051634148652760e11b815260040160405180910390fd5b5050505050505050565b5f60018260068111156103d6576103d66109b7565b0361040257507f000000000000000000000000cfd3759b83d8567e869e7584acfa83d9bc93e41e919050565b6002826006811115610416576104166109b7565b0361044257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6003826006811115610456576104566109b7565b0361048257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6004826006811115610496576104966109b7565b036104c257507f000000000000000000000000a048f803ddd1ef3eec93c8a14d66d14a5105690c919050565b60058260068111156104d6576104d66109b7565b0361050257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6006826006811115610516576105166109b7565b0361054257507f0000000000000000000000000000000000000000000000000000000000000000919050565b505f919050565b5f815160021461055a57505f919050565b5f7f000000000000000000000000cfd3759b83d8567e869e7584acfa83d9bc93e41e6001600160a01b0316835f81518110610597576105976109a3565b60200260200101516001600160a01b0316036105b557506001610617565b7f000000000000000000000000cfd3759b83d8567e869e7584acfa83d9bc93e41e6001600160a01b0316836001815181106105f2576105f26109a3565b60200260200101516001600160a01b03160361060f57505f610617565b505f92915050565b7f000000000000000000000000a048f803ddd1ef3eec93c8a14d66d14a5105690c6001600160a01b0316838281518110610653576106536109a3565b60200260200101516001600160a01b031614806106ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168382815181106106a7576106a76109a3565b60200260200101516001600160a01b0316145b8061070f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168382815181106106fc576106fc6109a3565b60200260200101516001600160a01b0316145b9392505050565b5f5f5f5f60608587031215610729575f5ffd5b8435935060208501359250604085013567ffffffffffffffff81111561074d575f5ffd5b8501601f8101871361075d575f5ffd5b803567ffffffffffffffff811115610773575f5ffd5b876020828401011115610784575f5ffd5b949793965060200194505050565b8035600781106107a0575f5ffd5b919050565b5f602082840312156107b5575f5ffd5b61070f82610792565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156107f5576107f56107be565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610824576108246107be565b604052919050565b5f6020828403121561083c575f5ffd5b813567ffffffffffffffff811115610852575f5ffd5b8201601f81018413610862575f5ffd5b803567ffffffffffffffff81111561087c5761087c6107be565b8060051b61088c602082016107fb565b918252602081840181019290810190878411156108a7575f5ffd5b6020850192505b8383101561099857823567ffffffffffffffff8111156108cc575f5ffd5b85016040818a03601f190112156108e1575f5ffd5b6108e96107d2565b6108f560208301610792565b8152604082013567ffffffffffffffff811115610910575f5ffd5b60208184010192505089601f830112610927575f5ffd5b813567ffffffffffffffff811115610941576109416107be565b610954601f8201601f19166020016107fb565b8181528b6020838601011115610968575f5ffd5b816020850160208301375f60208383010152806020840152505080845250506020820191506020830192506108ae565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b838152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f83011684010191505094935050505056fea2646970667358221220edb186652ca81e5e516771c6c3c766548a7a8dabf4b2da6193d5ba377973c84564736f6c634300081e0033