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
0x6101403461010f57601f6109ad38819003918201601f19168301916001600160401b038311848410176101135780849260809460405283398101031261010f5761004881610127565b9061005560208201610127565b61006d606061006660408501610127565b9301610127565b926080525f60a0525f60c05260e0526101005261012052604051610871908161013c823960805181818161019a015281816106c70152610708015260a05181818160ce01526106a2015260c0518181816086015261067d015260e0518181816102180152818161065801526107540152610100518181816101120152818161063301526107eb0152610120518181816101560152818161060e01526107a70152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361010f5756fe60806040526004361015610011575f80fd5b5f3560e01c806314bcf3dd146102475780634185d4221461020357806342b57409146101c9578063680bca47146101855780638d7324631461014157806397b56f57146100fd578063a936fa71146100b95763d09aed4814610071575f80fd5b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b55760203660031901126100b55760043560078110156100b5576101f16020916105d0565b6040516001600160a01b039091168152f35b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b55760603660031901126100b55760243560443560043567ffffffffffffffff82116100b557366023830112156100b557816004013567ffffffffffffffff81116100b55782019160248301903682116100b5576020818503126100b55760248101359067ffffffffffffffff82116100b55701816043820112156100b5576024810135936102d885610590565b946102e6604051968761056e565b808652602060248188019260051b85010101928484116100b55760448101915b8483106104875788888881519161031c83610590565b9361032a604051958661056e565b838552601f1961033985610590565b013660208701375f92835b85851061036a57610354876106e9565b1561035b57005b634148652760e11b5f5260045ffd5b61037485856105a8565b515190600782101561047357811561045557600781101561047357811115610464576001600160a01b036103a7826105d0565b169081156104555760206103bb87876105a8565b51015191803b156100b5575f6020936084604051809681936314bcf3dd60e01b83528960048401528a6024840152606060448401528051918291826064860152018484015e8181018301859052601f01601f19168101030181845afa92831561044a5760019361043a575b50610431878a6105a8565b52940193610344565b5f6104449161056e565b89610426565b6040513d5f823e3d90fd5b632699817960e01b5f5260045ffd5b636d14c6cd60e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b823567ffffffffffffffff81116100b55782016024810191906040908603601f1901126100b557604051916040830183811067ffffffffffffffff82111761055a57604052602081013560078110156100b5578352604081013567ffffffffffffffff81116100b55760209101019087601f830112156100b55781359267ffffffffffffffff841161055a5760405161052a601f8601601f19166020018261056e565b84815289602086860101116100b5575f602086819782809801838601378301015283820152815201920191610306565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761055a57604052565b67ffffffffffffffff811161055a5760051b60200190565b80518210156105bc5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b600781101561047357600181146106c4576002811461069f576003811461067a576004811461065557600581146106305760061461060c575f90565b7f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6002815103610836578051156105bc5760208101516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116810361081257506001905b6001600160a01b0361074883836105a8565b51166001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016149182156107cb575b821561078857505090565b6001600160a01b03925061079b916105a8565b51166001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161490565b91506001600160a01b036107df83836105a8565b51166001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016149161077d565b8151600110156105bc5760408201516001600160a01b031603610836575f90610736565b505f9056fea2646970667358221220ae7caf4b5347aca2a968f1b3cb3e2a2302438566fdcbc8f71162cb4756dd048b64736f6c634300081e0033000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d484000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb7000000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d007
Deployed ByteCode
0x60806040526004361015610011575f80fd5b5f3560e01c806314bcf3dd146102475780634185d4221461020357806342b57409146101c9578063680bca47146101855780638d7324631461014157806397b56f57146100fd578063a936fa71146100b95763d09aed4814610071575f80fd5b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b5575f3660031901126100b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb706001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f00000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d0076001600160a01b03168152602090f35b346100b5575f3660031901126100b5576040517f000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d6001600160a01b03168152602090f35b346100b55760203660031901126100b55760043560078110156100b5576101f16020916105d0565b6040516001600160a01b039091168152f35b346100b5575f3660031901126100b5576040517f0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d4846001600160a01b03168152602090f35b346100b55760603660031901126100b55760243560443560043567ffffffffffffffff82116100b557366023830112156100b557816004013567ffffffffffffffff81116100b55782019160248301903682116100b5576020818503126100b55760248101359067ffffffffffffffff82116100b55701816043820112156100b5576024810135936102d885610590565b946102e6604051968761056e565b808652602060248188019260051b85010101928484116100b55760448101915b8483106104875788888881519161031c83610590565b9361032a604051958661056e565b838552601f1961033985610590565b013660208701375f92835b85851061036a57610354876106e9565b1561035b57005b634148652760e11b5f5260045ffd5b61037485856105a8565b515190600782101561047357811561045557600781101561047357811115610464576001600160a01b036103a7826105d0565b169081156104555760206103bb87876105a8565b51015191803b156100b5575f6020936084604051809681936314bcf3dd60e01b83528960048401528a6024840152606060448401528051918291826064860152018484015e8181018301859052601f01601f19168101030181845afa92831561044a5760019361043a575b50610431878a6105a8565b52940193610344565b5f6104449161056e565b89610426565b6040513d5f823e3d90fd5b632699817960e01b5f5260045ffd5b636d14c6cd60e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b823567ffffffffffffffff81116100b55782016024810191906040908603601f1901126100b557604051916040830183811067ffffffffffffffff82111761055a57604052602081013560078110156100b5578352604081013567ffffffffffffffff81116100b55760209101019087601f830112156100b55781359267ffffffffffffffff841161055a5760405161052a601f8601601f19166020018261056e565b84815289602086860101116100b5575f602086819782809801838601378301015283820152815201920191610306565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761055a57604052565b67ffffffffffffffff811161055a5760051b60200190565b80518210156105bc5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b600781101561047357600181146106c4576002811461069f576003811461067a576004811461065557600581146106305760061461060c575f90565b7f00000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d00790565b507f000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb7090565b507f0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d48490565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000000000000000000000000000000000000000000090565b507f000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d90565b6002815103610836578051156105bc5760208101516001600160a01b037f000000000000000000000000fbcc0b771018816463e71e3164c45eb432b09f2d81169116810361081257506001905b6001600160a01b0361074883836105a8565b51166001600160a01b037f0000000000000000000000006719d5825cba8689214cea2484b71703e9b1d48416149182156107cb575b821561078857505090565b6001600160a01b03925061079b916105a8565b51166001600160a01b037f00000000000000000000000048940f7ab2c674aa66c09eda71614ad704e9d007161490565b91506001600160a01b036107df83836105a8565b51166001600160a01b037f000000000000000000000000cb2d625bf8c2187b180646af4738af5f1413fb7016149161077d565b8151600110156105bc5760408201516001600160a01b031603610836575f90610736565b505f9056fea2646970667358221220ae7caf4b5347aca2a968f1b3cb3e2a2302438566fdcbc8f71162cb4756dd048b64736f6c634300081e0033
External libraries
LibForcedInclusion : 0x8bBdF7B3D44c1CF6aA64Db449E93aD5C0d10E63c
LibInboxSetup : 0xb2c8E57eb1eb0b686B63f58E53f859bEA615677B