How It Works
Assets, rails, and vaults
The platform decouples three things that other systems hard-wire together:
- Assets — the RWA products themselves.
rcusdp(USD yield from tokenized T-bill / money-market strategies) andxaua(tokenized gold) live natively on Sui. - Rails — the path from where your users' USDC sits to the asset.
- Vaults — an asset made investable on a specific rail. One asset can have several vaults.
┌────────────────── Asset (native on Sui) ──────────────────┐
│ │
USDC on Sui ───────────► sui:direct rail ───────────► rcusdp-sui / xaua-sui │
│ (same chain, no bridge) │
└─────────────────────────────────────────────────────────────┘
Your users' USDC sits on Sui, the same chain as the assets, so deposits go straight into the vault — no bridge, no extra latency. Your integration code is identical across vaults; only the vaultId and settlement timing differ.
New chains and new assets appear as new vault entries in the asset catalog — your integration does not change.
:::note Legacy Solana rail (frozen)
A solana:gateway rail (rcusdp-sol) predates the Sui-native integration and is paused: deposit and redeem builds return 409 vault_paused, while claim and cancel-deposit stay open so any remaining balances can exit. Legacy Solana read endpoints remain available.
:::
Settlement cycles
Every vault settles in cycles. Requests accumulate while a cycle is open; at the cutoff the operator closes the batch and deploys assets to, or withdraws them from, the underlying RWA strategy; when results land on-chain the indexer emits the per-account transaction.*.settled events and balances update. (Platform-wide vault.cycle.* events exist in the contract for cycle-level signals; the per-account transaction.* events are the reliable per-user notification.)
Cycles exist because real-world assets take real time to subscribe and redeem (T-bills settle T+1; gold subscription via the issuer settles T+3), and because batching makes settlement cheaper and easier to verify on-chain.
You never manage cycles. You observe them:
| Where | What you see |
|---|---|
GET /v1/vaults/:vaultId | The vault's settlement design (settlement.deposit, settlement.redeem, settlement.cutoffUtc, settlement.instantRedeem) plus live status, paused, sharePrice, and apy |
| Positions & transactions | Pending deposits/redeems (with recordId) on GET …/positions; indexed rows on GET …/transactions |
| Webhooks | Per-account transaction.*.confirmed / transaction.*.settled events (subscribe to these); platform-wide vault.cycle.* where emitted |
What your user experiences
| Action | Immediately | After the cycle settles |
|---|---|---|
| Deposit | "Processing — will settle T+1" (cancelable) | Shares credited; transaction.deposit.settled webhook with the exact shares credited |
| Redeem (queued) | "Processing redemption" | USDC claimable; transaction.redeem.settled webhook |
| Claim | USDC arrives in the account's own wallet immediately | — |
Instant redeem (rcusdp-sui, when enabled) | USDC immediately, at a higher fee | — |
Timing per vault is published in the catalog (settlement.deposit, settlement.redeem, settlement.cutoffUtc) — currently T+1 for rcusdp-sui and T+3 for xaua-sui (cutoff 10:00 UTC). Instant-redeem availability and its fee are operator-controlled on-chain and can change at any time — treat the catalog values as indicative, and handle a rejected instant redemption gracefully (fall back to a queued redemption).
The transaction model: build → sign → submit → confirm
- Build —
POST /v1/vaults/:vaultId/tx/deposit(ortx/redeem,tx/claim,tx/cancel-deposit) returns an unsigned transaction plus anintentId. - Sign & submit — your wallet infrastructure signs: a WaaS provider for
individualaccounts, your backend key foromnibus, a multisig flow fortreasury/business. You submit to the chain RPC. - Confirm — optionally report the digest back (
POST /v1/transactions/:intentId/confirm) for instant status tracking; TBook's indexer also detects the transaction on-chain within about a minute either way. - Settle — the settlement cycle completes and the intent reaches
settled; webhooks notify you at each step.
This is why the platform is non-custodial: TBook can propose transactions but can never execute them.
Prices and yield
Each asset's price is its NAV per share/unit, exposed in the catalog and GET /v1/vaults/:vaultId/price. Where a live NAV source is wired (rcUSDP), the value is refreshed at request time; assets without a live feed yet return their catalog reference price. For yield assets, apy is published alongside. Your users' earnings are computed from indexed history and live positions — see Positions & Earnings for the exact formulas.
Next steps
- Account Models — who holds what
- Core Flows — normative semantics, including rollbacks and XAUa specifics
- Quickstart — run the full loop on sandbox