01 / Open · Bridger
Pick an ad.Fund the order.Pick an ad. Fund the order.
A maker’s ad sets the route, the limits and the price, so you see what you receive before you commit. Your tokens then go into the escrow on your own chain.
- You send
- 1,000 USDC on Ethereum
- You recieve
- 995 USDC on Stellar
- If unfunded
- The hold expires after ~30 min
02 / Locked · Maker’s bot
The maker’s side locks.The maker’s side locks.
The maker, or their bot, locks matching tokens from the ad. Both deposits are now recorded in each chain’s own history, so either chain can check them later.
- Locked
- 995 USDC on Stellar
- Checked by
- the maker’s on-chain rulebook
- Recorded
- on both chains
03 / Signed 2/2 · Both parties
Both sides co-sign.Both sides co-sign.
Each side signs one fixed message that names this exact trade and both chains’ records. The app checks it matches your trade first. It costs nothing and moves nothing.
- Check
- matches your trade
- Cost
- free, no gas, moves nothing
- Signatures
- 2 of 2
04 / Aggregated · Anyone
Two signaturesbecome one.Two signatures become one.
The two signatures combine into one that each chain can check. From here the trade can be finished by anyone who holds the public data, not only by us.
- Signature
- one aggregate, BLS12-381
- Can finish it
- anyone with the data
- Moves
- nothing yet
05 / Settling · The prover
A proof for each side,in seconds.A proof for each side, in seconds.
A zero-knowledge proof shows each chain that the other deposit really is recorded on the other chain. The unlocks are then sent to both chains, and the relayer pays the gas.
- Proof
- zk proof of the other deposit
- Time
- seconds
- Gas
- paid by the relayer
06 / Filled · Both chains
Both escrows open.Both escrows open.
Each chain checks the combined signature, the proof, and that this deposit was never unlocked before. Then it pays the recipient written into the order. Every step links to its transaction.
- Delivered
- 995 USDC on Stellar
- Checked
- signature · proof · used once
$ POST /v1/trades/create
→ createOrder transaction data
$ POST /v1/trades/4821/confirm
→ decided by on-chain state: OPEN█
$ POST /v1/trades/4821/lock
→ lockForOrder transaction data
$ GET /v1/trades/4821/deposits
→ ethereum APPROVED · stellar FINALIZED█
$ POST /v1/trades/4821/cosign
$ GET /v1/trades/4821/settlement
→ { "state": "SIGNED",
"signaturesCollected": 2 }█
$ GET /v1/trades/4821/settlement
→ { "state": "AGGREGATED" }
$ POST /v1/trades/4821/unlock
→ proof + aggregated signature, public█
… proving ethereum deposit
… proving stellar deposit
→ unlock sent to ethereum
→ unlock sent to stellar█
$ GET /v1/trades/4821/settlement
→ { "state": "FILLED" }
ethereum tx 0x9c1e…41ab
stellar tx 7f03…d2e8█
