244fb212 (main)
and
b246cf66 (PR)
+1 -7
+1 -7
{
"consensusAlgorithm": {
"name": "BABE/GRANDPA",
"description": "Avail uses the BABE/GRANDPA consensus algorithm. BABE is a block production mechanism that is used to create new blocks in the Avail blockchain. GRANDPA is a finality gadget that is used to finalize blocks.",
"blockTime": 20,
"consensusFinality": 60,
"unbondingPeriod": 2419200
},
"dataAvailabilitySampling": {
"erasureCodingScheme": "2D Reed-Solomon",
"erasureCodingProof": "Validity proofs"
},
"economicSecurity": {
"token": {
"symbol": "AVAIL",
"decimals": 18,
"coingeckoId": "avail"
}
},
"finality": 40,
"pruningWindow": 0,
"risks": {
"economicSecurity": {
"value": {
"value": "Staked assets",
"sentiment": "good",
"description": "There are staked assets on the DA layer that can be slashed in case of a data withholding attack. A dishonest supermajority of validators must collude to finalize a block with missing or invalid data. The invalid block would be added to the chain but rejected by honest full nodes.\n "
},
"adjustSecurityRisk": true
},
"fraudDetection": {
"value": "DAS",
"sentiment": "warning",
"description": "The DA layer uses data availability sampling (DAS) to protect against data withholding attacks. However, the block reconstruction protocol, which enables the minimum number of light nodes to collectively reconstruct the block, is still under development.",
"secondLine": ""
}
},
"sovereignProjectsTrackingConfig": [
{
"projectId": "avail-main",
"name": "Avail",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"0"
]
}
]
},
{
"projectId": "reserved-1",
"name": "Reserved-1",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"1"
]
}
]
},
{
"projectId": "reserved-2",
"name": "Reserved-2",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"2"
]
}
]
},
{
"projectId": "reserved-3",
"name": "Reserved-3",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"3"
]
}
]
},
{
"projectId": "reserved-4",
"name": "Reserved-4",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"4"
]
}
]
},
{
"projectId": "reserved-5",
"name": "Reserved-5",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"5"
]
}
]
},
{
"projectId": "reserved-6",
"name": "Reserved-6",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"6"
]
}
]
},
{
"projectId": "reserved-7",
"name": "Reserved-7",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"7"
]
}
]
},
{
"projectId": "reserved-8",
"name": "Reserved-8",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"8"
]
}
]
},
{
"projectId": "reserved-9",
"name": "Reserved-9",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"9"
]
}
]
},
{
"projectId": "0x84e96bb748abb8a16c28ecc",
"name": "0x84e96bb748abb8a16c28ecc",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"10"
]
}
]
},
{
"projectId": "leouarz-test-app",
"name": "Leouarz test app",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"11"
]
}
]
},
{
"projectId": "bling",
"name": "bling",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"12"
]
}
]
},
{
"projectId": "hello-world",
"name": "hello world",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"13"
]
}
]
},
{
"projectId": "azeazeqsdhfgkjkk",
"name": "azeazeqsdhfgkjkk",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"14"
]
}
]
},
{
"projectId": "jjjtkekznfnxkeke",
"name": "Jjjtkekznfnxkeke",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"15"
]
}
]
},
{
"projectId": "crestal",
"name": "CRESTAL",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"16"
]
}
]
},
{
"projectId": "170889",
"name": "170889",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"18"
]
}
]
},
{
"projectId": "skate-mainnet",
"name": "skate-mainnet",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"19"
]
}
]
},
{
"projectId": "lc85p",
"name": "lc85p",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"20"
]
}
]
},
{
"projectId": "dragonft",
"name": "Dragonft",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"21"
]
}
]
},
{
"projectId": "fuse-l2",
"name": "fuse-l2",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"22"
]
}
]
},
{
"projectId": "antonio",
"name": "antonio",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"23"
]
}
]
},
{
"projectId": "se-avail",
"name": "se-avail",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"24"
]
}
]
},
{
"projectId": "527d69c3",
"name": "Rooch Network",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"25"
]
}
]
},
{
"projectId": "kayabey",
"name": "kayabey",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"27"
]
}
]
},
{
"projectId": "kms",
"name": "KMS",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"28"
]
}
]
},
{
"projectId": "dans-awesome-app",
"name": "Dan's Awesome App",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"29"
]
}
]
},
{
"projectId": "up-or-down",
"name": "Up or Down",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"30"
]
}
]
},
{
"projectId": "svmbnb-mainnet",
"name": "svmbnb-mainnet",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"31"
]
}
]
},
{
"projectId": "odysphere",
"name": "odysphere",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"32"
]
}
]
},
{
"projectId": "uwu",
"name": "UwU",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"33"
]
}
]
},
{
"projectId": "art-peace",
"name": "art-peace",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"35"
]
}
]
},
{
"projectId": "lens-historical-data",
"name": "lens-historical-data",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"39"
]
}
]
},
{
"projectId": "ody-playground",
"name": "ody_playground",
"daTrackingConfig": [
{
"type": "avail",
"sinceBlock": 0,
"appIds": [
"40"
]
}
]
}
],
"systemCategory": "public",
"technology": {
"description": "\n## Architecture\n\n\n\n\n## Consensus\nAvail implements a Nominated Proof-of-Stake (NPoS) Sybil resistance mechanism, combined with the BABE/GRANDPA consensus protocol. \nBABE handles block production by assigning block production slots according to validators' stake and using a Verifiable Random Function (VRF). \nAt the start of each epoch, nodes run the Block-Production-Lottery algorithm to assign block production slots and share the results with other nodes. \nSlots are randomly assigned, meaning multiple validators might be selected for the same slot (with a 'race' determining who gets to propose the block) and some slots may remain empty. \nTo ensure liveness, secondary block producers are pre-determined and can step in if necessary, preventing any slot from being skipped. \nFinality is achieved through GRANDPA, a GHOST-based finality gadget that provides finality through consecutive rounds of validators voting.\n\n## Blobs\nData submitted to the Avail blockchain through submitData transactions is organized into a data matrix, with each block data divided into equal-sized cells. \nThis matrix is erasure coded using Reed-Solomon (RS) codes and committed using Kate-Zaverucha-Goldberg (KZG) polynomial commitments. \nEach block header on Avail includes two types of attestations: KZG polynomial commitments of the submitted data and the root of a Merkle tree, where the leaves represent the data blobs. \n\n## Data Availability Sampling (DAS)\nAvail ensures data availability through a data availability sampling (DAS) mechanism, which involves both Light clients and App clients.\nLight clients sample the data matrix by requesting data cells, and for each cell they then check the KZG polynomial openings against the commitments in the block header.\nLight clients first attempt to fetch cells using a Kademlia-based Distributed Hash Table (DHT) within a light clients peer-to-peer (P2P) network.\nIf the randomly selected cells are not available via DHT, the light client resorts to RPC calls to the Avail node(s) to obtain the data. Cells retrieved this way are then shared back into the DHT network, enhancing the overall availability of block data.\nAfter gathering the data, the light client verifies the cells and calculates a confidence level, which is stored locally for reference.\n\nApp clients focus on data specific to a given application ID. They reconstruct entire rows of the data matrix by requesting and assembling any missing cells from the network.\n\n## Erasure Coding Proof\n\nAvail uses Kate-Zaverucha-Goldberg (KZG) polynomial commitments as validity proofs of erasure-coded data. Light clients verify the commitments by checking the KZG polynomial openings against the commitments in the block header.\n\n## L2s Data Availability\n\nL2s can post application-specific data blobs to the Avail blockchain through submitData transactions. \nEach transaction contains an application ID that identifies the L2 and adheres to a size limit based on the Avail blockchain’s block size. \nApp-specific data can be reconstructed by app clients, which request and assemble missing cells from the network to complete the data reconstruction process.\n ",
"references": [
{
"title": "Avail Documentation",
"url": "https://docs.availproject.org/docs/welcome-to-avail-docs"
},
{
"title": "Avail Light Client - Source Code",
"url": "https://github.com/availproject/avail-light/blob/main/core/src/light_client.rs"
},
{
"title": "Avail App Client - Source Code",
"url": "https://github.com/availproject/avail-light/blob/a9e1741a6c7579d6ab1988eb409808b33f999180/core/src/app_client.rs"
}
],
"risks": [
{
"category": "Funds can be lost if",
"text": "a dishonest supermajority of Avail validators finalizes an unavailable block, and there aren't light nodes on the network verifying data availability, or they fail at social signaling unavailable data."
},
{
"category": "Funds can be lost if",
"text": "a dishonest supermajority of Avail validators finalizes an unavailable block, and the light nodes on the network cannot collectively reconstruct the block."
}
]
},
"throughput": [
{
"size": 4194304,
"frequency": 20,
"sinceTimestamp": 1739883920
},
{
"size": 2097152,
"frequency": 20,
"sinceTimestamp": 1721692800
}
],
"type": "Public Blockchain",
"usedWithoutBridgeIn": [
{
"id": "sxt",
"name": "Space and Time",
"slug": "sxt"
}
],
"usedWithoutBridgeIn": [],
"validators": {
"type": "dynamic"
}
}
+3 -3
+1 -1
{
"dataAvailability": [
{
"name": "All data required for forced exits is published onchain",
"description": "All the data needed to recover the latest accounts state (represented by the Account Tree) and construct the zk proof necessary for forced exits is published onchain in the form of blobs. Only data that leads to state changes is posted.",
"risks": [],
"references": []
}
],
"exitMechanisms": [
{
"name": "Regular exit",
"description": "The user initiates the withdrawal by submitting a regular transaction on this chain. When the block containing that transaction is settled the funds become available for withdrawal on L1. ZK proofs are required to settle blocks. Finally the user submits an L1 transaction to claim the funds.",
"risks": [],
"references": []
},
{
"name": "Escape hatch through ZK proofs",
"description": "If the centralized operators fail to process forced transactions after the deadline, the system can be frozen (desert mode) and users can exit by reconstructing the latest settled state using the data available on L1 and providing a ZK proof of balance.",
"risks": [],
"references": []
}
],
"forceTransactions": {
"name": "Users can force their transactions on L1",
"description": "If the centralized operators fail to include user transactions, users can force them themselves through L1. The possible transaction types that users can force are: deposits, withdrawals, order creation, order cancellation, and burning of pool shares. If the operators do not process forced transactions within 14d, the system can be frozen (desert mode) and users can exit using the latest settled state. All open positions are settled using the latest index price.",
"risks": [],
"references": []
},
"operator": {
"name": "Centralized operators",
"description": "Only the centralized operators can submit batches and verify them with a ZK proof, i.e. advance the state of the protocol.",
"risks": [
{
"category": "MEV can be extracted if",
"text": "the operator exploits their centralized position and frontruns user transactions."
}
],
"references": []
},
"otherConsiderations": [
{
"name": "External oracles used for index prices",
"description": "Lighter uses a combination of oracles to determine index prices, with Stork as the primary source. External signatures are currently not verified and the sequencer must be trusted to truthfully report data.",
"risks": [
{
"category": "Funds can be lost if",
"text": "the oracle prices are manipulated."
}
],
"references": [
{
"title": "Lighter docs - Fair Price Marking",
"url": "https://docs.lighter.xyz/perpetual-futures/fair-price-marking"
}
]
}
],
"stateValidation": {
"description": "Each update to the system state must be accompanied by a ZK proof that ensures that the new state was derived by correctly applying a series of valid transactions to the previous state. This includes user transactions originating from L1 and L2, as well as internal transactions created by L2 operators. In the desert mode, valid proofs of exit must be generated. These proofs are then verified on Ethereum by a smart contract.",
"categories": [
{
"title": "Prover Architecture",
"description": "[This repo](https://github.com/elliottech/lighter-prover/tree/main) contains the circuits and prover code for normal (i.e. non-desert) operation mode of Lighter. It includes the logic to generate and verify proofs of valid state transition according to the Lighter [matching engine](https://github.com/elliottech/lighter-prover/blob/d0ff2304aea516b22f3a5223881006b6a9af1cc9/circuit/src/matching_engine.rs)."
},
{
"title": "ZK Circuits",
"description": "Lighter transition is proven with custom Plonky2 circuits, compiled into ZK Lighter Verifier and Desert Verifier. ZK Lighter verifier implements the perp DEX and spot trading logic and could be found in this [prover repo](https://github.com/elliottech/lighter-prover/tree/main/circuit/src). Desert verifier consists of circuits proving valid L2 -> L1 withdrawals in the desert mode. More details in [ZK Catalog](https://l2beat.com/zk-catalog/lighterprover#proof-system)."
},
{
"title": "Verification Keys Generation",
"description": "Lighter wraps its validity proof into a Plonk-based proof system which requires a trusted setup. The verification keys are hardcoded in the verifier contract on-chain. Lighter prover repo contains a [script](https://github.com/elliottech/lighter-prover/blob/main/build_circuits.sh) that regenerates circuits and verification keys.",
"references": [
{
"title": "ZK Lighter verifier verification keys",
"url": "https://etherscan.io/address/0xd42b2D9eFD409c2a3074AE4f874F3f42389DB931#code#F1#L54"
"url": "https://etherscan.io/address/0x023B02ad3b8f9045595Ac7139FdBA643b562cfe3#code#F1#L54"
},
{
"title": "Desert verifier verification keys",
"url": "https://etherscan.io/address/0xd4460475F00307845082d3a146f36661354FBc67#code#F1#L39"
}
]
}
]
},
"upgradesAndGovernance": "Regular upgrades are initiated by the \"network governor\" and executed with a 21d delay. The \"security council\" is allowed to reduce the upgrade delay to zero in case of an emergency. The security council does not currently satisfy the Stage 1 requirements. The network governor also retains the ability to add or remove validators.",
"warning": "Jan 5 2026: at the moment of writing, the desert mode circuits source code is not publicly available and therefore it is not possible to fully verify the escape hatch logic."
}
+1 -1
{
"addresses": {
"ethereum": [
{
"name": "Lighter",
"isVerified": true,
"address": "eth:0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7",
"upgradeability": {
"proxyType": "zkLighter proxy",
"admins": [
"eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67"
],
"implementations": [
"eth:0xe5FB592Ef1b620909000Af0D5fb55a3593026142",
"eth:0x9307350AF47B0C0e7f8cA5ED2D57993aF3a6df1d"
]
},
"chain": "ethereum",
"description": "The main rollup contract. It processes L2 batches, manages token deposits and withdrawals, allows users to submit censorship-resistant L2 transactions and controls desert mode (escape hatch). Logic is split between two contracts because of code-size limits, many operations are delegated to AdditionalZKLighter.\n* Roles:\n * **admin**: UpgradeGatekeeper; ultimately Lighter Multisig 2",
"upgradableBy": [
{
"name": "Lighter Multisig 2",
"delay": "21d"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7#code"
},
{
"name": "UpgradeGatekeeper",
"isVerified": true,
"address": "eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Governance contract functioning like an upgrade timelock for downstream contracts. The current delay is 21d and can be entirely skipped by Lighter Multisig.\n* Roles:\n * **getMaster**: Lighter Multisig 2\n * **securityCouncilAddress**: Lighter Multisig",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67#code"
},
{
"name": "Governance",
"isVerified": true,
"address": "eth:0xa464DA0B43f80EE3FfC4795cbbFC78472b5c81A1",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67"
],
"implementations": [
"eth:0x46D3C0c01D5DAae4FE8e3f54f32901d9Fbde1f08"
]
},
"chain": "ethereum",
"pastUpgrades": [],
"description": "Manages the list of validators and the network governor.\n* Roles:\n * **admin**: UpgradeGatekeeper; ultimately Lighter Multisig 2\n * **networkGovernor**: Lighter Multisig 2\n * **validators**: EOA 1, EOA 2, EOA 3",
"upgradableBy": [
{
"name": "Lighter Multisig 2",
"delay": "21d"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xa464DA0B43f80EE3FfC4795cbbFC78472b5c81A1#code"
},
{
"name": "ZkLighterVerifier",
"isVerified": true,
"address": "eth:0xac3Ce44B6ff4E402858C99D5699ff63131572BaA",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67"
],
"implementations": [
"eth:0xd42b2D9eFD409c2a3074AE4f874F3f42389DB931"
"eth:0x023B02ad3b8f9045595Ac7139FdBA643b562cfe3"
]
},
"chain": "ethereum",
"pastUpgrades": [],
"description": "The main ZK verifier of Lighter, settles the proofs of correct L2 state transition in the case of normal rollup operation.\n* Roles:\n * **admin**: UpgradeGatekeeper; ultimately Lighter Multisig 2",
"upgradableBy": [
{
"name": "Lighter Multisig 2",
"delay": "21d"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xac3Ce44B6ff4E402858C99D5699ff63131572BaA#code"
},
{
"name": "DesertVerifier",
"isVerified": true,
"address": "eth:0xd4460475F00307845082d3a146f36661354FBc67",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "ZK verifier used to verify forced exits during desert mode.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xd4460475F00307845082d3a146f36661354FBc67#code"
}
]
},
"escrows": [
{
"address": "0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7",
"sinceTimestamp": 1737090335,
"tokens": [
"USDC",
"ETH",
"LIT",
"LINK",
"AAVE",
"UNI",
"SKY",
"LDO"
],
"contract": {
"isVerified": true,
"address": "eth:0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7",
"upgradeability": {
"proxyType": "zkLighter proxy",
"admins": [
"eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67"
],
"implementations": [
"eth:0xe5FB592Ef1b620909000Af0D5fb55a3593026142",
"eth:0x9307350AF47B0C0e7f8cA5ED2D57993aF3a6df1d"
]
},
"chain": "ethereum",
"url": "https://etherscan.io/address/0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7#code"
},
"chain": "ethereum",
"includeInTotal": true,
"chainId": 1
}
],
"risks": [
{
"category": "Funds can be stolen if",
"text": "a contract receives a malicious code upgrade. There is no delay on code upgrades.",
"isCritical": true
}
]
}
+1 -1
{
"baseTimestamp": 1768216772,
"baseTimestamp": 1768992487,
"contractsDiscoDriven": true,
"hasDiscoUi": true,
"isDiscoDriven": true,
"permissionsDiscoDriven": true
}
+17 -0
+17 -0
{
"creator": "Lighter",
"projectsForTvs": [
{
"projectId": "lighter",
"sinceTimestamp": 1759356000
}
],
"proofSystemInfo": "\n## Description\n\nLighter prover is a zk proving system for Lighter L2 based on [Plonky2](https://github.com/0xPolygonZero/plonky2/tree/main) circuits. It verifies the logic for regular state transition of Lighter L2, as well as state transitions in the “desert mode” when L2 is shut down and users exit, using different sets of circuits. The circuits are proven with a STARK which is wrapped into a Plonk SNARK before settling onchain.\n\n## Proof system\n\n[Plonky2](https://github.com/0xPolygonZero/plonky2) implements a circuit aritmetization based on TurboPlonk over Goldilocks field, but it replaces KZG polynomial commitment scheme with a FRI-based polynomial testing scheme. In this way proving Plonky2 circuits requires no trusted setup, i.e. it is a STARK. \n\nHowever Lighter wraps these STARK in a [gnark](https://github.com/Consensys/gnark) implementation of Plonk over BN254 curve, which requires a trusted setup.\n\n### Circuits\n\nThe proof system operates on Lighter STF circuits and desert mode circuits. All published circuits are available [here](https://github.com/elliottech/lighter-prover/tree/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit), note that the Lighter team has not published the desert circuits yet. \n\nLighter proof system defines circuits for proving all transactions, including internal, L1 and L2 transactions. The full list of available transactions that define Lighter STF can be seen [here](https://github.com/elliottech/lighter-prover/tree/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/transactions). \n\nTransaction circuits use custom implementations for arithmetic operations ([bigint](https://github.com/elliottech/lighter-prover/tree/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/bigint), [uint](https://github.com/elliottech/lighter-prover/tree/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/uint)), cryptographic primitives ([ecdsa](https://github.com/elliottech/lighter-prover/tree/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/ecdsa) on the Secp256k1 curve, [eddsa](https://github.com/elliottech/lighter-prover/tree/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/eddsa) on the ECgFp5 curve, [keccak](https://github.com/elliottech/lighter-prover/tree/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/keccak), [poseidon_bn128](https://github.com/elliottech/lighter-prover/tree/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/poseidon_bn128)) and other helper circuits.\n\n### Recursion\n\nLighter prover implements recursive aggregation of transaction proofs to make the whole pipeline more efficient and parallelizable. First, fixed-size blocks of consecutive transactions are processed and proven by [BlockTx circuit](https://github.com/elliottech/lighter-prover/blob/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/block_tx_constraints.rs), which can be done on separate machines. Next, arbitrary number of BlockTx proofs are aggregated into a single proof by [BlockTxChain circuit](https://github.com/elliottech/lighter-prover/blob/053ceda7c59a9a0e05997661ca5a1bb7a92bb267/circuit/src/block_tx_chain_constraints.rs), which includes continuity checks across all BlockTx proofs.\n",
"techStack": {
"snark": [
{
"id": "Plonky2",
"type": "Plonk",
"name": "Plonky2",
"description": "Toolkit for developing transparent SNARKs based on PLONK and FRI developed by Polygon Zero team."
},
{
"id": "Goldilocks",
"type": "Field",
"name": "Goldilocks",
"description": "Prime field of order p = 2**64 - 2**32 + 1."
},
{
"id": "CustomCircuits",
"type": "Other",
"name": "App-specific circuits",
"description": "This project uses custom app-specific ZK circuits."
}
],
"finalWrap": [
{
"id": "Gnark",
"type": "Plonk",
"name": "Gnark",
"description": "Consensys implementation of Plonk proving system written in Go."
},
{
"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": "Gnark",
"type": "Plonk",
"name": "Gnark",
"description": "Consensys implementation of Plonk proving system written in Go."
},
"id": "AztecIgnition",
"name": "Aztec Ignition",
"risk": "green",
"shortDescription": "Aztec Ignition is a trusted setup ceremony that was run by Aztec for KZG commitment over BN254 curve in 2019. It included 176 participants and was publicly open for participation.",
"longDescription": " \n Aztec Ignition is a trusted setup ceremony for KZG commitments over BN254 curve that was run by Aztec for KZG commitment over BN254 curve in 2019. \n It included 176 participants and was publicly open for participation.\n \n - Github repo to download and verify the ceremony artifacts: [https://github.com/AztecProtocol/ignition-verification](https://github.com/AztecProtocol/ignition-verification).\n - Github repo with instructions for ceremony participants: [https://github.com/AztecProtocol/Setup](https://github.com/AztecProtocol/Setup).\n - Ceremony announcement with a call to participate: [https://aztec.network/blog/announcing-ignition](https://aztec.network/blog/announcing-ignition).\n "
}
],
"verifierHashes": [
{
"hash": "0x5593b4a1aea71939da571a74d7276acc3588189c73287297f98cecd56962b2d8",
"proofSystem": {
"id": "Gnark",
"type": "Plonk",
"name": "Gnark",
"description": "Consensys implementation of Plonk proving system written in Go."
},
"knownDeployments": [
{
"address": "0x023B02ad3b8f9045595Ac7139FdBA643b562cfe3",
"chain": "ethereum"
}
],
"verificationStatus": "unsuccessful",
"verificationSteps": "At the time of writing, the sources for this version of the verifier circuits are not published and thus the verifier cannot be independently regenerated."
},
{
"hash": "0x3851046274646dacb2a19e53e45ef7f69f78f052f2033db62cb9c6024d6cd42f",
"proofSystem": {
"id": "Gnark",
"type": "Plonk",
"name": "Gnark",
"description": "Consensys implementation of Plonk proving system written in Go."
},
"knownDeployments": [
{
"address": "0xd42b2D9eFD409c2a3074AE4f874F3f42389DB931",
"chain": "ethereum"
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "\nThe verification process below is based on the `build_circuits.sh` [script](https://github.com/elliottech/lighter-prover/blob/main/build_circuits.sh) in the lighter-prover repo. It consumed around 100 GiB of memory at the peak, so we recommend rerunning it on a machine with 128 GiB of RAM.\n\nThe steps below are for Ubuntu 24.04 OS.\n\n1. Install rust, gcc, go.\n\n```\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n. .cargo/env\n\nsudo apt update\nsudo apt install build-essential golang-go\ngo version\n```\n \n2. Run the correct version of the script to regenerate the keys.\n\n```\ngit clone https://github.com/elliottech/lighter-prover.git\ncd lighter-prover\ngit checkout e39d2818cf817a7b37a249296b7cc00110681a38\nchmod +x build_circuits.sh\n./build_circuits.sh\n```\n\nThe script will generate the `final::....sol` file that contains the verifier smart contract with the verification keys.\n ",
"description": "Custom verifier ID: SHA256 hash of all VK_... values from the smart contract, abi packed in the same order they are defined."
},
{
"hash": "0xc3d58029fabf2a93d6cb9b96315c484e4bea2e238aaa081460c9027863c650e7",
"proofSystem": {
"id": "Gnark",
"type": "Plonk",
"name": "Gnark",
"description": "Consensys implementation of Plonk proving system written in Go."
},
"knownDeployments": [
{
"address": "0xd4460475F00307845082d3a146f36661354FBc67",
"chain": "ethereum"
}
],
"verificationStatus": "unsuccessful",
"verificationSteps": "The sources for desert verifier circuits are not published and thus the verifier cannot be independently regenerated.",
"description": "Custom verifier ID: SHA256 hash of all VK_... values from the smart contract, abi packed in the same order they are defined."
}
]
}
+18 -25
+3 -3
{
"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": "Avail",
"id": "AvailVector",
"type": "DA",
"name": "Avail",
"description": "This project is posting its data to Avail",
"name": "Avail with Vector",
"description": "This project utilizes Avail and has Vector enabled, facilitating the bridging of data availability commitments between Avail and Ethereum.",
"action": {
"type": "publicDaHighlight",
"slug": "avail"
}
},
{
"id": "ZKStack",
"type": "Stack",
"name": "Built on the ZK Stack",
"description": "The project is built on the ZK Stack",
"action": {
"type": "scalingFilter",
"id": "stack",
"value": "ZK Stack"
}
},
{
"id": "ElasticChain",
"type": "Infra",
"name": "Part of the Elastic Chain",
"description": "The project is part of the Elastic Chain, meaning it's based on the ZK stack and uses the shared contracts",
"action": {
"type": "scalingFilter",
"id": "infrastructure",
"value": "Elastic Chain"
}
},
{
"id": "Caldera",
"type": "RaaS",
"name": "Caldera",
"description": "This project was deployed via the rollup-as-a-service provider Caldera",
"action": {
"type": "scalingFilter",
"id": "raas",
"value": "Caldera"
}
}
],
"description": "Space and Time (SxT) is a decentralized data warehouse that aims to provide a zk 'Proof of SQL' to bring offchain data to smart contracts onchain. Built on ZK Stack, the SxT chain will serve as a settlement layer and payment hub for data queries.",
"links": {
"websites": [
"https://spaceandtime.io"
],
"bridges": [
"https://app.spaceandtime.ai"
],
"documentation": [
"https://docs.spaceandtime.io"
],
"explorers": [
"https://spaceandtime.calderaexplorer.xyz"
],
"repositories": [
"https://github.com/spaceandtimelabs"
],
"socialMedia": [
"https://x.com/spaceandtime",
"https://discord.com/invite/spaceandtimeDB",
"https://linkedin.com/company/space-and-time-db/",
"https://youtube.com/channel/UCXJyE7ahmqCH11aO7L76PBA",
"https://t.me/spaceandtimedb",
"https://instagram.com/spaceandtimedb/",
"https://spaceandtime.io/blog"
]
}
}
+1 -8
{
"capability": "universal",
"daLayer": [
"Avail"
],
"hostChain": {
"id": "ethereum",
"slug": "ethereum",
"name": "Ethereum"
},
"infrastructure": "Elastic Chain",
"layer": "layer2",
"proofSystem": {
"type": "Validity",
"zkCatalogId": "boojum"
},
"purposes": [
"Universal"
],
"raas": "Caldera",
"reasonsForBeingOther": [
{
"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": [
"ZK Stack"
],
"stage": "Not applicable",
"type": "Other",
"type": "Validium",
"vm": [
"EVM"
]
}
+2 -2
{
"self": {
"stateValidation": {
"value": "Validity proofs (ST, SN)",
"description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup.",
"sentiment": "good",
"orderHint": null,
"executionDelay": 10800,
"secondLine": "3h execution delay"
},
"dataAvailability": {
"value": "External",
"description": "Proof construction and state derivation fully rely on data that is posted on Avail. Transaction data is not checked against the Vector bridge data roots onchain, but L2 nodes can verify data availability by running an Avail light client.",
"sentiment": "bad"
"description": "Proof construction and state derivation fully rely on data that is posted on Avail. Transaction data is checked against the Vector bridge data roots, signed off by Avail validators.",
"sentiment": "warning"
},
"exitWindow": {
"value": "None",
"sentiment": "bad",
"description": "There is no window for users to exit in case of an unwanted standard upgrade because the central operator can censor withdrawal transactions by implementing a TransactionFilterer with no delay. The standard upgrade delay is 4d 3h."
},
"sequencerFailure": {
"value": "Enqueue via L1",
"description": "Users can submit transactions to an L1 queue, but can't force them. The sequencers cannot selectively skip transactions but can stop processing the queue entirely. In other words, if the sequencers censor or are down, they are so for everyone.",
"sentiment": "warning"
},
"proposerFailure": {
"value": "Replace proposer",
"description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen. There is a decentralized Governance system that can attempt changing Proposers with an upgrade.",
"sentiment": "warning",
"orderHint": null
}
}
}
+4 -4
[
{
"layer": {
"value": "Avail",
"sentiment": "warning",
"description": "The data is posted to Avail.",
"projectId": "avail"
},
"bridge": {
"value": "None",
"sentiment": "bad",
"description": "There is no bridge that can attest if the data has been made available.",
"orderHint": -2
"value": "Vector",
"sentiment": "warning",
"description": "The Vector DA bridge is used to attest to the data availability on Avail.",
"projectId": "vector"
},
"mode": {
"value": "State diffs",
"secondLine": "Compressed"
}
}
]
+3 -3
{
"architectureImage": "zkstack-validium",
"dataAvailability": [
{
"name": "Data is posted to Avail",
"description": "Transactions roots are posted onchain and the full data is posted on Avail. Since the Vector bridge is not used, availability of the data is not verified against Avail validators, meaning that the Sequencer can single-handedly publish unavailable commitments.",
"description": "Transactions roots are posted onchain and the full data is posted on Avail. The vector bridge is used to verify attestations from the Avail validator 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": "Avail's Data Attestation Bridge: Enabling Secure Validiums and Optimistic Chains",
"url": "https://blog.availproject.org/data-attestation-bridge/"
"title": "AvailL1DAValidator - checkDA() function",
"url": "https://etherscan.io/address/0x8f50d93B9955B285f787043B30B5F51D09bE0120#code#F1#L16"
}
]
}
],
"exitMechanisms": [
{
"name": "Regular messaging",
"description": "The user initiates L2->L1 messages by submitting a regular transaction on this chain. When the block containing that transaction is settled, the message becomes available for processing on L1. ZK proofs are required to settle blocks.",
"risks": [],
"references": [
{
"title": "Withdrawing funds - ZKsync documentation",
"url": "https://docs.zksync.io/zksync-protocol/rollup/bridging-assets"
}
]
},
{
"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 from L1, including all forced withdrawals and deposits. Once the force operation is submitted and if the request is serviced, the operation follows the flow of a regular message.",
"risks": [],
"references": []
}
],
"forceTransactions": {
"name": "Users can force any transaction via L1",
"description": "If a user is censored by the L2 Sequencer, they can try to force their transaction via an L1 queue. Right now there is no mechanism that forces L2 Sequencer to include transactions from the queue in an L2 block. The operator can implement a TransactionFilterer that censors forced transactions.",
"risks": [
{
"category": "Users can be censored if",
"text": "the operator refuses to include their transactions."
},
{
"category": "Users can be censored if",
"text": "the operator implements a TransactionFilterer, which is possible without delay."
}
],
"references": [
{
"title": "L1 - L2 interoperability - Developer's documentation",
"url": "https://docs.zksync.io/zksync-protocol/era-vm/contracts/handling-l1-l2-ops"
}
]
},
"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": []
},
"stateValidation": {
"description": "Each update to the system state 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.",
"categories": [
{
"title": "Prover Architecture",
"description": "ZKsync Era proof system Boojum can be found [here](https://github.com/matter-labs/era-boojum/tree/main) and contains essential tools like the Prover, the Verifier, and other backend components. The specs of the system can be found [here](https://github.com/matter-labs/zksync-era/tree/main/prover)."
},
{
"title": "ZK Circuits",
"description": "ZKsync Era circuits are built from Boojum and are designed to replicate the behavior of the EVM. The source code can be found [here](https://github.com/matter-labs/era-zkevm_circuits/tree/main). The circuits are checked against tests that can be found [here](https://github.com/matter-labs/era-zkevm_test_harness/tree/main).",
"risks": [
{
"category": "Funds can be lost if",
"text": "the proof system is implemented incorrectly."
}
]
},
{
"title": "Verification Keys Generation",
"description": "SNARK verification keys can be generated and checked against the Ethereum verifier contract using [this tool](https://github.com/matter-labs/zksync-era/tree/main/prover/crates/bin/vk_setup_data_generator_server_fri). The system requires a trusted setup."
}
],
"proofVerification": {
"shortDescription": "ZKsync Era is a ZK-EVM rollup on Ethereum.",
"aggregation": true,
"requiredTools": [
{
"name": "Custom tool",
"version": "v14.2.0",
"link": "https://github.com/matter-labs/zksync-era/tree/prover-v14.2.0/prover/vk_setup_data_generator_server_fri"
}
],
"verifiers": [
{
"name": "ZKsyncEraVerifier",
"description": "ZKsync Era utilizes [Boojum](https://github.com/matter-labs/zksync-crypto/tree/main/crates/boojum) as the main proving stack for their system. Boojum is an implementation of the [Redshift](https://eprint.iacr.org/2019/1400.pdf) protocol. The protocol makes use of recursive proof aggregation. The final Redshift proof is wrapped in a SNARK (Plonk + KZG) proof.",
"verified": "no",
"contractAddress": "0x06aa7a7B07108F7C5539645e32DD5c21cBF9EB66",
"chainId": 1,
"subVerifiers": [
{
"name": "Final wrap",
"proofSystem": "Plonk SNARK",
"mainArithmetization": "Plonkish",
"mainPCS": "KZG",
"trustedSetup": "Aztec ceremony",
"link": "https://github.com/matter-labs/zksync-protocol/blob/main/crates/circuit_definitions/src/circuit_definitions/aux_layer/wrapper.rs"
},
{
"name": "Aggregation circuit",
"proofSystem": "Redshift",
"mainArithmetization": "Plonkish",
"mainPCS": "LPC",
"trustedSetup": "None",
"link": "https://github.com/matter-labs/zksync-protocol/blob/7dfcc81eccc3984793646a5a47e4cd68757955a2/crates/circuit_definitions/src/circuit_definitions/recursion_layer/mod.rs#L45"
},
{
"name": "Main circuit",
"proofSystem": "Redshift",
"mainArithmetization": "Plonkish",
"mainPCS": "LPC",
"trustedSetup": "None",
"link": "https://github.com/matter-labs/zksync-protocol/tree/main/crates/zkevm_circuits"
}
]
}
]
}
},
"upgradesAndGovernance": "\nThere are two main paths for contract upgrades in the shared ZK stack ecosystem - standard and emergency - both converging on the shared upgrade management contract ProtocolUpgradeHandler.\nThe standard path involves a governance proposal and voting through the DAO, multiple timelock delays and finally approval by the Guardians or 6 SecurityCouncil participants.\nThe emergency path allows for contract upgrades without any delay by the EmergencyUpgradeBoard, which acts as a 3/3 Multisig between SecurityCouncil, Guardians and the FoundationMultisig.\n## Standard path\n### On ZKsync Era\nDelegates can start new proposals by reaching a threshold of 21M ZK tokens on the ZKsync Era Rollup's ZkProtocolGovernor contract.\nThis launches a 3d 'voting delay' after which the 7d voting period starts. During these first two periods, the proposal can be canceled by the proposer or if it falls below the proposing threshold.\nA proposal is only successful if it reaches both quorum (630M ZK tokens) and simple majority. When it reaches quorum, a remaining voting period of 3d is guaranteed by a potential late quorum vote extension.\nIn the successful case, it can be queued in the 0s timelock which forwards it via the Gateway to Ethereum as an L2->L1 log.\n### On Ethereum\nAfter the execution of the proposal-containing batch (3h delay), the proposal is now picked up by the ProtocolUpgradeHandler and enters the 3d 'legal veto period'.\nThis serves as a window in which a veto could be coordinated offchain, to be then enforced by non-approval of Guardians and SecurityCouncil. A threshold of 2 Guardians can extend the veto period to 7d.\nAfter this a proposal enters a *waiting* state of 1mo, from which it can be immediately approved (cancelling the delay) by 6 participants of the SecurityCouncil.\nFor the unlikely case that the Security Council does not approve here, the Guardians can instead approve the proposal, or nobody. In the two latter cases, the waiting period is enforced in full.\nA proposal cannot be actively cancelled in the ProtocolUpgradeHandler, but will expire if not approved within the waiting period. An approved proposal now enters the *pendingExecution* state for a final delay of 1d and can then be executed.\n### Other governance tracks\nThere are two other tracks of Governance also starting with DAO Delegate proposals the ZKsync Era rollup: 1) Token Program Proposals that add new minters, allocations or upgrade the ZK token and\n2) Governance Advisory Proposals that e.g. change the ZK Credo or other offchain Governance Procedures without onchain targets.\nThe protocol for these two other tracks is similar to the first part of the standard path described above (albeit having different quorum and timelock values), and not passing over to the Ethereum L1.\nFurther customizations are that the ZkFoundationMultisig can propose to the ZkTokenGovernor without a threshold and that the Guardians' L2 alias can cancel proposals in the ZkTokenGovernor and the ZkGovOpsGovernor.\n## Emergency path\nSecurityCouncil (9/12), Guardians (5/8) and ZkFoundationMultisig (3/5) form a de-facto 3/3 Multisig\nby pushing an immediate upgrade proposal through the EmergencyUpgradeBoard, which circumvents all delays and executes immediately via the ProtocolUpgradeHandler.\n## Upgrade Delays\nThe cumulative duration of the upgrade paths from the moment of a voted 'successful' proposal is 4d 3h or 8d 3h (depending on Guardians extending the LegalVetoPeriod) for Standard, 0 for Emergency and 1mo 4d for the path in which the SecurityCouncil is not approving the proposal.\n## Freezing\nThe SecurityCouncil can freeze (pause withdrawals and settlement) all chains connected to the current ChainTypeManager.\nEither for a softFreeze of 12h or a hardFreeze of 7d.\nAfter a softFreeze and / or a hardFreeze, a proposal from the EmergencyUpgradeBoard has to be passed before subsequent freezes are possible.\nOnly the SecurityCouncil can unfreeze an active freeze.\n## ZK cluster Admin and Chain Admin\nApart from the paths that can upgrade all shared implementations, the ZK stack governance system defines other roles that can modify the system:\nA single *ZK cluster Admin* role who governs parameters in the shared contracts and a *Chain Admin* role (defined in each chain-specific diamond contract) for managing parameters of each individual ZK chain that builds on the stack.\nThese chain-specific actions include critical operations like setting a transaction filterer that can censor L1 -> L2 messages, changing the DA mode, migrating the chain to a different settlement layer and standard operations like setting fee parameters and adding / removing Validators in the ValidatorTimelock.\nFor rollups, data availability on Ethereum is validated by a RollupL1DAValidator contract (or a RelayedSLDAValidator on the Gateway). Each rollup can become a permanent rollup (through their Chain Admin) which disallows DA changes to non-whitelisted sources or settlement layers in the future.\nThe source of truth for rollup-compliant DA validator contracts is the RollupDAManager contract, which is administered via the ProtocolUpgradeHandler.\nZKsync Era's Chain Admin differs from the others as it also has the above *ZK cluster Admin* role in the shared ZK stack contracts.",
"upgradesAndGovernanceImage": "zkstack"
}
+4 -4
{
"addresses": {
"ethereum": [
{
"name": "Diamond",
"isVerified": true,
"address": "eth:0x410D7e4Ea1093A532eF9A7a2D5df84084B05ec24",
"upgradeability": {
"proxyType": "EIP2535 diamond proxy",
"admins": [],
"implementations": [
"eth:0x431449e2a28A69122860A4956A3f7191eE15aFBC",
"eth:0xae5cbB5f70e134668a13d7C8EcEF5e9E6FffCF22",
"eth:0x365D0ae3ECA13004daf2A4ba1501c01AaEbb4fec",
"eth:0x2f116b9033d88Bb3Cf64C371AE5458fbA22BA39A"
],
"immutable": false
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1743800207,
"transactionHash": "0x16d2c7f565c946c7e7b8893092fe21693ee610a540d8e48d50ef672f94924dd0",
"implementations": [
"eth:0xEaedCF01c0B01C1a10b74cB0A2cDeF78a9540cdb",
"eth:0x95C45F931946C97D10D9d6e859Fe8D62785ed3C1",
"eth:0x36b026c39125964D99596CE302866B5A59E4dE27",
"eth:0x53d0b421BB3e522632ABEB06BB2c4eB15eaD9800"
]
},
{
"timestamp": 1743800207,
"transactionHash": "0x16d2c7f565c946c7e7b8893092fe21693ee610a540d8e48d50ef672f94924dd0",
"implementations": [
"eth:0xEaedCF01c0B01C1a10b74cB0A2cDeF78a9540cdb",
"eth:0x95C45F931946C97D10D9d6e859Fe8D62785ed3C1",
"eth:0x36b026c39125964D99596CE302866B5A59E4dE27",
"eth:0x53d0b421BB3e522632ABEB06BB2c4eB15eaD9800"
]
},
{
"timestamp": 1743800207,
"transactionHash": "0x16d2c7f565c946c7e7b8893092fe21693ee610a540d8e48d50ef672f94924dd0",
"implementations": [
"eth:0xEaedCF01c0B01C1a10b74cB0A2cDeF78a9540cdb",
"eth:0x95C45F931946C97D10D9d6e859Fe8D62785ed3C1",
"eth:0x36b026c39125964D99596CE302866B5A59E4dE27",
"eth:0x53d0b421BB3e522632ABEB06BB2c4eB15eaD9800"
]
},
{
"timestamp": 1748477795,
"transactionHash": "0xa7c0bbce514c44dc6dda571c09f6529ab28adde2b3e8274661b26d111b70a69a",
"implementations": [
"eth:0xF2C9D38D16c7A7Dc9aA4F743Fce024354d9c19B4",
"eth:0x05DeB01AaDB6C98F8B78a1F9A81ccd68Ac4d70d4",
"eth:0x26b9a55DaBab9A8e74815A9D6Cd7F74AC0d7215f",
"eth:0x0A7C1b8D56BE02d9731e3A764107602f8F6dd490"
]
},
{
"timestamp": 1758834599,
"transactionHash": "0x300d4d863ea7ccc4d22738184d8aa72ce3a61125bf960d9dd658020b85a2471a",
"implementations": [
"eth:0x431449e2a28A69122860A4956A3f7191eE15aFBC",
"eth:0xae5cbB5f70e134668a13d7C8EcEF5e9E6FffCF22",
"eth:0x365D0ae3ECA13004daf2A4ba1501c01AaEbb4fec",
"eth:0x2f116b9033d88Bb3Cf64C371AE5458fbA22BA39A"
]
},
{
"timestamp": 1758834599,
"transactionHash": "0x300d4d863ea7ccc4d22738184d8aa72ce3a61125bf960d9dd658020b85a2471a",
"implementations": [
"eth:0x431449e2a28A69122860A4956A3f7191eE15aFBC",
"eth:0xae5cbB5f70e134668a13d7C8EcEF5e9E6FffCF22",
"eth:0x365D0ae3ECA13004daf2A4ba1501c01AaEbb4fec",
"eth:0x2f116b9033d88Bb3Cf64C371AE5458fbA22BA39A"
]
}
],
"description": "The main contract defining the Layer 2. Operator actions like commiting blocks, providing ZK proofs and executing batches ultimately target this contract which then processes transactions. During batch execution it processes L1 --> L2 and L2 --> L1 transactions.\n* Roles:\n * **getAdmin**: ChainAdminOwnable; ultimately Caldera Multisig 3\n * **validators**: ValidatorTimelock",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x410D7e4Ea1093A532eF9A7a2D5df84084B05ec24#code"
},
{
"name": "ValidiumL1DAValidator",
"name": "AvailL1DAValidator",
"isVerified": true,
"address": "eth:0x907b30407249949521Bf0c89A43558dae200146A",
"address": "eth:0x8f50d93B9955B285f787043B30B5F51D09bE0120",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Contract that 'verifies' the data availability for validiums. This implementation only checks the correct formatting and does not serve as a DA oracle. Can be used by ZK stack validiums as the L1 part of a DAValidator pair.\n",
"description": "Contract that verifies that the validiums data was made available on Avail by querying the 0x054fd961708D8E2B9c10a63F6157c74458889F0a on Ethereum for a merkle proof of inclusion.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x907b30407249949521Bf0c89A43558dae200146A#code"
"url": "https://etherscan.io/address/eth:0x8f50d93B9955B285f787043B30B5F51D09bE0120#code"
},
{
"name": "BridgeHub",
"isVerified": true,
"address": "eth:0x303a465B659cBB0ab36eE643eA362c509EEb5213",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1"
],
"implementations": [
"eth:0xc89423b4909080fB8F8A43dF5E1C27001e55C24B"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1717520639,
"transactionHash": "0xdbb03a14ea223de3db4ac0916e78123bd0a1dde68e98952326d8382d29ac4d61",
"implementations": [
"eth:0x12f893689f9603991a8c22C249FFd0509Be95661"
]
},
{
"timestamp": 1725887363,
"transactionHash": "0x21aec24a9df97ce4886d699314be627b0818da4d1987349421fb3df102c43f2b",
"implementations": [
"eth:0x509dA1BE24432F8804C4A9FF4a3c3f80284CDd13"
]
},
{
"timestamp": 1736352035,
"transactionHash": "0xc90d135e4b8ab58304853f3be34b2fefd18c2a817d3d250e7b669e024d5277c5",
"implementations": [
"eth:0x0029e562c0b54C0b88cB22adF4346DbfEC87400c"
]
},
{
"timestamp": 1743408047,
"transactionHash": "0x96a2f14c85022136ab3d4e568e9f1fe8f4611a4a2597f979332840259378f6b3",
"implementations": [
"eth:0xb720523EC3c615b069453bF4B0584CEbF034706f"
]
},
{
"timestamp": 1745843591,
"transactionHash": "0x1fbaad1ac4bffb295da999881a37c1a52751ccad9b1533c0d2400fdca3631132",
"implementations": [
"eth:0xcdd748d4A80CE6831080f1dA2CA9084CDa87Cc87"
]
},
{
"timestamp": 1750343219,
"transactionHash": "0x56b626590d1042673f7cf09f480533e8084d3e6141dc079fba657b1cc2ec17eb",
"implementations": [
"eth:0x08A98B1048Fb61E9Fff7d7d98305aC6286Ae9F32"
]
},
{
"timestamp": 1760519351,
"transactionHash": "0xa022a2ce09b145eb5d0c4342b3f3583e79b66ee7205ab986322be819f277ba83",
"implementations": [
"eth:0xc89423b4909080fB8F8A43dF5E1C27001e55C24B"
]
}
],
"description": "The main registry (hub) for all the contracts in the ZK stack cluster and central entrypoint for bridge transactions. Stores important mappings like from chainId to diamond address, from chainId to parent CTM, from chainId to base token etc. A clone of Bridgehub is also deployed on each L2 chain, but this clone is only used on settlement layers.\n* Roles:\n * **admin**: EraChainAdminProxy, ProxyAdmin; ultimately EmergencyUpgradeBoard, Matter Labs Multisig\n * **owner**: ProtocolUpgradeHandler; ultimately EmergencyUpgradeBoard",
"upgradableBy": [
{
"name": "EmergencyUpgradeBoard",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x303a465B659cBB0ab36eE643eA362c509EEb5213#code"
},
{
"name": "MessageRoot",
"isVerified": true,
"address": "eth:0x5Ce9257755391D1509cD4eC1899d3F88A57BB4aD",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1"
],
"implementations": [
"eth:0x669ed5BB1377C917333e7d4223ce3419EE4099fD"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1739109035,
"transactionHash": "0xc47e24e8cc6c7a493bbb1a46b74f1ff113fad2e35d7596aa688df5bf0402fc65",
"implementations": [
"eth:0x19347Fb8eD3E8e35eb4a01c8B18Bd330194Cf0ad"
]
},
{
"timestamp": 1750343219,
"transactionHash": "0x56b626590d1042673f7cf09f480533e8084d3e6141dc079fba657b1cc2ec17eb",
"implementations": [
"eth:0x382fb241396eA915108e7B7Ce1adE1322bA73aeE"
]
},
{
"timestamp": 1760519351,
"transactionHash": "0xa022a2ce09b145eb5d0c4342b3f3583e79b66ee7205ab986322be819f277ba83",
"implementations": [
"eth:0x669ed5BB1377C917333e7d4223ce3419EE4099fD"
]
}
],
"description": "Aggregates remote bridge message roots from all ZK stack chains. To be used with the Gateway when deployed.\n* Roles:\n * **admin**: ProxyAdmin; ultimately EmergencyUpgradeBoard",
"upgradableBy": [
{
"name": "EmergencyUpgradeBoard",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x5Ce9257755391D1509cD4eC1899d3F88A57BB4aD#code"
},
{
"name": "CTMDeploymentTracker",
"isVerified": true,
"address": "eth:0x6078F6B379f103de1Aa912dc46bb8Df0c8809860",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1"
],
"implementations": [
"eth:0x00e9d8A4b35C32880A10Feb391aDEDA0D3F90991"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1739109203,
"transactionHash": "0x8b5a21b3473a638022e84097a99c4668bb0a454686b737e87957729c4822741b",
"implementations": [
"eth:0x1E405E5cdF127Dc98Eb490AB0e97345f892Ff7E1"
]
},
{
"timestamp": 1760519351,
"transactionHash": "0xa022a2ce09b145eb5d0c4342b3f3583e79b66ee7205ab986322be819f277ba83",
"implementations": [
"eth:0x00e9d8A4b35C32880A10Feb391aDEDA0D3F90991"
]
}
],
"description": "Asset deployment tracker where the 'asset' is a ChainTypeManager. The registering of asset IDs for ChainTypeManagers is necessary to be able to migrate them to a given settlement layer, for example the Gateway.\n* Roles:\n * **admin**: ProxyAdmin; ultimately EmergencyUpgradeBoard",
"upgradableBy": [
{
"name": "EmergencyUpgradeBoard",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x6078F6B379f103de1Aa912dc46bb8Df0c8809860#code"
},
{
"name": "RollupL1DAValidator",
"isVerified": true,
"address": "eth:0x72213dfe8CA61B0A782970dCFebFb877778f9119",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Contract that verifies the data availability of ethereum calldata and blobs. Can be used by ZK stack rollups as the L1 part of a DAValidator pair.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x72213dfe8CA61B0A782970dCFebFb877778f9119#code"
},
{
"name": "ChainTypeManager",
"isVerified": true,
"address": "eth:0xc2eE6b6af7d616f6e27ce7F4A451Aedc2b0F5f5C",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1"
],
"implementations": [
"eth:0x4aB7204e4205c96C32E23ADa9191720976dC084f"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1717520663,
"transactionHash": "0x514bbf46d227eee8567825bf5c8ee1855aa8a1916f7fee7b191e2e3d5ecba849",
"implementations": [
"eth:0x8279B7E48fA074f966385d87AEf29Bd031e54fD5"
]
},
{
"timestamp": 1722934619,
"transactionHash": "0xc1e73b06359759201b76ab7654e0bd49011f33c0230dfc24423985fbf36ea817",
"implementations": [
"eth:0xed1Dc7F0Be2B19cb02a2476150C8ea24A37c5274"
]
},
{
"timestamp": 1736352035,
"transactionHash": "0xc90d135e4b8ab58304853f3be34b2fefd18c2a817d3d250e7b669e024d5277c5",
"implementations": [
"eth:0xb39B175a5E0945F2FB6A7F31764c0e31D9cF5b75"
]
},
{
"timestamp": 1743408047,
"transactionHash": "0x96a2f14c85022136ab3d4e568e9f1fe8f4611a4a2597f979332840259378f6b3",
"implementations": [
"eth:0xA3bCcAEe38cb0273A979118a0DE483E47D50F6Cb"
]
},
{
"timestamp": 1745843591,
"transactionHash": "0x1fbaad1ac4bffb295da999881a37c1a52751ccad9b1533c0d2400fdca3631132",
"implementations": [
"eth:0x6D598c77AF57Bfa17201483400615c61819dD45A"
]
},
{
"timestamp": 1750343219,
"transactionHash": "0x56b626590d1042673f7cf09f480533e8084d3e6141dc079fba657b1cc2ec17eb",
"implementations": [
"eth:0x345314c7E4af84B763d98d23f772622E23AfB5CE"
]
},
{
"timestamp": 1760519351,
"transactionHash": "0xa022a2ce09b145eb5d0c4342b3f3583e79b66ee7205ab986322be819f277ba83",
"implementations": [
"eth:0x4aB7204e4205c96C32E23ADa9191720976dC084f"
]
}
],
"description": "Defines L2 diamond contract versions, creation and upgrade data and the proof system for all ZK stack chains connected to it. ZK chains are children of this central contract and can only upgrade to versions that were previously registered here. The current protocol version is 0,29,2.\n* Roles:\n * **admin**: EraChainAdminProxy, ProxyAdmin; ultimately EmergencyUpgradeBoard, Matter Labs Multisig\n * **owner**: ProtocolUpgradeHandler; ultimately EmergencyUpgradeBoard",
"upgradableBy": [
{
"name": "EmergencyUpgradeBoard",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xc2eE6b6af7d616f6e27ce7F4A451Aedc2b0F5f5C#code"
},
{
"name": "L1Nullifier",
"isVerified": true,
"address": "eth:0xD7f9f54194C633F36CCD5F3da84ad4a1c38cB2cB",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1"
],
"implementations": [
"eth:0x71759C4eA628293F5a99aAB1585dF1c8dA4718e0"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1717521479,
"transactionHash": "0xce3d72f23297a281cb58502dcc6a6c029489316a2faf9c4ef83141b1b254017c",
"implementations": [
"eth:0xCba1aF8f0bB223b2544F8eB8f69d1c7960f788dB"
]
},
{
"timestamp": 1724658671,
"transactionHash": "0xaec33529b74f8f9d56d7aa568c6358be299228a85e49ea85cb106eca5af7367c",
"implementations": [
"eth:0xb56A8225A745756DD215faf22E4796f373561AcD"
]
},
{
"timestamp": 1736352035,
"transactionHash": "0xc90d135e4b8ab58304853f3be34b2fefd18c2a817d3d250e7b669e024d5277c5",
"implementations": [
"eth:0xF5A14DCdde1143443f06033200D345c2a2828A99"
]
},
{
"timestamp": 1743408047,
"transactionHash": "0x96a2f14c85022136ab3d4e568e9f1fe8f4611a4a2597f979332840259378f6b3",
"implementations": [
"eth:0xda2866AF0e170d0867a3F3bB52Db10D6E09Df78A"
]
},
{
"timestamp": 1745843591,
"transactionHash": "0x1fbaad1ac4bffb295da999881a37c1a52751ccad9b1533c0d2400fdca3631132",
"implementations": [
"eth:0x3B4FD84B27fE7B9247d5B8C6d1A29B2889C81518"
]
},
{
"timestamp": 1750343219,
"transactionHash": "0x56b626590d1042673f7cf09f480533e8084d3e6141dc079fba657b1cc2ec17eb",
"implementations": [
"eth:0xC6f08EFb7BA78f40d00F41aFAC00211d59eb9431"
]
},
{
"timestamp": 1760519351,
"transactionHash": "0xa022a2ce09b145eb5d0c4342b3f3583e79b66ee7205ab986322be819f277ba83",
"implementations": [
"eth:0x71759C4eA628293F5a99aAB1585dF1c8dA4718e0"
]
}
],
"description": "Contract responsible for bookkeeping L1 bridging transactions. Used to finalize withdrawals and reclaim failed deposits. Does not escrow funds.\n* Roles:\n * **admin**: ProxyAdmin; ultimately EmergencyUpgradeBoard\n * **owner**: ProtocolUpgradeHandler; ultimately EmergencyUpgradeBoard",
"upgradableBy": [
{
"name": "EmergencyUpgradeBoard",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xD7f9f54194C633F36CCD5F3da84ad4a1c38cB2cB#code"
},
{
"name": "ProtocolUpgradeHandler",
"isVerified": true,
"address": "eth:0xE30Dca3047B37dc7d88849dE4A4Dc07937ad5Ab3",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x1e4c534e7ce1FF5621Ea506D99b367D7d8EFbE3e"
],
"implementations": [
"eth:0x36625Bd3dDB469377C6e9893712158cA3c0cC14B"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1738855967,
"transactionHash": "0xa3d1fa107e6dc4ce67d92a5af74aa7dc34602c2a1d46727790819c1f974bed95",
"implementations": [
"eth:0xD5e9D3d483a93d03D8d604CC79dC9f2F4B78C604"
]
},
{
"timestamp": 1743408047,
"transactionHash": "0x96a2f14c85022136ab3d4e568e9f1fe8f4611a4a2597f979332840259378f6b3",
"implementations": [
"eth:0x0A67f0Fd2f7523057039F14969Fe23a5f620f19A"
]
},
{
"timestamp": 1760519471,
"transactionHash": "0x2309df20dd1cb3f3a3289e97517d10d399989292f966578240ec387246a13e61",
"implementations": [
"eth:0x36625Bd3dDB469377C6e9893712158cA3c0cC14B"
]
}
],
"description": "The central upgrade contract and Governance proxy for all ZK stack contracts. Accepts successful DAO proposals from L2 and emergency proposals from the EmergencyUpgradeBoard. The three members of the EmergencyUpgradeBoard also have special roles and permissions in this contract.\n* Roles:\n * **admin**: ProxyAdmin; ultimately EmergencyUpgradeBoard\n * **emergencyUpgradeBoard**: EmergencyUpgradeBoard\n * **guardians**: Guardians\n * **l2_protocol_governor**: ProtocolTimelockController(L2->L1)\n * **securityCouncil**: SecurityCouncil",
"upgradableBy": [
{
"name": "EmergencyUpgradeBoard",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xE30Dca3047B37dc7d88849dE4A4Dc07937ad5Ab3#code"
},
{
"name": "RollupDAManager",
"isVerified": true,
"address": "eth:0xE689e79a06D3D09f99C21E534cCF6a8b7C9b3C45",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Simple registry for allowed DA address pairs for the 'rollup' data availability mode (can be permanently enforced with isPermanentRollup=true). Rollup DA address pairs (especially the L1 part) usually point to contracts that validate if data was made available on Ethereum.\n* Roles:\n * **owner**: ProtocolUpgradeHandler; ultimately EmergencyUpgradeBoard",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xE689e79a06D3D09f99C21E534cCF6a8b7C9b3C45#code"
},
{
"name": "ChainAdminOwnable",
"isVerified": true,
"address": "eth:0x86F4487949Ac2fb0d5735870f1731e879e1d9680",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A governance proxy that lets Caldera Multisig 3 act through it.\n* Roles:\n * **owner**: Caldera Multisig 3",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x86F4487949Ac2fb0d5735870f1731e879e1d9680#code"
},
{
"name": "EraChainAdminProxy",
"isVerified": true,
"address": "eth:0x2cf3bD6a9056b39999F3883955E183F655345063",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A governance proxy that lets Matter Labs Multisig act through it.\n* Roles:\n * **owner**: Matter Labs Multisig",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x2cf3bD6a9056b39999F3883955E183F655345063#code"
},
{
"name": "L1VerifierFflonk",
"isVerified": true,
"address": "eth:0x1AC4F629Fdc77A7700B68d03bF8D1A53f2210911",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Verifies a zk-SNARK proof using an implementation of the fflonk proof system.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x1AC4F629Fdc77A7700B68d03bF8D1A53f2210911#code"
},
{
"name": "L1VerifierPlonk",
"isVerified": true,
"address": "eth:0x2db2ffdecb7446aaab01FAc3f4D55863db3C5bd6",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Verifies a zk-SNARK proof using an implementation of the PlonK proof system.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x2db2ffdecb7446aaab01FAc3f4D55863db3C5bd6#code"
},
{
"name": "DualVerifier",
"isVerified": true,
"address": "eth:0xD71DDC9956781bf07DbFb9fCa891f971dbE9868A",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A router contract for verifiers. Routes verification requests to L1VerifierFflonk or L1VerifierPlonk depending on the supplied proof type.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xD71DDC9956781bf07DbFb9fCa891f971dbE9868A#code"
},
{
"name": "ProxyAdmin",
"isVerified": true,
"address": "eth:0x1e4c534e7ce1FF5621Ea506D99b367D7d8EFbE3e",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "* Roles:\n * **owner**: ProtocolUpgradeHandler",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x1e4c534e7ce1FF5621Ea506D99b367D7d8EFbE3e#code"
},
{
"name": "ProxyAdmin",
"isVerified": true,
"address": "eth:0x257FC0c3EB02F7ba8C0fd3eD57692A9c1ee6D29B",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "* Roles:\n * **owner**: EraChainAdminProxy",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0x257FC0c3EB02F7ba8C0fd3eD57692A9c1ee6D29B#code"
},
{
"name": "L1NativeTokenVault",
"isVerified": true,
"address": "eth:0xbeD1EB542f9a5aA6419Ff3deb921A372681111f6",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1"
],
"implementations": [
"eth:0x8E1C5A8c5d8C33ed0eC756d6f4006f2D875bA083"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1739109131,
"transactionHash": "0x50619c1506e8e93cc28017847b5690b6a0784bc2b08c1dbb8555b71525b72351",
"implementations": [
"eth:0x40B1060a114380f40faC6869c5B383f47e61530c"
]
},
{
"timestamp": 1745843591,
"transactionHash": "0x1fbaad1ac4bffb295da999881a37c1a52751ccad9b1533c0d2400fdca3631132",
"implementations": [
"eth:0xDf3a3E51aEABB5da548F854B608E3C9De1ae2947"
]
},
{
"timestamp": 1750343219,
"transactionHash": "0x56b626590d1042673f7cf09f480533e8084d3e6141dc079fba657b1cc2ec17eb",
"implementations": [
"eth:0xBa05B8B761386289Ba413a74AF1933d6a76E1b52"
]
},
{
"timestamp": 1760519351,
"transactionHash": "0xa022a2ce09b145eb5d0c4342b3f3583e79b66ee7205ab986322be819f277ba83",
"implementations": [
"eth:0x8E1C5A8c5d8C33ed0eC756d6f4006f2D875bA083"
]
}
],
"description": "Canonical central asset escrow for all ZK stack chains.\n* Roles:\n * **admin**: ProxyAdmin; ultimately EmergencyUpgradeBoard\n * **owner**: ProtocolUpgradeHandler; ultimately EmergencyUpgradeBoard",
"upgradableBy": [
{
"name": "EmergencyUpgradeBoard",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xbeD1EB542f9a5aA6419Ff3deb921A372681111f6#code"
},
{
"name": "ProxyAdmin",
"isVerified": true,
"address": "eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "* Roles:\n * **owner**: ProtocolUpgradeHandler",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1#code"
},
{
"name": "ChainAssetHandler",
"isVerified": true,
"address": "eth:0xDd5CB8B9037357B4cD37391A073798f8aaB61076",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xC2a36181fB524a6bEfE639aFEd37A67e77d62cf1"
],
"implementations": [
"eth:0xaa180C70126f751C164465638770B865965A744B"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1758286391,
"transactionHash": "0x960c2e5bb98f4b9a07087b3b50fdc4681bbea1467aab3748dbb0050311f54ede",
"implementations": [
"eth:0xaa180C70126f751C164465638770B865965A744B"
]
}
],
"description": "Specialized contract for managing chain assets, i.e. chain migrations.\n* Roles:\n * **admin**: ProxyAdmin; ultimately EmergencyUpgradeBoard\n * **owner**: ProtocolUpgradeHandler; ultimately EmergencyUpgradeBoard",
"upgradableBy": [
{
"name": "EmergencyUpgradeBoard",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xDd5CB8B9037357B4cD37391A073798f8aaB61076#code"
},
{
"name": "ServerNotifier",
"isVerified": true,
"address": "eth:0xfca808A744735D9919EEBe4660B8Fd897456Ce31",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x257FC0c3EB02F7ba8C0fd3eD57692A9c1ee6D29B"
],
"implementations": [
"eth:0x555D040F4A089D1dF14B372a87C5aF8FA37BDB7A"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1747199375,
"transactionHash": "0xbeb7447fc88b154a4730b01cb1a75b7093095056e88818c3659253111d06e66f",
"implementations": [
"eth:0x555D040F4A089D1dF14B372a87C5aF8FA37BDB7A"
]
}
],
"description": "A simple contract that can be called by the ChainAdmin to emit notifications about chain migrations.\n* Roles:\n * **admin**: ProxyAdmin; ultimately Matter Labs Multisig",
"upgradableBy": [
{
"name": "Matter Labs Multisig",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/eth:0xfca808A744735D9919EEBe4660B8Fd897456Ce31#code"
}
],
"zksync2": [
{
"name": "ProtocolTimelockController",
"isVerified": true,
"address": "zksync:0x085b8B6407f150D62adB1EF926F7f304600ec714",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "zksync2",
"description": "Timelock contract allowing the queueing of transactions with a minimum delay of 0s.\n* Roles:\n * **canceller**: ZkProtocolGovernor\n * **executor**: ZkProtocolGovernor\n * **proposer**: ZkProtocolGovernor\n * **timelockAdmin**: ProtocolTimelockController; ultimately ZkProtocolGovernor",
"discoveryDrivenData": true,
"url": "https://explorer.zksync.io/address/zksync:0x085b8B6407f150D62adB1EF926F7f304600ec714#code"
},
{
"name": "ZkToken",
"isVerified": true,
"address": "zksync:0x5A7d6b2F92C77FAD6CCaBd7EE0624E64907Eaf3E",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"zksync:0xdB1E46B448e68a5E35CB693a99D59f784aD115CC"
],
"implementations": [
"zksync:0x4fcd824D304e9b1584CdBb582c104BDcbFb11274"
]
},
"chain": "zksync2",
"pastUpgrades": [
{
"timestamp": 1716317326,
"transactionHash": "0x5bfce59c2ad18019ef20d58a3f1ec496cdc85537fc9564c932f7dcbbb2a15b56",
"implementations": [
"zksync:0x3931e73ebA79a7C898D3b0e02c7C62bA4F11cB14"
]
},
{
"timestamp": 1718011538,
"transactionHash": "0xa6bc022ba0f60ac6f10a6efb84b261e9ca1b327a611bdd7a1f4d37cc9b027a3c",
"implementations": [
"zksync:0x01a6715d3560241E09E865a46122bf347A576c09"
]
},
{
"timestamp": 1765195612,
"transactionHash": "0x749b9e6eed328052d679eb86639be807b4acf811ac8786f730b45258ba41ce6f",
"implementations": [
"zksync:0x4fcd824D304e9b1584CdBb582c104BDcbFb11274"
]
}
],
"description": "The ZK token contract on ZKsync Era. Mintable through access control roles. Used for voting in the ZK stack governance system.\n* Roles:\n * **admin**: ZkTokenProxyAdmin; ultimately ProtocolUpgradeHandler_l2Alias\n * **defaultAdmin**: ProtocolUpgradeHandler_l2Alias\n * **minterAdmin**: ZkTokenTimelockController; ultimately ZkTokenGovernor",
"upgradableBy": [
{
"id": "ProtocolUpgradeHandler_l2Alias",
"name": "ProtocolUpgradeHandler_l2Alias",
"delay": "no"
}
],
"discoveryDrivenData": true,
"url": "https://explorer.zksync.io/address/zksync:0x5A7d6b2F92C77FAD6CCaBd7EE0624E64907Eaf3E#code"
},
{
"name": "GovOpsTimelockController",
"isVerified": true,
"address": "zksync:0xC9E442574958f96C026DeF9a50C3236cab17428a",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "zksync2",
"description": "Timelock contract allowing the queueing of transactions with a minimum delay of 3d.\n* Roles:\n * **canceller**: ZkGovOpsGovernor\n * **executor**: ZkGovOpsGovernor\n * **proposer**: ZkGovOpsGovernor\n * **timelockAdmin**: GovOpsTimelockController; ultimately ZkGovOpsGovernor",
"discoveryDrivenData": true,
"url": "https://explorer.zksync.io/address/zksync:0xC9E442574958f96C026DeF9a50C3236cab17428a#code"
},
{
"name": "ZkTokenProxyAdmin",
"isVerified": true,
"address": "zksync:0xdB1E46B448e68a5E35CB693a99D59f784aD115CC",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "zksync2",
"description": "* Roles:\n * **owner**: ProtocolUpgradeHandler_l2Alias",
"discoveryDrivenData": true,
"url": "https://explorer.zksync.io/address/zksync:0xdB1E46B448e68a5E35CB693a99D59f784aD115CC#code"
},
{
"name": "ZkTokenTimelockController",
"isVerified": true,
"address": "zksync:0xe5d21A9179CA2E1F0F327d598D464CcF60d89c3d",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "zksync2",
"description": "Timelock contract allowing the queueing of transactions with a minimum delay of 3d.\n* Roles:\n * **canceller**: ZkTokenGovernor\n * **executor**: ZkTokenGovernor\n * **proposer**: ZkTokenGovernor\n * **timelockAdmin**: ZkTokenTimelockController; ultimately ZkTokenGovernor",
"discoveryDrivenData": true,
"url": "https://explorer.zksync.io/address/zksync:0xe5d21A9179CA2E1F0F327d598D464CcF60d89c3d#code"
}
]
},
"escrows": [],
"programHashes": [
{
"title": "Boojum L2 Bootloader program",
"description": "EraVM program that proves the correct execution of a batch of ZK Stack L2 blocks.",
"programUrl": "https://github.com/matter-labs/era-contracts/blob/v0.28.0/system-contracts/bootloader/bootloader.yul",
"proverSystemProject": "boojum",
"verificationStatus": "successful",
"verificationSteps": "\nPrepare:\n\n1. Install npm and yarn: `npm install --global yarn`\n2. Install hardhat: `npm install -g hardhat`\n3. Install foundry-zksync: `curl -L https://raw.githubusercontent.com/matter-labs/foundry-zksync/main/install-foundry-zksync | bash` from [here](https://foundry-book.zksync.io/introduction/installation/).\n\nVerify:\n\n1. Checkout the correct branch in [era-contracts](https://github.com/matter-labs/era-contracts) repo: `git checkout v0.28.0`. Commit hash should be `cfd77cb6bc9ab3d751d42c6161f1b393a9c51647`.\n2. Execute recompute_hashes.sh script: `chmod +x recompute_hashes.sh` and `./recompute_hashes.sh`. Note that the script may require a specific version of `foundryup-zksync` and it will suggest the command to install it. However you might need to manually clear git working tree in the repo foundry-zksync (probably in ~/.foundry/matter-labs/foundry-zksync) to change versions.\n ",
"hash": "0x0100085f9382a7928dd83bfc529121827b5f29f18b9aa10d18aa68e1be7ddc35"
}
],
"risks": [
{
"category": "Funds can be stolen if",
"text": "a contract receives a malicious code upgrade. There is a 4d 3h - 8d 3h delay on code upgrades unless upgrade is initiated by the EmergencyUpgradeBoard in which case there is no delay."
}
]
}
+1 -1
{
"baseTimestamp": 1768825040,
"baseTimestamp": 1768995818,
"contractsDiscoDriven": true,
"hasDiscoUi": true,
"isDiscoDriven": true,
"permissionsDiscoDriven": true
}
+5 -0
+5 -0
{
"daLayer": "avail",
"name": "Vector",
"relayerType": {
"value": "Permissioned",
"sentiment": "warning",
"description": "Only whitelisted relayers can post attestations to this bridge."
},
"risks": {
"committeeSecurity": {
"value": "Validator set",
"sentiment": "good",
"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 Participation in the committee is permissionless, based only on stake requirements and an honest majority of validators processing the new operator's request to join the active set.",
"orderHint": 2
},
"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": "No mechanism",
"sentiment": "bad",
"description": "The relayer role is permissioned, and the DA bridge does not have a Security Council or a governance mechanism to propose new relayers. In case of relayer failure, the DA bridge will halt and be unable to recover without the intervention of a centralized entity."
}
},
"technology": {
"description": "\n## Architecture\n\n\n\nThe Vector bridge is a data availability bridge that facilitates data availability commitments to be bridged between Avail and Ethereum.\nThe SP1 Vector bridge is composed of three main components: the **Vector** contract, the **Succinct Gateway** contracts, and the **Verifier** contracts.
\nBy default, Vector operates asynchronously, handling requests in a fulfillment-based manner. First, zero-knowledge proofs of Avail block ranges are requested for proving. Requests can be submitted either off-chain through the Succinct API, or onchain through the requestCall() method of the Succinct Gateway smart contract.\nAlternatively, it is possible to run an SP1 Vector operator with local proving, allowing for self-generating the proofs.\nOnce a proving request is received, the off-chain prover generates the proof and relays it to the Vector contract. The Vector contract verifies the proof with the corresponding verifier contract and, if successful, stores the data commitment in storage.
\n\nBy default, Vector on Ethereum is updated by the Succinct operator at a cadence of approximately 1.5 hours.",
"references": [
{
"title": "SP1 Vector Operator",
"url": "https://github.com/succinctlabs/sp1-vector/blob/a9689768ff4052e0933cc575b79001d4bcfa0cd5/script/bin/operator.rs"
},
{
"title": "Succinct Gateway - Etherscan",
"url": "https://etherscan.io/address/0x6c7a05e0AE641c6559fD76ac56641778B6eCd776#code#F1#L148"
}
],
"risks": [
{
"category": "Funds can be lost if",
"text": "the DA bridge accepts an incorrect or malicious data commitment provided by 2/3 of Avail validators."
},
{
"category": "Funds can be frozen if",
"text": "excluding L2-specific DA fallback - the permissioned relayers are unable to submit DA commitments to the Vector contract."
}
]
},
"usedIn": [
{
"id": "lens",
"name": "Lens",
"slug": "lens"
},
{
"id": "sophon",
"name": "Sophon",
"slug": "sophon"
},
{
"id": "sxt",
"name": "Space and Time",
"slug": "sxt"
}
],
"validationType": {
"value": "Validity Proof",
"description": "The DA attestation requires onchain SNARK proof verification to be accepted by the bridge. Operators signatures and their corresponding stake are verified as part of the proof.",
"zkCatalogId": "sp1"
}
}