This PoC is now completed, the report on the results and learnings is here:
Atomic Transfer PoC Report
We intend to deliver a PoC showcasing a user executing an atomic asset transfer between two zones.
At a high-level, we have a user who holds 100 NMO in Zone A, he wants to transfer 50 NMO to Zone B. They want the transfer to happen atomically, i.e. we don’t want to end up in a situation where the user has withdrawn 50 NMO from Zone A but the deposit to Zone B has failed.
Atomic Asset Transfer Design
For this PoC, the asset transfer will be executed through two partial transactions.
- The User Partial Transaction in which he pays the executor a fee to include a presigned transaction in Zone A to withdraw 50 NMO and a second presigned transaction in Zone B to deposit 50 NMO.
- The Executor Partial Transaction runs the STF for both Zones A and B with the presigned transactions provided by the user in the User Partial Transaction and pockets the fee from the user. The act of completing the user partial transaction is done by creating an “executor ptx”. The bundle of
[user_ptx, executor_ptx]
forms a completed (balanced) transaction.
The two partial transactions will look something like this:

Making this Concrete
For this initial PoC we are looking to understand feasibility of this design. To that end, we will focus on getting an end-to-end integration of the CL data model with a real zkVM. This will mean that we will not implement features that are not crucial to demonstrating feasibility of this design.
Limitations of v0.1
- Zones A and B only support withdrawals and deposits with no privacy (do we want them to use different proving systems?)
- Zones A and B will be running the same STF
- We will strip out some of the non-crucial parts of CL (e.g. we may drop support for multiple death constraints, or even drop the birth constraint all together)
- We are not implementing the CL ledger (global set of commitments and nullifiers.)
Deliverables
- A balanced bundle of partial transactions that executes the atomic asset transfer