Titandocs

Parties & identity

Canton party ids, fingerprint binding, and how the interface resolves "who am I" for every scoped read.

A party is Canton's identity primitive. It looks like this:

Alice::1220f3a91c7e8b4d…
└─┬─┘  └────────┬──────┘
 hint      fingerprint (of the public key)

The suffix is a fingerprint of the party's public key. That binding is what lets the engine verify that a Session-Auth signature really came from the party claiming it — verifyPartyKey recomputes the fingerprint from the presented key and compares.

Duplicate party hints bite. A hint collision on staging produced an engine 502 that Cloudflare turned into an HTML error page, stripping CORS headers — the browser then reported a CORS failure for what was a backend 500-class error. Party hints must be unique per network.

Roles

PartyRole
OperatorOwns the Vault, approves withdrawals, submits batch manifests
TraderDeposits collateral, opens sessions, places orders
AuditorRead-only observer on manifests (retrofit)

Titan is currently mono-operator: GET /v1/vault returns the single active vault, while GET /v1/vaults/:operator exists for the multi-operator future.

Identity in the interface

useParty() resolves the trader party for every scoped query key, with a strict precedence:

Connected Canton walletwallet.canton.address. The real thing.

Persisted trading sessionstores/session.ts. A page reload restores the session before the wallet extension re-announces, so reads do not blank out for a beat.

Seeded dev fallbackMOCK_PARTY_ID (the "Alice" account in the BFF seed). Disconnected surfaces mask this data rather than display it.

Party-scoped TanStack Query keys must include the party. Switching the active trader then invalidates positions, fills, balance, and orders in one shot, instead of leaving one panel showing the previous account.

// ✅ party is part of the key — switching traders refetches everything
useQuery({
  queryKey: ['positions', party, market],
  queryFn: () => positionService.list(party, market),
});

Multi-credential accounts

Auth is exclusive: Canton or EVM or Auth0 — connecting one disconnects the other two. Priority on rehydrate is canton > evm > auth0.

Only the Canton path yields a real trading party. EVM and Auth0 exist for onboarding and identity today; they do not by themselves authorise an order.

MethodSDKSignatureYields a trading party
Canton (CIP-0103)@canton-network/dapp-sdkEd25519Yes
5N Loop@fivenorth/loop-sdkEd25519Yes
EVMReown AppKit + wagmisecp256k1 (SIWE)No
MailAuth0 (email + passkey)No

On this page