Core Flows
Normative semantics for every money movement. Field names and webhook types here are contractual.
Settlement cycles
Every vault settles in cycles: requests accumulate while the cycle is accepting; at the cutoff it moves to processing (assets are deployed to or withdrawn from the underlying RWA strategy); when results are final the cycle settles and balances update. You never manage cycles — you observe settlementCycle fields on intents and events, and vault.cycle.* webhooks.
Deposit — Sui direct rail (rcusdp-sui, xaua-sui)
build tx ──► user signs ──► pending record (cycle N)
──► cycle N settles (T+1 / T+3) ──► shares credited
POST /v1/vaults/:vaultId/tx/deposit→ unsigned tx +intentId.- Sign & submit; on-chain a pending record joins the current cycle. Intent:
confirmed; webhooktransaction.deposit.confirmed. - While the cycle is
accepting, anrcusdp-suideposit is cancelable (tx/cancel-depositwith therecordIdfrom positions; a 200 bps cancel fee is withheld, disclosed in the build response'ssummary.cancelFeeBps).xaua-suisubscriptions are not cancelable —tx/cancel-depositreturns 400. - Cycle settles → shares credited at the cycle's share price. Intent:
settled; webhooktransaction.deposit.settled.
Legacy Solana rail (rcusdp-sol) — frozen
The Solana gateway rail is frozen: the rcusdp-sol vault is paused in the catalog. Deposit and redeem builds return 409 vault_paused; tx/claim and tx/cancel-deposit stay open so any remaining balances can exit, and the legacy read endpoints keep working. New integrations should target the Sui vaults only.
Redeem
- Queued (default, all vaults):
tx/redeem {mode:"queued"}locks shares into the current cycle → on settlement the proceeds are paid straight to the account's wallet —transaction.redeem.settledcarries the deliveredamount, and there is nothing further to do. (Verified against a live mainnet settlement cycle: the settle transaction transfers USDC to every redeeming wallet directly.) - Instant (
rcusdp-suionly):tx/redeem {mode:"instant"}pays USDC immediately, minus an instant-redeem fee. No cycle involved. Availability and the fee are operator-tunable on-chain — readsettlement.instantRedeemfromGET /v1/vaults/rcusdp-suifor current values instead of hard-coding them.
tx/claim exists for vaults/rails that allocate a claimable balance instead of paying out directly (the event then carries claimable and tx/claim pays the account's own wallet, transaction.claim.confirmed). On rcusdp-sui today, redemption proceeds arrive without a claim step. Either way funds only ever reach the account's own wallet — moving them anywhere else is a treasury withdrawal. Fiat off-ramping is your side of the integration.
XAUa specifics
- A deposit on
xaua-suiis a gold subscription: priced at the settlement cycle's NAV, settled T+3 business days, cycle cutoff 10:00 UTC (requests after the cutoff join the next cycle). Subscriptions settle net of the issuer's subscription fee — thetransaction.deposit.confirmedevent reports the netamountand thefee. - Subscriptions are not cancelable once submitted (
tx/cancel-depositreturns 400); redemptions are likewise T+3 and there is no instant path. - Wallets must be whitelisted by the issuer before transacting — deposit builds preflight the on-chain whitelist and return 403
not_whitelisteduntil then. Omnibus/treasury accounts need exactly one whitelisted wallet; individual mode requires the managed batch-whitelist flow — plan it with TBook. - XAUa is non-yield-bearing: P&L is gold price movement, reported by the same earnings endpoint.
Failures
| Failure | What happens | What you see |
|---|---|---|
| Unsigned tx expires before signing | nothing moved | intent → expired; rebuild with a new Idempotency-Key |
| Transaction reverts on-chain | nothing moved | intent → failed with failureReason |
| Cycle rolled back (operational abort) | deposited funds returned: in-wallet (direct rail) or claimable (legacy gateway rail) | vault.cycle.rolled_back + per-account transaction.deposit.cancelled (reason:"rollback"). Omnibus: reverse your sub-ledger allocation using the amounts in the event |
| Vault paused | no new deposits/redeems; claims and cancel-deposits still work | vault.paused / vault.unpaused; builds return 409 vault_paused |
| Your webhook endpoint down | deliveries retried 1m/5m/30m, then marked failed | catch up via GET /v1/events |
Timing summary
| Vault | Deposit | Redeem | Instant redeem | Cancel window |
|---|---|---|---|---|
rcusdp-sui | T+1 | T+1 | operator-tunable — see GET /v1/vaults/rcusdp-sui | while cycle accepting (200 bps fee) |
rcusdp-sol (frozen) | paused — 409 vault_paused | paused — 409 vault_paused | — | claim & cancel remain open |
xaua-sui | T+3 (cutoff 10:00 UTC) | T+3 | — | not cancelable |