cctp-deposit for USDC, usdt0-deposit for USDT) and the funding mode.
Before you start
The owner’s Stellar account needs a trustline to Circle’s USDC (and USDT0, for USDT). If it is missing, the first action isstellar_trustline. Handle it with Pesa’s sponsored onboarding, which pays the reserve.
Direct mode
1
Quote and create
buy_amount and fee.details before the user confirms. Keep the idempotency key: if the request times out, retry with the same key.2
Verify and sign the calls
3
Submit the burn
DepositForBurn log in the receipt.4
Wait for credit
Poll
getTransfer every few seconds until status is completed. Show stage as progress.Deposit address mode
With a deposit address, the transfer starts atAWAITING_FUNDS and the first action is send_to_address.
FUNDED and the next action is evm_calls. A Privy smart wallet sends them as one batched transaction. See React Native.
At most one open deposit-address transfer can exist per chain and address.
USDT through USDT0
Useroute: "usdt0-deposit". The actions come in this order:
stellar_trustline, if the USDT0 or USDC trustline is missing.evm_calls: anapprove(Ethereum only) and the OFTsend. Check them withverifyUsdt0Calls. Indeposit_addressmode, Pesa first tops up the LayerZero fee in native coin.stellar_tx: the USDT0 to USDC swap on the Stellar DEX, after LayerZero delivers. Check it withverifyStellarSwap, sign, and submit{ kind: "stellar_tx", signed_xdr }.
SWAP_REQUOTE and the swap action carries a lower output. Show the new amount; signing it is the user’s approval.