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
| Party | Role |
|---|---|
| Operator | Owns the Vault, approves withdrawals, submits batch manifests |
| Trader | Deposits collateral, opens sessions, places orders |
| Auditor | Read-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 wallet — wallet.canton.address. The real thing.
Persisted trading session — stores/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 fallback — MOCK_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.
| Method | SDK | Signature | Yields a trading party |
|---|---|---|---|
| Canton (CIP-0103) | @canton-network/dapp-sdk | Ed25519 | Yes |
| 5N Loop | @fivenorth/loop-sdk | Ed25519 | Yes |
| EVM | Reown AppKit + wagmi | secp256k1 (SIWE) | No |
| Auth0 (email + passkey) | — | No |