Proposal, not live spec. Status names below are a proposal shaped after on-chain
deposit flows (Li.Fi execution events) and payment lifecycles (Stripe, Transak). The team
should confirm the final set with the routing layer.
Proposed lifecycle
| Status | Meaning | Terminal? | Credit the user? |
|---|---|---|---|
created | Deposit created, funds not yet moving | No | No |
routing | Funds being settled cross-chain | No | No |
source_confirmed | Source payment confirmed on-chain | No | No |
completed | USDC landed on the target chain | Yes | Yes |
failed | Deposit could not be completed | Yes | No |
refunded | A completed deposit was reversed | Yes | No (reverse credit) |
Rules worth adopting (from Stripe)
- Credit on
completedonly. Never credit from a client-side event. - Statuses can arrive out of order. Don’t assume order; reconcile against current status.
- Final states are terminal -
completed,failed,refundeddon’t change.
Two model shapes we saw
- On-chain execution events (Li.Fi):
RouteExecutionStarted / Updated / Completed / Failed. Closest to Rheon, because the deposit settles on-chain. - Fiat-order statuses (Transak): a longer chain like
AWAITING_PAYMENT → PROCESSING → COMPLETED(+FAILED / REFUNDED / EXPIRED). Relevant once the Bank On/Off-Ramp lands.
Three tracking channels (Transak)
The same status can be delivered three ways, with one consistent payload - the partner picks per need:- Polling - reconciliation
- Webhook - push (recommended for crediting)
- WebSocket - near-real-time stream