Skip to main content
Version: 1.2

Verifier Contracts

To utilize the results generated by a zkVM program in your on-chain application, it's essential to verify the receipt on-chain.

You can verify a RISC Zero Groth16Receipt using a verify() call to an IRiscZeroVerifier contract.

Using a Verifier

Use verifier contract in your application by calling the verify method with the expected journal and other fields of the receipt.

Below is an example from the EvenNumber.sol contract in the Foundry Template:

contract EvenNumber {
// ...

/// @notice Set the even number stored on the contract. Requires a RISC Zero proof that the number is even.
function set(uint256 x, bytes calldata seal) public {
// Construct the expected journal data. Verify will fail if journal does not match.
bytes memory journal = abi.encode(x);
// The verify call will revert if the given seal is not a verifying zero-knowledge proof.
verifier.verify(seal, IS_EVEN_ID, sha256(journal));
number = x;
}

// ...
}

In this example, the IS_EVEN zkVM program verifies that the number, x, is even. By verifying a receipt with the image ID of that program, it is guaranteed that the stored number will always be even. RISC Zero's zkVM and the IS_EVEN program guarantee that it's computationally impossible to produce a verifying receipt for an odd number.

Verifier Implementations

All of our deployed verifier contracts implement the IRiscZeroVerifier interface.

We deploy a base verifier implementation, the emergency stop wrapper, and the router as part of our version management design. It is recommended that most applications use RiscZeroVerifierRouter. In some cases, your application may wish to make calls directly to either the emergency stop wrapper, or the base implementation.

tip

It is recommended that you use the RiscZeroVerifierRouter

Verifier Router

Calls to RiscZeroVerifierRouter.verify() will be routed to the appropriate base verifier contract depending on which version of the zkVM was used to generate the receipt. By using the RiscZeroVerifierRouter, your contract can accept multiple types of receipts, including batch-verified receipts and receipts generated with future improvements to the zkVM and proofs system.

RISC Zero deploys and manages the RiscZeroVerifierRouter contract listed below. This contract will have verifiers added for each release of the zkVM, and will have verifiers removed in the case of security vulnerabilities. You can find detailed information in the version management design, including information about how to manage your own copy of the smart contracts, if your application requires it.

Contract Addresses

NOTE: The tables below are generated from the deployment.toml file in the risc0-ethereum repository.

Ethereum Mainnet (1)

ContractAddress
RiscZeroVerifierRouter0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x03B66cEDaB014Ca7E970Bfb83C1951d10DD2A805
TimelockController0x0b144E07A0826182B6b59788c34b32Bfa86Fb711

Ethereum Sepolia (11155111)

ContractAddress
RiscZeroVerifierRouter0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x47d697328D6A80b00D796cEd9f54468931Aa1ECe
TimelockController0xB4E3306129208cC8e6E75157f75f62eAe0B920a0

Ethereum Holesky (17000)

ContractAddress
RiscZeroVerifierRouter0xf70aBAb028Eb6F4100A24B203E113D94E87DE93C
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x47d697328D6A80b00D796cEd9f54468931Aa1ECe
TimelockController0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319

Arbitrum Mainnet (42161)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x03B66cEDaB014Ca7E970Bfb83C1951d10DD2A805
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Arbitrum Sepolia (421614)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x47d697328D6A80b00D796cEd9f54468931Aa1ECe
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Avalanche Mainnet (43114)

ContractAddress
RiscZeroVerifierRouter0x0b144E07A0826182B6b59788c34b32Bfa86Fb711
RiscZeroGroth16Verifier0x8062Dc6C824F10e62E47FdC55A0ecD54C2641F2d
RiscZeroVerifierEmergencyStop0x5b188d3d31f7bcfC2e3A22F85c3ca4dD23a77dD1
TimelockController0xDC986a09728F76110FF666eE7b20d99086501d15

Avalanche Fuji (43113)

ContractAddress
RiscZeroVerifierRouter0x0b144E07A0826182B6b59788c34b32Bfa86Fb711
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x47d697328D6A80b00D796cEd9f54468931Aa1ECe
TimelockController0xDC986a09728F76110FF666eE7b20d99086501d15

Base Mainnet (8453)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x03B66cEDaB014Ca7E970Bfb83C1951d10DD2A805
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Base Sepolia (84532)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x47d697328D6A80b00D796cEd9f54468931Aa1ECe
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Optimism Mainnet (10)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x03B66cEDaB014Ca7E970Bfb83C1951d10DD2A805
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Optimism Sepolia (11155420)

ContractAddress
RiscZeroVerifierRouter0xB369b4dd27FBfb59921d3A4a3D23AC2fc32FB908
RiscZeroGroth16Verifier0xAC292cF957Dd5BA174cdA13b05C16aFC71700327
RiscZeroVerifierEmergencyStop0x47d697328D6A80b00D796cEd9f54468931Aa1ECe
TimelockController0x2DEfEA335392bb62d01f74e338697C7B31De254C

Linea Mainnet (59144)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x8C8b557C6EBDA8E6D62E7b54B7B5Ed8cFa8B48B4
RiscZeroVerifierEmergencyStop0x6Fb722974D67A55091c70129Bd0Bb06ec025ce5D
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Polygon zkEVM Mainnet (1101)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x8062Dc6C824F10e62E47FdC55A0ecD54C2641F2d
RiscZeroVerifierEmergencyStop0x5b188d3d31f7bcfC2e3A22F85c3ca4dD23a77dD1
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15