2a46bd43 (main)
and
ce709a88 (PR)
+4 -4
+1 -1
{
"dataAvailability": [
{
"name": "Data published onchain",
"description": "Account delta data is published onchain as blobs. A prover migration (gnark/MIMC → plonky2/Poseidon2) at block 23,711,820 left pre-migration blobs undecodable, but Lighter published a full state snapshot at batch #166859 (blobs.zip) that closes the gap. L2BEAT reproduced the snapshot state root from blobs and verified the roll-forward to chain head, confirming the live state is reconstructable from L1.",
"risks": [],
"references": [
{
"title": "Lighter Prover v0.0.1 (first public release, Dec 2025)",
"url": "https://github.com/elliottech/lighter-prover"
},
{
"title": "StateRootUpdate event — gnark to plonky2 migration",
"url": "https://etherscan.io/tx/0x6a50b2b00444914e5c53df2fb48404078a098f93fc3911e6fcbde1c7b6418225"
},
{
"title": "Desert exit circuit + state snapshot (blobs.zip)",
"url": "https://github.com/elliottech/lighter-prover/tree/main/desertexit"
}
]
}
],
"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 are expected to exit by reconstructing the latest settled state and providing a ZK proof of balance. The desert exit circuit and a full state snapshot at batch #166859 are public, and the deployed DesertVerifier matches a rebuild from that circuit. L2BEAT reproduced the snapshot state root from L1 blobs and verified the roll-forward to chain head.",
"risks": [],
"references": [
{
"title": "Desert exit circuit + state snapshot",
"url": "https://github.com/elliottech/lighter-prover/tree/main/desertexit"
}
]
}
],
"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 both normal and 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/0xf7b964eD0C05a7aA12fdC54865295531C9D2AEC1#code#F1#L54"
"url": "https://etherscan.io/address/0x9Ca512d2F131134972EB95515325F69812395332#code#F1#L54"
},
{
"title": "Desert verifier verification keys",
"url": "https://etherscan.io/address/0x866418061d4C1168e1c8E8f6facE79675395E008#code#F1#L55"
}
]
}
]
},
"upgradesAndGovernance": {
"content": "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."
}
}
+2 -2
{
"addresses": {
"ethereum": [
{
"name": "Lighter",
"isVerified": true,
"address": "eth:0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7",
"upgradeability": {
"proxyType": "zkLighter proxy",
"admins": [
"eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67"
],
"implementations": [
"eth:0x8D692294a4824d868e35B3CEcd734aCf41B2342e",
"eth:0xaA5e1aaa81a39F828248ffFeaDC77CcEC8eC3906"
]
},
"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/0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7#code"
},
{
"name": "DesertVerifier",
"isVerified": true,
"address": "eth:0x866418061d4C1168e1c8E8f6facE79675395E008",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x866418061d4C1168e1c8E8f6facE79675395E008#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/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/0xa464DA0B43f80EE3FfC4795cbbFC78472b5c81A1#code"
},
{
"name": "ZkLighterVerifier",
"isVerified": true,
"address": "eth:0xac3Ce44B6ff4E402858C99D5699ff63131572BaA",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67"
],
"implementations": [
"eth:0xf7b964eD0C05a7aA12fdC54865295531C9D2AEC1"
"eth:0x9Ca512d2F131134972EB95515325F69812395332"
]
},
"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/0xac3Ce44B6ff4E402858C99D5699ff63131572BaA#code"
}
]
},
"escrows": [
{
"address": "0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7",
"sinceTimestamp": 1737090335,
"tokens": [
"USDC",
"ETH",
"LIT",
"LINK",
"AAVE",
"UNI",
"SKY",
"LDO",
"AZTEC"
],
"contract": {
"isVerified": true,
"address": "eth:0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7",
"upgradeability": {
"proxyType": "zkLighter proxy",
"admins": [
"eth:0x94da8A995D0D82Ef0fE7E509C6D76c22603B6f67"
],
"implementations": [
"eth:0x8D692294a4824d868e35B3CEcd734aCf41B2342e",
"eth:0xaA5e1aaa81a39F828248ffFeaDC77CcEC8eC3906"
]
},
"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
}
],
"zkVerifiers": [
"eth:0xf7b964eD0C05a7aA12fdC54865295531C9D2AEC1",
"eth:0x9Ca512d2F131134972EB95515325F69812395332",
"eth:0x866418061d4C1168e1c8E8f6facE79675395E008"
]
}
+1 -1
{
"baseTimestamp": 1787230600,
"baseTimestamp": 1787570248,
"contractsDiscoDriven": true,
"hasDiscoUi": true,
"isDiscoDriven": true,
"permissionsDiscoDriven": true
}
+10 -10
+2 -2
[
{
"address": "0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d",
"sinceTimestamp": 1782477747,
"tokens": [
"ETH",
"USDG",
"AAPL",
"AMZN",
"GOOGL",
"META",
"MSFT",
"NVDA",
"TSLA",
"ORCL",
"SPCX",
"BABA",
"USAR",
"USO",
"COIN",
"CRCL",
"QQQ",
"SPY",
"SGOV",
"SLV",
"AMD",
"INTC",
"MU",
"SNDK",
"CRWV",
"PLTR"
],
"contract": {
"isVerified": true,
"address": "robinhood:0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d",
"upgradeability": {
"proxyType": "zkLighter proxy",
"admins": [
"robinhood:0x43CfF77CD060A155dCe5deb12B93b875f69F2716"
],
"implementations": [
"robinhood:0xE470e41Cacc197EA07f879577765A8c81234ED7B",
"robinhood:0x1be72833f96e47366610CCFb9Bec081FE69EECf5"
"robinhood:0x82DE5B1161C93afDFE21bA0D5343f01Cd7401d90",
"robinhood:0xDa2B59fFB41485a6f21E14e479AE7B7AB29a997c"
]
},
"chain": "robinhood",
"description": "Main Lighter contract on Robinhood Chain. It escrows USDG used as margin as well as ETH and Robinhood tokenized equities and ETFs used for spot trading, and credits the corresponding balances inside Lighter.",
"url": "https://robinhoodchain.blockscout.com/address/0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d#code"
},
"chain": "robinhood",
"chainId": 4663
}
]
+1 -1
{
"dataAvailability": [
{
"name": "State differences posted on Robinhood Chain",
"description": "The state differences required to reconstruct and prove the Lighter state are included directly in commitBatch calldata on Robinhood Chain. Unlike the Ethereum deployment, the Lighter contract does not read EIP-4844 blob hashes. Robinhood Chain subsequently batches its own transaction data to Ethereum blobs.",
"risks": [],
"references": [
{
"title": "Example commitBatch transaction on Robinhood Chain",
"url": "https://robinhoodchain.blockscout.com/tx/0x73360fb1c909946ab6eba200a1dfc8c70065c04784dadcbc0ca090c1788fd7a3"
},
{
"title": "Robinhood Chain architecture documentation",
"url": "https://docs.robinhood.com/chain/"
}
]
}
],
"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 are expected to exit by reconstructing the latest settled state and providing a ZK proof of balance.",
"risks": [],
"references": [
{
"title": "Deployed DesertVerifier on Robinhood Chain",
"url": "https://robinhoodchain.blockscout.com/address/0x56aeED6920DBB9E198C2C0072147A45684A06E10"
}
]
}
],
"forceTransactions": {
"name": "Priority requests can be submitted on Robinhood Chain",
"description": "Users can submit priority requests directly to the Lighter contract on Robinhood Chain. If the operators leave the oldest request unprocessed for more than 14d, anyone can activate desert mode.",
"risks": [],
"references": [
{
"title": "Lighter contract on Robinhood Chain",
"url": "https://robinhoodchain.blockscout.com/address/0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d"
}
]
},
"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. The network governor can add or remove validators.",
"risks": [
{
"category": "MEV can be extracted if",
"text": "the operator exploits their centralized position and frontruns user transactions."
}
],
"references": []
},
"otherConsiderations": [
{
"name": "USDG is the quote and margin asset",
"description": "Unlike the Ethereum deployment, this fork uses Global Dollar (USDG) instead of USDC as the quote and margin asset.",
"risks": [],
"references": [
{
"title": "Robinhood Chain token contracts",
"url": "https://docs.robinhood.com/chain/contracts/"
},
{
"title": "Robinhood Wallet perpetual futures documentation",
"url": "https://robinhood.com/us/en/support/articles/robinhood-wallet-perpetual-futures/"
}
]
},
{
"name": "External oracles used for index prices",
"description": "Lighter uses external oracles to determine index prices. External signatures are not verified by the settlement contract 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. These proofs are verified on Robinhood Chain by a smart contract. In desert mode, users can provide proofs of their balances to exit, which is validate by the DesertVerifier.",
"categories": [
{
"title": "Verification Keys Generation",
"description": "Lighter uses a Plonk-based proof system which requires a trusted setup. The verification keys are hardcoded in the verifier contract on-chain. The Lighter prover repository contains a [script](https://github.com/elliottech/lighter-prover/blob/main/build_circuits.sh) that regenerates circuits and verification keys, but it does not reproduce the verification keys used by this deployment.",
"references": [
{
"title": "ZK Lighter verifier verification keys",
"url": "https://robinhoodchain.blockscout.com/address/0xA3c70B197AcE329D9e09C753DA7874B78F1D00f4"
"url": "https://robinhoodchain.blockscout.com/address/0x61CA82e45F5a57d00E66b522Be72D8bA41e634Aa"
}
]
},
{
"title": "Validity proofs",
"description": "State updates are verified by the ZkLighterVerifier contract. 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).",
"risks": [],
"references": [
{
"title": "Deployed DesertVerifier implementation",
"url": "https://robinhoodchain.blockscout.com/address/0x56aeED6920DBB9E198C2C0072147A45684A06E10"
}
]
}
]
}
}
+6 -6
{
"addresses": {
"robinhood": [
{
"name": "UpgradeGatekeeper",
"isVerified": true,
"address": "robinhood:0x43CfF77CD060A155dCe5deb12B93b875f69F2716",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "robinhood",
"description": "Governance contract functioning like an upgrade timelock for downstream contracts. The current delay is 21d and can be entirely skipped by 0x4972E0CaCb2AC45644BA054838e96fF4f6f7eFDb.\n* Roles:\n * **getMaster**: SafeL2\n * **securityCouncilAddress**: Lighter Security Council",
"discoveryDrivenData": true,
"url": "https://robinhoodchain.blockscout.com/address/0x43CfF77CD060A155dCe5deb12B93b875f69F2716#code"
},
{
"name": "DesertVerifier",
"isVerified": true,
"address": "robinhood:0x56aeED6920DBB9E198C2C0072147A45684A06E10",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "robinhood",
"description": "",
"discoveryDrivenData": true,
"url": "https://robinhoodchain.blockscout.com/address/0x56aeED6920DBB9E198C2C0072147A45684A06E10#code"
},
{
"name": "Lighter",
"isVerified": true,
"address": "robinhood:0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d",
"upgradeability": {
"proxyType": "zkLighter proxy",
"admins": [
"robinhood:0x43CfF77CD060A155dCe5deb12B93b875f69F2716"
],
"implementations": [
"robinhood:0xE470e41Cacc197EA07f879577765A8c81234ED7B",
"robinhood:0x1be72833f96e47366610CCFb9Bec081FE69EECf5"
"robinhood:0x82DE5B1161C93afDFE21bA0D5343f01Cd7401d90",
"robinhood:0xDa2B59fFB41485a6f21E14e479AE7B7AB29a997c"
]
},
"chain": "robinhood",
"description": "* Roles:\n * **admin**: UpgradeGatekeeper; ultimately SafeL2",
"upgradableBy": [
{
"name": "SafeL2",
"delay": "21d"
}
],
"discoveryDrivenData": true,
"url": "https://robinhoodchain.blockscout.com/address/0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d#code"
},
{
"name": "ZkLighterVerifier",
"isVerified": true,
"address": "robinhood:0xe1aFBE2D670eFF0e7C8A41F080792C011916ac31",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"robinhood:0x43CfF77CD060A155dCe5deb12B93b875f69F2716"
],
"implementations": [
"robinhood:0xA3c70B197AcE329D9e09C753DA7874B78F1D00f4"
"robinhood:0x61CA82e45F5a57d00E66b522Be72D8bA41e634Aa"
]
},
"chain": "robinhood",
"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 SafeL2",
"upgradableBy": [
{
"name": "SafeL2",
"delay": "21d"
}
],
"discoveryDrivenData": true,
"url": "https://robinhoodchain.blockscout.com/address/0xe1aFBE2D670eFF0e7C8A41F080792C011916ac31#code"
},
{
"name": "Governance",
"isVerified": true,
"address": "robinhood:0xf6F6Bd6eEA2b9A2041328732CcAe4c5e1DD278B7",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"robinhood:0x43CfF77CD060A155dCe5deb12B93b875f69F2716"
],
"implementations": [
"robinhood:0x3468Dcab5a2D81Af207B3e301DFA889321989a61"
]
},
"chain": "robinhood",
"pastUpgrades": [],
"description": "Manages the list of validators and the network governor.\n* Roles:\n * **admin**: UpgradeGatekeeper; ultimately SafeL2\n * **networkGovernor**: SafeL2\n * **validators**: Lighter Validator 1, Lighter Validator 2, Lighter Validator 3",
"upgradableBy": [
{
"name": "SafeL2",
"delay": "21d"
}
],
"discoveryDrivenData": true,
"url": "https://robinhoodchain.blockscout.com/address/0xf6F6Bd6eEA2b9A2041328732CcAe4c5e1DD278B7#code"
}
]
},
"escrows": [
{
"address": "0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d",
"sinceTimestamp": 1782477747,
"tokens": [
"ETH",
"USDG",
"AAPL",
"AMZN",
"GOOGL",
"META",
"MSFT",
"NVDA",
"TSLA",
"ORCL",
"SPCX",
"BABA",
"USAR",
"USO",
"COIN",
"CRCL",
"QQQ",
"SPY",
"SGOV",
"SLV",
"AMD",
"INTC",
"MU",
"SNDK",
"CRWV",
"PLTR"
],
"contract": {
"isVerified": true,
"address": "robinhood:0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d",
"upgradeability": {
"proxyType": "zkLighter proxy",
"admins": [
"robinhood:0x43CfF77CD060A155dCe5deb12B93b875f69F2716"
],
"implementations": [
"robinhood:0xE470e41Cacc197EA07f879577765A8c81234ED7B",
"robinhood:0x1be72833f96e47366610CCFb9Bec081FE69EECf5"
"robinhood:0x82DE5B1161C93afDFE21bA0D5343f01Cd7401d90",
"robinhood:0xDa2B59fFB41485a6f21E14e479AE7B7AB29a997c"
]
},
"chain": "robinhood",
"description": "Main Lighter contract on Robinhood Chain. It escrows USDG used as margin as well as ETH and Robinhood tokenized equities and ETFs used for spot trading, and credits the corresponding balances inside Lighter.",
"url": "https://robinhoodchain.blockscout.com/address/0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d#code"
},
"chain": "robinhood",
"chainId": 4663
}
],
"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": [
"robinhood:0xA3c70B197AcE329D9e09C753DA7874B78F1D00f4",
"robinhood:0x61CA82e45F5a57d00E66b522Be72D8bA41e634Aa",
"robinhood:0x56aeED6920DBB9E198C2C0072147A45684A06E10"
]
}
+1 -1
{
"baseTimestamp": 1787136754,
"baseTimestamp": 1787570584,
"contractsDiscoDriven": true,
"hasDiscoUi": true,
"isDiscoDriven": true,
"permissionsDiscoDriven": true
}
+6 -14
+6 -14
{
"creator": "Lighter",
"projectsForTvs": [
{
"projectId": "lighter",
"sinceTimestamp": 1759356000
},
{
"projectId": "lighter-robinhood",
"sinceTimestamp": 1782502424
}
],
"proofSystemInfo": "## 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### Lighter 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/main). \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/main/circuit/src/transactions). \n\nTransaction circuits use custom implementations for arithmetic operations ([bigint](https://github.com/elliottech/lighter-prover/tree/main/circuit/src/bigint), [uint](https://github.com/elliottech/lighter-prover/tree/main/circuit/src/uint)), cryptographic primitives ([ecdsa](https://github.com/elliottech/lighter-prover/tree/main/circuit/src/ecdsa) on the Secp256k1 curve, [eddsa](https://github.com/elliottech/lighter-prover/tree/main/circuit/src/eddsa) on the ECgFp5 curve, [keccak](https://github.com/elliottech/lighter-prover/tree/main/circuit/src/keccak), [poseidon_bn128](https://github.com/elliottech/lighter-prover/tree/main/circuit/src/poseidon_bn128)) and other helper circuits.\n\n### Desert circuits\n\nLighter also provides [desert exit circuits](https://github.com/elliottech/lighter-prover/tree/main/desertexit) that allow users to permissionlessly exit L2 when it is in the desert mode. Users can use desert circuit to generate a proof of ownership of all their positions locally, which could be submitted on L1 for withdrawing funds.\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/main/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/main/circuit/src/block_tx_chain_constraints.rs), which includes continuity checks across all BlockTx proofs.",
"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",
"participantCount": 176,
"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": "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. \nIt 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)."
}
],
"verifierHashes": [
{
"hash": "0x836ea0348ed3ae0bf5136f58d874d57075d4094691b08c3ef02a6aaa332df363",
"hash": "0x9209eb726c5ccddbc337163770320215d2495c43987eaae0ccdd37e9a4686eff",
"name": "Lighter verifier",
"sourceLink": "https://github.com/elliottech/lighter-prover/tree/8c01ea010d6fd46bdb77ef2f93a79278d1adf0df/circuit/src",
"proofSystem": {
"id": "Gnark",
"type": "Plonk",
"name": "Gnark",
"description": "Consensys implementation of Plonk proving system written in Go."
},
"knownDeployments": [
{
"address": "eth:0xf7b964eD0C05a7aA12fdC54865295531C9D2AEC1"
"address": "eth:0x9Ca512d2F131134972EB95515325F69812395332"
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "The verification process below is based on the `build_circuits.sh` [script](https://github.com/elliottech/lighter-prover/blob/8c01ea010d6fd46bdb77ef2f93a79278d1adf0df/build_circuits.sh) in the lighter-prover repository. It consumed around 100 GiB of memory at its peak, so we recommend rerunning it on a machine with 128 GiB of RAM.\n\nThe steps below are for Ubuntu 22.04.\n\n1. Install Rust, GCC, and Go version 1.21 or later.\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\n\n# One way to install Go 1.21 on Ubuntu 22.04\nwget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz\nsudo tar -xvf go1.21.0.linux-amd64.tar.gz\nsudo mv go /usr/local\nexport GOROOT=/usr/local/go\nexport GOPATH=$HOME/go\nexport PATH=$GOPATH/bin:$GOROOT/bin:$PATH\nsource ~/.profile\n```\n\n2. Check out the `main` revision used for the verification and run the script to regenerate the keys.\n\n```\ngit clone https://github.com/elliottech/lighter-prover.git\ncd lighter-prover\ngit checkout 8c01ea010d6fd46bdb77ef2f93a79278d1adf0df\nchmod +x build_circuits.sh\n./build_circuits.sh\n```\n\nThe script generates a `final::....sol` file containing the verifier smart contract and verification keys.",
"verificationStatus": "notVerified",
"verificationSteps": "The sources for the 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."
},
{
"hash": "0x1ea7019dfa94b4b4c58254a958d8fa81a2a8d5d651477acae75bd9405ee5f181",
"hash": "0x0b3f7515b28812264c235ac2bba289e19a42cecfbceb2eef9856bd6f591a2308",
"name": "Lighter on Robinhood verifier",
"proofSystem": {
"id": "Gnark",
"type": "Plonk",
"name": "Gnark",
"description": "Consensys implementation of Plonk proving system written in Go."
},
"knownDeployments": [
{
"address": "robinhood:0xA3c70B197AcE329D9e09C753DA7874B78F1D00f4"
"address": "robinhood:0x61CA82e45F5a57d00E66b522Be72D8bA41e634Aa"
}
],
"verificationStatus": "notVerified",
"description": "Custom verifier ID: SHA256 hash of all VK_... values from the smart contract, abi packed in the same order they are defined."
},
{
"hash": "0xc8ffb171b6ebf0bba84df27eaa1021550c5242b146739c704221b456203630a9",
"name": "Lighter Desert verifier",
"sourceLink": "https://github.com/elliottech/lighter-prover/tree/23d1596b832db24f1007e20220ba1556d23b0c68/desertexit/circuits",
"proofSystem": {
"id": "Gnark",
"type": "Plonk",
"name": "Gnark",
"description": "Consensys implementation of Plonk proving system written in Go."
},
"knownDeployments": [
{
"address": "eth:0x866418061d4C1168e1c8E8f6facE79675395E008"
},
{
"address": "robinhood:0x56aeED6920DBB9E198C2C0072147A45684A06E10"
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "The verification process below is based on the `build.sh` [script](https://github.com/elliottech/lighter-prover/blob/23d1596b832db24f1007e20220ba1556d23b0c68/desertexit/build.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 22.04 OS.\n\n1. Install rust, gcc, go version 1.21 and later.\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\nsudo apt install jq\n\n# one way to install latest go on Ubuntu 22.04\nwget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz\nsudo tar -xvf go1.21.0.linux-amd64.tar.gz\nsudo mv go /usr/local\nexport GOROOT=/usr/local/go\nexport GOPATH=$HOME/go\nexport PATH=$GOPATH/bin:$GOROOT/bin:$PATH\nsource ~/.profile\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/desertexit\ngit checkout 23d1596b832db24f1007e20220ba1556d23b0c68\nchmod +x build.sh\n./build.sh\n```\n\nThe script will generate the `desertwrapper::....sol` file in the `lighter-prover/desertexit/artifacts` directory that contains the verifier smart contract with the verification keys.",
"description": "Custom verifier ID: SHA256 hash of all VK_... values from the smart contract, abi packed in the same order they are defined."
}
]
}