Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11919937 | 9 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RiscZeroVerifierRouter
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 10000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Copyright 2025 RISC Zero, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.9; import {Ownable, Ownable2Step} from "openzeppelin/contracts/access/Ownable2Step.sol"; import {IRiscZeroVerifier, Receipt} from "./IRiscZeroVerifier.sol"; /// @notice Router for IRiscZeroVerifier, allowing multiple implementations to be accessible behind a single address. contract RiscZeroVerifierRouter is IRiscZeroVerifier, Ownable2Step { /// @notice Mapping from 4-byte verifier selector to verifier contracts. /// Used to route receipts to verifiers that are able to check the receipt. mapping(bytes4 => IRiscZeroVerifier) public verifiers; /// @notice Value of an entry that has never been set. IRiscZeroVerifier internal constant UNSET = IRiscZeroVerifier(address(0)); /// @notice A "tombstone" value used to mark verifier entries that have been removed from the mapping. IRiscZeroVerifier internal constant TOMBSTONE = IRiscZeroVerifier(address(1)); /// @notice Error raised when attempting to verify a receipt with a selector that is not /// registered on this router. Generally, this indicates a version mismatch where the /// prover generated a receipt with version of the zkVM that does not match any /// registered version on this router contract. error SelectorUnknown(bytes4 selector); /// @notice Error raised when attempting to add a verifier for a selector that is already registered. error SelectorInUse(bytes4 selector); /// @notice Error raised when attempting to verify a receipt with a selector that has been /// removed, or attempting to add a new verifier with a selector that was previously /// registered and then removed. error SelectorRemoved(bytes4 selector); /// @notice Error raised when attempting to add a verifier with a zero address. error VerifierAddressZero(); constructor(address admin) Ownable(admin) {} /// @notice Adds a verifier to the router, such that it can receive receipt verification calls. function addVerifier(bytes4 selector, IRiscZeroVerifier verifier) external onlyOwner { if (verifiers[selector] == TOMBSTONE) { revert SelectorRemoved({selector: selector}); } if (verifiers[selector] != UNSET) { revert SelectorInUse({selector: selector}); } if (address(verifier) == address(0)) { revert VerifierAddressZero(); } verifiers[selector] = verifier; } /// @notice Removes verifier from the router, such that it can not receive verification calls. /// Removing a selector sets it to the tombstone value. It can never be set to any /// other value, and can never be reused for a new verifier, in order to enforce the /// property that each selector maps to at most one implementation across time. function removeVerifier(bytes4 selector) external onlyOwner { // Simple check to reduce the chance of accidents. // NOTE: If there ever _is_ a reason to remove a selector that has never been set, the owner // can call addVerifier with the tombstone address. if (verifiers[selector] == UNSET) { revert SelectorUnknown({selector: selector}); } verifiers[selector] = TOMBSTONE; } /// @notice Get the associated verifier, reverting if the selector is unknown or removed. function getVerifier(bytes4 selector) public view returns (IRiscZeroVerifier) { IRiscZeroVerifier verifier = verifiers[selector]; if (verifier == UNSET) { revert SelectorUnknown({selector: selector}); } if (verifier == TOMBSTONE) { revert SelectorRemoved({selector: selector}); } return verifier; } /// @notice Get the associated verifier, reverting if the selector is unknown or removed. function getVerifier(bytes calldata seal) public view returns (IRiscZeroVerifier) { // Use the first 4 bytes of the seal at the selector to look up in the mapping. return getVerifier(bytes4(seal[0:4])); } /// @inheritdoc IRiscZeroVerifier function verify(bytes calldata seal, bytes32 imageId, bytes32 journalDigest) external view { getVerifier(seal).verify(seal, imageId, journalDigest); } /// @inheritdoc IRiscZeroVerifier function verifyIntegrity(Receipt calldata receipt) external view { getVerifier(receipt.seal).verifyIntegrity(receipt); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol) pragma solidity ^0.8.20; import {Ownable} from "./Ownable.sol"; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This extension of the {Ownable} contract includes a two-step mechanism to transfer * ownership, where the new owner must call {acceptOwnership} in order to replace the * old one. This can help prevent common mistakes, such as transfers of ownership to * incorrect accounts, or to contracts that are unable to interact with the * permission system. * * The initial owner is specified at deployment time in the constructor for `Ownable`. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. * * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); if (pendingOwner() != sender) { revert OwnableUnauthorizedAccount(sender); } _transferOwnership(sender); } }
// Copyright 2025 RISC Zero, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.9; import {reverseByteOrderUint32} from "./Util.sol"; /// @notice A receipt attesting to a claim using the RISC Zero proof system. /// @dev A receipt contains two parts: a seal and a claim. /// /// The seal is a zero-knowledge proof attesting to knowledge of a witness for the claim. The claim /// is a set of public outputs, and for zkVM execution is the hash of a `ReceiptClaim` struct. /// /// IMPORTANT: The `claimDigest` field must be a hash computed by the caller for verification to /// have meaningful guarantees. Treat this similar to verifying an ECDSA signature, in that hashing /// is a key operation in verification. The most common way to calculate this hash is to use the /// `ReceiptClaimLib.ok(imageId, journalDigest).digest()` for successful executions. struct Receipt { bytes seal; bytes32 claimDigest; } /// @notice Public claims about a zkVM guest execution, such as the journal committed to by the guest. /// @dev Also includes important information such as the exit code and the starting and ending system /// state (i.e. the state of memory). `ReceiptClaim` is a "Merkle-ized struct" supporting /// partial openings of the underlying fields from a hash commitment to the full structure. struct ReceiptClaim { /// @notice Digest of the SystemState just before execution has begun. bytes32 preStateDigest; /// @notice Digest of the SystemState just after execution has completed. bytes32 postStateDigest; /// @notice The exit code for the execution. ExitCode exitCode; /// @notice A digest of the input to the guest. /// @dev This field is currently unused and must be set to the zero digest. bytes32 input; /// @notice Digest of the Output of the guest, including the journal /// and assumptions set during execution. bytes32 output; } library ReceiptClaimLib { using OutputLib for Output; using SystemStateLib for SystemState; bytes32 constant TAG_DIGEST = sha256("risc0.ReceiptClaim"); // Define a constant to ensure hashing is done at compile time. Can't use the // SystemStateLib.digest method here because the Solidity compiler complains. bytes32 constant SYSTEM_STATE_ZERO_DIGEST = 0xa3acc27117418996340b84e5a90f3ef4c49d22c79e44aad822ec9c313e1eb8e2; /// @notice Construct a ReceiptClaim from the given imageId and journalDigest. /// Returned ReceiptClaim will represent a successful execution of the zkVM, running /// the program committed by imageId and resulting in the journal specified by /// journalDigest. /// @param imageId The identifier for the guest program. /// @param journalDigest The SHA-256 digest of the journal bytes. /// @dev Input hash and postStateDigest are set to all-zeros (i.e. no committed input, or /// final memory state), the exit code is (Halted, 0), and there are no assumptions /// (i.e. the receipt is unconditional). function ok(bytes32 imageId, bytes32 journalDigest) internal pure returns (ReceiptClaim memory) { return ReceiptClaim( imageId, SYSTEM_STATE_ZERO_DIGEST, ExitCode(SystemExitCode.Halted, 0), bytes32(0), Output(journalDigest, bytes32(0)).digest() ); } function digest(ReceiptClaim memory claim) internal pure returns (bytes32) { return sha256( abi.encodePacked( TAG_DIGEST, // down claim.input, claim.preStateDigest, claim.postStateDigest, claim.output, // data uint32(claim.exitCode.system) << 24, uint32(claim.exitCode.user) << 24, // down.length uint16(4) << 8 ) ); } } /// @notice Commitment to the memory state and program counter (pc) of the zkVM. /// @dev The "pre" and "post" fields of the ReceiptClaim are digests of the system state at the /// start are stop of execution. Programs are loaded into the zkVM by creating a memory image /// of the loaded program, and creating a system state for initializing the zkVM. This is /// known as the "image ID". struct SystemState { /// @notice Program counter. uint32 pc; /// @notice Root hash of a merkle tree which confirms the integrity of the memory image. bytes32 merkle_root; } library SystemStateLib { bytes32 constant TAG_DIGEST = sha256("risc0.SystemState"); function digest(SystemState memory state) internal pure returns (bytes32) { return sha256( abi.encodePacked( TAG_DIGEST, // down state.merkle_root, // data reverseByteOrderUint32(state.pc), // down.length uint16(1) << 8 ) ); } } /// @notice Exit condition indicated by the zkVM at the end of the guest execution. /// @dev Exit codes have a "system" part and a "user" part. Semantically, the system part is set to /// indicate the type of exit (e.g. halt, pause, or system split) and is directly controlled by the /// zkVM. The user part is an exit code, similar to exit codes used in Linux, chosen by the guest /// program to indicate additional information (e.g. 0 to indicate success or 1 to indicate an /// error). struct ExitCode { SystemExitCode system; uint8 user; } /// @notice Exit condition indicated by the zkVM at the end of the execution covered by this proof. /// @dev /// `Halted` indicates normal termination of a program with an interior exit code returned from the /// guest program. A halted program cannot be resumed. /// /// `Paused` indicates the execution ended in a paused state with an interior exit code set by the /// guest program. A paused program can be resumed such that execution picks up where it left /// of, with the same memory state. /// /// `SystemSplit` indicates the execution ended on a host-initiated system split. System split is /// mechanism by which the host can temporarily stop execution of the execution ended in a system /// split has no output and no conclusions can be drawn about whether the program will eventually /// halt. System split is used in continuations to split execution into individually provable segments. enum SystemExitCode { Halted, Paused, SystemSplit } /// @notice Output field in the `ReceiptClaim`, committing to a claimed journal and assumptions list. struct Output { /// @notice Digest of the journal committed to by the guest execution. bytes32 journalDigest; /// @notice Digest of the ordered list of `ReceiptClaim` digests corresponding to the /// calls to `env::verify` and `env::verify_integrity`. /// @dev Verifying the integrity of a `Receipt` corresponding to a `ReceiptClaim` with a /// non-empty assumptions list does not guarantee unconditionally any of the claims over the /// guest execution (i.e. if the assumptions list is non-empty, then the journal digest cannot /// be trusted to correspond to a genuine execution). The claims can be checked by additional /// verifying a `Receipt` for every digest in the assumptions list. bytes32 assumptionsDigest; } library OutputLib { bytes32 constant TAG_DIGEST = sha256("risc0.Output"); function digest(Output memory output) internal pure returns (bytes32) { return sha256( abi.encodePacked( TAG_DIGEST, // down output.journalDigest, output.assumptionsDigest, // down.length uint16(2) << 8 ) ); } } /// @notice Error raised when cryptographic verification of the zero-knowledge proof fails. error VerificationFailed(); /// @notice Verifier interface for RISC Zero receipts of execution. interface IRiscZeroVerifier { /// @notice Verify that the given seal is a valid RISC Zero proof of execution with the /// given image ID and journal digest. Reverts on failure. /// @dev This method additionally ensures that the input hash is all-zeros (i.e. no /// committed input), the exit code is (Halted, 0), and there are no assumptions (i.e. the /// receipt is unconditional). /// @param seal The encoded cryptographic proof (i.e. SNARK). /// @param imageId The identifier for the guest program. /// @param journalDigest The SHA-256 digest of the journal bytes. function verify(bytes calldata seal, bytes32 imageId, bytes32 journalDigest) external view; /// @notice Verify that the given receipt is a valid RISC Zero receipt, ensuring the `seal` is /// valid a cryptographic proof of the execution with the given `claim`. Reverts on failure. /// @param receipt The receipt to be verified. function verifyIntegrity(Receipt calldata receipt) external view; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// Copyright 2024 RISC Zero, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.9; /// @notice reverse the byte order of the uint256 value. /// @dev Solidity uses a big-endian ABI encoding. Reversing the byte order before encoding /// ensure that the encoded value will be little-endian. /// Written by k06a. https://ethereum.stackexchange.com/a/83627 function reverseByteOrderUint256(uint256 input) pure returns (uint256 v) { v = input; // swap bytes v = ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) | ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8); // swap 2-byte long pairs v = ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) | ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16); // swap 4-byte long pairs v = ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) | ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32); // swap 8-byte long pairs v = ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) | ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64); // swap 16-byte long pairs v = (v >> 128) | (v << 128); } /// @notice reverse the byte order of the uint32 value. /// @dev Solidity uses a big-endian ABI encoding. Reversing the byte order before encoding /// ensure that the encoded value will be little-endian. /// Written by k06a. https://ethereum.stackexchange.com/a/83627 function reverseByteOrderUint32(uint32 input) pure returns (uint32 v) { v = input; // swap bytes v = ((v & 0xFF00FF00) >> 8) | ((v & 0x00FF00FF) << 8); // swap 2-byte long pairs v = (v >> 16) | (v << 16); } /// @notice reverse the byte order of the uint16 value. /// @dev Solidity uses a big-endian ABI encoding. Reversing the byte order before encoding /// ensure that the encoded value will be little-endian. /// Written by k06a. https://ethereum.stackexchange.com/a/83627 function reverseByteOrderUint16(uint16 input) pure returns (uint16 v) { v = input; // swap bytes v = (v >> 8) | ((v & 0x00FF) << 8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
{ "remappings": [ "forge-std/=../lib/forge-std/src/", "openzeppelin/=../lib/openzeppelin-contracts/", "@openzeppelin/contracts/=/Users/victorgraf/risc0/ethereum/lib/openzeppelin-contracts/contracts/", "erc4626-tests/=/Users/victorgraf/risc0/ethereum/lib/openzeppelin-contracts/lib/erc4626-tests/", "openzeppelin-contracts/=/Users/victorgraf/risc0/ethereum/lib/openzeppelin-contracts/contracts/" ], "optimizer": { "enabled": true, "runs": 10000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": true }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"SelectorInUse","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"SelectorRemoved","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"SelectorUnknown","type":"error"},{"inputs":[],"name":"VerifierAddressZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"contract IRiscZeroVerifier","name":"verifier","type":"address"}],"name":"addVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"getVerifier","outputs":[{"internalType":"contract IRiscZeroVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"seal","type":"bytes"}],"name":"getVerifier","outputs":[{"internalType":"contract IRiscZeroVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"removeVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"verifiers","outputs":[{"internalType":"contract IRiscZeroVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"seal","type":"bytes"},{"internalType":"bytes32","name":"imageId","type":"bytes32"},{"internalType":"bytes32","name":"journalDigest","type":"bytes32"}],"name":"verify","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"seal","type":"bytes"},{"internalType":"bytes32","name":"claimDigest","type":"bytes32"}],"internalType":"struct Receipt","name":"receipt","type":"tuple"}],"name":"verifyIntegrity","outputs":[],"stateMutability":"view","type":"function"}]
Contract Creation Code
60803460c157601f610bc338819003918201601f19168301916001600160401b0383118484101760c55780849260209460405283398101031260c157516001600160a01b0381169081900360c157801560ae57600180546001600160a01b03199081169091555f80549182168317815560405192916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3610ae990816100da8239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f803560e01c80631599ead51461074e5780633cadf4491461072a578063715018a61461068457806379ba5097146105985780638da5cb5b1461056557806393d237f614610497578063ab750e75146103b4578063c17e7ba814610359578063d0a6af30146101e3578063e30c3978146101af578063f2fde38b146101075763fa9381d31461009e575f80fd5b346101045760206003193601126101045773ffffffffffffffffffffffffffffffffffffffff60406020927fffffffff000000000000000000000000000000000000000000000000000000006100f26108a2565b16815260028452205416604051908152f35b80fd5b50346101045760206003193601126101045760043573ffffffffffffffffffffffffffffffffffffffff81168091036101ab57610142610a90565b807fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015573ffffffffffffffffffffffffffffffffffffffff8254167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b5080fd5b5034610104578060031936011261010457602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b5034610104576040600319360112610104576101fd6108a2565b6024359073ffffffffffffffffffffffffffffffffffffffff8216809203610355577fffffffff0000000000000000000000000000000000000000000000000000000090610249610a90565b168083526002602052600173ffffffffffffffffffffffffffffffffffffffff6040852054161461032a57808352600260205273ffffffffffffffffffffffffffffffffffffffff6040842054166102ff5781156102d7578252600260205260408220907fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b6004837f85ec61b4000000000000000000000000000000000000000000000000000000008152fd5b7f50a41efb000000000000000000000000000000000000000000000000000000008352600452602482fd5b7fde03ac4c000000000000000000000000000000000000000000000000000000008352600452602482fd5b8280fd5b5034610104576020600319360112610104576004359067ffffffffffffffff821161010457602061039661039036600486016108d1565b90610a59565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b5034610104576060600319360112610104578060043567ffffffffffffffff8111610494576103e79036906004016108d1565b73ffffffffffffffffffffffffffffffffffffffff6104068284610a59565b1691823b1561048f576104529284926040518095819482937fab750e7500000000000000000000000000000000000000000000000000000000845260606004850152606484019161096d565b6024356024830152604435604483015203915afa8015610484576104735750f35b8161047d916108ff565b6101045780f35b6040513d84823e3d90fd5b505050fd5b50fd5b5034610104576020600319360112610104577fffffffff000000000000000000000000000000000000000000000000000000006104d26108a2565b6104da610a90565b16808252600260205273ffffffffffffffffffffffffffffffffffffffff6040832054161561053a57815260026020526040812060017fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b7fe4ea6542000000000000000000000000000000000000000000000000000000008252600452602490fd5b503461010457806003193601126101045773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b50346101045780600319360112610104573373ffffffffffffffffffffffffffffffffffffffff6001541603610658577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154166001558054337fffffffffffffffffffffffff0000000000000000000000000000000000000000821617825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b807f118cdaa7000000000000000000000000000000000000000000000000000000006024925233600452fd5b503461010457806003193601126101045761069d610a90565b7fffffffffffffffffffffffff0000000000000000000000000000000000000000600154166001558073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346101045760206003193601126101045760206103966107496108a2565b6109ab565b503461089e57602060031936011261089e5760043567ffffffffffffffff811161089e5780360390604060031983011261089e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd8160040135920182121561089e5781810160048101359067ffffffffffffffff821161089e57602401813603811361089e5773ffffffffffffffffffffffffffffffffffffffff916107f491610a59565b1690813b1561089e5780604051937f1599ead500000000000000000000000000000000000000000000000000000000855260206004860152019160246004840135930167ffffffffffffffff841161089e57833603811361089e57848093602461086b83945f98604084870152606486019161096d565b910135604483015203915afa801561089357610885575080f35b61089191505f906108ff565b005b6040513d5f823e3d90fd5b5f80fd5b600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361089e57565b9181601f8401121561089e5782359167ffffffffffffffff831161089e576020838186019501011161089e57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094057604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b7fffffffff0000000000000000000000000000000000000000000000000000000016805f52600260205273ffffffffffffffffffffffffffffffffffffffff60405f205416908115610a2e5760018214610a03575090565b7fde03ac4c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fe4ea6542000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9060041161089e577fffffffff00000000000000000000000000000000000000000000000000000000610a8d9135166109ab565b90565b73ffffffffffffffffffffffffffffffffffffffff5f54163303610ab057565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea164736f6c634300081a000a000000000000000000000000821c0423dfd0f70890cb9bc6718451261b1696de
Deployed Bytecode
0x60806040526004361015610011575f80fd5b5f803560e01c80631599ead51461074e5780633cadf4491461072a578063715018a61461068457806379ba5097146105985780638da5cb5b1461056557806393d237f614610497578063ab750e75146103b4578063c17e7ba814610359578063d0a6af30146101e3578063e30c3978146101af578063f2fde38b146101075763fa9381d31461009e575f80fd5b346101045760206003193601126101045773ffffffffffffffffffffffffffffffffffffffff60406020927fffffffff000000000000000000000000000000000000000000000000000000006100f26108a2565b16815260028452205416604051908152f35b80fd5b50346101045760206003193601126101045760043573ffffffffffffffffffffffffffffffffffffffff81168091036101ab57610142610a90565b807fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015573ffffffffffffffffffffffffffffffffffffffff8254167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b5080fd5b5034610104578060031936011261010457602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b5034610104576040600319360112610104576101fd6108a2565b6024359073ffffffffffffffffffffffffffffffffffffffff8216809203610355577fffffffff0000000000000000000000000000000000000000000000000000000090610249610a90565b168083526002602052600173ffffffffffffffffffffffffffffffffffffffff6040852054161461032a57808352600260205273ffffffffffffffffffffffffffffffffffffffff6040842054166102ff5781156102d7578252600260205260408220907fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b6004837f85ec61b4000000000000000000000000000000000000000000000000000000008152fd5b7f50a41efb000000000000000000000000000000000000000000000000000000008352600452602482fd5b7fde03ac4c000000000000000000000000000000000000000000000000000000008352600452602482fd5b8280fd5b5034610104576020600319360112610104576004359067ffffffffffffffff821161010457602061039661039036600486016108d1565b90610a59565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b5034610104576060600319360112610104578060043567ffffffffffffffff8111610494576103e79036906004016108d1565b73ffffffffffffffffffffffffffffffffffffffff6104068284610a59565b1691823b1561048f576104529284926040518095819482937fab750e7500000000000000000000000000000000000000000000000000000000845260606004850152606484019161096d565b6024356024830152604435604483015203915afa8015610484576104735750f35b8161047d916108ff565b6101045780f35b6040513d84823e3d90fd5b505050fd5b50fd5b5034610104576020600319360112610104577fffffffff000000000000000000000000000000000000000000000000000000006104d26108a2565b6104da610a90565b16808252600260205273ffffffffffffffffffffffffffffffffffffffff6040832054161561053a57815260026020526040812060017fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b7fe4ea6542000000000000000000000000000000000000000000000000000000008252600452602490fd5b503461010457806003193601126101045773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b50346101045780600319360112610104573373ffffffffffffffffffffffffffffffffffffffff6001541603610658577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154166001558054337fffffffffffffffffffffffff0000000000000000000000000000000000000000821617825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b807f118cdaa7000000000000000000000000000000000000000000000000000000006024925233600452fd5b503461010457806003193601126101045761069d610a90565b7fffffffffffffffffffffffff0000000000000000000000000000000000000000600154166001558073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346101045760206003193601126101045760206103966107496108a2565b6109ab565b503461089e57602060031936011261089e5760043567ffffffffffffffff811161089e5780360390604060031983011261089e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd8160040135920182121561089e5781810160048101359067ffffffffffffffff821161089e57602401813603811361089e5773ffffffffffffffffffffffffffffffffffffffff916107f491610a59565b1690813b1561089e5780604051937f1599ead500000000000000000000000000000000000000000000000000000000855260206004860152019160246004840135930167ffffffffffffffff841161089e57833603811361089e57848093602461086b83945f98604084870152606486019161096d565b910135604483015203915afa801561089357610885575080f35b61089191505f906108ff565b005b6040513d5f823e3d90fd5b5f80fd5b600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361089e57565b9181601f8401121561089e5782359167ffffffffffffffff831161089e576020838186019501011161089e57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094057604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b7fffffffff0000000000000000000000000000000000000000000000000000000016805f52600260205273ffffffffffffffffffffffffffffffffffffffff60405f205416908115610a2e5760018214610a03575090565b7fde03ac4c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fe4ea6542000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9060041161089e577fffffffff00000000000000000000000000000000000000000000000000000000610a8d9135166109ab565b90565b73ffffffffffffffffffffffffffffffffffffffff5f54163303610ab057565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea164736f6c634300081a000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000821c0423dfd0f70890cb9bc6718451261b1696de
-----Decoded View---------------
Arg [0] : admin (address): 0x821C0423dfD0f70890CB9BC6718451261b1696de
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000821c0423dfd0f70890cb9bc6718451261b1696de
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.