Skip to main content
Version: 3.0

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

Ethereum Mainnet (1)

ContractAddress
RiscZeroVerifierRouter0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x9F9994Eb4Cb5200198FEfb470f8b50301662e696
TimelockController0x0b144E07A0826182B6b59788c34b32Bfa86Fb711

Ethereum Sepolia (11155111)

ContractAddress
RiscZeroVerifierRouter0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x724d375B5b622e15f0E64e9Deb76a4cB17877797
TimelockController0xB4E3306129208cC8e6E75157f75f62eAe0B920a0

Ethereum Holesky (17000)

ContractAddress
RiscZeroVerifierRouter0xf70aBAb028Eb6F4100A24B203E113D94E87DE93C
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x724d375B5b622e15f0E64e9Deb76a4cB17877797
TimelockController0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319

Ethereum Hoodi (560048)

ContractAddress
RiscZeroVerifierRouter0x32Db7dc407AC886807277636a1633A1381748DD8
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x724d375B5b622e15f0E64e9Deb76a4cB17877797
TimelockController0xE1CC216c5fd5EcAE1e951bDdcf951601554Be338

Arbitrum Mainnet (42161)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x9F9994Eb4Cb5200198FEfb470f8b50301662e696
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Arbitrum Sepolia (421614)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x724d375B5b622e15f0E64e9Deb76a4cB17877797
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Avalanche Mainnet (43114)

ContractAddress
RiscZeroVerifierRouter0x0b144E07A0826182B6b59788c34b32Bfa86Fb711
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x9F9994Eb4Cb5200198FEfb470f8b50301662e696
TimelockController0xDC986a09728F76110FF666eE7b20d99086501d15

Avalanche Fuji (43113)

ContractAddress
RiscZeroVerifierRouter0x0b144E07A0826182B6b59788c34b32Bfa86Fb711
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x724d375B5b622e15f0E64e9Deb76a4cB17877797
TimelockController0xDC986a09728F76110FF666eE7b20d99086501d15

Base Mainnet (8453)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x9F9994Eb4Cb5200198FEfb470f8b50301662e696
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Base Sepolia (84532)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x724d375B5b622e15f0E64e9Deb76a4cB17877797
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Optimism Mainnet (10)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x9F9994Eb4Cb5200198FEfb470f8b50301662e696
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Optimism Sepolia (11155420)

ContractAddress
RiscZeroVerifierRouter0xB369b4dd27FBfb59921d3A4a3D23AC2fc32FB908
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x724d375B5b622e15f0E64e9Deb76a4cB17877797
TimelockController0x2DEfEA335392bb62d01f74e338697C7B31De254C

Linea Mainnet (59144)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0x3d9aad871eaae3c5b847930f3Eef878D91766e46
RiscZeroVerifierEmergencyStop0x4384e61DF16BFB392EFC1eF4B0D99F4ECC49BC40
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15

Linea Sepolia (59141)

ContractAddress
RiscZeroVerifierRouter0x27983ee173aD10E171D17C9c5C14d5baFE997609
RiscZeroGroth16Verifier0x3d9aad871eaae3c5b847930f3Eef878D91766e46
RiscZeroVerifierEmergencyStop0xF968911CA0b32faE4CDded83F1219b89189EB94B
TimelockController0xBDaEd5bbf8016AfD05Fc4659572e5fEb5854aAD4

Polygon (POS) Mainnet (137)

ContractAddress
RiscZeroVerifierRouter0xdBAD523786971B75A7b1c1CFdCfECDeb59A764B9
RiscZeroGroth16Verifier0x2a098988600d87650Fb061FfAff08B97149Fa84D
RiscZeroVerifierEmergencyStop0x9F9994Eb4Cb5200198FEfb470f8b50301662e696
TimelockController0x15249b0ee8eCabC8AB5753763501D4AcD0B7ABAB

Polygon zkEVM Mainnet (1101)

ContractAddress
RiscZeroVerifierRouter0x0b144e07a0826182b6b59788c34b32bfa86fb711
RiscZeroGroth16Verifier0xBdbFbF4500fced0d5511feEc1BB6a62EEf5Cd028
RiscZeroVerifierEmergencyStop0xf0BF916fCC8581C1c2EfA480444feDf9BdbE8A4c
TimelockController0xdc986a09728f76110ff666ee7b20d99086501d15