Skip to main content
Version: 1.1

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
RiscZeroGroth16Verifier0x94A4684d6F7085C19138Bd4f9F3295fa9943C622
RiscZeroVerifierEmergencyStop0x08AeD6C108E500540a9544beF7a8B8a05E056e87
TimelockController0x0b144E07A0826182B6b59788c34b32Bfa86Fb711

Ethereum Sepolia (11155111)

ContractAddress
RiscZeroVerifierRouter0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187
RiscZeroGroth16Verifier0xd9b0d07CeCd808a8172F21fA7C97992168f045CA
RiscZeroVerifierEmergencyStop0x7a028d6f0BD603Ad2a47e3a3B1E504C0D6234877
TimelockController0xB4E3306129208cC8e6E75157f75f62eAe0B920a0

Ethereum Holesky (17000)

ContractAddress
RiscZeroVerifierRouter0xf70aBAb028Eb6F4100A24B203E113D94E87DE93C
RiscZeroGroth16Verifier0x44c220f0598345195cE99AD6A57aDfFcb9Ea33e7
RiscZeroVerifierEmergencyStop0xBDaEd5bbf8016AfD05Fc4659572e5fEb5854aAD4
TimelockController0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319

Arbitrum Mainnet (42161)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Arbitrum Sepolia (421614)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Avalanche Mainnet (43114)

ContractAddress
RiscZeroVerifierRouter0x0b144E07A0826182B6b59788c34b32Bfa86Fb711
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0xDC986a09728F76110FF666eE7b20d99086501d15

Avalanche Fuji (43113)

ContractAddress
RiscZeroVerifierRouter0x0b144E07A0826182B6b59788c34b32Bfa86Fb711
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0xDC986a09728F76110FF666eE7b20d99086501d15

Base Mainnet (8453)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Base Sepolia (84532)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x2DEfEA335392bb62d01f74e338697C7B31De254C
RiscZeroVerifierEmergencyStop0xB369b4dd27FBfb59921d3A4a3D23AC2fc32FB908
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Optimism Mainnet (10)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Optimism Sepolia (11110)

ContractAddress
RiscZeroVerifierRouter0xB369b4dd27FBfb59921d3A4a3D23AC2fc32FB908
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0x2DEfEA335392bb62d01f74e338697C7B31De254C

Linea Mainnet (59144)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Polygon zkEVM Mainnet (1101)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x84b943E31e7fAe6072ce5F75eb4694C7D5F9b0cF
RiscZeroVerifierEmergencyStop0x5E36f0D56741013d864d8FEb5950AB0E7Eff9Ab1
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15