Skip to main content

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
  1. POST /v1/vaults/:vaultId/tx/deposit → unsigned tx + intentId.
  2. Sign & submit; on-chain a pending record joins the current cycle. Intent: confirmed; webhook transaction.deposit.confirmed.
  3. While the cycle is accepting, an rcusdp-sui deposit is cancelable (tx/cancel-deposit with the recordId from positions; a 200 bps cancel fee is withheld, disclosed in the build response's summary.cancelFeeBps). xaua-sui subscriptions are not cancelabletx/cancel-deposit returns 400.
  4. Cycle settles → shares credited at the cycle's share price. Intent: settled; webhook transaction.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 wallettransaction.redeem.settled carries the delivered amount, 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-sui only): tx/redeem {mode:"instant"} pays USDC immediately, minus an instant-redeem fee. No cycle involved. Availability and the fee are operator-tunable on-chain — read settlement.instantRedeem from GET /v1/vaults/rcusdp-sui for 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-sui is 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 — the transaction.deposit.confirmed event reports the net amount and the fee.
  • Subscriptions are not cancelable once submitted (tx/cancel-deposit returns 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_whitelisted until 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

FailureWhat happensWhat you see
Unsigned tx expires before signingnothing movedintent → expired; rebuild with a new Idempotency-Key
Transaction reverts on-chainnothing movedintent → 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 pausedno new deposits/redeems; claims and cancel-deposits still workvault.paused / vault.unpaused; builds return 409 vault_paused
Your webhook endpoint downdeliveries retried 1m/5m/30m, then marked failedcatch up via GET /v1/events

Timing summary

VaultDepositRedeemInstant redeemCancel window
rcusdp-suiT+1T+1operator-tunable — see GET /v1/vaults/rcusdp-suiwhile cycle accepting (200 bps fee)
rcusdp-sol (frozen)paused — 409 vault_pausedpaused — 409 vault_pausedclaim & cancel remain open
xaua-suiT+3 (cutoff 10:00 UTC)T+3not cancelable