{
"finality": 600,
"pruningWindow": 1209600,
"risks": {
"economicSecurity": {
"value": {
"value": "No slashing",
"sentiment": "bad",
"description": "Node operators are required to stake a minimum of 32 ETH (first quorum) or 1 EIGEN (second quorum) to become members of the DA network. Although slashing is enabled at EigenLayer protocol level, individual AVSs like EigenDA need to activate it by migrating to Operators Sets and defining slashing conditions. Currently, there is no slashing condition in place for misbehaving nodes. The EIGEN token social forking protocol for intersubjective attributable faults is under active development."
},
"adjustSecurityRisk": false
},
"fraudDetection": {
"value": "None",
"sentiment": "bad",
"description": "There is no fraud detection mechanism in place. A data withholding attack can only be detected by nodes downloading the full data from the DA layer."
}
},
"sovereignProjectsTrackingConfig": [
{
"projectId": "mantle-testnet",
"name": "Mantle-testnet",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 0,
"customerId": "0xc16267ecb2297f8a98fce214686e80697da91198"
}
]
},
{
"projectId": "matter-labs-wonderfi",
"name": "Matter Labs - WonderFi",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 0,
"customerId": "0xdaf4b26d608d58f53ab6f0758a12de01296ce5bf"
}
]
},
{
"projectId": "altlayer",
"name": "AltLayer",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 0,
"customerId": "0x4fdbd273b8d2c1c429a7e3078063c49528aa8264"
}
]
},
{
"projectId": "altlayer-2",
"name": "AltLayer-2",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 0,
"customerId": "0x1359fbd4b9bc9441a90436719426157526742c9a"
}
]
},
{
"projectId": "altlayer-cyber",
"name": "Altlayer Cyber",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 0,
"customerId": "35.167.254.127"
}
]
},
{
"projectId": "conduit",
"name": "Conduit",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 0,
"customerId": "0x8dc6f0bd2ce3c40d633f5541e21e7574598f7c75"
}
]
},
{
"projectId": "layer-n",
"name": "Layer N",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 0,
"customerId": "0xd697219f32129f4544a554be015386fac9445507"
}
]
},
{
"projectId": "treasure",
"name": "Treasure",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 0,
"customerId": "0x96561d11f55f99f7cda780b77e524195bde1dcde"
}
]
},
{
"projectId": "openledger",
"name": "OpenLedger",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1752044400,
"customerId": "0xe16fabeb99a6c098e4d7b4d442df0c827d5a6d26"
}
]
},
{
"projectId": "alchemy-production",
"name": "Alchemy Production",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1753833600,
"customerId": "0x3ba8c28a0209dea4d0502031f83d09a17a389fb0"
}
]
},
{
"projectId": "powerloom",
"name": "Powerloom",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1754438400,
"customerId": "0x00efb491755397ab8727ab45c4aef5fdcd3ecef8"
}
]
},
{
"projectId": "soon-base",
"name": "SOON - Base",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1748934000,
"customerId": "0xa11b7dea1592011c0055c62efb9566a845493003"
}
]
},
{
"projectId": "polymer",
"name": "Polymer",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1731974400,
"customerId": "0xf33f8cfea5857ebf248520cf6bc33640680ff83b"
}
]
},
{
"projectId": "crestal",
"name": "Crestal",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1728399600,
"customerId": "0x2659d4555e482ec4131a493def0770a922c75de3"
}
]
},
{
"projectId": "rise",
"name": "Rise",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1767607200,
"customerId": "0x78d5974216f751eb328018f003067f77e8be2fc4"
}
]
},
{
"projectId": "conduit-2",
"name": "Conduit",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1719266400,
"customerId": "34.145.120.220"
}
]
},
{
"projectId": "conduit-3",
"name": "Conduit",
"daTrackingConfig": [
{
"type": "eigen-da",
"sinceTimestamp": 1719262800,
"customerId": "34.168.104.248"
}
]
}
],
"systemCategory": "public",
"technology": {
"description": "## Architecture\n\n\n\nEigenDA is composed by three types of off-chain entities: node operators, a disperser and a retriever.\n- EigenDA **operators** are node operators running the EigenDA node software and are registered to the EigenDA AVS in EigenLayer.\n- The **disperser** is the entity responsible for collecting the blobs from the sequencer, erasure coding them and generating the encoded blob's KZG commitments for each chunk. Although the disperser could be rollup-operated, it is currently a centralised entity operated by Eigen Labs.\n- Lastly, the **retriever** client is responsible for querying the EigenDA operators to retrieve blob chunks, verifying their integrity and reconstructing the original blob.\n\n### Operators Registration\nOperators register with the EigenDAServiceManager via the registerOperatorToAVS() function, enabling them to participate in the data availability network. They are responsible for holding and serving blobs data, and earn rewards for their participation in the network.\n\n\n\n### Operators Stake Update\n\nEigenDA operators' stake for quorum verification is fetched from the EigenDA StakeRegistry contract. To keep the stake in sync with changes in share balances in the EigenLayer DelegationManager (e.g., due to tokens delegated/undelegated to operators), the permissionless updateOperators() function on the RegistryCoordinator contract needs to be called periodically. This function updates the operators' quorum weight in the StakeRegistry contract based on the operators' shares in the EigenLayer DelegationManager contract.\n\n\n### Operators Blob Storage and Retrieval\n\nThe process of storing a blob on EigenDA works as follows. A sequencer submits blobs to the EigenDA Disperser, which erasure codes the blobs into chunks and generates KZG commitments and proofs for each chunk, certifying the correctness of the data. The disperser then sends the chunks, KZG commitments, and KZG proofs to the operators.\nMultiple operators are responsible for storing chunks of the encoded data blobs and their associated KZG commitment and proof.\nOnce the chunks, KZG commitments, and KZG proofs are sent to the operators, each of them generates a signature certifying that they have stored the data. These signatures are then sent to the Disperser which aggregates them and submits them to Ethereum by sending a transaction to the EigenDAServiceManager (the DA bridge).\n\n\n\n## Data Availability Certificates\n\nEigenDA uses different certificate formats depending on the version, each with corresponding verifier contracts:\n\n### Certificate Types\n- **V1 Certificates**: Used in EigenDA V1, verified through the EigenDAServiceManager contract via the confirmBatch() function. These certificates contain batch headers with KZG commitments and BLS aggregated signatures from operators.\n\n- **V2/V3 Certificates**: Used in EigenDA V2, which introduces significant architectural changes. The sequencer acts as the relayer and does not post batches to the service manager. Instead, certificates are verified through dedicated DACert Verifier contracts that correspond to different certificate versions.\n\n### EigenDA V2\nIn EigenDA V2, the architecture has evolved to improve efficiency:\n- **Sequencer as Relayer**: The sequencer now acts as the relayer, eliminating the need to post batches to the service manager\n- **Direct Certificate Verification**: Certificates are verified directly through version-specific DACert Verifier contracts\n- **Improved Throughput**: The new architecture supports higher throughput by removing bottlenecks in the batch confirmation process\n\n\n## L2 Data Availability\nThe verification process differs between EigenDA versions:\n\n**EigenDA V1**: The Disperser collects operators' signatures and submits them to the EigenDAServiceManager contract via the confirmBatch() function. This submission includes a call to the BLSRegistry contract to verify signatures and check whether the required quorum of operators' stake has been achieved.\n\n**EigenDA V2**: Certificate verification is handled by dedicated DACert Verifier contracts. Each certificate version corresponds to a specific verifier that validates the certificate format and cryptographic proofs without requiring batch submissions to a central service manager.\n\nThreshold BLS signatures are not used. Instead, the threshold check is performed on the signers' total stake fetched by the StakeRegistry, and the stake threshold percentage to reach is provided in the batch header input data.\n\nThe EigenDARollupUtils.sol library's verifyBlob() function can then be used by L2s to verify that a data blob is included within a confirmed batch in the EigenDAServiceManager (V1) or through the appropriate DACert Verifier contract (V2/V3).\nThis function is not used by the EigenDAServiceManager contract itself, but rather by L2 systems to prove inclusion of the blob and that their trust assumptions (i.e., batch confirmation threshold) were as expected.",
"references": [
{
"title": "EigenDA - Documentation",
"url": "https://docs.eigenda.xyz/overview"
},
{
"title": "EigenDA Integration Spec - Lifecycle Phases",
"url": "https://layr-labs.github.io/eigenda/integration/spec/5-lifecycle-phases.html#secure-dispersal"
},
{
"title": "EigenDA Disperser - Source Code",
"url": "https://github.com/Layr-Labs/eigenda/blob/2ed86a0c1dd730b56c8235031c19e08a9837bde8/disperser/batcher/batcher.go"
},
{
"title": "EigenDA Rollup Utils - Source Code",
"url": "https://github.com/Layr-Labs/eigenda-utils/blob/c4cbc9ec078aeca3e4a04bd278e2fb136bf3e6de/src/libraries/EigenDARollupUtils.sol"
}
],
"risks": [
{
"category": "Users can be censored if",
"text": "the disperser does not distribute data to EigenDA operators."
}
]
},
"throughput": [
{
"size": 15728640,
"frequency": 1,
"sinceTimestamp": 1719187200
},
{
"size": "NO_CAP",
"frequency": 1,
"sinceTimestamp": 1753833600
}
],
"type": "DA Service",
"usedWithoutBridgeIn": [
{
"id": "aevo",
"name": "Aevo",
"slug": "aevo"
},
{
"id": "fuel",
"name": "Fuel Ignition",
"slug": "fuel"
},
{
"id": "megaeth",
"name": "MegaETH",
"slug": "megaeth"
},
{
"id": "roninnetwork",
"name": "Ronin",
"slug": "ronin-network"
},
{
"id": "soon",
"name": "Soon Alpha Mainnet",
"slug": "soon"
}
],
"validators": {
"type": "static",
"count": 91
}
}
eigenda-v2+5-0
daBridge+5-0
{
"daLayer": "eigenda",
"name": "DACert Verifier (EigenDA V2)",
"relayerType": {
"value": "SelfRelay",
"sentiment": "good",
"description": "In EigenDA V2 secure integrations, the rollup batcher includes the DA certificate on L1, no separate third-party relayer is required."
},
"risks": {
"committeeSecurity": {
"value": "Permissioned",
"sentiment": "warning",
"description": "The committee requires an honest minority (less than 1/3) of members (or the network stake) to prevent the DA bridge from accepting an unavailable data commitment.\n There are 91 operators currently registered in the committee, but entry or exit of members is partially controlled by a centralized entity.",
"orderHint": 1
},
"upgradeability": {
"value": "No delay",
"sentiment": "bad",
"description": "There is no delay in the upgradeability of the bridge. Users have no time to exit the system before the bridge implementation update is completed."
},
"relayerFailure": {
"value": "Self propose",
"sentiment": "good",
"description": "Anyone can relay data availability commitments to the DA bridge. In case of current relayer failure, users can collect attestations from committee members and propose new data availability commitments to the DA bridge."
}
},
"technology": {
"description": "## EigenDA V2 Architecture\n\nEigenDA V2 introduces a more efficient architecture where the L2 sequencer acts as the relayer, eliminating the need for separate permissioned relayers:\n\n- **Sequencer as Relayer**: The sequencer acts as the relayer, eliminating the need for separate permissioned relayers\n- **Direct Certificate Verification**: Multiple DACert Verifier contracts handle different certificate versions (V2, V3). These contracts read operator/state metadata via EigenDA and EigenLayer core contracts (incl. ServiceManager components) and verify signatures and stake thresholds.\n- **Version-Specific Verification**: Each certificate version has a corresponding verifier contract that validates the specific certificate format and cryptographic proofs\n\n### Certificate Types and Verifiers\nEigenDA V2 supports multiple certificate formats:\n\n- **V2 Certificates**: Contain blob inclusion info, batch headers, and non-signer stakes with signatures. Verified through EigenDACertVerifierV2 contracts.\n- **V3 Certificates**: Similar structure to V2 but with reordered fields for optimization. Verified through EigenDACertVerifierV3 contracts.\n\n### Verification Process\n1. **Certificate Construction**: The EigenDA client constructs certificates from BlobStatusReply data received from the disperser\n2. **Version Detection**: The certificate version is determined from the commitment structure \n3. **Verifier Selection**: The appropriate DACert Verifier contract is selected based on the certificate version using the EigenDACertVerifierRouter\n4. **Onchain Verification**: The verifier contract's checkDACert function validates the certificate against operator signatures and stake thresholds\n\n### Secure Dispersal Flow\nBased on the EigenDA integration spec:\n\n1. EigenDA Client converts raw payload bytes into a blob\n2. Client fetches the appropriate EigenDACertVerifier contract address using the router\n3. Client submits blob request to disperser and polls for BlobStatusReply\n4. Once confirmation thresholds are met, client constructs the DACert from the reply\n5. Client calls the verifier's checkDACert function for onchain verification\n6. Based on verification status, client either returns the certificate or initiates failover\n\n### Router-Based Verifier Selection\nEigenDA V2 uses the EigenDACertVerifierRouter to dynamically select the appropriate verifier contract:\n- The router maps certificate versions to their corresponding verifier contracts\n- This allows for seamless upgrades and support for multiple certificate formats\n- The client queries the router using the latest block number to get the verifier for the reference block\n\nThis architecture provides improved throughput and eliminates single points of failure while maintaining the same security guarantees as V1.",
"references": [
{
"title": "EigenDA Integration Spec - Lifecycle Phases",
"url": "https://layr-labs.github.io/eigenda/integration/spec/5-lifecycle-phases.html#secure-dispersal"
},
{
"title": "EigenDA - Documentation",
"url": "https://docs.eigenda.xyz/overview"
},
{
"title": "EigenDA Disperser - Source Code",
"url": "https://github.com/Layr-Labs/eigenda/blob/2ed86a0c1dd730b56c8235031c19e08a9837bde8/disperser/batcher/batcher.go"
}
],
"risks": [
{
"category": "Funds can be lost if",
"text": "the sequencer posts an invalid certificate and EigenDA operators do not make the data available for verification."
},
{
"category": "Funds can be frozen if",
"text": "the EigenDACertVerifierRouter fails to provide correct verifier contract addresses."
}
]
},
"usedIn": [
{
"id": "celo",
"name": "Celo",
"slug": "celo"
},
{
"id": "roninnetwork",
"name": "Ronin",
"slug": "ronin-network"
}
],
"validationType": {
"value": "BLS Signature",
"description": "EigenDA V2 certificates require onchain BLS signatures verification through dedicated DACert Verifier contracts. Each certificate version corresponds to a specific verifier that validates the certificate format and proofs."
}
}
risc0+4-2
zkCatalogInfo+4-2
{
"creator": "RISC Zero",
"projectsForTvs": [
{
"projectId": "taiko",
"sinceTimestamp": 1730452800
},
{
"projectId": "bob",
"sinceTimestamp": 1752703200
},
{
"projectId": "megaeth",
"sinceTimestamp": 1763954183
},
{
"projectId": "soon",
"sinceTimestamp": 1765180787
},
{
"projectId": "base",
"sinceTimestamp": 1779825599
},
{
"projectId": "roninnetwork",
"sinceTimestamp": 1780557929
}
],
"proofSystemInfo": "## Description\n\nRISC Zero is the first zkVM proving RISC-V ISA programs. Its STARK proving system is based on a rather standard theoretical construction of [Ben-Sasson et al paper](https://eprint.iacr.org/2018/046) and [DEEP-ALI version of FRI](https://eprint.iacr.org/2019/336). The proof of zkVM execution is wrapped in Groth16 SNARK for efficient onchain verification. RISC Zero onchain verifier targets [96 bits of security](https://dev.risczero.com/api/security-model#cryptographic-security).\n\n## Proof system\n\n### RISC-V circuit\n\nRISC Zero implements a [circuit that proves RISC-V RV32IM instruction set](https://github.com/risc0/risc0/tree/main/risc0/circuit/rv32im) (see [here](https://dev.risczero.com/api/zkvm/zkvm-specification#the-zkvm-execution-model) for more details). Arithmetization of this circuit has different types of columns: control, data and accumulator. Control columns contain public data that describes the RISC-V program being executed and proven. Data and accumulator columns contain private data (accessible only to prover), data represents the running state of the processor and memory and accumulator is auxiliary data for the PLOOKUP argument.\n\n### Recursion circuit\n\nRISC Zero prover supports recursive proving of RISC-V programs using [recursion circuit](https://github.com/risc0/risc0/tree/main/risc0/circuit/recursion). This is a separate STARK circuit that is designed to efficiently generate proofs for the verification of STARK proofs, it uses the same proving system as the RISC-V circuit.\n\nBig programs are split into several segments that are executed and proven in parallel. Segment receipts (i.e. proofs of correct execution) are verified with recursion circuits and succinct receipts are produced. These succinct receipts could be recursively joined in pairs of two until a single succinct proof of the whole execution is produced. \n\n### Final wrap\n\nRISC Zero [implements a SNARK wrapping](https://github.com/risc0/risc0/tree/main/risc0/groth16) of a recursive succinct receipt into a Groth16 proof over BN254 curve for onchain verification. This Groth16 R1CS circuit uses a circuit-specific trusted setup, the ceremony was run by RISC Zero, see [below](#trusted-setups) for more details. \n\nThe final wrap circuit has a [control root](https://dev.risczero.com/terminology#control-root) public input that depends on the RISC-V and recursion circuit versions. This design allows upgrading RISC Zero proving system without changing the final wrapper and thus without running a new trusted setup ceremony.",
"techStack": {
"zkVM": [
{
"id": "RISC0",
"type": "STARK",
"name": "Risc0",
"description": "zkVM STARK proving system developed by RISC ZERO for RISC-V programs."
},
{
"id": "RISCV32",
"type": "ISA",
"name": "RISC-V 32bit",
"description": "Free and open-source universal 32-bit ISA used across a variety of hardware and software."
},
{
"id": "BabyBear",
"type": "Field",
"name": "Baby Bear",
"description": "Prime field of order p = 15 * 2**27 + 1."
}
],
"finalWrap": [
{
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
{
"id": "BN254",
"type": "curve",
"name": "BN254",
"description": "BN254, aka BN256, aka alt_bn128 pairing-friendly 254-bit prime field Weierstrass elliptic curve."
}
]
},
"trustedSetups": [
{
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"id": "Risc0",
"name": "Risc0 Groth16",
"participantCount": 55,
"risk": "yellow",
"shortDescription": "Circuit-specific trusted setup for Risc0 final wrap Groth16 onchain verifier. It was built on top of 55 phase 1 contributions, and reached 238 phase 2 participants. Proving system could be broken if either phase 1 or 2 is compromised.",
"longDescription": "Ceremony for a circuit-specific trusted setup run by Risc0 for Groth16 circuits verifying Risc0 STARK proof.\n\nRisc0 Groth16 builds on top of Polygon zkEVM ceremony as phase 1. It contains 55 participants.\n\nPhase 2 of the trusted setup was publicly announced and run with 238 participants. Ceremony transcript, as well as instructions for participation and verification \nare publicly available.\n\n- Phase 1 ceremony: .\n- Ceremony instructions: [https://risczero.com/blog/ceremony-contribution-public-instructions](https://risczero.com/blog/ceremony-contribution-public-instructions)\n- Link to the verification: [https://dev.risczero.com/api/trusted-setup-ceremony#the-transcript-matches-the-circuit](https://dev.risczero.com/api/trusted-setup-ceremony#the-transcript-matches-the-circuit)\n- Post with a call to community to participate: [https://x.com/RiscZero/status/1781110200923275769](https://x.com/RiscZero/status/1781110200923275769)"
}
],
"verifierHashes": [
{
"hash": "0xa42b7a9c647b7bea4f92660bfd9cd3c5afc91b4c40773f9fb410eb55c8402e40",
"name": "RiscZero v2.2.0",
"sourceLink": "https://github.com/risc0/risc0/tree/v2.2.0",
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"knownDeployments": [
{
"address": "eth:0xafB31f5b70623CDF4b20Ada3f7230916A5A79df9",
"overrideUsedIn": [
"taiko",
"bob",
"megaeth",
"soon"
"soon",
"roninnetwork"
]
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "Verification works on a linux machine, 36 GiB of memory is enough to regenerate the verifier. Approximately 14 GiB of trusted setup files need to be downloaded.\n\nTo regenerate the verifier, both Groth16 verifier keys and constructor parameters `control_root` and `bn254_control_id` need to be regenerated.\n\n1. Install npm, rust, git-lfs:\n```\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n. .cargo/env\n\nsudo apt install npm git-lfs\n```\n\n2. Install snarkjs and circom v2.1.0 (from sources):\n```\nnpm install -g snarkjs\n\ngit clone https://github.com/iden3/circom.git\ncd circom\ngit checkout v2.1.0\ncargo build --release\ncargo install --path circom\nexport PATH=\"$HOME/.cargo/bin:$PATH\"\n```\n\n3. Clone risc0 repo, lfs pull the circuit for verifying Risc Zero STARK proofs and compile it into R1CS:\n```\ngit clone https://github.com/risc0/risc0.git\ncd risc0\ngit checkout v2.0.0 # hash 3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38\ngit lfs install\ngit lfs pull --include=groth16_proof/groth16/stark_verify.circom\ncd groth16_proof/groth16\ncircom stark_verify.circom --r1cs\n\n# check that the circuit is correct:\nshasum -a 256 stark_verify.r1cs # output should be 84d3c34b7c0eb55ad1b16b24f75e0b9de307f7b74089ea4a20a998390ee24178\n```\n\n4. Download phase 1 and phase 2 trusted setup files, verify their correctness:\n```\nwget https://storage.googleapis.com/zkevm/ptau/powersOfTau28_hez_final_23.ptau\nwget https://risc0-artifacts.s3.us-west-2.amazonaws.com/tsc/2024-04-04/stark_verify_final.zkey\n\nexport NODE_OPTIONS=\"--max-old-space-size=32768\" # without this snarkjs runs out of mem\nsnarkjs zkey verify stark_verify.r1cs powersOfTau28_hez_final_23.ptau stark_verify_final.zkey\n```\n\n5. Export the solidity verifier. Check it manually against the deployed smart contract: `snarkjs zkey export solidityverifier stark_verify_final.zkey verifier.sol`.\n\n6. Check out to the `v2.2.0` tag of risc0 repo: `git checkout v2.2.0`, commit hash should be `eff3c74bf9992401c2c68bea95eb6c93b27999ec`. \nFrom the risc0 repo root dir, call `RUST_LOG=info cargo xtask bootstrap`. \nIt will output computed `allowed_control_root` and `bn254_identity_control_id` that could be compared with the contract constructor values: `0xce52bf56033842021af3cf6db8a50d1b7535c125a34f1a22c6fdcf002c5a1529` and `0x04446e66d300eb7fb45c9726bb53c793dda407a62e9601618bb43c5c14657ac0`. Note that the bytes of `bn254_identity_control_id` will be output in the reversed order.",
"description": "Custom verifier ID: SHA256 hash of the following values abi packed together: the bytes32 value of internal pure function verifier_key_digest() of the RiscZeroGroth16Verifier.sol, bytes32 value of `control_root` and bytes32 value of `bn254_control_id` of contract constructor values."
},
{
"hash": "0x10ab33bc472e3e9024d89e512d33781519ba9b1621e4fe0ffd80cd20523062a8",
"name": "RiscZero v3.0.0",
"sourceLink": "https://github.com/risc0/risc0/tree/v3.0.0",
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"knownDeployments": [
{
"address": "eth:0x2a098988600d87650Fb061FfAff08B97149Fa84D",
"overrideUsedIn": [
"bob",
"taiko"
"taiko",
"roninnetwork"
]
},
{
"address": "eth:0x411e56a890c5fe0712f6F345977815Ba8E7785C3"
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "Verification works on a linux machine, 36 GiB of memory is enough to regenerate the verifier. Approximately 14 GiB of trusted setup files need to be downloaded.\n\nTo regenerate the verifier, both Groth16 verifier keys and constructor parameters `control_root` and `bn254_control_id` need to be regenerated.\n\n1. Install npm, rust, git-lfs:\n```\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n. .cargo/env\n\nsudo apt install npm git-lfs\n```\n\n2. Install snarkjs and circom v2.1.0 (from sources):\n```\nnpm install -g snarkjs\n\ngit clone https://github.com/iden3/circom.git\ncd circom\ngit checkout v2.1.0\ncargo build --release\ncargo install --path circom\nexport PATH=\"$HOME/.cargo/bin:$PATH\"\n```\n\n3. Clone risc0 repo, lfs pull the circuit for verifying Risc Zero STARK proofs and compile it into R1CS:\n```\ngit clone https://github.com/risc0/risc0.git\ncd risc0\ngit checkout v2.0.0 # hash 3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38\ngit lfs install\ngit lfs pull --include=groth16_proof/groth16/stark_verify.circom\ncd groth16_proof/groth16\ncircom stark_verify.circom --r1cs\n\n# check that the circuit is correct:\nshasum -a 256 stark_verify.r1cs # output should be 84d3c34b7c0eb55ad1b16b24f75e0b9de307f7b74089ea4a20a998390ee24178\n```\n\n4. Download phase 1 and phase 2 trusted setup files, verify their correctness:\n```\nwget https://storage.googleapis.com/zkevm/ptau/powersOfTau28_hez_final_23.ptau\nwget https://risc0-artifacts.s3.us-west-2.amazonaws.com/tsc/2024-04-04/stark_verify_final.zkey\n\nexport NODE_OPTIONS=\"--max-old-space-size=32768\" # without this snarkjs runs out of mem\nsnarkjs zkey verify stark_verify.r1cs powersOfTau28_hez_final_23.ptau stark_verify_final.zkey\n```\n\n5. Export the solidity verifier. Check it manually against the deployed smart contract: `snarkjs zkey export solidityverifier stark_verify_final.zkey verifier.sol`.\n\n6. Check out to the `v3.0.0` tag of risc0 repo: `git checkout v3.0.0`, commit hash should be `96eef1c3c9c6dde65dcc2fc86791a4358fcc8e4d`. \nFrom the risc0 repo root dir, call `RUST_LOG=info cargo xtask bootstrap`. \nIt will output computed `allowed_control_root` and `bn254_identity_control_id` that could be compared with the contract constructor values: `0xa54dc85ac99f851c92d7c96d7318af41dbe7c0194edfcc37eb4d422a998c1f56` and `0x04446e66d300eb7fb45c9726bb53c793dda407a62e9601618bb43c5c14657ac0`. Note that the bytes of `bn254_identity_control_id` will be output in the reversed order.",
"description": "Custom verifier ID: SHA256 hash of the following values abi packed together: the bytes32 value of internal pure function verifier_key_digest() of the RiscZeroGroth16Verifier.sol, bytes32 value of `control_root` and bytes32 value of `bn254_control_id` of contract constructor values."
},
{
"hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"name": "RiscZero Soon verifier",
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"knownDeployments": [
{
"address": "eth:0x455218fa82e96A6adCcf182EE8A90A93BE7a6Bc6"
}
],
"verificationStatus": "unsuccessful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"description": "Verifier smart contract sources are not available on Etherscan, hash value is set to 0x0 to indicate that it is not known."
},
{
"hash": "0x79325d9dc09af1afcea4dbf04db9fada7a71846045ad56daa1996bbebf9468d8",
"name": "RiscZero v1.0.0",
"sourceLink": "https://github.com/risc0/risc0/tree/v1.0.0",
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"knownDeployments": [
{
"address": "eth:0xf70aBAb028Eb6F4100A24B203E113D94E87DE93C"
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "Verification works on a linux machine, 36 GiB of memory is enough to regenerate the verifier. Approximately 14 GiB of trusted setup files need to be downloaded.\n\nTo regenerate the verifier, both Groth16 verifier keys and constructor parameters `control_root` and `bn254_control_id` need to be regenerated.\n\n1. Install npm, rust, git-lfs:\n```\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n. .cargo/env\n\nsudo apt install npm git-lfs\n```\n\n2. Install snarkjs and circom v2.1.0 (from sources):\n```\nnpm install -g snarkjs\n\ngit clone https://github.com/iden3/circom.git\ncd circom\ngit checkout v2.1.0\ncargo build --release\ncargo install --path circom\nexport PATH=\"$HOME/.cargo/bin:$PATH\"\n```\n\n3. Clone risc0 repo, lfs pull the circuit for verifying Risc Zero STARK proofs and compile it into R1CS:\n```\ngit clone https://github.com/risc0/risc0.git\ncd risc0\ngit checkout v2.0.0 # hash 3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38\ngit lfs install\ngit lfs pull --include=groth16_proof/groth16/stark_verify.circom\ncd groth16_proof/groth16\ncircom stark_verify.circom --r1cs\n\n# check that the circuit is correct:\nshasum -a 256 stark_verify.r1cs # output should be 84d3c34b7c0eb55ad1b16b24f75e0b9de307f7b74089ea4a20a998390ee24178\n```\n\n4. Download phase 1 and phase 2 trusted setup files, verify their correctness:\n```\nwget https://storage.googleapis.com/zkevm/ptau/powersOfTau28_hez_final_23.ptau\nwget https://risc0-artifacts.s3.us-west-2.amazonaws.com/tsc/2024-04-04/stark_verify_final.zkey\n\nexport NODE_OPTIONS=\"--max-old-space-size=32768\" # without this snarkjs runs out of mem\nsnarkjs zkey verify stark_verify.r1cs powersOfTau28_hez_final_23.ptau stark_verify_final.zkey\n```\n\n5. Export the solidity verifier. Check it manually against the deployed smart contract: `snarkjs zkey export solidityverifier stark_verify_final.zkey verifier.sol`.\n\n6. Check out to the `v1.0.0` tag of risc0 repo: `git checkout v1.0.0`, commit hash should be `f2d27817a953ca4548739164afaf065de4d9a54a`.\nFrom the risc0 repo root dir, call `RUST_LOG=info cargo xtask bootstrap`. \nIt will output computed `allowed_control_root` and `bn254_identity_control_id` that could be compared with the contract constructor values: `0xa516a057c9fbf5629106300934d48e0e775d4230e41e503347cad96fcbde7e2e` and `0x0eb6febcf06c5df079111be116f79bd8c7e85dc9448776ef9a59aaf2624ab551`. Note that the bytes of `bn254_identity_control_id` will be output in the reversed order.",
"description": "Custom verifier ID: SHA256 hash of the following values abi packed together: the bytes32 value of internal pure function verifier_key_digest() of the RiscZeroGroth16Verifier.sol, bytes32 value of `control_root` and bytes32 value of `bn254_control_id` of contract constructor values."
},
{
"hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"name": "Kailua v1.2.0 verifier",
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"knownDeployments": [
{
"address": "eth:0xa23bf38299bbCbAA01b9ea8a1d3412D9f405b97d"
}
],
"verificationStatus": "notVerified",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"description": "Kailua v1.2.0 introduces a dedicated KailuaVerifier wrapper contract (deployed behind a proxy) that gates proof verification with optional fault-proof permits before delegating to the underlying RISC Zero verifier at `RISC_ZERO_VERIFIER`."
},
{
"hash": "0x55c1a9d623f4b589ad496bf8fde885abfafbcbf0129c67f1dbc78c8430b69eaf",
"name": "RiscZero v2.0.0-rc.3",
"sourceLink": "https://github.com/risc0/risc0/tree/v2.0.0-rc.3",
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"knownDeployments": [
{
"address": "eth:0x20ff7C2Cf391a5F096A2Cc181cb41916680f8E97"
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "Verification works on a linux machine, 36 GiB of memory is enough to regenerate the verifier. Approximately 14 GiB of trusted setup files need to be downloaded.\n\nTo regenerate the verifier, both Groth16 verifier keys and constructor parameters `control_root` and `bn254_control_id` need to be regenerated.\n\n1. Install npm, rust, git-lfs:\n```\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n. .cargo/env\n\nsudo apt install npm git-lfs\n```\n\n2. Install snarkjs and circom v2.1.0 (from sources):\n```\nnpm install -g snarkjs\n\ngit clone https://github.com/iden3/circom.git\ncd circom\ngit checkout v2.1.0\ncargo build --release\ncargo install --path circom\nexport PATH=\"$HOME/.cargo/bin:$PATH\"\n```\n\n3. Clone risc0 repo, lfs pull the circuit for verifying Risc Zero STARK proofs and compile it into R1CS:\n```\ngit clone https://github.com/risc0/risc0.git\ncd risc0\ngit checkout v2.0.0 # hash 3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38\ngit lfs install\ngit lfs pull --include=groth16_proof/groth16/stark_verify.circom\ncd groth16_proof/groth16\ncircom stark_verify.circom --r1cs\n\n# check that the circuit is correct:\nshasum -a 256 stark_verify.r1cs # output should be 84d3c34b7c0eb55ad1b16b24f75e0b9de307f7b74089ea4a20a998390ee24178\n```\n\n4. Download phase 1 and phase 2 trusted setup files, verify their correctness:\n```\nwget https://storage.googleapis.com/zkevm/ptau/powersOfTau28_hez_final_23.ptau\nwget https://risc0-artifacts.s3.us-west-2.amazonaws.com/tsc/2024-04-04/stark_verify_final.zkey\n\nexport NODE_OPTIONS=\"--max-old-space-size=32768\" # without this snarkjs runs out of mem\nsnarkjs zkey verify stark_verify.r1cs powersOfTau28_hez_final_23.ptau stark_verify_final.zkey\n```\n\n5. Export the solidity verifier. Check it manually against the deployed smart contract: `snarkjs zkey export solidityverifier stark_verify_final.zkey verifier.sol`.\n\n6. Check out to the `v2.0.0-rc.3` tag of risc0 repo: `git checkout v2.0.0-rc.3`, commit hash should be `99e8616b4e74203a5aa361a485e0196516b4b308`. \nFrom the risc0 repo root dir, call `RUST_LOG=info cargo xtask bootstrap`. \nIt will output computed `allowed_control_root` and `bn254_identity_control_id` that could be compared with the contract constructor values: `0x539032186827b06719244873b17b2d4c122e2d02cfb1994fe958b2523b844576` and `0x04446e66d300eb7fb45c9726bb53c793dda407a62e9601618bb43c5c14657ac0`. Note that the bytes of `bn254_identity_control_id` will be output in the reversed order.",
"description": "Custom verifier ID: SHA256 hash of the following values abi packed together: the bytes32 value of internal pure function verifier_key_digest() of the RiscZeroGroth16Verifier.sol, bytes32 value of `control_root` and bytes32 value of `bn254_control_id` of contract constructor values."
},
{
"hash": "0x23aae7a460d8470faa11d2b75a9005eee1d3e0bce0e88ac2288f1ada4e4664df",
"name": "RiscZero v2.1.0",
"sourceLink": "https://github.com/risc0/risc0/tree/v2.1.0",
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"knownDeployments": [
{
"address": "eth:0x54aCE3ED46529B4d4F3770C8Bad5dDC48717B9bF"
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "Verification works on a linux machine, 36 GiB of memory is enough to regenerate the verifier. Approximately 14 GiB of trusted setup files need to be downloaded.\n\nTo regenerate the verifier, both Groth16 verifier keys and constructor parameters `control_root` and `bn254_control_id` need to be regenerated.\n\n1. Install npm, rust, git-lfs:\n```\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n. .cargo/env\n\nsudo apt install npm git-lfs\n```\n\n2. Install snarkjs and circom v2.1.0 (from sources):\n```\nnpm install -g snarkjs\n\ngit clone https://github.com/iden3/circom.git\ncd circom\ngit checkout v2.1.0\ncargo build --release\ncargo install --path circom\nexport PATH=\"$HOME/.cargo/bin:$PATH\"\n```\n\n3. Clone risc0 repo, lfs pull the circuit for verifying Risc Zero STARK proofs and compile it into R1CS:\n```\ngit clone https://github.com/risc0/risc0.git\ncd risc0\ngit checkout v2.0.0 # hash 3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38\ngit lfs install\ngit lfs pull --include=groth16_proof/groth16/stark_verify.circom\ncd groth16_proof/groth16\ncircom stark_verify.circom --r1cs\n\n# check that the circuit is correct:\nshasum -a 256 stark_verify.r1cs # output should be 84d3c34b7c0eb55ad1b16b24f75e0b9de307f7b74089ea4a20a998390ee24178\n```\n\n4. Download phase 1 and phase 2 trusted setup files, verify their correctness:\n```\nwget https://storage.googleapis.com/zkevm/ptau/powersOfTau28_hez_final_23.ptau\nwget https://risc0-artifacts.s3.us-west-2.amazonaws.com/tsc/2024-04-04/stark_verify_final.zkey\n\nexport NODE_OPTIONS=\"--max-old-space-size=32768\" # without this snarkjs runs out of mem\nsnarkjs zkey verify stark_verify.r1cs powersOfTau28_hez_final_23.ptau stark_verify_final.zkey\n```\n\n5. Export the solidity verifier. Check it manually against the deployed smart contract: `snarkjs zkey export solidityverifier stark_verify_final.zkey verifier.sol`.\n\n6. Check out to the `v2.1.0` tag of risc0 repo: `git checkout v2.1.0`, commit hash should be `0f60032dce731863eba197c8494bdf455445c4af`. \nFrom the risc0 repo root dir, call `RUST_LOG=info cargo xtask bootstrap`. \nIt will output computed `allowed_control_root` and `bn254_identity_control_id` that could be compared with the contract constructor values: `0x884389273e128b32475b334dec75ee619b77cb33d41c332021fe7e44c746ee60` and `0x04446e66d300eb7fb45c9726bb53c793dda407a62e9601618bb43c5c14657ac0`. Note that the bytes of `bn254_identity_control_id` will be output in the reversed order.",
"description": "Custom verifier ID: SHA256 hash of the following values abi packed together: the bytes32 value of internal pure function verifier_key_digest() of the RiscZeroGroth16Verifier.sol, bytes32 value of `control_root` and bytes32 value of `bn254_control_id` of contract constructor values."
}
]
}
roninnetwork+135-93
display+7-12
{
"badges": [
{
"id": "EVM",
"type": "VM",
"name": "EVM",
"description": "This project uses the Ethereum Virtual Machine to run its smart contracts and supports the Solidity programming language",
"action": {
"type": "scalingFilter",
"id": "vm",
"value": "EVM"
}
},
{
"id": "EigenDA",
"id": "EigenDAVerifier",
"type": "DA",
"name": "EigenDA",
"description": "This project is posting its data to EigenDA",
"name": "EigenDA with DA Verifier",
"description": "This project uses EigenDA and integrates the DACert Verifier to validate DA commitments.",
"action": {
"type": "publicDaHighlight",
"slug": "eigenda"
"slug": "eigendaverifier"
}
},
{
"id": "OPStack",
"id": "OPKailua",
"type": "Stack",
"name": "Built on OP Stack",
"description": "The project is built on the OP Stack",
"action": {
"type": "scalingFilter",
"id": "stack",
"value": "OP Stack"
}
"name": "Built on the OP Kailua stack",
"description": "The project is built on the OP Kailua stack"
},
{
"id": "MigratedFromL1",
"type": "Other",
"name": "Migrated from L1 to Ethereum L2",
"description": "This project has migrated from being a standalone L1 blockchain to an Ethereum L2",
"action": {
"type": "scalingFilter",
"id": "other",
"value": "Migrated from L1 to Ethereum L2"
}
},
{
"id": "Conduit",
"type": "RaaS",
"name": "Conduit",
"description": "This project was deployed via the rollup-as-a-service provider Conduit",
"action": {
"type": "scalingFilter",
"id": "raas",
"value": "Conduit"
}
}
],
"description": "Ronin is an Ethereum Optimium based on the OP Stack, optimized for gaming and NFT applications. It migrated from an independent sidechain to a Layer 2 in May 2026, using EigenDA for data availability and keeping RON as the custom gas token.",
"links": {
"websites": [
"https://roninchain.com/"
],
"bridges": [
"https://app.roninchain.com/bridge"
],
"documentation": [
"https://docs.roninchain.com/"
],
"repositories": [
"https://github.com/ronin-chain/ronin",
"https://github.com/axieinfinity"
],
"explorers": [
"https://app.roninchain.com/explorer"
],
"socialMedia": [
"https://twitter.com/Ronin_Network",
"https://discord.gg/roninnetwork",
"https://blog.roninchain.com/"
]
}
}
scalingInfo+6-13
{
"capability": "universal",
"daLayer": [
"EigenDA"
],
"hostChain": {
"id": "ethereum",
"slug": "ethereum",
"name": "Ethereum"
},
"layer": "layer2",
"proofSystem": {
"type": "Optimistic",
"name": "OPFP",
"challengeProtocol": "Interactive"
},
"purposes": [
"Universal"
],
"raas": "Conduit",
"reasonsForBeingOther": [
{
"label": "No proofs",
"shortDescription": "The proof system isn't fully functional",
"description": "Projects without a proper proof system fully rely on single entities to safely update the state. A malicious proposer can finalize an invalid state, which can cause loss of funds."
},
{
"label": "No DA bridge",
"shortDescription": "There is no data availability bridge",
"description": "Projects without a data availability bridge fully rely on single entities (the sequencer) to honestly rely available data roots on Ethereum. A malicious sequencer can collude with the proposer to finalize an unavailable state, which can cause loss of funds."
}
],
"stacks": [
"OP Stack"
],
"stage": "Stage 0",
"type": "Other",
"type": "Optimium",
"vm": [
"EVM"
]
}
scalingStage+4-4
{
"missing": {
"nextStage": "Stage 1",
"requirements": [
"Users' withdrawals can be censored by the permissioned operators.",
"Upgrades executed by actors with more centralized control than a Security Council provide less than 7d for users to exit if the permissioned operator is down or censoring.",
"The Security Council is not properly set up.",
"No secure onchain DA verifier is integrated on L1, so DA attestations cannot be independently verified by challengers.",
"The DA verifier is upgradeable with less than 7d independent exit window.",
"The DA layer does not meet minimum decentralization requirements (DAC <5 external members, or no attestation verifier for an external DA chain)."
],
"principle": "Compromising ≥75% of the Security Council to push a malicious upgrade, or sequencer+DA-committee collusion to withhold data and finalize invalid state roots, should be the only ways (other than bugs) to steal funds or block withdrawals indefinitely."
},
"stage": "Stage 0",
"summary": [
{
"stage": "Stage 0",
"requirements": [
{
"satisfied": true,
"description": "The project self-identifies as a Validium or Optimium."
},
{
"satisfied": true,
"description": "State roots are posted to Ethereum L1."
},
{
"satisfied": true,
"description": "A complete and functional proof system (fraud or validity proofs) is deployed."
},
{
"satisfied": false,
"description": "DA is attested solely by the sequencer, which can withhold data unilaterally."
"satisfied": true,
"description": "DA is attested by a committee or external DA layer, not solely by the sequencer."
},
{
"satisfied": true,
"description": "A source-available node exists that can reconstruct the L2 state when DA is accessible. Please note that the L2BEAT team has not verified the validity of the node source code. [View code](https://github.com/conduitxyz/ronin-migration-reth-docker)"
},
{
"satisfied": false,
"description": "Fraud proof submission is not sufficiently decentralized."
"satisfied": true,
"description": "There are at least 5 external actors who can submit fraud proofs."
}
]
},
{
"stage": "Stage 1",
"requirements": [
{
"satisfied": false,
"description": "Users' withdrawals can be censored by the permissioned operators."
},
{
"satisfied": false,
"description": "Upgrades executed by actors with more centralized control than a Security Council provide less than 7d for users to exit if the permissioned operator is down or censoring."
},
{
"satisfied": false,
"description": "The Security Council is not properly set up."
},
{
"satisfied": false,
"description": "No secure onchain DA verifier is integrated on L1, so DA attestations cannot be independently verified by challengers."
},
{
"satisfied": false,
"description": "The DA verifier is upgradeable with less than 7d independent exit window."
},
{
"satisfied": false,
"description": "The DA layer does not meet minimum decentralization requirements (DAC <5 external members, or no attestation verifier for an external DA chain)."
}
],
"principle": {
"satisfied": false,
"description": "Compromising ≥75% of the Security Council to push a malicious upgrade, or sequencer+DA-committee collusion to withhold data and finalize invalid state roots, should be the only ways (other than bugs) to steal funds or block withdrawals indefinitely."
}
},
{
"stage": "Stage 2",
"requirements": [
{
"satisfied": false,
"description": "Fraud proof submission is open only to whitelisted actors."
},
{
"satisfied": false,
"description": "Upgrades unrelated to onchain provable bugs, including upgrades to the DA verifier, provide less than 30d to exit."
},
{
"satisfied": false,
"description": "The Security Council's actions are not confined to onchain provable bugs."
},
{
"satisfied": false,
"description": "The DA verifier (and related contracts) is upgradeable with less than 30d independent exit window."
},
{
"satisfied": false,
"description": "The DA mechanism relies on reputational security alone; no staked assets are at risk for DA misbehavior or slashable < TVS."
}
]
}
]
}
scalingRisks+15-15
{
"self": {
"stateValidation": {
"value": "Fraud proofs (INT)",
"description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. Only one entity is currently allowed to propose and submit challenges, as only permissioned games are currently allowed.",
"executionDelay": 302400,
"challengeDelay": 302400,
"sentiment": "bad",
"value": "Fraud proofs (1R, ZK)",
"description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Single round proofs (1R) prove the validity of a state proposal, only requiring a single transaction to resolve. A fault proof eliminates a state proposal by proving that any intermediate state transition in the proposal results in a different state root. For either, a ZK proof is used.",
"sentiment": "good",
"orderHint": null,
"executionDelay": 302400,
"challengeDelay": 259200,
"initialBond": {
"value": "0.0"
"value": "0.5"
},
"permissioned": true,
"defenderAdvantage": "not-applicable",
"secondLine": "3d 12h challenge period\n+ 3d 12h execution delay"
"permissioned": false,
"defenderAdvantage": "not-assessed",
"secondLine": "3d challenge period\n+ 3d 12h execution delay"
},
"exitWindow": {
"value": "None",
"description": "There is no window for users to exit in case of an unwanted upgrade since contracts are instantly upgradable.",
"sentiment": "bad",
"orderHint": -604800
},
"proposerFailure": {
"value": "Cannot withdraw",
"description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen.",
"sentiment": "bad",
"orderHint": null
"value": "Self propose",
"description": "The primary whitelisted proposer has an optimistic advantage, letting them win by default if no conflicting proposals are made. This privilege is dropped after 1mo of inactivity, and anyone can leverage the source available zk prover to prove a fault or a conflicting valid proposal to win against the privileged proposer and/or supply a bond and make a counter proposal at any time.",
"sentiment": "good",
"orderHint": 2592000
},
"dataAvailability": {
"value": "External",
"description": "Proof construction and state derivation fully rely on data that is posted on EigenDA. The sequencer is publishing data to EigenDA v2. Sequencer transaction data roots are not checked against the DACert Verifier onchain.",
"sentiment": "bad"
"description": "Proof construction and state derivation fully rely on data that is posted on EigenDA. The sequencer is publishing data to EigenDA v2. Sequencer transaction data roots are checked against the DACert Verifier data roots, signed off by EigenDA operators.",
"sentiment": "warning"
},
"sequencerFailure": {
"value": "Self sequence",
"description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There can be up to a 12h delay on this operation.",
"sentiment": "good",
"orderHint": 43200,
"secondLine": "12h delay"
}
}
}
scalingDa+4-4
[
{
"layer": {
"value": "EigenDA",
"sentiment": "warning",
"description": "The data is posted to EigenDA which is a separate data availability layer developed by the Eigenlayer team. Only commitments to the data are published on an onchain inbox.",
"projectId": "eigenda"
},
"bridge": {
"value": "None",
"sentiment": "bad",
"description": "There is no bridge that can attest if the data has been made available.",
"orderHint": -2
"value": "DACert Verifier",
"sentiment": "warning",
"description": "EigenDA V3 certificates are verified by the proof system through the DACert Verifier contract, which validates certificates against operator signatures and stake thresholds.",
"projectId": "eigenda-v2"
},
"mode": {
"value": "Transaction data",
"secondLine": "Compressed"
}
}
]
scalingTechnology+52-33
{
"architectureImage": "opstack-optimium-superchain-opfp",
"architectureImage": "opstack-optimium-superchain-opfp-kailua",
"dataAvailability": [
{
"name": "Data is posted to EigenDA",
"description": "Transactions roots are posted onchain and the full data is posted on EigenDA. The sequencer is publishing data to EigenDA v2. Since the DACert Verifier is not used, availability of the data is not verified against EigenDA operators, meaning that the Sequencer can single-handedly publish unavailable commitments.",
"description": "Transactions roots are posted onchain and the full data is posted on EigenDA. The sequencer is publishing data to EigenDA v2. The DACert Verifier is used to verify attestations from the EigenDA operator set that the data is indeed available.",
"risks": [
{
"category": "Funds can be lost if",
"text": "the sequencer posts an unavailable transaction root.",
"isCritical": true
},
{
"category": "Funds can be lost if",
"text": "the data is not available on the external provider.",
"isCritical": true
}
],
"references": [
{
"title": "EigenDA Docs - Overview",
"url": "https://docs.eigenda.xyz/overview"
},
{
"title": "Derivation: Batch submission - OP Mainnet specs",
"url": "https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/derivation.md#batch-submission"
},
{
"title": "BatchInbox - address",
"url": "https://etherscan.io/address/0x003A7A2d3129838Adb01c8d9b7DA62Ac6Ec27961#code"
},
{
"title": "OptimismPortal2.sol - source code, depositTransaction function",
"url": "https://etherscan.io/address/0x97cEbbf8959e2A5476fbe9B98A21806Ec234609B#code"
}
]
}
],
"exitMechanisms": [
{
"name": "Regular exits",
"description": "The user initiates the withdrawal by submitting a regular transaction on this chain. When a state root containing such transaction is settled, the funds become available for withdrawal on L1 after 3d 12h. Withdrawal inclusion can be proven before state root settlement, but a 7d period has to pass before it becomes actionable. The process of state root settlement takes a challenge period of at least 3d 12h to complete. Finally the user submits an L1 transaction to claim the funds. This transaction requires a merkle proof.",
"description": "The user initiates the withdrawal by submitting a regular transaction on this chain. When a state root containing such transaction is settled, the funds become available for withdrawal on L1 after 3d 12h. Withdrawal inclusion can be proven before state root settlement, but a 7d period has to pass before it becomes actionable. The process of state root settlement takes a challenge period of at least 3d to complete. Finally the user submits an L1 transaction to claim the funds. This transaction requires a merkle proof.",
"risks": [],
"references": [
{
"title": "OptimismPortal2.sol - Etherscan source code, proveWithdrawalTransaction function",
"url": "https://etherscan.io/address/0x97cEbbf8959e2A5476fbe9B98A21806Ec234609B#code"
},
{
"title": "OptimismPortal2.sol - Etherscan source code, finalizeWithdrawalTransaction function",
"url": "https://etherscan.io/address/0x97cEbbf8959e2A5476fbe9B98A21806Ec234609B#code"
}
]
},
{
"name": "Forced messaging",
"description": "If the user experiences censorship from the operator with regular L2->L1 messaging they can submit their messages directly on L1. The system is then obliged to service this request or halt all messages, including forced withdrawals from L1 and regular messages initiated on L2. Once the force operation is submitted and if the request is serviced, the operation follows the flow of a regular message.",
"risks": [],
"references": [
{
"title": "Forced withdrawal from an OP Stack blockchain",
"url": "https://docs.optimism.io/stack/transactions/forced-transaction"
}
]
}
],
"forceTransactions": {
"name": "Users can force any transaction",
"description": "Because the state of the system is based on transactions submitted on the underlying host chain and anyone can submit their transactions there it allows the users to circumvent censorship by interacting with the smart contract on the host chain directly.",
"risks": [],
"references": [
{
"title": "Sequencing Window - OP Mainnet Specs",
"url": "https://github.com/ethereum-optimism/optimism/blob/51eeb76efeb32b3df3e978f311188aa29f5e3e94/specs/glossary.md#sequencing-window"
},
{
"title": "OptimismPortal2.sol - source code, depositTransaction function",
"url": "https://etherscan.io/address/0x97cEbbf8959e2A5476fbe9B98A21806Ec234609B#code"
}
]
},
"operator": {
"name": "The system has a centralized operator",
"description": "The operator is the only entity that can propose blocks. A live and trustworthy operator is vital to the health of the system.",
"risks": [
{
"category": "MEV can be extracted if",
"text": "the operator exploits their centralized position and frontruns user transactions."
}
],
"references": []
},
"otherConsiderations": [
{
"name": "EVM compatible smart contracts are supported",
"description": "OP stack chains are pursuing the EVM Equivalence model. No changes to smart contracts are required regardless of the language they are written in, i.e. anything deployed on L1 can be deployed on L2.",
"risks": [],
"references": [
{
"title": "Introducing EVM Equivalence",
"url": "https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306"
}
]
},
{
"name": "External bridge architecture",
"description": "The May 2026 L2 migration deployed the OP Stack canonical bridge (OptimismPortal2 and L1StandardBridge) but did not migrate user funds into it; it is currently empty. User assets are custodied on two separate L1 paths, neither of which is the canonical bridge analyzed on this page: (1) Chainlink CCIP TokenPools, the active bridge since April 2025, securing 12 tokens including AXS, USDC, WETH, WBTC (new contract), YGG, PIXEL and SLP via Chainlink DON attestations and the Risk Management Network; (2) the legacy MainchainGateway, deprecated in April 2025 but still holding residual balances (legacy WBTC, ETH backing of legacy WETH, dust), withdrawable through the Ronin BridgeOperator stake-weighted multisig. Sky Mavis has not announced a plan to migrate liquidity into the OP Stack bridge.",
"risks": [],
"references": [
{
"title": "MainchainGateway - Etherscan",
"url": "https://etherscan.io/address/0x64192819Ac13Ef72bF6b5AE239AC672B43a9AF08"
},
{
"title": "Ronin Bridge to Chainlink CCIP migration - Ronin Blog",
"url": "https://blog.roninchain.com/p/the-ronin-bridge-chainlink-ccip-migration"
}
]
},
{
"name": "Proof system cannot execute for this chain",
"description": "The dispute games on this chain commit to the op-program v1.3.1 prestate (0x038512e0…6764d54c). That binary embeds the superchain-registry snapshot at commit 42bd03ba8313 (2024-08-21), which lists 17 chain IDs and does not include Ronin (chainId 2020). If a dispute game were stepped through to the VM, op-program's RollupConfigByChainID(2020) would not find a rollup config and would panic, producing an invalid output state — any claim (honest or fraudulent) could then be \"disproven\" against the panic. Users are not exposed today because the respected game type is PermissionedDisputeGame: only the proposer can create state proposals and only proposer/challenger can move or step. The proof system therefore reduces to an operator-attested delay timer rather than an adversarial fraud-proof. Fix would require redeploying games with either an updated registry snapshot or a chain-specific prestate.",
"risks": [],
"references": [
{
"title": "absolutePrestate hash registered in superchain-registry as op-program v1.3.1",
"url": "https://github.com/ethereum-optimism/superchain-registry/blob/main/validation/standard/standard-prestates.toml"
},
{
"title": "op-program v1.3.1 release (commit e3c2f04, 2024-08-23)",
"url": "https://github.com/ethereum-optimism/optimism/releases/tag/op-program%2Fv1.3.1"
},
{
"title": "superchain-registry snapshot pinned at op-program v1.3.1 build (42bd03ba8313)",
"url": "https://github.com/ethereum-optimism/superchain-registry/blob/42bd03ba8313/chainList.json"
}
]
}
],
"stateValidation": {
"description": "Updates to the system state can be proposed and challenged by permissioned operators only. If a state root passes the challenge period, it is optimistically considered correct and made actionable for withdrawals.",
"categories": [
{
"title": "State root proposals",
"description": "Proposers submit state roots as children of the latest confirmed state root (called anchor state), by calling the `create` function in the DisputeGameFactory. A state root can have multiple conflicting children. Each proposal requires a stake, currently set to 0.0 ETH, that can be slashed if the proposal is proven incorrect via a fraud proof. Stakes can be withdrawn only after the proposal has been confirmed. A state root gets confirmed if the challenge period has passed and it is not countered.",
"description": "Proposers submit state roots as children of any (possibly unresolved) previous state root proposal, by calling the `propose()` function in the KailuaTreasury. A parent state root can have multiple conflicting children, composing a tournament. Each proposer requires to lock a bond, currently set to 0.5 ETH, that can be slashed if any proposal made by them is proven incorrect via a fault proof or a conflicting validity proof. The bond can be withdrawn once the proposer has no more pending proposals that need to be resolved and was not eliminated.\n\nProposals consist of a state root and a reference to their parent and implicitly challenge any sibling proposals who have the same parent. A proposal asserts that the proposed state root constitutes a valid state transition from the parent's state root. To offer efficient zk fault proofs, each proposal must include 3600 intermediate state commitments, each spanning 6 L2 blocks. \n\nProposals target sequential tournament epochs of currently 3600 * 6 L2 blocks. A tournament with a resolved parent tournament, a single child- and no conflicting sibling proposals can be resolved after 3d. \n\nThe **Vanguard** is a privileged actor who can always make the first child proposal on a parent state root. They can, in the worst case, delay each tournament for up to 1mo by not making this first proposal. Sibling proposals made after the Vanguard's initial one or after the 1mo vanguardAdvantage in each tournament are permissionless.",
"references": [
{
"title": "OP stack specification: Fault Dispute Game",
"url": "https://specs.optimism.io/fault-proof/stage-one/fault-dispute-game.html#fault-dispute-game"
"title": "Sequencing - Kailua Docs",
"url": "https://boundless-xyz.github.io/kailua/design.html#sequencing"
},
{
"title": "Vanguard - Kailua Docs",
"url": "https://boundless-xyz.github.io/kailua/parameters.html#vanguard-advantage"
}
],
"risks": [
{
"category": "Funds can be stolen if",
"text": "no whitelisted challenger disputes an invalid state root before the challenge window expires.",
"isCritical": true
"category": "Funds can be frozen if",
"text": "the vanguard exploits their vanguard advantage (1mo), halting the chain until they propose."
}
]
},
{
"title": "Challenges",
"description": "Challenges are opened to disprove invalid state roots using bisection games. Each bisection move requires a stake that increases expontentially with the depth of the bisection, with a factor of 1.09493. The maximum depth is 73, and reaching it therefore requires a cumulative stake of 0.00 ETH from depth 0. Actors can participate in any challenge by calling the `defend` or `attack` functions, depending whether they agree or disagree with the latest claim and want to move the bisection game forward. Actors that disagree with the top-level claim are called challengers, and actors that agree are called defenders. Each actor might be involved in multiple (sub-)challenges at the same time, meaning that the protocol operates with [full concurrency](https://medium.com/l2beat/fraud-proof-wars-b0cb4d0f452a). Challengers and defenders alternate in the bisection game, and they pass each other a clock that starts with 3d 12h. If a clock expires, the claim is considered defeated if it was countered, or it gets confirmed if uncountered. Since honest parties can inherit clocks from malicious parties that play both as challengers and defenders (see [freeloader claims](https://specs.optimism.io/fault-proof/stage-one/fault-dispute-game.html#freeloader-claims)), if a clock gets inherited with less than 3h, it generally gets extended by 3h with the exception of 6h right before depth 30, and 1d right before the last depth. The maximum clock extension that a top level claim can get is therefore 10d. Since unconfirmed state roots are independent of one another, users can decide to exit with a subsequent confirmed state root if the previous one is delayed. Winners get the entire losers' stake, meaning that sybils can potentially play against each other at no cost. The final instruction found via the bisection game is then executed onchain in the MIPS one step prover contract who determines the winner. The protocol does not enforce valid bisections, meaning that actors can propose correct initial claims and then provide incorrect midpoints. The protocol can be subject to resource exhaustion attacks ([Spearbit 5.1.3](https://github.com/ethereum-optimism/optimism/blob/develop/docs/security-reviews/2024_08_Fault-Proofs-No-MIPS_Spearbit.pdf)).",
"description": "Any conflicting sibling proposals within a tournament that are made within the 3d challenge period of a proposal they are challenging, delay resolving the tournament until sufficient ZK proofs are published to leave one single tournament survivor.\n\nIn the tree of proposed state roots, each parent node can have multiple children. These children are indirectly challenging each other in a tournament, which can only be resolved if but a single child survives. A state root can be resolved if it is **the only remaining proposal** due to any combination of the following elimination methods:\n1. the proposal's challenge period of 3d has ended before a conflicting proposal was made\n2. the proposal is proven correct with a full validity proof (invalidates all conflicting proposals)\n3. a conflicting sibling proposal is proven faulty\n\nProving any of the 3600 intermediate state commitments in a proposal faulty invalidates the entire proposal. Proving a proposal valid invalidates all conflicting siblings. Pruning of a tournament's children happens strictly chronologically, which guarantees that the first faulty proposal of a given proposer is always pruned first. When pruned, an invalid proposal leads to the elimination of its proposer, which invalidates all their subsequent proposals, slashes their bond, and disallows future proposals by the same address. A slashed bond is transferred to an address chosen by the prover who caused the slashing.\n\nA single remaining child in a tournament can be 'resolved' and will be finalized and usable for withdrawals after an execution delay of 3d 12h (time for the Guardian to manually blacklist malicious state roots).",
"references": [
{
"title": "Fraud Proof Wars: OPFP",
"url": "https://medium.com/l2beat/fraud-proof-wars-b0cb4d0f452a"
"url": "https://boundless-xyz.github.io/kailua/operate.html",
"title": "How to run a challenger - Boundless Docs"
},
{
"url": "https://boundless-xyz.github.io/kailua/dispute.html",
"title": "Disputes - Kailua Book"
}
]
},
{
"title": "Validity proofs",
"description": "Validity proofs and fault proofs both must be accompanied by a ZK proof that ensures that the new state was derived by correctly applying a series of valid user transactions to the previous state. These proofs are then verified on Ethereum by a smart contract.\n\nThe Kailua state validation system is primarily optimistically resolved, so no validity proofs are required in the happy case. But two different zk proofs on unresolved state roots are possible and permissionless: The proveValidity() function proves a state root proposal's full validity, automatically invalidating all conflicting sibling proposals. proveOutputFault() allows any actor to eliminate a state root proposal for which they can prove that any of the 3600 intermediate state transitions in the proposal are not correct. Both are zk proofs of validity, although one is used as an efficient fault proof to invalidate a single conflicting state transition.",
"references": [
{
"url": "https://boundless-xyz.github.io/kailua/introduction.html",
"title": "Kailua Proof System - Boundless Docs"
},
{
"url": "https://github.com/risc0/risc0-ethereum/blob/main/contracts/version-management-design.md",
"title": "Verifier upgrade and deprecation - Kailua Docs"
}
],
"risks": [
{
"category": "Funds can be stolen if",
"text": "the validity proof cryptography is broken or implemented incorrectly."
},
{
"category": "Funds can be stolen if",
"text": "no challenger checks the published state."
},
{
"category": "Funds can be stolen if",
"text": "the proposer routes proof verification through a malicious or faulty verifier by specifying an unsafe route selector."
},
{
"category": "Funds can be frozen if",
"text": "a verifier needed for a given proof is paused by its permissioned owner."
}
]
}
]
},
"stateValidationImage": "opfp"
"stateValidationImage": "kailua"
}
permissions+1-1
{
"ethereum": {
"roles": [],
"actors": [
{
"id": "RoninConduitOwner",
"name": "RoninConduitOwner",
"description": "A Multisig with 5/6 threshold. \n5-of-6 joint Ronin/Conduit Safe.\n* Can upgrade **with no delay**\n * AnchorStateRegistry [via: ProxyAdmin]\n * L1ERC721Bridge [via: ProxyAdmin]\n * DisputeGameFactory [via: ProxyAdmin]\n * OptimismMintableERC20Factory [via: ProxyAdmin]\n * OptimismPortal2 [via: ProxyAdmin]\n * DelayedWETH [via: ProxyAdmin]\n * KailuaVerifier \n * L1StandardBridge [via: ProxyAdmin]\n * SystemConfig [via: ProxyAdmin]\n * SuperchainConfig [via: ProxyAdmin]\n * L1CrossDomainMessenger [via: ProxyAdmin]\n* Can interact with AddressManager\n * set and change address mappings [via: ProxyAdmin]\n* Can interact with SystemConfig\n * it can update the preconfer address, the batch submitter (Sequencer) address and the gas configuration of the system \n* Can interact with SuperchainConfig\n * Allowed to pause withdrawals. In op stack systems with a proof system, the Guardian can also blacklist dispute games and set the respected game type (permissioned / permissionless) ",
"accounts": [
{
"address": "eth:0xE9Ad9723C24d946958f9FD3Bc861BbF983525607",
"type": "Contract",
"isVerified": true,
"name": "0xE9Ad…5607",
"url": "https://etherscan.io/address/0xE9Ad9723C24d946958f9FD3Bc861BbF983525607"
}
],
"chain": "ethereum",
"references": [],
"participants": [
{
"address": "eth:0xea42A416fdDFA91C69C879A7EdA3923394783B28",
"type": "EOA",
"isVerified": true,
"name": "0xea42…3B28",
"url": "https://etherscan.io/address/0xea42A416fdDFA91C69C879A7EdA3923394783B28"
},
{
"address": "eth:0xaa6a1e7C2979F1D49d97F7f6E5F7B7c25d2f85c2",
"type": "EOA",
"isVerified": true,
"name": "0xaa6a…85c2",
"url": "https://etherscan.io/address/0xaa6a1e7C2979F1D49d97F7f6E5F7B7c25d2f85c2"
},
{
"address": "eth:0x8e0759dCEDbA69Ce4D1528395F13a13a25252070",
"type": "EOA",
"isVerified": true,
"name": "0x8e07…2070",
"url": "https://etherscan.io/address/0x8e0759dCEDbA69Ce4D1528395F13a13a25252070"
},
{
"address": "eth:0x8f9C82DD023D692cB74bF7d3d9436C9f5c2A3552",
"type": "EOA",
"isVerified": true,
"name": "0x8f9C…3552",
"url": "https://etherscan.io/address/0x8f9C82DD023D692cB74bF7d3d9436C9f5c2A3552"
},
{
"address": "eth:0x81175155D85377C337d92f1FA52Da166C3A4E7Ac",
"type": "EOA",
"isVerified": true,
"name": "0x8117…E7Ac",
"url": "https://etherscan.io/address/0x81175155D85377C337d92f1FA52Da166C3A4E7Ac"
},
{
"address": "eth:0x6BB4249858Ee19b6ABC071AD26bEe690baa783A6",
"type": "EOA",
"isVerified": true,
"name": "0x6BB4…83A6",
"url": "https://etherscan.io/address/0x6BB4249858Ee19b6ABC071AD26bEe690baa783A6"
}
],
"discoveryDrivenData": true
},
{
"id": "Conduit Multisig 1",
"name": "Conduit Multisig 1",
"description": "A Multisig with 4/10 threshold. \n* Can interact with DisputeGameFactory\n * Allowed to challenge or delete state roots proposed by a Proposer ",
"accounts": [
{
"address": "eth:0x4a4962275DF8C60a80d3a25faEc5AA7De116A746",
"type": "Contract",
"isVerified": true,
"name": "0x4a49…A746",
"url": "https://etherscan.io/address/0x4a4962275DF8C60a80d3a25faEc5AA7De116A746"
}
],
"chain": "ethereum",
"references": [],
"participants": [
{
"address": "eth:0xcdC931935768c0562AfE989A366a3Dc4d52F4853",
"type": "EOA",
"isVerified": true,
"name": "0xcdC9…4853",
"url": "https://etherscan.io/address/0xcdC931935768c0562AfE989A366a3Dc4d52F4853"
},
{
"address": "eth:0xA9FCCc53F1c9095DA867Bd648683F8bdCcc78d09",
"type": "EOA",
"isVerified": true,
"name": "0xA9FC…8d09",
"url": "https://etherscan.io/address/0xA9FCCc53F1c9095DA867Bd648683F8bdCcc78d09"
},
{
"address": "eth:0x6BB4249858Ee19b6ABC071AD26bEe690baa783A6",
"type": "EOA",
"isVerified": true,
"name": "0x6BB4…83A6",
"url": "https://etherscan.io/address/0x6BB4249858Ee19b6ABC071AD26bEe690baa783A6"
},
{
"address": "eth:0x2103c69696CB2D3779f5445393808239034E911c",
"type": "EOA",
"isVerified": true,
"name": "0x2103…911c",
"url": "https://etherscan.io/address/0x2103c69696CB2D3779f5445393808239034E911c"
},
{
"address": "eth:0x81175155D85377C337d92f1FA52Da166C3A4E7Ac",
"type": "EOA",
"isVerified": true,
"name": "0x8117…E7Ac",
"url": "https://etherscan.io/address/0x81175155D85377C337d92f1FA52Da166C3A4E7Ac"
},
{
"address": "eth:0xA0737fea60F0601A192E3d2c98865A883ab0bda2",
"type": "EOA",
"isVerified": true,
"name": "0xA073…bda2",
"url": "https://etherscan.io/address/0xA0737fea60F0601A192E3d2c98865A883ab0bda2"
},
{
"address": "eth:0xF3313C48BD8E17b823d5498D62F37019dFEA647D",
"type": "EOA",
"isVerified": true,
"name": "0xF331…647D",
"url": "https://etherscan.io/address/0xF3313C48BD8E17b823d5498D62F37019dFEA647D"
},
{
"address": "eth:0xa0C600a6e85bf225958FFAcC70B5FDDF9A059038",
"type": "EOA",
"isVerified": true,
"name": "0xa0C6…9038",
"url": "https://etherscan.io/address/0xa0C600a6e85bf225958FFAcC70B5FDDF9A059038"
},
{
"address": "eth:0xefCf0c8faFB425997870f845e26fC6cA6EE6dD5C",
"type": "EOA",
"isVerified": true,
"name": "0xefCf…dD5C",
"url": "https://etherscan.io/address/0xefCf0c8faFB425997870f845e26fC6cA6EE6dD5C"
},
{
"address": "eth:0x4D8007a0E9f293e62E2b0F43C6Cf4C4B9e135BAe",
"type": "EOA",
"isVerified": true,
"name": "0x4D80…5BAe",
"url": "https://etherscan.io/address/0x4D8007a0E9f293e62E2b0F43C6Cf4C4B9e135BAe"
}
],
"discoveryDrivenData": true
},
{
"id": "MainchainBridgeManager",
"name": "MainchainBridgeManager",
"accounts": [
{
"address": "eth:0x2Cf3CFb17774Ce0CFa34bB3f3761904e7fc3FaDB",
"type": "Contract",
"isVerified": true,
"name": "0x2Cf3…FaDB",
"url": "https://etherscan.io/address/0x2Cf3CFb17774Ce0CFa34bB3f3761904e7fc3FaDB"
}
],
"chain": "ethereum",
"description": "Governance and proxy-admin contract for the legacy MainchainGateway bridge. Holds the operator/governor set, tallies stake-weighted votes for bridge proposals (operator rotations, threshold changes, withdrawals).\n* Can upgrade **with no delay**\n * MainchainGateway ",
"discoveryDrivenData": true
},
{
"id": "Safe",
"name": "Safe",
"description": "A Multisig with 3/5 threshold. \n* Can interact with TimelockController\n * cancel queued transactions \n * execute transactions that are ready \n * manage all access control roles **with 3d delay** [via: TimelockController with 3d delay]\n * propose transactions \n* Can interact with RiscZeroVerifierEmergencyStop\n * pause the verifier \n* Can interact with RiscZeroVerifierEmergencyStop\n * pause the verifier \n* Can interact with RiscZeroVerifierEmergencyStop\n * pause the verifier \n* Can interact with RiscZeroVerifierRouter\n * add/remove verifiers and the selectors they are mapped to **with 3d delay** [via: TimelockController with 3d delay]\n* Can interact with RiscZeroVerifierEmergencyStop\n * pause the verifier \n* Can interact with RiscZeroVerifierEmergencyStop\n * pause the verifier ",
"accounts": [
{
"address": "eth:0x2E5bcc9959dB5F5016F830E47943b07242CB2609",
"type": "Contract",
"isVerified": true,
"name": "0x2E5b…2609",
"url": "https://etherscan.io/address/0x2E5bcc9959dB5F5016F830E47943b07242CB2609"
}
],
"chain": "ethereum",
"references": [],
"participants": [
{
"address": "eth:0x10B0589c16a8851450BD7FEE274cD349fB9d6A0E",
"type": "EOA",
"isVerified": true,
"name": "0x10B0…6A0E",
"url": "https://etherscan.io/address/0x10B0589c16a8851450BD7FEE274cD349fB9d6A0E"
},
{
"address": "eth:0x751708D6341b36c0C258754fc2DbF96074f5BdC7",
"type": "EOA",
"isVerified": true,
"name": "0x7517…BdC7",
"url": "https://etherscan.io/address/0x751708D6341b36c0C258754fc2DbF96074f5BdC7"
},
{
"address": "eth:0xbF58b6DE2B893e7ab707edc6cf99Bb6989C173a4",
"type": "EOA",
"isVerified": true,
"name": "0xbF58…73a4",
"url": "https://etherscan.io/address/0xbF58b6DE2B893e7ab707edc6cf99Bb6989C173a4"
},
{
"address": "eth:0xd5D43445d0227a47cA2eACCb9392352746eD9926",
"type": "EOA",
"isVerified": true,
"name": "0xd5D4…9926",
"url": "https://etherscan.io/address/0xd5D43445d0227a47cA2eACCb9392352746eD9926"
},
{
"address": "eth:0xDA8e7102681f9652FB8a10b70949CF7F260e0A01",
"type": "EOA",
"isVerified": true,
"name": "0xDA8e…0A01",
"url": "https://etherscan.io/address/0xDA8e7102681f9652FB8a10b70949CF7F260e0A01"
}
],
"discoveryDrivenData": true
},
{
"id": "LegacyBridgeOwner",
"name": "LegacyBridgeOwner",
"description": "A Multisig with 3/5 threshold. \n* Can upgrade **with no delay**\n * MainchainBridgeManager ",
"accounts": [
{
"address": "eth:0x51F6696Ae42C6C40CA9F5955EcA2aaaB1Cefb26e",
"type": "Contract",
"isVerified": true,
"name": "0x51F6…b26e",
"url": "https://etherscan.io/address/0x51F6696Ae42C6C40CA9F5955EcA2aaaB1Cefb26e"
}
],
"chain": "ethereum",
"references": [],
"participants": [
{
"address": "eth:0x4BFEc2a63B72c67e6c3f599fCc40E1d42AE519ff",
"type": "EOA",
"isVerified": true,
"name": "0x4BFE…19ff",
"url": "https://etherscan.io/address/0x4BFEc2a63B72c67e6c3f599fCc40E1d42AE519ff"
},
{
"address": "eth:0x0182147F7aC923BF8024C953acA2225C91206485",
"type": "EOA",
"isVerified": true,
"name": "0x0182…6485",
"url": "https://etherscan.io/address/0x0182147F7aC923BF8024C953acA2225C91206485"
},
{
"address": "eth:0xC93f43dbbf0a1346D9E0d623B68d78891b131Bf9",
"type": "EOA",
"isVerified": true,
"name": "0xC93f…1Bf9",
"url": "https://etherscan.io/address/0xC93f43dbbf0a1346D9E0d623B68d78891b131Bf9"
},
{
"address": "eth:0xFE1a01580d7Cd7EC333DDC087b2c4DE3226f6031",
"type": "EOA",
"isVerified": true,
"name": "0xFE1a…6031",
"url": "https://etherscan.io/address/0xFE1a01580d7Cd7EC333DDC087b2c4DE3226f6031"
},
{
"address": "eth:0xCfD1C43CdB2bD66c7B66a7aBe66Fb6BE497d7f86",
"type": "EOA",
"isVerified": true,
"name": "0xCfD1…7f86",
"url": "https://etherscan.io/address/0xCfD1C43CdB2bD66c7B66a7aBe66Fb6BE497d7f86"
}
],
"discoveryDrivenData": true
},
{
"id": "EOA-1",
"name": "EOA 1",
"accounts": [
{
"address": "eth:0x9aA8feACbB42659a806cDD6933ab3982586824F1",
"type": "EOA",
"isVerified": true,
"name": "0x9aA8…24F1",
"url": "https://etherscan.io/address/0x9aA8feACbB42659a806cDD6933ab3982586824F1",
"displayName": "EOA 1"
}
],
"chain": "ethereum",
"description": "* Can interact with SystemConfig\n * Allowed to commit transactions from the current layer to the host chain ",
"discoveryDrivenData": true
},
{
"id": "EOA-2",
"name": "EOA 2",
"accounts": [
{
"address": "eth:0xD379de941E78Ab394d4D4917FcCE1CC45b6cd620",
"type": "EOA",
"isVerified": true,
"name": "0xD379…d620",
"url": "https://etherscan.io/address/0xD379de941E78Ab394d4D4917FcCE1CC45b6cd620",
"displayName": "EOA 2"
}
],
"chain": "ethereum",
"description": "* Can interact with DisputeGameFactory\n * Allowed to post new state roots of the current layer to the host chain ",
"description": "* Can interact with DisputeGameFactory\n * Allowed to post new state roots of the current layer to the host chain \n* Can interact with KailuaTreasury\n * propose new state roots before anyone else, giving a first-mover advantage on the optimistic clock ",
"discoveryDrivenData": true
},
{
"id": "EOA-3",
"name": "EOA 3",
"accounts": [
{
"address": "eth:0xF616A4f81857CFEe54A4A049Ec187172574bd412",
"type": "EOA",
"isVerified": true,
"name": "0xF616…d412",
"url": "https://etherscan.io/address/0xF616A4f81857CFEe54A4A049Ec187172574bd412",
"displayName": "EOA 3"
}
],
"chain": "ethereum",
"description": "* Can interact with RiscZeroVerifierEmergencyStop\n * pause the verifier ",
"discoveryDrivenData": true
}
]
}
}
contracts+45-10
{
"addresses": {
"ethereum": [
{
"name": "RiscZeroGroth16Verifier",
"isVerified": true,
"address": "eth:0x20ff7C2Cf391a5F096A2Cc181cb41916680f8E97",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Verifier contract for RISC Zero Groth16 proofs (version 2.0.0-rc.3).\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x20ff7C2Cf391a5F096A2Cc181cb41916680f8E97#code"
},
{
"name": "RiscZeroGroth16Verifier",
"isVerified": true,
"address": "eth:0x2a098988600d87650Fb061FfAff08B97149Fa84D",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Verifier contract for RISC Zero Groth16 proofs (version 3.0.0).\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x2a098988600d87650Fb061FfAff08B97149Fa84D#code"
},
{
"name": "DisputeGameFactory",
"isVerified": true,
"address": "eth:0x45dA2CD511DA5FEAa535eBF166E628314a65843a",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0xc040F392E52Cb6970CA8E110c280fE24E07C5e2c"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0xc040F392E52Cb6970CA8E110c280fE24E07C5e2c"
]
}
],
"description": "The dispute game factory allows the creation of dispute games, used to propose state roots and eventually challenge them.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner\n * **challengerFromDGF**: Conduit Multisig 1\n * **proposerFromDGF**: EOA 2",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x45dA2CD511DA5FEAa535eBF166E628314a65843a#code"
},
{
"name": "RiscZeroGroth16Verifier",
"isVerified": true,
"address": "eth:0x54aCE3ED46529B4d4F3770C8Bad5dDC48717B9bF",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Verifier contract for RISC Zero Groth16 proofs (version 2.0.3).\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x54aCE3ED46529B4d4F3770C8Bad5dDC48717B9bF#code"
},
{
"name": "OptimismPortal2",
"isVerified": true,
"address": "eth:0x652CD53eCf9466E5Fb00D0E11d6CBf6469a56D77",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0x97cEbbf8959e2A5476fbe9B98A21806Ec234609B"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0x97cEbbf8959e2A5476fbe9B98A21806Ec234609B"
]
}
],
"description": "The OptimismPortal contract is the main entry point to deposit funds from L1 to L2. It also allows to prove and finalize withdrawals. It specifies which game type can be used for withdrawals, which currently is the PermissionedDisputeGame.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"description": "The OptimismPortal contract is the main entry point to deposit funds from L1 to L2. It also allows to prove and finalize withdrawals. It specifies which game type can be used for withdrawals, which currently is the KailuaGame.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x652CD53eCf9466E5Fb00D0E11d6CBf6469a56D77#code"
},
{
"name": "RiscZeroGroth16Verifier",
"isVerified": true,
"address": "eth:0xafB31f5b70623CDF4b20Ada3f7230916A5A79df9",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Verifier contract for RISC Zero Groth16 proofs (version 2.2.0).\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xafB31f5b70623CDF4b20Ada3f7230916A5A79df9#code"
},
{
"name": "SystemConfig",
"isVerified": true,
"address": "eth:0xc4f4F908C36C8119f1FBd52CebbDB30C6f2a23C1",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0xd392c27B84b1cA776528F2704BC67B82a62132d2"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0xd392c27B84b1cA776528F2704BC67B82a62132d2"
]
}
],
"description": "Contains configuration parameters such as the Sequencer address, gas limit on this chain and the unsafe block signer address.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner\n * **batcherHash**: EOA 1\n * **owner**: RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xc4f4F908C36C8119f1FBd52CebbDB30C6f2a23C1#code"
},
{
"name": "RiscZeroGroth16Verifier",
"isVerified": true,
"address": "eth:0xf70aBAb028Eb6F4100A24B203E113D94E87DE93C",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Verifier contract for RISC Zero Groth16 proofs. This older implementation exposes control-root and selector constants but does not expose a VERSION getter.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xf70aBAb028Eb6F4100A24B203E113D94E87DE93C#code"
},
{
"name": "SuperchainConfig",
"isVerified": true,
"address": "eth:0xEE552e802A50d855bD08E93dfcc69228FC7B9E2c",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x502e993a5aFC9fE59b00B07ee500729D71092E34"
],
"implementations": [
"eth:0xb08Cc720F511062537ca78BdB0AE691F04F5a957"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964591,
"transactionHash": "0x7188bd8c0868aa05fff966307d86c6d5b840bee115e91449bd0b9e1ad7f097ea",
"implementations": [
"eth:0xb08Cc720F511062537ca78BdB0AE691F04F5a957"
]
},
{
"timestamp": 1780988555,
"transactionHash": "0x7e9202c4d6cb60aa8f0d86f9524f58cc3b5edb505495f61503d9374e3859cdb6",
"implementations": [
"eth:0x6322C2f2D6a4305Fc033754d486A5A067Ee5F9b1"
]
},
{
"timestamp": 1780988555,
"transactionHash": "0x7e9202c4d6cb60aa8f0d86f9524f58cc3b5edb505495f61503d9374e3859cdb6",
"implementations": [
"eth:0xb08Cc720F511062537ca78BdB0AE691F04F5a957"
]
}
],
"description": "This is NOT the shared SuperchainConfig contract of the OP stack Superchain but rather a local fork. It manages pause states for each chain connected to it, as well as a global pause state for all chains. The guardian role can pause either separately, but each pause expires after 3mo 1d if left untouched.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner\n * **guardian**: RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xEE552e802A50d855bD08E93dfcc69228FC7B9E2c#code"
},
{
"name": "L1ERC721Bridge",
"isVerified": true,
"address": "eth:0x3a63087B36Ad5a2fD89C7C8517832dE067Fe4959",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0x74f1aC50EB0BE98853805D381C884f5f9abDEcf9"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0x74f1aC50EB0BE98853805D381C884f5f9abDEcf9"
]
}
],
"description": "Used to bridge ERC-721 tokens from host chain to this chain.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x3a63087B36Ad5a2fD89C7C8517832dE067Fe4959#code"
},
{
"name": "L1StandardBridge",
"isVerified": true,
"address": "eth:0x85Ce2Ccef125aa8d018c298d5eA0f2FB5E5063c1",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0x61525EaaCDdB97D9184aFc205827E6A4fd0Bf62A"
]
},
"chain": "ethereum",
"pastUpgrades": [],
"description": "The main entry point to deposit ERC20 tokens from host chain to this chain.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x85Ce2Ccef125aa8d018c298d5eA0f2FB5E5063c1#code"
},
{
"name": "L1CrossDomainMessenger",
"isVerified": true,
"address": "eth:0xF9aD628d9F907ad5d46Ab80100dacDf09EAc9A8e",
"upgradeability": {
"proxyType": "resolved delegate proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0xb686F13AfF1e427a1f993F29ab0F2E7383729FE0"
],
"immutable": false
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0xb686F13AfF1e427a1f993F29ab0F2E7383729FE0"
]
}
],
"description": "Sends messages from host chain to this chain, and relays messages back onto host chain. In the event that a message sent from host chain to this chain is rejected for exceeding this chain's epoch gas limit, it can be resubmitted via this contract's replay function.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xF9aD628d9F907ad5d46Ab80100dacDf09EAc9A8e#code"
},
{
"name": "TimelockController",
"isVerified": true,
"address": "eth:0x0b144E07A0826182B6b59788c34b32Bfa86Fb711",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A timelock with access control. The current minimum delay is 3d.\n* Roles:\n * **canceller**: Safe\n * **defaultAdmin**: TimelockController; ultimately Safe\n * **executor**: Safe\n * **proposer**: Safe",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x0b144E07A0826182B6b59788c34b32Bfa86Fb711#code"
},
{
"name": "AnchorStateRegistry",
"isVerified": true,
"address": "eth:0x0B95fF1d1B113bac3E29Ac0BBF2089126C9aE81A",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0x36398155Cd17cfe804F69b233eDDA800DD4D5aA5"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0x36398155Cd17cfe804F69b233eDDA800DD4D5aA5"
]
}
],
"description": "Contains the latest confirmed state root that can be used as a starting point in a dispute game. It specifies which game type can be used for withdrawals, which currently is the PermissionedDisputeGame.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"description": "Contains the latest confirmed state root that can be used as a starting point in a dispute game. It specifies which game type can be used for withdrawals, which currently is the KailuaGame.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x0B95fF1d1B113bac3E29Ac0BBF2089126C9aE81A#code"
},
{
"name": "RiscZeroVerifierEmergencyStop",
"isVerified": true,
"address": "eth:0x1efDd13f831ceeEa14940806705A53D3211CD698",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A verifier wrapper for the RiscZeroGroth16Verifier that allows pausing (emergency stop) the verifier by its owner.\n* Roles:\n * **owner**: Safe",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x1efDd13f831ceeEa14940806705A53D3211CD698#code"
},
{
"name": "PreimageOracle",
"isVerified": true,
"address": "eth:0x1fb8cdFc6831fc866Ed9C51aF8817Da5c287aDD3",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "The PreimageOracle contract is used to load the required data from L1 for a dispute game.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x1fb8cdFc6831fc866Ed9C51aF8817Da5c287aDD3#code"
},
{
"name": "KailuaGame",
"isVerified": true,
"address": "eth:0x296e7aD6D441b0627768bC0650179a4206479444",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Implementation of the KailuaGame with type 1337. Based on this implementation, new KailuaGames are created with every new state root proposal.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x296e7aD6D441b0627768bC0650179a4206479444#code"
},
{
"name": "RiscZeroVerifierEmergencyStop",
"isVerified": true,
"address": "eth:0x44c220f0598345195cE99AD6A57aDfFcb9Ea33e7",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A verifier wrapper for the RiscZeroGroth16Verifier that allows pausing (emergency stop) the verifier by its owner.\n* Roles:\n * **owner**: EOA 3",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x44c220f0598345195cE99AD6A57aDfFcb9Ea33e7#code"
},
{
"name": "RiscZeroSetVerifier",
"isVerified": true,
"address": "eth:0x5005aBa3DFf7C940fcc1e48DccCAD611a80eEB85",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Set verifier contract for RISC Zero proofs (version 0.9.0). It allows verifying a whole set of proofs identified with a Merkle root at once, afterwards each individual proof could be efficiently verified just by checking Merkle inclusion against the verified root.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x5005aBa3DFf7C940fcc1e48DccCAD611a80eEB85#code"
},
{
"name": "ProxyAdmin",
"isVerified": true,
"address": "eth:0x502e993a5aFC9fE59b00B07ee500729D71092E34",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "* Roles:\n * **owner**: RoninConduitOwner",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x502e993a5aFC9fE59b00B07ee500729D71092E34#code"
},
{
"name": "OptimismMintableERC20Factory",
"isVerified": true,
"address": "eth:0x51639D151456d0384285C6974e441A5D2B784B7D",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0x8ee6fB13c6c9a7e401531168E196Fbf8b05cEabB"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0x8ee6fB13c6c9a7e401531168E196Fbf8b05cEabB"
]
}
],
"description": "A helper contract that generates OptimismMintableERC20 contracts on the network it's deployed to. OptimismMintableERC20 is a standard extension of the base ERC20 token contract designed to allow the L1StandardBridge contracts to mint and burn tokens. This makes it possible to use an OptimismMintableERC20 as this chain's representation of a token on the host chain, or vice-versa.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x51639D151456d0384285C6974e441A5D2B784B7D#code"
},
{
"name": "PermissionedDisputeGame",
"isVerified": true,
"address": "eth:0x58bf355C5d4EdFc723eF89d99582ECCfd143266A",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Same as FaultDisputeGame, but only two permissioned addresses are designated as proposer and challenger.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x58bf355C5d4EdFc723eF89d99582ECCfd143266A#code"
},
{
"name": "MainchainGateway",
"isVerified": true,
"address": "eth:0x64192819Ac13Ef72bF6b5AE239AC672B43a9AF08",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x2Cf3CFb17774Ce0CFa34bB3f3761904e7fc3FaDB"
],
"implementations": [
"eth:0x5019d41B0737e39B51Fd6dA4859F3e27579E4e69"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1655883630,
"transactionHash": "0x8f2924a52e63564c9cb0b119d72dc8290daa39c59cbe02e7f1ab6b2160ac9aa4",
"implementations": [
"eth:0x2DBA725f0a3485382a7F125a31cBF4361539aF73"
]
},
{
"timestamp": 1656414982,
"transactionHash": "0xbb60c9f020bd6f9c6737b28290f75272d2090f529d8450deafdf5d675fa8bcc0",
"implementations": [
"eth:0x71356E37e0368Bd10bFDbF41dC052fE5FA24cD05"
]
},
{
"timestamp": 1681283663,
"transactionHash": "0xa090f035d1895ab7b69fc72303e122d0c565becf9c6c684ecf7257c0311233af",
"implementations": [
"eth:0xa67BA5315AF4961Eb937158032AF9300C657dAcD"
]
},
{
"timestamp": 1698119543,
"transactionHash": "0xbbbeadcbf7df225dfef18cb3add0f29cbd2e90921acb7a3851b3a250832d12fe",
"implementations": [
"eth:0x72E28A9009Ad12dE019BFF418CD210D4bbc3D403"
]
},
{
"timestamp": 1722934127,
"transactionHash": "0x855dd3b1194e3b889f4667b6a0996220e350e034d35d3eab29b4f23bc205767e",
"implementations": [
"eth:0xfc274EC92bBb1A1472884558d1B5CaaC6F8220Ee"
]
},
{
"timestamp": 1724989295,
"transactionHash": "0x167c741a87278fa0a50f0ed15e89edd1d05ed43a5808476e564347f1d34f784d",
"implementations": [
"eth:0xD6c4986bbe09f2dDb262B4611b0BA06891be605e"
]
},
{
"timestamp": 1745306903,
"transactionHash": "0x234e508f2cf87b9d204402ded64d6fa13a65ac85e77b206b0be5718b9ce2a3b5",
"implementations": [
"eth:0x450032864C52Cb9210da8e30cE97CEaC8e215953"
]
},
{
"timestamp": 1751007983,
"transactionHash": "0x4befaa551b1c1300d7476e827cf84165dcf444b2815576ea5003554bdfac1416",
"implementations": [
"eth:0x5019d41B0737e39B51Fd6dA4859F3e27579E4e69"
]
}
],
"description": "Legacy multi-sig-secured Ronin bridge contract holding the L1 side of deposits made before the April 2025 Chainlink CCIP migration. Still custodies residual user balances (ETH backing legacy WETH on Ronin, the deprecated WBTC contract, and dust). Withdrawals authorised by the Ronin BridgeOperator stake-weighted threshold via MainchainBridgeManager.\n* Roles:\n * **admin**: MainchainBridgeManager",
"upgradableBy": [
{
"name": "MainchainBridgeManager",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x64192819Ac13Ef72bF6b5AE239AC672B43a9AF08#code"
},
{
"name": "MIPS",
"isVerified": true,
"address": "eth:0x6463dEE3828677F6270d83d45408044fc5eDB908",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "The MIPS contract is used to execute the final step of the dispute game which objectively determines the winner of the dispute.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x6463dEE3828677F6270d83d45408044fc5eDB908#code"
},
{
"name": "RiscZeroVerifierEmergencyStop",
"isVerified": true,
"address": "eth:0x68dC2cB4e61774873971c499D9b239ec5Ac540E3",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A verifier wrapper for the RiscZeroGroth16Verifier that allows pausing (emergency stop) the verifier by its owner.\n* Roles:\n * **owner**: Safe",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x68dC2cB4e61774873971c499D9b239ec5Ac540E3#code"
},
{
"name": "DelayedWETH",
"isVerified": true,
"address": "eth:0x69Fcd2E75af364295EaF48Dc058338F80CFfb434",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0x33Dadc2d1aA9BB613A7AE6B28425eA00D44c6998"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0x33Dadc2d1aA9BB613A7AE6B28425eA00D44c6998"
]
}
],
"description": "Contract designed to hold the bonded ETH for each game. It is designed as a wrapper around WETH to allow an owner to function as a backstop if a game would incorrectly distribute funds.\n* Roles:\n * **admin**: ProxyAdmin; ultimately RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x69Fcd2E75af364295EaF48Dc058338F80CFfb434#code"
},
{
"name": "KailuaVerifier",
"isVerified": true,
"address": "eth:0x6b49976a7340D0A3C00d1bEBE0E36E2367D89c7C",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xE9Ad9723C24d946958f9FD3Bc861BbF983525607"
],
"implementations": [
"eth:0x7fC721ACC2183c292737C5a28Ea1B30d19f1cF29"
"eth:0xDd26da83B27987A7040caE31f2E35d9Bd6f5DE59"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1780027571,
"transactionHash": "0xa6d65a7371559f4e7ef00b5e2037850046dce7282d57f0aca5becd5fce93f995",
"implementations": [
"eth:0x7fC721ACC2183c292737C5a28Ea1B30d19f1cF29"
]
},
{
"timestamp": 1782901175,
"transactionHash": "0x07bf7a192a2ea3b5324ef5cef339715fc6b972b261463e751f39a3f7bb2ae72d",
"implementations": [
"eth:0xDd26da83B27987A7040caE31f2E35d9Bd6f5DE59"
]
}
],
"description": "Proxy in front of the Kailua proof verifier; routes verification requests to the canonical RiscZeroVerifierRouter and asserts the chain-specific rollup config and FPVM image ID.\n* Roles:\n * **admin**: RoninConduitOwner",
"upgradableBy": [
{
"name": "RoninConduitOwner",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x6b49976a7340D0A3C00d1bEBE0E36E2367D89c7C#code"
},
{
"name": "ProxyAdmin",
"isVerified": true,
"address": "eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "* Roles:\n * **owner**: RoninConduitOwner",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC#code"
},
{
"name": "RiscZeroVerifierEmergencyStop",
"isVerified": true,
"address": "eth:0x844D5f01161E3559d36f23d0Aa9E9620949aF782",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A verifier wrapper for the RiscZeroSetVerifier that allows pausing (emergency stop) the verifier by its owner.\n* Roles:\n * **owner**: Safe",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x844D5f01161E3559d36f23d0Aa9E9620949aF782#code"
},
{
"name": "RiscZeroVerifierRouter",
"isVerified": true,
"address": "eth:0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A router proxy that routes to verifiers based on selectors. The mapping can be changed by a permissioned owner (TimelockController).\n* Roles:\n * **owner**: TimelockController; ultimately Safe",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319#code"
},
{
"name": "RiscZeroVerifierEmergencyStop",
"isVerified": true,
"address": "eth:0x9F9994Eb4Cb5200198FEfb470f8b50301662e696",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A verifier wrapper for the RiscZeroGroth16Verifier that allows pausing (emergency stop) the verifier by its owner.\n* Roles:\n * **owner**: Safe",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x9F9994Eb4Cb5200198FEfb470f8b50301662e696#code"
},
{
"name": "Wrapped Ether Token",
"isVerified": true,
"address": "eth:0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2#code"
},
{
"name": "KailuaTreasury",
"isVerified": true,
"address": "eth:0xc7EaCDd1E755d2823463Abc4434CA445F752b336",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Kailua (RISC Zero ZK fault-proof) game implementation registered as game type 1337 in the DisputeGameFactory. Deployed but NOT yet active. Bonds confiscated from eliminated proposers are split 1/3 to the prover, 1/3 to the tournament winner, 1/3 burned.\n",
"description": "Kailua (RISC Zero ZK fault-proof) treasury: holds participation bonds, mints KailuaGame clones, and defines the vanguard proposer economics. Bonds confiscated from eliminated proposers are split 1/3 to the prover, 1/3 to the tournament winner, 1/3 burned.\n* Roles:\n * **vanguard**: EOA 2",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xc7EaCDd1E755d2823463Abc4434CA445F752b336#code"
},
{
"name": "RiscZeroVerifierEmergencyStop",
"isVerified": true,
"address": "eth:0xDa8f3de6fBBdb261Ac771B813a578A7aBdA6B2b1",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A verifier wrapper for the RiscZeroGroth16Verifier that allows pausing (emergency stop) the verifier by its owner.\n* Roles:\n * **owner**: Safe",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xDa8f3de6fBBdb261Ac771B813a578A7aBdA6B2b1#code"
},
{
"name": "PauseEnforcer",
"isVerified": true,
"address": "eth:0xF184a6Cd470Cac2CF5cD4fBa34e20D482D6A6062",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Immutable emergency-pause contract for the legacy MainchainGateway. Holders of the SENTRY_ROLE can flip MainchainGateway into a paused state to halt deposits and withdrawals in an emergency.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xF184a6Cd470Cac2CF5cD4fBa34e20D482D6A6062#code"
}
]
},
"escrows": [
{
"address": "0x652CD53eCf9466E5Fb00D0E11d6CBf6469a56D77",
"sinceTimestamp": 1771964639,
"tokens": [
"ETH"
],
"contract": {
"isVerified": true,
"address": "eth:0x652CD53eCf9466E5Fb00D0E11d6CBf6469a56D77",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0x97cEbbf8959e2A5476fbe9B98A21806Ec234609B"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1771964639,
"transactionHash": "0x476d87c0223e17c8e11c6f318b59f573760ecdabc7b2d2a67cd24f99178c7e18",
"implementations": [
"eth:0x97cEbbf8959e2A5476fbe9B98A21806Ec234609B"
]
}
],
"description": "Main entry point for users depositing ETH.",
"upgradableBy": [
{
"name": "ProxyAdmin",
"delay": "no"
}
],
"url": "https://etherscan.io/address/0x652CD53eCf9466E5Fb00D0E11d6CBf6469a56D77#code"
},
"chain": "ethereum",
"includeInTotal": true,
"chainId": 1
},
{
"address": "0x85Ce2Ccef125aa8d018c298d5eA0f2FB5E5063c1",
"sinceTimestamp": 1771964639,
"tokens": "*",
"contract": {
"isVerified": true,
"address": "eth:0x85Ce2Ccef125aa8d018c298d5eA0f2FB5E5063c1",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x757077Ddf12B652430DCE8fF3e4c749F5Ca861fC"
],
"implementations": [
"eth:0x61525EaaCDdB97D9184aFc205827E6A4fd0Bf62A"
]
},
"chain": "ethereum",
"pastUpgrades": [],
"description": "Main entry point for users depositing ERC20 token that do not require custom gateway.",
"upgradableBy": [
{
"name": "ProxyAdmin",
"delay": "no"
}
],
"url": "https://etherscan.io/address/0x85Ce2Ccef125aa8d018c298d5eA0f2FB5E5063c1#code"
},
"chain": "ethereum",
"includeInTotal": true,
"chainId": 1
},
{
"address": "0x64192819Ac13Ef72bF6b5AE239AC672B43a9AF08",
"sinceTimestamp": 1655883630,
"tokens": "*",
"excludedTokens": [
"AXS",
"USDC",
"WBTC",
"YGG",
"WETH"
],
"contract": {
"name": "MainchainGateway",
"isVerified": true,
"address": "eth:0x64192819Ac13Ef72bF6b5AE239AC672B43a9AF08",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x2Cf3CFb17774Ce0CFa34bB3f3761904e7fc3FaDB"
],
"implementations": [
"eth:0x5019d41B0737e39B51Fd6dA4859F3e27579E4e69"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1655883630,
"transactionHash": "0x8f2924a52e63564c9cb0b119d72dc8290daa39c59cbe02e7f1ab6b2160ac9aa4",
"implementations": [
"eth:0x2DBA725f0a3485382a7F125a31cBF4361539aF73"
]
},
{
"timestamp": 1656414982,
"transactionHash": "0xbb60c9f020bd6f9c6737b28290f75272d2090f529d8450deafdf5d675fa8bcc0",
"implementations": [
"eth:0x71356E37e0368Bd10bFDbF41dC052fE5FA24cD05"
]
},
{
"timestamp": 1681283663,
"transactionHash": "0xa090f035d1895ab7b69fc72303e122d0c565becf9c6c684ecf7257c0311233af",
"implementations": [
"eth:0xa67BA5315AF4961Eb937158032AF9300C657dAcD"
]
},
{
"timestamp": 1698119543,
"transactionHash": "0xbbbeadcbf7df225dfef18cb3add0f29cbd2e90921acb7a3851b3a250832d12fe",
"implementations": [
"eth:0x72E28A9009Ad12dE019BFF418CD210D4bbc3D403"
]
},
{
"timestamp": 1722934127,
"transactionHash": "0x855dd3b1194e3b889f4667b6a0996220e350e034d35d3eab29b4f23bc205767e",
"implementations": [
"eth:0xfc274EC92bBb1A1472884558d1B5CaaC6F8220Ee"
]
},
{
"timestamp": 1724989295,
"transactionHash": "0x167c741a87278fa0a50f0ed15e89edd1d05ed43a5808476e564347f1d34f784d",
"implementations": [
"eth:0xD6c4986bbe09f2dDb262B4611b0BA06891be605e"
]
},
{
"timestamp": 1745306903,
"transactionHash": "0x234e508f2cf87b9d204402ded64d6fa13a65ac85e77b206b0be5718b9ce2a3b5",
"implementations": [
"eth:0x450032864C52Cb9210da8e30cE97CEaC8e215953"
]
},
{
"timestamp": 1751007983,
"transactionHash": "0x4befaa551b1c1300d7476e827cf84165dcf444b2815576ea5003554bdfac1416",
"implementations": [
"eth:0x5019d41B0737e39B51Fd6dA4859F3e27579E4e69"
]
}
],
"description": "Legacy multi-sig-secured Ronin bridge (pre-CCIP). Holds residual ETH and ERC-20 deposits. Withdrawals authorised by the Ronin BridgeOperator threshold-signature set.",
"url": "https://etherscan.io/address/0x64192819Ac13Ef72bF6b5AE239AC672B43a9AF08#code"
},
"chain": "ethereum",
"includeInTotal": true,
"source": "external",
"bridgedUsing": {
"bridges": [
{
"name": "Ronin Bridge (legacy multi-sig)"
}
]
},
"chainId": 1
}
],
"programHashes": [
{
"title": "OP absolute prestate v1.3.1",
"description": "A commitment to the initial state of the OP stack fault proof program.",
"programUrl": "https://github.com/ethereum-optimism/optimism/tree/op-node/v1.3.1/op-program",
"title": "Kailua fault proof program Risc0 v3.0.5, Kailua v1.3.0 (Hokulea)",
"description": "Program that executes OP Kona client to derive blocks and generate fault or validity proofs, is a part of ZK non-interactive kailua fault proof system. This is the Hokulea variant of the Kailua guest, used by projects that post data availability to EigenDA.",
"proverSystemProject": "risc0",
"programUrl": "https://github.com/boundless-xyz/kailua/releases/tag/v1.3.0",
"verificationStatus": "successful",
"verificationSteps": "Steps are based on [this guide](https://docs.optimism.io/chain-operators/tutorials/absolute-prestate).\n\n1. Install docker [https://docs.docker.com/get-started/get-docker/](https://docs.docker.com/get-started/get-docker/) and make sure it is running.\n2. Check out the correct branch of [optimism](https://github.com/ethereum-optimism/optimism) repo: `git checkout op-program/v1.3.1` . Commit hash should be `e3c2f046c2d7103c765cbd47e949a284e511a47d`.\n3. Regenerate the absolute prestate: `make reproducible-prestate`. This script will print out the correct hash.",
"hash": "0x038512e02c4c3f7bdaec27d00edf55b7155e0905301e1a88083e4e0a6764d54c"
"verificationSteps": "Even though the program is compiled in docker for reproducibility reasons, it gives the correct image ID only on linux OS. Steps below were done on Ubuntu 22.04 OS.\n\nPrepare (see [kailua prerequisites](https://github.com/boundless-xyz/kailua?tab=readme-ov-file#prerequisites)):\n\n1. Install rust: `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`, then `. .cargo/env`.\n2. Install dependency libs `sudo apt-get install build-essential libssl-dev clang`.\n3. Install docker [https://docs.docker.com/get-started/get-docker/](https://docs.docker.com/get-started/get-docker/).\n4. Install the risc zero toolkit `curl -L https://risczero.com/install | bash`, then `rzup install`.\n5. Install just, svm and foundry.\n\nVerify:\n\n1. Checkout the correct tag in [kailua](https://github.com/boundless-xyz/kailua) repo: `git checkout v1.3.0`. Commit hash should be `a11c73fec58f55010b4c6feec0d5c73dd9346f45`.\n2. Make sure docker is running by running `docker ps`.\n3. Execute the just recipe to build the FPVM guest images: `just build-fpvm`. This produces both the Kona and Hokulea (EigenDA) guest variants.\n4. Read `KAILUA_FPVM_HOKULEA_ID` (a `[u32;8]`) from the generated `methods.rs`. Convert each `u32` to its little-endian bytes and concatenate to obtain the on-chain `FPVM_IMAGE_ID`.",
"hash": "0xd3c097dfec583bb305eefcb5dcddc313b072e372cee66e13492c37fb50e6a90b"
},
{
"title": "Set builder program",
"description": "Recursively verifies a Merkle tree of zk proofs at once, identified by a Merkle Mountain Range root.",
"programUrl": "https://github.com/risc0/risc0-ethereum/tree/v3.0.1/crates/aggregation/guest/set-builder",
"proverSystemProject": "risc0",
"verificationStatus": "successful",
"verificationSteps": "Even though the program is compiled in docker for reproducibility reasons, it gives the correct image ID only on linux OS. Steps below were done on Ubuntu 22.04 OS.\n\nPrepare:\n\n1. Install rust: `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`, then `. .cargo/env`.\n2. Install dependency libs `sudo apt-get install build-essential`.\n3. Install docker [https://docs.docker.com/get-started/get-docker/](https://docs.docker.com/get-started/get-docker/).\n4. Install the risc zero toolkit `curl -L https://risczero.com/install | bash`, then `rzup install`.\n\nVerify:\n\n1. Checkout the correct branch in [risc0-ethereum](https://github.com/risc0/risc0-ethereum/tree/main) repo: `git checkout v3.0.1` . Commit hash should be `365e7b2db4f620fa256580c27558d2623362b9ae `.\n2. Make sure docker is running by running `docker ps `.\n3. Set env var to use Risc Zero docker build: `export RISC0_USE_DOCKER=1`.\n4. From the repo root dir: `cargo risczero build --manifest-path crates/aggregation/guest/set-builder/Cargo.toml` to build elf binaries from sources. This command should output correct ImageID.",
"hash": "0x70909b25db0db00f1d4b4016aeb876f53568a3e5a8e6397cb562d79947a02cc9"
}
],
"risks": [
{
"category": "Funds can be stolen if",
"text": "a contract receives a malicious code upgrade. There is no delay on code upgrades.",
"isCritical": true
}
],
"zkVerifiers": []
"zkVerifiers": [
"eth:0xafB31f5b70623CDF4b20Ada3f7230916A5A79df9",
"eth:0x2a098988600d87650Fb061FfAff08B97149Fa84D"
]
}