Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- ZkRequiredVerifier
- Optimization enabled
- true
- Compiler version
- v0.8.30+commit.73712a01
- Optimization runs
- 200
- EVM Version
- prague
- Verified at
- 2026-07-15T01:17:31.899499Z
Constructor Arguments
0x000000000000000000000000429b4115e773a0cf0e49c0443685dd290ae426ef00000000000000000000000063ec87f54cced71b0dc879ce6cedfa6f3d5826700000000000000000000000003da89a777b11aaba02b5c92fab96545d05fd4cc60000000000000000000000002546d7424f23ee0d1260c414da3f17e295c187c6
Arg [0] (address) : 0x429b4115e773a0cf0e49c0443685dd290ae426ef
Arg [1] (address) : 0x63ec87f54cced71b0dc879ce6cedfa6f3d582670
Arg [2] (address) : 0x3da89a777b11aaba02b5c92fab96545d05fd4cc6
Arg [3] (address) : 0x2546d7424f23ee0d1260c414da3f17e295c187c6
contracts/layer1/verifiers/compose/ZkRequiredVerifier.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "./ComposeVerifier.sol";
/// @title ZkRequiredVerifier
/// @notice Requires exactly two sub-proofs of which at least one is a ZK proof:
/// (SGX_GETH or SGX_RETH) + (RISC0 or SP1), or RISC0 + SP1.
/// @dev The ZK mandate is structural, not configurational: the second element of every accepted
/// combination is a ZK verifier, so no TEE-only (SGX + SGX) pair can ever satisfy this
/// verifier — the exact combination that finalized the June 2026 forged proofs on the old
/// MainnetVerifier.
/// @custom:security-contact security@taiko.xyz
contract ZkRequiredVerifier is ComposeVerifier {
constructor(
address _sgxGethVerifier,
address _sgxRethVerifier,
address _risc0RethVerifier,
address _sp1RethVerifier
)
ComposeVerifier(
_sgxGethVerifier,
address(0),
address(0),
_sgxRethVerifier,
_risc0RethVerifier,
_sp1RethVerifier
)
{ }
function areVerifiersSufficient(address[] memory _verifiers)
internal
view
override
returns (bool)
{
if (_verifiers.length != 2) return false;
// Valid combinations (in ascending ID order):
// [SGX_GETH, RISC0_RETH], [SGX_GETH, SP1_RETH],
// [SGX_RETH, RISC0_RETH], [SGX_RETH, SP1_RETH],
// [RISC0_RETH, SP1_RETH]
// The second element is always a ZK verifier; SGX_GETH + SGX_RETH does not satisfy.
if (_verifiers[0] == sgxGethVerifier || _verifiers[0] == sgxRethVerifier) {
return _verifiers[1] == risc0RethVerifier || _verifiers[1] == sp1RethVerifier;
} else if (_verifiers[0] == risc0RethVerifier) {
return _verifiers[1] == sp1RethVerifier;
}
return false;
}
}
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
virtual
{
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/","solady/auth/=node_modules/solady/src/auth/","@optimism/=node_modules/optimism/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","forge-std/=node_modules/forge-std/","@p256-verifier/contracts/=node_modules/p256-verifier/src/","@eth-fabric/urc/=node_modules/urc/src/","@automata-network/on-chain-pccs/=node_modules/@automata-network/on-chain-pccs/src/","@automata-network/automata-dcap-attestation/=node_modules/@automata-network/automata-dcap-attestation/","risc0/=node_modules/risc0-ethereum/contracts/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":"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
0x610140604052348015610010575f5ffd5b50604051610bd2380380610bd283398101604081905261002f91610077565b6001600160a01b039384166080525f60a081905260c05291831660e05282166101005216610120526100c8565b80516001600160a01b0381168114610072575f5ffd5b919050565b5f5f5f5f6080858703121561008a575f5ffd5b6100938561005c565b93506100a16020860161005c565b92506100af6040860161005c565b91506100bd6060860161005c565b905092959194509250565b60805160a05160c05160e0516101005161012051610a716101615f395f81816101200152818161051e01528181610659015261070101525f8181610147015281816104de0152818161060401526106af01525f818160a30152818161049e01526105b001525f8181610195015261045e01525f818161016e015261041e01525f818160f9015281816103de015261055c0152610a715ff3fe608060405234801561000f575f5ffd5b5060043610610085575f3560e01c80638d732463116100585780638d7324631461011b57806397b56f5714610142578063a936fa7114610169578063d09aed4814610190575f5ffd5b806314bcf3dd146100895780634185d4221461009e57806342b57409146100e1578063680bca47146100f4575b5f5ffd5b61009c61009736600461073c565b6101b7565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100c56100ef3660046107cb565b6103c1565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b5f6101c482840184610859565b80519091505f8167ffffffffffffffff8111156101e3576101e36107eb565b60405190808252806020026020018201604052801561020c578160200160208202803683370190505b5090505f5f5b83811015610390575f85828151811061022d5761022d6109d0565b60209081029190910101515190505f81600681111561024e5761024e6109e4565b0361026c57604051632699817960e01b815260040160405180910390fd5b82600681111561027e5761027e6109e4565b816006811115610290576102906109e4565b116102ae57604051636d14c6cd60e01b815260040160405180910390fd5b5f6102b8826103c1565b90506001600160a01b0381166102e157604051632699817960e01b815260040160405180910390fd5b806001600160a01b03166314bcf3dd8c8c8a8781518110610304576103046109d0565b6020026020010151602001516040518463ffffffff1660e01b815260040161032e939291906109f8565b5f6040518083038186803b158015610344575f5ffd5b505afa158015610356573d5f5f3e3d5ffd5b505050508085848151811061036d5761036d6109d0565b6001600160a01b0390921660209283029190910190910152509150600101610212565b5061039a82610549565b6103b757604051634148652760e11b815260040160405180910390fd5b5050505050505050565b5f60018260068111156103d6576103d66109e4565b0361040257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6002826006811115610416576104166109e4565b0361044257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6003826006811115610456576104566109e4565b0361048257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6004826006811115610496576104966109e4565b036104c257507f0000000000000000000000000000000000000000000000000000000000000000919050565b60058260068111156104d6576104d66109e4565b0361050257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6006826006811115610516576105166109e4565b0361054257507f0000000000000000000000000000000000000000000000000000000000000000919050565b505f919050565b5f815160021461055a57505f919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825f81518110610596576105966109d0565b60200260200101516001600160a01b031614806105fd57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825f815181106105ea576105ea6109d0565b60200260200101516001600160a01b0316145b156106ad577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168260018151811061063f5761063f6109d0565b60200260200101516001600160a01b031614806106a757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682600181518110610694576106946109d0565b60200260200101516001600160a01b0316145b92915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825f815181106106e9576106e96109d0565b60200260200101516001600160a01b031603610542577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682600181518110610694576106946109d0565b5f5f5f5f6060858703121561074f575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115610773575f5ffd5b8501601f81018713610783575f5ffd5b803567ffffffffffffffff811115610799575f5ffd5b8760208284010111156107aa575f5ffd5b949793965060200194505050565b8035600781106107c6575f5ffd5b919050565b5f602082840312156107db575f5ffd5b6107e4826107b8565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610822576108226107eb565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610851576108516107eb565b604052919050565b5f60208284031215610869575f5ffd5b813567ffffffffffffffff81111561087f575f5ffd5b8201601f8101841361088f575f5ffd5b803567ffffffffffffffff8111156108a9576108a96107eb565b8060051b6108b960208201610828565b918252602081840181019290810190878411156108d4575f5ffd5b6020850192505b838310156109c557823567ffffffffffffffff8111156108f9575f5ffd5b85016040818a03601f1901121561090e575f5ffd5b6109166107ff565b610922602083016107b8565b8152604082013567ffffffffffffffff81111561093d575f5ffd5b60208184010192505089601f830112610954575f5ffd5b813567ffffffffffffffff81111561096e5761096e6107eb565b610981601f8201601f1916602001610828565b8181528b6020838601011115610995575f5ffd5b816020850160208301375f60208383010152806020840152505080845250506020820191506020830192506108db565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b838152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f83011684010191505094935050505056fea264697066735822122028e916e39aa9fe7fef1d3b43f0586a74328bd745fcf7520cbe5781f6e1e9b75a64736f6c634300081e0033000000000000000000000000429b4115e773a0cf0e49c0443685dd290ae426ef00000000000000000000000063ec87f54cced71b0dc879ce6cedfa6f3d5826700000000000000000000000003da89a777b11aaba02b5c92fab96545d05fd4cc60000000000000000000000002546d7424f23ee0d1260c414da3f17e295c187c6
Deployed ByteCode
0x608060405234801561000f575f5ffd5b5060043610610085575f3560e01c80638d732463116100585780638d7324631461011b57806397b56f5714610142578063a936fa7114610169578063d09aed4814610190575f5ffd5b806314bcf3dd146100895780634185d4221461009e57806342b57409146100e1578063680bca47146100f4575b5f5ffd5b61009c61009736600461073c565b6101b7565b005b6100c57f00000000000000000000000063ec87f54cced71b0dc879ce6cedfa6f3d58267081565b6040516001600160a01b03909116815260200160405180910390f35b6100c56100ef3660046107cb565b6103c1565b6100c57f000000000000000000000000429b4115e773a0cf0e49c0443685dd290ae426ef81565b6100c57f0000000000000000000000002546d7424f23ee0d1260c414da3f17e295c187c681565b6100c57f0000000000000000000000003da89a777b11aaba02b5c92fab96545d05fd4cc681565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b5f6101c482840184610859565b80519091505f8167ffffffffffffffff8111156101e3576101e36107eb565b60405190808252806020026020018201604052801561020c578160200160208202803683370190505b5090505f5f5b83811015610390575f85828151811061022d5761022d6109d0565b60209081029190910101515190505f81600681111561024e5761024e6109e4565b0361026c57604051632699817960e01b815260040160405180910390fd5b82600681111561027e5761027e6109e4565b816006811115610290576102906109e4565b116102ae57604051636d14c6cd60e01b815260040160405180910390fd5b5f6102b8826103c1565b90506001600160a01b0381166102e157604051632699817960e01b815260040160405180910390fd5b806001600160a01b03166314bcf3dd8c8c8a8781518110610304576103046109d0565b6020026020010151602001516040518463ffffffff1660e01b815260040161032e939291906109f8565b5f6040518083038186803b158015610344575f5ffd5b505afa158015610356573d5f5f3e3d5ffd5b505050508085848151811061036d5761036d6109d0565b6001600160a01b0390921660209283029190910190910152509150600101610212565b5061039a82610549565b6103b757604051634148652760e11b815260040160405180910390fd5b5050505050505050565b5f60018260068111156103d6576103d66109e4565b0361040257507f000000000000000000000000429b4115e773a0cf0e49c0443685dd290ae426ef919050565b6002826006811115610416576104166109e4565b0361044257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6003826006811115610456576104566109e4565b0361048257507f0000000000000000000000000000000000000000000000000000000000000000919050565b6004826006811115610496576104966109e4565b036104c257507f00000000000000000000000063ec87f54cced71b0dc879ce6cedfa6f3d582670919050565b60058260068111156104d6576104d66109e4565b0361050257507f0000000000000000000000003da89a777b11aaba02b5c92fab96545d05fd4cc6919050565b6006826006811115610516576105166109e4565b0361054257507f0000000000000000000000002546d7424f23ee0d1260c414da3f17e295c187c6919050565b505f919050565b5f815160021461055a57505f919050565b7f000000000000000000000000429b4115e773a0cf0e49c0443685dd290ae426ef6001600160a01b0316825f81518110610596576105966109d0565b60200260200101516001600160a01b031614806105fd57507f00000000000000000000000063ec87f54cced71b0dc879ce6cedfa6f3d5826706001600160a01b0316825f815181106105ea576105ea6109d0565b60200260200101516001600160a01b0316145b156106ad577f0000000000000000000000003da89a777b11aaba02b5c92fab96545d05fd4cc66001600160a01b03168260018151811061063f5761063f6109d0565b60200260200101516001600160a01b031614806106a757507f0000000000000000000000002546d7424f23ee0d1260c414da3f17e295c187c66001600160a01b031682600181518110610694576106946109d0565b60200260200101516001600160a01b0316145b92915050565b7f0000000000000000000000003da89a777b11aaba02b5c92fab96545d05fd4cc66001600160a01b0316825f815181106106e9576106e96109d0565b60200260200101516001600160a01b031603610542577f0000000000000000000000002546d7424f23ee0d1260c414da3f17e295c187c66001600160a01b031682600181518110610694576106946109d0565b5f5f5f5f6060858703121561074f575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115610773575f5ffd5b8501601f81018713610783575f5ffd5b803567ffffffffffffffff811115610799575f5ffd5b8760208284010111156107aa575f5ffd5b949793965060200194505050565b8035600781106107c6575f5ffd5b919050565b5f602082840312156107db575f5ffd5b6107e4826107b8565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610822576108226107eb565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610851576108516107eb565b604052919050565b5f60208284031215610869575f5ffd5b813567ffffffffffffffff81111561087f575f5ffd5b8201601f8101841361088f575f5ffd5b803567ffffffffffffffff8111156108a9576108a96107eb565b8060051b6108b960208201610828565b918252602081840181019290810190878411156108d4575f5ffd5b6020850192505b838310156109c557823567ffffffffffffffff8111156108f9575f5ffd5b85016040818a03601f1901121561090e575f5ffd5b6109166107ff565b610922602083016107b8565b8152604082013567ffffffffffffffff81111561093d575f5ffd5b60208184010192505089601f830112610954575f5ffd5b813567ffffffffffffffff81111561096e5761096e6107eb565b610981601f8201601f1916602001610828565b8181528b6020838601011115610995575f5ffd5b816020850160208301375f60208383010152806020840152505080845250506020820191506020830192506108db565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b838152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f83011684010191505094935050505056fea264697066735822122028e916e39aa9fe7fef1d3b43f0586a74328bd745fcf7520cbe5781f6e1e9b75a64736f6c634300081e0033