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-24T09:37:42.290637Z
Constructor Arguments
0x000000000000000000000000fca057ab211dfaeb01fb8a36f4231fb4021a664100000000000000000000000025a669bc4e405b78437b560f908bc78f8141d15900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Arg [0] (address) : 0xfca057ab211dfaeb01fb8a36f4231fb4021a6641
Arg [1] (address) : 0x25a669bc4e405b78437b560f908bc78f8141d159
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
0x610140604052348015610010575f5ffd5b50604051610b9e380380610b9e83398101604081905261002f91610077565b6001600160a01b039384166080525f60a081905260c05291831660e05282166101005216610120526100c8565b80516001600160a01b0381168114610072575f5ffd5b919050565b5f5f5f5f6080858703121561008a575f5ffd5b6100938561005c565b93506100a16020860161005c565b92506100af6040860161005c565b91506100bd6060860161005c565b905092959194509250565b60805160a05160c05160e0516101005161012051610a4461015a5f395f81816101200152818161051e01526106c201525f8181610147015281816104de015261066d01525f818160a30152818161049e015261061901525f8181610195015261045e01525f818161016e015261041e01525f818160f9015281816103de0152818161055d01526105b70152610a445ff3fe608060405234801561000f575f5ffd5b5060043610610085575f3560e01c80638d732463116100585780638d7324631461011b57806397b56f5714610142578063a936fa7114610169578063d09aed4814610190575f5ffd5b806314bcf3dd146100895780634185d4221461009e57806342b57409146100e1578063680bca47146100f4575b5f5ffd5b61009c610097366004610716565b6101b7565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100c56100ef3660046107a5565b6103c1565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b5f6101c48284018461082c565b80519091505f8167ffffffffffffffff8111156101e3576101e36107be565b60405190808252806020026020018201604052801561020c578160200160208202803683370190505b5090505f5f5b83811015610390575f85828151811061022d5761022d6109a3565b60209081029190910101515190505f81600681111561024e5761024e6109b7565b0361026c57604051632699817960e01b815260040160405180910390fd5b82600681111561027e5761027e6109b7565b816006811115610290576102906109b7565b116102ae57604051636d14c6cd60e01b815260040160405180910390fd5b5f6102b8826103c1565b90506001600160a01b0381166102e157604051632699817960e01b815260040160405180910390fd5b806001600160a01b03166314bcf3dd8c8c8a8781518110610304576103046109a3565b6020026020010151602001516040518463ffffffff1660e01b815260040161032e939291906109cb565b5f6040518083038186803b158015610344575f5ffd5b505afa158015610356573d5f5f3e3d5ffd5b505050508085848151811061036d5761036d6109a3565b6001600160a01b0390921660209283029190910190910152509150600101610212565b5061039a82610549565b6103b757604051634148652760e11b815260040160405180910390fd5b5050505050505050565b5f60018260068111156103d6576103d66109b7565b0361040257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6002826006811115610416576104166109b7565b0361044257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6003826006811115610456576104566109b7565b0361048257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6004826006811115610496576104966109b7565b036104c257507f0000000000000000000000000000000000000000000000000000000000000000919050565b60058260068111156104d6576104d66109b7565b0361050257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6006826006811115610516576105166109b7565b0361054257507f0000000000000000000000000000000000000000000000000000000000000000919050565b505f919050565b5f815160021461055a57505f919050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316835f81518110610597576105976109a3565b60200260200101516001600160a01b0316036105b557506001610617565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001815181106105f2576105f26109a3565b60200260200101516001600160a01b03160361060f57505f610617565b505f92915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316838281518110610653576106536109a3565b60200260200101516001600160a01b031614806106ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168382815181106106a7576106a76109a3565b60200260200101516001600160a01b0316145b8061070f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168382815181106106fc576106fc6109a3565b60200260200101516001600160a01b0316145b9392505050565b5f5f5f5f60608587031215610729575f5ffd5b8435935060208501359250604085013567ffffffffffffffff81111561074d575f5ffd5b8501601f8101871361075d575f5ffd5b803567ffffffffffffffff811115610773575f5ffd5b876020828401011115610784575f5ffd5b949793965060200194505050565b8035600781106107a0575f5ffd5b919050565b5f602082840312156107b5575f5ffd5b61070f82610792565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156107f5576107f56107be565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610824576108246107be565b604052919050565b5f6020828403121561083c575f5ffd5b813567ffffffffffffffff811115610852575f5ffd5b8201601f81018413610862575f5ffd5b803567ffffffffffffffff81111561087c5761087c6107be565b8060051b61088c602082016107fb565b918252602081840181019290810190878411156108a7575f5ffd5b6020850192505b8383101561099857823567ffffffffffffffff8111156108cc575f5ffd5b85016040818a03601f190112156108e1575f5ffd5b6108e96107d2565b6108f560208301610792565b8152604082013567ffffffffffffffff811115610910575f5ffd5b60208184010192505089601f830112610927575f5ffd5b813567ffffffffffffffff811115610941576109416107be565b610954601f8201601f19166020016107fb565b8181528b6020838601011115610968575f5ffd5b816020850160208301375f60208383010152806020840152505080845250506020820191506020830192506108ae565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b838152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f83011684010191505094935050505056fea2646970667358221220edb186652ca81e5e516771c6c3c766548a7a8dabf4b2da6193d5ba377973c84564736f6c634300081e0033000000000000000000000000fca057ab211dfaeb01fb8a36f4231fb4021a664100000000000000000000000025a669bc4e405b78437b560f908bc78f8141d15900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561000f575f5ffd5b5060043610610085575f3560e01c80638d732463116100585780638d7324631461011b57806397b56f5714610142578063a936fa7114610169578063d09aed4814610190575f5ffd5b806314bcf3dd146100895780634185d4221461009e57806342b57409146100e1578063680bca47146100f4575b5f5ffd5b61009c610097366004610716565b6101b7565b005b6100c57f00000000000000000000000025a669bc4e405b78437b560f908bc78f8141d15981565b6040516001600160a01b03909116815260200160405180910390f35b6100c56100ef3660046107a5565b6103c1565b6100c57f000000000000000000000000fca057ab211dfaeb01fb8a36f4231fb4021a664181565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b5f6101c48284018461082c565b80519091505f8167ffffffffffffffff8111156101e3576101e36107be565b60405190808252806020026020018201604052801561020c578160200160208202803683370190505b5090505f5f5b83811015610390575f85828151811061022d5761022d6109a3565b60209081029190910101515190505f81600681111561024e5761024e6109b7565b0361026c57604051632699817960e01b815260040160405180910390fd5b82600681111561027e5761027e6109b7565b816006811115610290576102906109b7565b116102ae57604051636d14c6cd60e01b815260040160405180910390fd5b5f6102b8826103c1565b90506001600160a01b0381166102e157604051632699817960e01b815260040160405180910390fd5b806001600160a01b03166314bcf3dd8c8c8a8781518110610304576103046109a3565b6020026020010151602001516040518463ffffffff1660e01b815260040161032e939291906109cb565b5f6040518083038186803b158015610344575f5ffd5b505afa158015610356573d5f5f3e3d5ffd5b505050508085848151811061036d5761036d6109a3565b6001600160a01b0390921660209283029190910190910152509150600101610212565b5061039a82610549565b6103b757604051634148652760e11b815260040160405180910390fd5b5050505050505050565b5f60018260068111156103d6576103d66109b7565b0361040257507f000000000000000000000000fca057ab211dfaeb01fb8a36f4231fb4021a6641919050565b6002826006811115610416576104166109b7565b0361044257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6003826006811115610456576104566109b7565b0361048257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6004826006811115610496576104966109b7565b036104c257507f00000000000000000000000025a669bc4e405b78437b560f908bc78f8141d159919050565b60058260068111156104d6576104d66109b7565b0361050257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6006826006811115610516576105166109b7565b0361054257507f0000000000000000000000000000000000000000000000000000000000000000919050565b505f919050565b5f815160021461055a57505f919050565b5f7f000000000000000000000000fca057ab211dfaeb01fb8a36f4231fb4021a66416001600160a01b0316835f81518110610597576105976109a3565b60200260200101516001600160a01b0316036105b557506001610617565b7f000000000000000000000000fca057ab211dfaeb01fb8a36f4231fb4021a66416001600160a01b0316836001815181106105f2576105f26109a3565b60200260200101516001600160a01b03160361060f57505f610617565b505f92915050565b7f00000000000000000000000025a669bc4e405b78437b560f908bc78f8141d1596001600160a01b0316838281518110610653576106536109a3565b60200260200101516001600160a01b031614806106ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168382815181106106a7576106a76109a3565b60200260200101516001600160a01b0316145b8061070f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168382815181106106fc576106fc6109a3565b60200260200101516001600160a01b0316145b9392505050565b5f5f5f5f60608587031215610729575f5ffd5b8435935060208501359250604085013567ffffffffffffffff81111561074d575f5ffd5b8501601f8101871361075d575f5ffd5b803567ffffffffffffffff811115610773575f5ffd5b876020828401011115610784575f5ffd5b949793965060200194505050565b8035600781106107a0575f5ffd5b919050565b5f602082840312156107b5575f5ffd5b61070f82610792565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156107f5576107f56107be565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610824576108246107be565b604052919050565b5f6020828403121561083c575f5ffd5b813567ffffffffffffffff811115610852575f5ffd5b8201601f81018413610862575f5ffd5b803567ffffffffffffffff81111561087c5761087c6107be565b8060051b61088c602082016107fb565b918252602081840181019290810190878411156108a7575f5ffd5b6020850192505b8383101561099857823567ffffffffffffffff8111156108cc575f5ffd5b85016040818a03601f190112156108e1575f5ffd5b6108e96107d2565b6108f560208301610792565b8152604082013567ffffffffffffffff811115610910575f5ffd5b60208184010192505089601f830112610927575f5ffd5b813567ffffffffffffffff811115610941576109416107be565b610954601f8201601f19166020016107fb565b8181528b6020838601011115610968575f5ffd5b816020850160208301375f60208383010152806020840152505080845250506020820191506020830192506108ae565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b838152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f83011684010191505094935050505056fea2646970667358221220edb186652ca81e5e516771c6c3c766548a7a8dabf4b2da6193d5ba377973c84564736f6c634300081e0033