# Cartesi PRT Honeypot v2 Markdown version of https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2 ## Summary - Total Value Secured: $1.68 K (+9.14% compared to seven days ago; canonically bridged $1.68 K, natively minted $0.00, externally bridged $0.00; 0.00% with additional trust assumptions compared to the tokens involved and the Stage assigned to the project's canonical messaging bridge) - **Warning:** The CTSI token associated with Cartesi PRT Honeypot v2 accounts for 100% of the TVS! (sentiment: bad) - TVS by asset: Other $1.68 K (100%) - Associated tokens: CTSI: $1.68 K (100% of TVS) - Past day UOPS: No data - Stage: Stage 2 (Appchain: The Cartesi PRT Honeypot v2 is a minimal appchain (running a Cartesi Machine / dApp) for the purpose of incentivizing the testing of the Cartesi PRT proof system. Inputs/actions in the appchain are limited to deposits of CTSI by anyone and withdrawals by a single user.) - Type: Optimistic Rollup - Purpose: Bug bounty - Host chain: Ethereum ### Risks - Sequencer failure: Self sequence (sentiment: good) - State validation: Fraud proofs (INT) (7d 1h challenge period; sentiment: good) - Data availability: Onchain (sentiment: good) - Exit window: Not applicable (sentiment: neutral) - **Warning:** Bug bounty Appchain: The single hardcoded address can withdraw all funds. (sentiment: bad) - Proposer failure: Self propose (sentiment: good) ### About Cartesi PRT Honeypot v2 is an application-specific Stage-2 rollup that stress-tests Cartesi Rollups’ security. Protected solely by Cartesi’s PRT (Permissionless Refereed Tournaments) fraud-proof algorithm, it turns its locked funds into an open bounty for anyone who can break the system. Users should not deposit unless they are willing to donate their funds to the Honeypot. ### Links - Website: https://cartesi.io/ - Docs: https://docs.cartesi.io/cartesi-rollups/, https://github.com/cartesi/honeypot/wiki/ - Explorer: https://cartesiscan.io/, https://explorer.cartesi.io/ - Repository: https://github.com/cartesi/honeypot, https://github.com/cartesi/dave - Social: https://twitter.com/cartesiproject, https://discord.gg/G2tCH5KkcM, https://cartesi.io/blog/, https://reddit.com/r/cartesi/, https://youtube.com/@cartesiproject, https://t.me/cartesiproject, https://linkedin.com/company/cartesiproject, https://instagram.com/cartesiproject/, https://medium.com/cartesi - Contracts explorer (Disco): https://disco.l2beat.com/ui/p/cartesi-prt-honeypot-v2 ### Badges - Application-specific chain: This project is built to operate a specific application - CartesiVM: This project uses the Cartesi Machine to run its smart contracts and supports any programming language that can be ported to RISC-V architecture - Ethereum with calldata: This project is posting its data to Ethereum as calldata - Built on the Cartesi stack: The project is built on the Cartesi stack ## Value Secured The interactive TVS charts are shown on [the HTML page](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2#tvs). Token by token: [TVS breakdown](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2/tvs-breakdown). - [TVS chart (JSON)](https://l2beat.com/api/scaling/tvs/cartesi-prt-honeypot-v2) - [TVS breakdown by token (JSON)](https://l2beat.com/api/scaling/tvs/cartesi-prt-honeypot-v2/breakdown) ## Onchain costs The section shows the operating costs that L2s pay to Ethereum. The interactive costs chart is shown on [the HTML page](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2#onchain-costs). ### Tracked transactions #### Batch submissions - functionCall: 2025-11-04 13:46 UTC - now; currently used; address: [0x1b51e2992A2755Ba4D6F7094032DF91991a0Cfac](https://etherscan.io/address/0x1b51e2992A2755Ba4D6F7094032DF91991a0Cfac); selector: 0x1789cd63; signature: `function addInput(address appContract, bytes payload) returns (bytes32)` #### State updates - functionCall: 2025-11-04 13:46 UTC - now; currently used; address: [0xF0D8374F8446E87e013Ec1435C7245E05f439259](https://etherscan.io/address/0xF0D8374F8446E87e013Ec1435C7245E05f439259); selector: 0x8bca2e0c; signature: `function settle(uint256 epochNumber, bytes32 outputsMerkleRoot, bytes32[] calldata proof)` ## Milestones & Incidents - 2025-11-08: [Cartesi PRT Honeypot v2 deployed on Ethereum](https://etherscan.io/address/0xfddf68726a28e418fa0c2a52c3134904a8c3e998). Cartesi PRT Honeypot v2 deployed to Ethereum mainnet. - 2025-05-09: [Dave: decentralized, secure, lively fraud-proofs](https://dl.acm.org/doi/10.1145/3734698). Dave paper published on ACM DLT, a peer-reviewed journal. - 2024-11-13: [The Dave Algorithm](https://youtu.be/dI_3neyXVl0). Devcon 2024 presentation introducing the Dave algorithm. - 2022-12-23: [Permissionless Refereed Tournaments](https://arxiv.org/abs/2212.12439). PRT paper published on arxiv. ## Risk summary **Warning:** The challenge protocol can be subject to delay attacks. ### Funds can be stolen if 1. there is no one that checks the published state. Fraud proofs assume at least one honest and able validator. ## Risk analysis **Warning:** The challenge protocol can be subject to delay attacks. ### Sequencer failure Self sequence (sentiment: good) Users can self sequence transactions by sending them on L1. There is no privileged operator. ### State validation Fraud proofs (INT) (7d 1h challenge period; sentiment: good) Fraud proofs allow actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. ### Data availability Onchain (sentiment: good) All of the data needed for proof construction is published on Ethereum L1. ### Exit window Not applicable (sentiment: neutral) **Warning:** Bug bounty Appchain: The single hardcoded address can withdraw all funds. (sentiment: bad) Users cannot exit their funds as all deposits are considered donations. ### Proposer failure Self propose (sentiment: good) Anyone can be a Proposer and propose new roots to the L1 bridge. ## Stage Cartesi PRT Honeypot v2 is a Stage 2 Appchain Optimistic Rollup. ### Scope of assessment #### In scope - Ability to deposit and withdraw CTSI by the permissioned address - L1 core contracts - Derivation logic spec - Permissioned Withdrawal logic in the offchain application #### Not in scope - Published offchain Cartesi Machine source code - Cartesi Machine source code to onchain template hash mapping Rollup operators cannot compromise the system, but being **application-specific** might bring additional risk. Users can deposit (donate) CTSI tokens to the Honeypot. The funds can only be withdrawn by the Cartesi Multisig to its own address. The appchain has the very specific purpose of a bug bounty on the proof system, incentivizing security researchers to break it and claim the deposited funds. **Note:** We're still in the process of formalizing how to properly integrate appchains in the Stages framework. ### Stage 0 6 requirements met. - Met: A complete and functional proof system is deployed. - Met: There are at least 5 external actors who can submit fraud proofs. - Met: The project calls itself a rollup. - Met: State roots are posted to Ethereum L1. - Met: Inputs for the state transition function are posted to Ethereum L1. - Met: A source-available node exists that can recreate the state from Ethereum L1 data. Please note that the L2BEAT team has not verified the validity of the node source code. [View code](https://github.com/cartesi/dave/tree/main/cartesi-rollups/node) ### Stage 1 2 requirements met. **Principle** - Met: Compromising ≥75% of the Security Council is the only way (other than bugs) for a rollup to indefinitely block an L2→L1 message (e.g. a withdrawal) or push an invalid L2→L1 message (e.g. an invalid withdrawal) with a <7d exit window. **Guidelines** - Met: The sources of all programs used are public and program hashes can be independently regenerated. ### Stage 2 1 requirement met. - Met: Fraud proof submission is open to everyone. [Learn more about Stages](https://l2beat.com/stages). Please keep in mind that these stages do not reflect project security, this is an opinionated assessment of project maturity based on subjective criteria, created with a goal of incentivizing projects to push toward better decentralization. Each team may have taken different paths to achieve this goal. ## Data availability ### All transaction data is recorded on chain All executed transactions are submitted to an on chain smart contract. The execution of the rollup is based entirely on the submitted transactions, so anyone monitoring the contract can know the correct state of the rollup chain. **References** - [InputBox.sol#18 - Etherscan source code, addInput function](https://etherscan.io/address/0x1b51e2992A2755Ba4D6F7094032DF91991a0Cfac#code#F1#L18) ## State derivation ### Node software The source code for the Cartesi node software is available [here](https://github.com/cartesi/dave/tree/v2.0.0/cartesi-rollups/node). ### Genesis state The genesis state comes from the Honeypot Cartesi Machine template included in the [Honeypot v3 release](https://github.com/cartesi/honeypot/releases/tag/v3.0.0). Alternatively, you can recreate it by following the build steps in the [Honeypot GitHub Repository](https://github.com/cartesi/honeypot/tree/v3.0.0?tab=readme-ov-file#building-the-application). ### Data format The reference implementation for ERC20 deposits can be found [here](https://github.com/cartesi/rollups-contracts/blob/v2.1.0/src/common/InputEncoding.sol#L38). To learn about the withdrawal request format, please refer to the documentation [here](https://github.com/cartesi/honeypot/wiki/Requesting-withdrawals). ## State validation **Under review:** The information in the section might be incomplete or outdated. The L2BEAT Team is working to research & validate the content before publishing. ### Fraud proofs After some period of time, the published state root is assumed to be correct. For a certain time period, usually one week, anyone can submit a fraud proof that shows that the state was incorrect.The initial bond for joining the tournament is set to 0.23219805 ETH. **Risks** - Funds can be stolen if there is no one that checks the published state. Fraud proofs assume at least one honest and able validator. **References** - [Permissionless Refereed Tournaments](https://arxiv.org/abs/2212.12439) - [MultiLevelTournamentFactory.sol#L48 - dispute resolution factory](https://etherscan.io/address/0xa02997f69Dc5F1A727abE12ee36f87E28BBdEa6b#code#F1#L48) - [DaveConsensus.sol#L111 - application consensus](https://etherscan.io/address/0xF0D8374F8446E87e013Ec1435C7245E05f439259#code#F1#L111) ### Program Hashes #### Cartesi Honeypot v2 template hash The hash of the initial Cartesi machine state that is used in Dave dispute games of Cartesi Honeypot v2. - Hash: `0x144d45af1181b35f2b11c4b1150d6cb16934c28093707fb97c911ff16b3fe609` - Repository: https://github.com/cartesi/honeypot/blob/699c2b12745f1f7da708cb497106e657e3a67e49/honeypot.cpp - Verification: successful - Used in: [Cartesi PRT Honeypot v2](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2) ##### Verification steps The verification process is based on [this guide](https://github.com/cartesi/honeypot/blob/699c2b12745f1f7da708cb497106e657e3a67e49/README.md#building-and-running). 1. Install all required dependencies: Docker, GNU Make, Lua 5.4, [cartesi/machine-emulator](https://github.com/cartesi/machine-emulator) 0.19.x and [cartesi/xgenext2fs](https://github.com/cartesi/genext2fs). In our experience, cartesi-machine could not be installed from cartesi APT package repository because the `dist.cartesi.io` URL was not accessible, the homebrew installation worked successfully on an ubuntu machine. 2. Check out the correct commit version of the [honeypot repo](https://github.com/cartesi/honeypot): `git checkout 699c2b12745f1f7da708cb497106e657e3a67e49`. 3. On x86 architecture, configure docker to work with riscv64 architecture via emulation: `docker run --privileged --rm tonistiigi/binfmt --install riscv64`. 4. Build the application by running: `make HONEYPOT_CONFIG=mainnet`. This build script will output the correct program hash on successful execution. ## Updates Each date links the update on the HTML page, which also shows its contract diffs. ### [2026-10-01 10:35 UTC](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2?update=25bf6fe1) (4 changes) Cartesi Multisig removed one signer (eth:0xccD54bae0DfadA083F590f9aA16285f3eE4b5325): threshold 3/6 -> 3/5. ### [2026-09-28 10:48 UTC](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2?update=bace87ec) (high severity, 10 changes) Upgraded Cartesi ms to Safe 1.5.0. ### [2025-12-10 15:32 UTC](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2?update=95f9008f) (7 changes) The example tournament has concluded. Nothing to see. ### [2025-11-14 08:36 UTC](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2?update=93e19ecb) (15 changes) Diff against honeypot v1: - [Application](https://disco.l2beat.com/diff/eth:0x4c1E74EF88a75C24e49eddD9f70D82A94D19251c/eth:0xfDDF68726a28e418fA0c2a52c3134904a8c3e998): minimal changes, mainly formatting and casing, and a new field is added to track the number of "executed outputs". The template hash is different. - [DaveConsensus](https://disco.l2beat.com/diff/eth:0x6CE590b9F0697327f18c601DF6f0baE4a0801B68/eth:0xF0D8374F8446E87e013Ec1435C7245E05f439259): new constants, new interface. The biggest change comes from the imported interface but very little of it is actually used. - [InputBox](https://disco.l2beat.com/diff/eth:0xc70074BDD26d8cF983Ca6A5b89b8db52D5850051/eth:0x1b51e2992A2755Ba4D6F7094032DF91991a0Cfac): aesthetic changes. - [ERC20Portal](https://disco.l2beat.com/diff/eth:0xc700D6aDd016eECd59d989C028214Eaa0fCC0051/eth:0xACA6586A0Cf05bD831f2501E7B4aea550dA6562D): aesthetic changes. - [MultiLevelTournamentFactory](https://disco.l2beat.com/diff/eth:0xA31C2aCfF3464658866960c0fBD3d798310272D7/eth:0xa02997f69Dc5F1A727abE12ee36f87E28BBdEa6b): main change i notice is the additional of a `height` value in many functions. - [BottomTournament](https://disco.l2beat.com/diff/eth:0x18256941eC7B661F9F46C228b74e775b581e63f8/eth:0xe6B4444d324E0B403c9C43C5d7c8B2C3d5d02962) - [MiddleTournament](https://disco.l2beat.com/diff/eth:0xe49E4CB0Ab5c0E5792E762807329B420Cc4FF1AE/eth:0x0a88360f41D0f643ea63ade00c0A1a795395d2D9) - [TopTournament](https://disco.l2beat.com/diff/eth:0x09114973AE4bf3Af3896E4e541082C73f224F8Aa/eth:0x367Ff3c21E189645aaf17bDD41D4C186686CfE53): obligatory bondValue added (gas dependent) that must be paid on joinTournament(), can be used for gas refunds and be claimed by tournament winner - No significant changes in the Top/Middle/Bottom tournament factories. ## Operator ### There is no central operator There is no privileged entity that sequences transactions or produces blocks. This activity is permissionless and open to anyone. **References** - [Honeypot Docs - Running a validator node](https://github.com/cartesi/honeypot/wiki/Running-a-validator-node) ### Users can force any transaction Because the state of the system is based on transactions submitted on the underlying host chain and anyone can submit their transactions there it allows the users to circumvent censorship by interacting with the smart contract on the host chain directly. ## Withdrawals ### No user withdrawals No address apart from the Cartesi Multisig can trigger a withdrawal and deposits are considered donations to the Honeypot. If a withdrawal is requested by them, all funds in the escrow are withdrawable to the permissioned address as soon as the next settlement on L1 occurs (min. every 7d 1h). **References** - [Requesting withdrawals, Honeypot Wiki](https://github.com/cartesi/honeypot/wiki/Requesting-withdrawals) ## Permissions Explore these contracts and permissions in Disco, L2BEAT's contract explorer: https://disco.l2beat.com/ui/p/cartesi-prt-honeypot-v2 ### Ethereum #### Actors ##### Cartesi Multisig Addresses: [0x60247492F1538Ed4520e61aE41ca2A8447592Ff5](https://etherscan.io/address/0x60247492F1538Ed4520e61aE41ca2A8447592Ff5) A Multisig with 3/5 threshold. - Can interact with Application - withdraw the entire balance in the escrow Participants (5): [0xD91C0C2fC065a2e094129066D2683ef16E6F6032](https://etherscan.io/address/0xD91C0C2fC065a2e094129066D2683ef16E6F6032), [0x53cfaE10bb087bd67288eCA9e7d58E216aEbD961](https://etherscan.io/address/0x53cfaE10bb087bd67288eCA9e7d58E216aEbD961), [0xF4554F08Ed918893996DC36428Cb9DCbF2De990E](https://etherscan.io/address/0xF4554F08Ed918893996DC36428Cb9DCbF2De990E), [0xA7Dd0A6AF60ae9Accc7533d016dc7B68Db3324b1](https://etherscan.io/address/0xA7Dd0A6AF60ae9Accc7533d016dc7B68Db3324b1), [0xC826D6061b5C62237932c834B60a5eFf04D80F30](https://etherscan.io/address/0xC826D6061b5C62237932c834B60a5eFf04D80F30) ## Smart contracts ![A diagram of the smart contract architecture](https://l2beat.com/static/images/architecture/cartesi-prt-honeypot-v2.6f5c8456.png) Explore these contracts and permissions in Disco, L2BEAT's contract explorer: https://disco.l2beat.com/ui/p/cartesi-prt-honeypot-v2 ### Ethereum #### InputBox Addresses: [0x1b51e2992A2755Ba4D6F7094032DF91991a0Cfac](https://etherscan.io/address/0x1b51e2992A2755Ba4D6F7094032DF91991a0Cfac#code) Serves as both the canonical log for arbitrary dApp inputs and a portal for depositing assets (one possible type of input). It ensures data availability and that all off-chain participants process the same inputs in the same order. #### DaveConsensus Addresses: [0xF0D8374F8446E87e013Ec1435C7245E05f439259](https://etherscan.io/address/0xF0D8374F8446E87e013Ec1435C7245E05f439259#code) Contract managing PRT fraud-proof tournaments, application epochs and input validation, as well as settlement and challenge periods. Dispute tournaments are started here and the final, verified computation result (as an `outputsMerkleRoot`) is recorded when they are resolved. #### Application (escrow) Addresses: [0xfDDF68726a28e418fA0c2a52c3134904a8c3e998](https://etherscan.io/address/0xfDDF68726a28e418fA0c2a52c3134904a8c3e998#code) Main dApp contract that escrows assets and executes the verified results (outputs) from off-chain computation. It relies on the DaveConsensus contract to validate outputs before releasing assets or triggering on-chain actions. The immutable template hash of the dApp is `0x144d45af1181b35f2b11c4b1150d6cb16934c28093707fb97c911ff16b3fe609`. - Roles: - **withdrawer**: Cartesi Multisig The following tokens are included in the value secured calculation: CTSI #### MiddleTournament Addresses: [0x0a88360f41D0f643ea63ade00c0A1a795395d2D9](https://etherscan.io/address/0x0a88360f41D0f643ea63ade00c0A1a795395d2D9#code) Handles the intermediate stages of a dispute following the TopTournament targeting a more granular bisection game. #### CartesiStateTransition Addresses: [0x31EEaeC2A8d855B13B376b72C172F0c20A2910F6](https://etherscan.io/address/0x31EEaeC2A8d855B13B376b72C172F0c20A2910F6#code) Onchain verifier that can execute a single, disputed instruction of the Cartesi machine. It is the ultimate arbiter that BottomTournament calls to determine which party's claimed state transition is correct. #### MultiLevelTournamentFactory Addresses: [0xa02997f69Dc5F1A727abE12ee36f87E28BBdEa6b](https://etherscan.io/address/0xa02997f69Dc5F1A727abE12ee36f87E28BBdEa6b#code) Responsible for creating and orchestrating the multi-stage dispute process. It instantiates the correct tournament contract (Top, Middle, or Bottom) depending on the current stage of the dispute game. #### TopTournament_example Addresses: [0xA2835312696Afa86c969e40831857dbB1412627f](https://etherscan.io/address/0xA2835312696Afa86c969e40831857dbB1412627f#code), [0x367Ff3c21E189645aaf17bDD41D4C186686CfE53](https://etherscan.io/address/0x367Ff3c21E189645aaf17bDD41D4C186686CfE53#code) (Implementation (Upgradable)) Represents the entry point and highest level of a dispute in PRT. Disagreeing validators join this tournament to resolve conflicts over the entire computation trace through a bisection game. The required bond amount for joining the Tournament is calculated from worst case gas estimates and currently is 0.23219805 ETH. #### ERC20Portal Addresses: [0xACA6586A0Cf05bD831f2501E7B4aea550dA6562D](https://etherscan.io/address/0xACA6586A0Cf05bD831f2501E7B4aea550dA6562D#code) Contract that allows anyone to perform transfers of ERC-20 tokens to Cartesi DApps. #### CanonicalTournamentParametersProvider Addresses: [0xc8d8639C3ec8925A00d4F262299807DC632c3113](https://etherscan.io/address/0xc8d8639C3ec8925A00d4F262299807DC632c3113#code) Provides constant configuration data for the tournament system. It defines parameters like the number of levels (3), the minimum challenge period of ~7d, and the size of computation segments at each stage of a dispute. #### BottomTournament Addresses: [0xe6B4444d324E0B403c9C43C5d7c8B2C3d5d02962](https://etherscan.io/address/0xe6B4444d324E0B403c9C43C5d7c8B2C3d5d02962#code) Referees the dispute over a single contested Cartesi machine step as the final stage of arbitration in a dispute. It calls the CartesiStateTransition contract to get a definitive on-chain ruling and identify the winner. ### Program Hashes #### Cartesi Honeypot v2 template hash The hash of the initial Cartesi machine state that is used in Dave dispute games of Cartesi Honeypot v2. - Hash: `0x144d45af1181b35f2b11c4b1150d6cb16934c28093707fb97c911ff16b3fe609` - Repository: https://github.com/cartesi/honeypot/blob/699c2b12745f1f7da708cb497106e657e3a67e49/honeypot.cpp - Verification: successful - Used in: [Cartesi PRT Honeypot v2](https://l2beat.com/layer2s/projects/cartesi-prt-honeypot-v2) ##### Verification steps The verification process is based on [this guide](https://github.com/cartesi/honeypot/blob/699c2b12745f1f7da708cb497106e657e3a67e49/README.md#building-and-running). 1. Install all required dependencies: Docker, GNU Make, Lua 5.4, [cartesi/machine-emulator](https://github.com/cartesi/machine-emulator) 0.19.x and [cartesi/xgenext2fs](https://github.com/cartesi/genext2fs). In our experience, cartesi-machine could not be installed from cartesi APT package repository because the `dist.cartesi.io` URL was not accessible, the homebrew installation worked successfully on an ubuntu machine. 2. Check out the correct commit version of the [honeypot repo](https://github.com/cartesi/honeypot): `git checkout 699c2b12745f1f7da708cb497106e657e3a67e49`. 3. On x86 architecture, configure docker to work with riscv64 architecture via emulation: `docker run --privileged --rm tonistiigi/binfmt --install riscv64`. 4. Build the application by running: `make HONEYPOT_CONFIG=mainnet`. This build script will output the correct program hash on successful execution.