Credentials
Passwords
Passwords
Hashed with scrypt (N=32768, r=8, p=1) and a per-user salt. Policy: at
least 10 characters with upper, lower, and digit. Five consecutive failures
lock the account for 15 minutes; login errors are generic so nothing leaks
about which part was wrong. Provisioned and admin-reset accounts are forced
to rotate on first login.
Sessions
Sessions
HMAC-SHA256-signed cookie (httpOnly,
secure, SameSite=Lax, 24-hour
TTL). Sessions embed the account’s token version: a password change
bumps it and instantly invalidates every other session.API keys
API keys
256-bit secrets, stored as SHA-256 hashes, unrecoverable after
creation. Prefix-only display, optional expiry, immediate revocation, and
session-only management:
a key cannot create keys, change the password, manage 2FA/passkeys, or
export wallets.
TOTP & passkeys
TOTP & passkeys
TOTP secrets AES-256-GCM encrypted at rest, codes single-use per time
step, disable requires password and a live code. Passkeys are
origin-bound WebAuthn credentials with signed, single-use, fast-expiring
challenges.
Custodial key custody
- Generated server-side; never returned, logged, or shown in any UI.
- Encrypted at rest with AES-256-GCM (per-wallet IV + auth tag) under a platform master key held in the deployment environment.
- Decrypted only transiently, in memory, to sign.
- The single egress path is the deliberate, session-only export, re-encrypted under your passphrase (PBKDF2-SHA256, 310k iterations + AES-256-GCM) before it leaves.
Request hardening
- Input validation everywhere: every body, query, and path param is
schema-validated; failures return structured
validation_errordetails. - Amounts bounded to uint64 in base units; addresses EIP-55 checksummed.
- Ownership enforced on every access: wallets, transactions, keys, and
passkeys resolve only within the authenticated account; cross-tenant IDs
read as
404 not_found. - Content-type as CSRF defense: writes require
application/json, which cross-origin HTML forms cannot produce without a preflight the API never allows. Combined withSameSite=Laxcookies, classic CSRF has no path. - Rate limits on login, reads, and writes; see Rate limits.
Platform isolation
The sandbox resolves only on its dedicated hosts; admin-portal routes 404 there, and sandbox routes 404 on the portal, enforced at the proxy layer, not by convention.Confidentiality boundary
What FHE does and doesn’t hide, in one line: amounts are encrypted; the sandbox can decrypt balances of custodial wallets it manages (that’s how the dashboard shows figures), external wallets stay opaque, and redeem settlement publicly decrypts exactly one value: the burned amount. Details in Confidential transfers.The current MVP sandbox runs on Sepolia, so funds are testnet-denominated; the
same platform orchestrates real value once deployed to Mainnet. Accounts are
provisioned by admins, who can also deactivate them, killing sessions and keys
immediately. The controls above are the production security model; integrate
against them now and it carries over.