Settlement
Senticore executes trades off-chain and periodically anchors settlement state on-chain.
Settlement lifecycle
Active vs committed state
| State | Meaning |
|---|---|
| Active state | Latest sequencer-confirmed trading state |
| Committed market state | Market/order-book state covered by the checkpoint newStateRoot |
| Committed financial state | Account liabilities and exit entitlements covered by the checkpoint solvencyRoot and exitRoot |
| Withdrawable state | Claims that can be proven against a published withdraw root |
The web application should clearly distinguish active trading balances from committed withdrawal availability.
Under the current private-beta validator policy, an asset deposit may change the
financial roots without changing the market-state root. Clients must not infer
deposit failure from latestStateRoot alone.
Deposits
Deposits go through the MultiCollateralVault on Arbitrum One,
0xd1f0fffb736d75fd402121eb14bdc46bfe80ca02 (see
Contract addresses):
- Call
deposit(assetId, amount)after an ERC-20 approval, ordepositWithPermit(...). Both creditmsg.senderonly; there is no deposit-for-another-account, so send the transaction from the wallet that owns the engine account you want funded. assetId = keccak256(abi.encode(token, decimals, chainId)). Read the registered assets with their token addresses, decimals andassetIdfromGET /api/v1/public/assets(ARB, CKT, FYT, TCO, USDC, USDT, WBTC and ETH, listed as WETH) instead of deriving them by hand.- USDC is the native Arbitrum USDC
0xaf88d065e77c8cC2239327C5EDb3A432268e5831, not bridged USDC.e. - The engine credit arrives about 15–20 minutes after the on-chain
deposit; the listener waits for confirmations before it credits. A freshly
listed asset can take longer on its very first deposit while the listener
catches up to the current block. Confirm the credit on
GET /api/v1/accounts/{account}(usdcFree,assetBalances), not from the transaction receipt.
Withdrawal proof path
Withdrawal proofs are available to authenticated wallet clients and the protected settlement/operator integration through:
GET /api/v1/protocol/withdraw-proof
This is not an anonymous public endpoint. Wallet applications use an existing
approved Read credential bound to the requested wallet for both the proof
route and GET /api/v1/protocol/withdrawals/{account}:{nonce}?asset=....
For a browser this is Authorization: Bearer <read-token>; refresh the existing
delegated Read token before fetching the proof. A credential for a different
wallet is not sufficient. Both responses are private, no-store.
Vault claims belong to the connected owner wallet, not a selected trading subaccount. Keep an existing withdrawal request and nonce when retrying a failed status/proof read; a read-authentication failure does not cancel the request or prove that a withdrawal transaction executed. The normal signed/on-chain withdrawal lifecycle is unchanged.
The existing operator proof credential remains supported for execution and recovery tooling, but must never be embedded in frontend code or given to users.
Integrations should treat withdrawal proofs as verification material and must distinguish proof availability from final on-chain execution.
Operational guarantees
For outcome markets, committing a resolution starts the persistent resolved-position settlement flow; it does not itself prove every account has been credited. Oracle V2 finalization waits past the market's committed recovery deadline, and payout follows asynchronously. Valid YES/NO pays 1/0 USDC per share; V2 INVALID pays 0.50/0.50 with deterministic rounding. See Oracle and payout rules.
Settlement depends on:
- durable sequencer logs,
- projection consistency,
- checkpoint construction,
- publisher quorum signing,
- on-chain contract execution,
- incident runbooks for lag or drift.
For the custody contract, see MultiCollateralVault. For checkpoint anchoring, see StateCommitment.