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

Contract Address Details

0x461461E95De3cC306D5424F554463C162433384e

Contract Name
DevnetVerifier
Creator
0x4779d1–4df7b8 at 0xf0893f–867d4d
Balance
0 ETH
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
32249
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
prague




Verified at
2026-01-09T13:04:06.743573Z

Constructor Arguments

0x000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d484000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb7000000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d007

Arg [0] (address) : 0xfbcc0b771018816463e71e3164c45eb432b09f2d
Arg [1] (address) : 0x6719d5825cba8689214cea2484b71703e9b1d484
Arg [2] (address) : 0xcb2d625bf8c2187b180646af4738af5f1413fb70
Arg [3] (address) : 0x48940f7ab2c674aa66c09eda71614ad704e9d007

              

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":true,"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":{"contracts/layer1/core/libs/LibInboxSetup.sol":{"LibInboxSetup":"0xb2c8E57eb1eb0b686B63f58E53f859bEA615677B"},"contracts/layer1/core/libs/LibForcedInclusion.sol":{"LibForcedInclusion":"0x8bBdF7B3D44c1CF6aA64Db449E93aD5C0d10E63c"}},"evmVersion":"prague"}
              

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

Verify & Publish
0x6101403461010f57601f6109ad38819003918201601f19168301916001600160401b038311848410176101135780849260809460405283398101031261010f5761004881610127565b9061005560208201610127565b61006d606061006660408501610127565b9301610127565b926080525f60a0525f60c05260e0526101005261012052604051610871908161013c823960805181818161019a015281816106c70152610708015260a05181818160ce01526106a2015260c0518181816086015261067d015260e0518181816102180152818161065801526107540152610100518181816101120152818161063301526107eb0152610120518181816101560152818161060e01526107a70152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361010f5756fe60806040526004361015610011575f80fd5b5f3560e01c806314bcf3dd146102475780634185d4221461020357806342b57409146101c9578063680bca47146101855780638d7324631461014157806397b56f57146100fd578063a936fa71146100b95763d09aed4814610071575f80fd5b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b55760203660031901126100b55760043560078110156100b5576101f16020916105d0565b6040516001600160a01b039091168152f35b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b55760603660031901126100b55760243560443560043567ffffffffffffffff82116100b557366023830112156100b557816004013567ffffffffffffffff81116100b55782019160248301903682116100b5576020818503126100b55760248101359067ffffffffffffffff82116100b55701816043820112156100b5576024810135936102d885610590565b946102e6604051968761056e565b808652602060248188019260051b85010101928484116100b55760448101915b8483106104875788888881519161031c83610590565b9361032a604051958661056e565b838552601f1961033985610590565b013660208701375f92835b85851061036a57610354876106e9565b1561035b57005b634148652760e11b5f5260045ffd5b61037485856105a8565b515190600782101561047357811561045557600781101561047357811115610464576001600160a01b036103a7826105d0565b169081156104555760206103bb87876105a8565b51015191803b156100b5575f6020936084604051809681936314bcf3dd60e01b83528960048401528a6024840152606060448401528051918291826064860152018484015e8181018301859052601f01601f19168101030181845afa92831561044a5760019361043a575b50610431878a6105a8565b52940193610344565b5f6104449161056e565b89610426565b6040513d5f823e3d90fd5b632699817960e01b5f5260045ffd5b636d14c6cd60e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b823567ffffffffffffffff81116100b55782016024810191906040908603601f1901126100b557604051916040830183811067ffffffffffffffff82111761055a57604052602081013560078110156100b5578352604081013567ffffffffffffffff81116100b55760209101019087601f830112156100b55781359267ffffffffffffffff841161055a5760405161052a601f8601601f19166020018261056e565b84815289602086860101116100b5575f602086819782809801838601378301015283820152815201920191610306565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761055a57604052565b67ffffffffffffffff811161055a5760051b60200190565b80518210156105bc5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b600781101561047357600181146106c4576002811461069f576003811461067a576004811461065557600581146106305760061461060c575f90565b7f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6002815103610836578051156105bc5760208101516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116810361081257506001905b6001600160a01b0361074883836105a8565b51166001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016149182156107cb575b821561078857505090565b6001600160a01b03925061079b916105a8565b51166001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161490565b91506001600160a01b036107df83836105a8565b51166001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016149161077d565b8151600110156105bc5760408201516001600160a01b031603610836575f90610736565b505f9056fea2646970667358221220ae7caf4b5347aca2a968f1b3cb3e2a2302438566fdcbc8f71162cb4756dd048b64736f6c634300081e0033000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d484000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb7000000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d007

Deployed ByteCode

0x60806040526004361015610011575f80fd5b5f3560e01c806314bcf3dd146102475780634185d4221461020357806342b57409146101c9578063680bca47146101855780638d7324631461014157806397b56f57146100fd578063a936fa71146100b95763d09aed4814610071575f80fd5b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb706001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f00000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d0076001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d6001600160a01b03168152602090f35b346100b55760203660031901126100b55760043560078110156100b5576101f16020916105d0565b6040516001600160a01b039091168152f35b346100b5575f3660031901126100b5576040517f0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d4846001600160a01b03168152602090f35b346100b55760603660031901126100b55760243560443560043567ffffffffffffffff82116100b557366023830112156100b557816004013567ffffffffffffffff81116100b55782019160248301903682116100b5576020818503126100b55760248101359067ffffffffffffffff82116100b55701816043820112156100b5576024810135936102d885610590565b946102e6604051968761056e565b808652602060248188019260051b85010101928484116100b55760448101915b8483106104875788888881519161031c83610590565b9361032a604051958661056e565b838552601f1961033985610590565b013660208701375f92835b85851061036a57610354876106e9565b1561035b57005b634148652760e11b5f5260045ffd5b61037485856105a8565b515190600782101561047357811561045557600781101561047357811115610464576001600160a01b036103a7826105d0565b169081156104555760206103bb87876105a8565b51015191803b156100b5575f6020936084604051809681936314bcf3dd60e01b83528960048401528a6024840152606060448401528051918291826064860152018484015e8181018301859052601f01601f19168101030181845afa92831561044a5760019361043a575b50610431878a6105a8565b52940193610344565b5f6104449161056e565b89610426565b6040513d5f823e3d90fd5b632699817960e01b5f5260045ffd5b636d14c6cd60e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b823567ffffffffffffffff81116100b55782016024810191906040908603601f1901126100b557604051916040830183811067ffffffffffffffff82111761055a57604052602081013560078110156100b5578352604081013567ffffffffffffffff81116100b55760209101019087601f830112156100b55781359267ffffffffffffffff841161055a5760405161052a601f8601601f19166020018261056e565b84815289602086860101116100b5575f602086819782809801838601378301015283820152815201920191610306565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761055a57604052565b67ffffffffffffffff811161055a5760051b60200190565b80518210156105bc5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b600781101561047357600181146106c4576002811461069f576003811461067a576004811461065557600581146106305760061461060c575f90565b7f00000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d00790565b507f000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb7090565b507f0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d48490565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d90565b6002815103610836578051156105bc5760208101516001600160a01b037f000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d81169116810361081257506001905b6001600160a01b0361074883836105a8565b51166001600160a01b037f0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d48416149182156107cb575b821561078857505090565b6001600160a01b03925061079b916105a8565b51166001600160a01b037f00000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d007161490565b91506001600160a01b036107df83836105a8565b51166001600160a01b037f000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb7016149161077d565b8151600110156105bc5760408201516001600160a01b031603610836575f90610736565b505f9056fea2646970667358221220ae7caf4b5347aca2a968f1b3cb3e2a2302438566fdcbc8f71162cb4756dd048b64736f6c634300081e0033

External libraries