Skip to main content
Every trade has two sides. The depositor has USDC locked in escrow and receives fiat. The taker pays fiat and receives the USDC. In a buy, the liquidity provider (LP) is the depositor and the user is the taker. In a sell, the roles swap.

A buy, step by step

1

The LP funds the escrow

The LP deposits USDC into the escrow contract. For each payment rail they set terms: currency, minimum rate, and a hash of the account that receives payments.
2

The user opens an order

The user picks an offer and signs signal_intent. The orchestrator checks the rate and limits, then locks that amount of the LP’s USDC for this order. The order gets a pay-by time and a settle-by time.
3

The user pays

Only after the lock is confirmed does the app show the LP’s payment details and a reference derived from the order ID. The user pays the LP in their payment app.
4

The phone proves the payment

The user signs in to their payment account inside the app. The phone captures the transfer record over TLS and proves, in zero knowledge, that it matches this order: amount, currency, payee, payer, reference and a final status. A verifier checks the proof and signs a claim.
5

The escrow releases

fulfill_intent checks the claim’s signature, rebuilds the order context from on-chain data, and spends the payment’s nullifier. The escrow then releases the USDC to the user.

When something goes wrong

Where the dollars come from

Users fund their Stellar wallet from any supported chain. A USDC deposit from Base, Arbitrum, Avalanche or another CCTP chain is burned there and minted as native USDC in the user’s own Stellar wallet. USDT arrives through USDT0 and is converted to USDC on the Stellar DEX. See Chain abstraction.