Developers
Five ways to use UDAs
A Universal Deposit Address is one persistent address per owner that accepts deposits on every supported EVM chain and settles every deposit to a destination you configure once. These are the five product shapes where that collapse pays off most.
Note

Phase 1 covers Ethereum, Arbitrum, Base, BNB Smart Chain, and Polygon, with the major stablecoins (USDC, USDT) plus native assets. The full list lives at Supported networks and is also queryable at runtime via GET /v1/uda/supported-chains.

Use cases

On-ramps and off-ramps

A fiat-on-ramp adds a new chain by standing up nodes, indexers, reorg handling, and per-chain treasury wiring. Each addition is a quarter of engineering work, and the users sitting on the unsupported chain churn out long before the new integration ships.

With a UDA you skip that entire path. Issue one address per user, advertise "deposit any supported stablecoin from any supported chain", and let Stridge route the deposit to the chain your treasury actually operates on. The set of chains you support on the deposit side grows whenever Stridge adds a network — without you shipping anything.

Source the user hasYour treasury wantsWhat UDA does
USDC on BaseUSDC on ArbitrumCross-chain transfer via the cheapest bridge route
USDT on EthereumUSDC on ArbitrumSwap + bridge in one settlement
ETH on EthereumUSDC on ArbitrumSwap to USDC, bridge to Arbitrum

The user does not pick a network in your UI — they paste an address. The on-ramp side of your app stays a single-chain integration; the deposit side is multi-chain by construction. Start at the UDA Quickstart.

B2B payouts and treasury

Reconciling stablecoin payouts across chains is the kind of work that produces shadow spreadsheets. The same nominal "USDC" splits into USDC.e, native USDC, bridged USDC; payers send on whichever network their CFO happened to fund last; finance has to map every transfer back to a customer by memo, timing, and luck.

Issue one UDA per customer, biller, or counterparty and the reconciliation problem collapses. Whatever chain the payer sends from, the funds land on the chain and in the token you operate in — and every deposit shows up as a uda.settlement.completed webhook tagged with the owner you assigned at create time.

  • One row per customer — the owner field is your stable identifier; use the customer id, the entity id, or the email you already index on.
  • No more memos — the deposit lands at a per-customer address; the address itself is the routing key.
  • One token, one chain on the way out — settle every payer to your operational chain (e.g. Arbitrum USDC) regardless of where they sent from.

The settlement record at GET /v1/settlements/{id} carries the source-chain tx, the destination-chain tx, the route taken, and the total fee in destination units — drop it into your ledger and reconciliation is one webhook event away. See Settlements for the full record shape.

For payout and withdrawal flows where the back-office only knows the payer's on-chain deposit tx hash, look the settlement up by reference:

GET /v1/uda/settlements/by-reference?reference={deposit_tx_hash}

Three lookup paths cover every back-office need:

You knowUse
Internal settlement idGET /v1/settlements/{id}
On-chain deposit tx hashGET /v1/uda/settlements/by-reference?reference=…
Nothing yet — wait for the eventuda.settlement.completed webhook

See List settlements by reference for the full response shape.

Peer-to-peer payments

A consumer P2P app's signup funnel dies on the second screen, where the new user has to pick a network. They hold USDC on Polygon; the app expects USDC on Base; nobody who is not already a crypto power user gets past that screen.

UDA turns "deposit" into a single field. Every user gets one address at signup, that address accepts deposits on every chain the user might happen to hold funds on, and the destination chain is whatever your wallet stack is built around. The chain picker disappears from your onboarding.

Tip

The UDA id is permanent and idempotent on (tenant, owner). Calling POST /v1/uda twice with the same owner returns the existing record — safe to wire into a signup hook without worrying about duplicates.

The three webhooks (deposit.confirmed, uda.settlement.created, uda.settlement.completed) give you exactly the events you need to drive the in-app deposit UI — pending state on confirm, "swap in progress" on settlement created, "funds available" on settlement completed.

Crypto neobanks

A neobank's deposit screen sets the tone for the entire product. If users see "select network, select token, copy the right address, double-check the chain in your sending wallet, hope for the best", the app feels like a developer tool. If they see one address that just works, it feels like a bank.

UDAs let you ship the second experience without operating bridges, monitoring solver liquidity, or staffing a settlement on-call. Each account holder gets one persistent deposit address that:

  • Accepts USDC, USDT, and the chain's native asset on Ethereum, Arbitrum, Base, BNB Smart Chain, and Polygon.
  • Lands every deposit in your account-ledger token on your account-ledger chain.
  • Emits one webhook per lifecycle stage so the in-app balance can update without polling.

Pair it with GET /v1/uda/quote to surface an estimated fee and arrival time in the deposit UI before the user broadcasts. The quote response mirrors a completed settlement, so the same UI components render both the pre-deposit estimate and the post-deposit confirmation.

Invoicing and checkout

Invoice flows want a one-to-one mapping between an invoice and an address — for the same reason cash registers want a receipt number. The address is the routing key for reconciliation, support, and dispute handling.

UDAs satisfy this with no extra wiring. Create one UDA per invoice (use the invoice id as owner), embed the deposit address in the invoice, and the payer sends from whatever chain and stablecoin they happen to hold. The settlement webhook arrives tagged with the same owner, so closing the invoice is a one-line lookup against your invoice id.

StepWhat you do
1POST /v1/uda with owner = invoice_id, destination = your treasury
2Render deposit_addresses in the invoice; let the payer pick a chain
3Wait for uda.settlement.completed webhook tagged with owner = invoice_id
4Mark the invoice paid; reconcile against settlement.amount

Because every invoice gets a dedicated UDA, partial payments, overpayments, and late payments all land on the right invoice automatically — no memos, no human triage.

Where to start
Was this page helpful?