security
Where your keys live, what Dart can and cannot touch, and eight checks you can run in this browser right now.
where your keys are
hover or tap a point on the lineoutside the key pathholds no keys · serves the page and the engine · the real risk is altered JavaScript
- generated
- in your browser
- stored
- AES-GCM-256 ciphertext; the encryption key is a non-extractable CryptoKey in this browser's IndexedDB — it cannot be copied out, and it sits in the storage of vault.dartterminal.fun — a separate origin the pages' scripts cannot reach
- signs
- the engine, in the page — nothing leaves; exports and outside transfers need a 2FA code the engine itself verifies with the server
- recovers
- backup file (passphrase, PBKDF2 600 000 rounds) restores on any device; private-key export behind 2FA
Dart's own description of its architecture, drawn from the code — not an independent verification. The checks below test parts of it in your browser.
what Dart cannot — and can — do
cannot — while the page you run is the real one
Move your trading fundsthe server never holds those keys: they exist as ciphertext in your browser and in your backup file. Only altered page code could reach them — the right column is about exactly that.
Sign with your main walletsigning needs your Privy session and happens in Privy's enclave.
Read your private keys from the serverthey never travel there. In the browser the decrypted keys live inside the engine, not on window; the encryption key cannot be copied out of this browser, and since 13 Oct the vault runs on its own origin, vault.dartterminal.fun, whose storage this page's scripts cannot reach at all.
Change a transaction after Buycalldata is built, dry-run and signed in your browser; the server serves data and sees the signed transaction no earlier than the node does.
can — and how you would notice
Ship the page and enginea hacked server could ship altered JavaScript — the real risk of any web wallet, and the one every "cannot" rests on. The engine is hash-pinned (SRI), hashes are in /releases.json, CSP blocks inline and third-party scripts, and the engine itself asks the server to verify your 2FA code before an export or an outside transfer — a script that skips the page dialog still needs your code.
See your trading addressesthey are public on chain anyway; the page sends addresses, never keys.
Show a wrong price or routethe engine dry-runs every buy with eth_call first, so a broken route fails in the preview, not with your money. A deliberately wrong quote is not caught by that — compare the quote with the chart before Buy.
Go offlineyour keys stay in your browser and your backup file; export them and use any wallet.
sign-in · 2fa · signing
Sign-in
- Privy session — email / Google / passkey / wallet
- sessions expire; the page re-checks them
- Dart stores no password of yours
Two-factor
- TOTP app + ten one-time recovery codes
- you choose the gates: outside withdrawals, key export, transfers, backups
- a correct code opens the action for 10 min in this browser; repeated wrong codes lock 2FA for a while
- the engine checks the code with the server itself, from inside the isolated vault origin, so page scripts cannot skip the gate
- 2FA secrets sit encrypted on the server and can never move funds by themselves
Signing
- trading wallets sign in the page — no pop-ups, no confirm step: speed is the point of a terminal
- that is why 2FA sits on the exits
- no method signs arbitrary calldata or messages: the engine composes every transaction itself
- the main wallet signs through Privy's flow with your session
if something goes wrong
The server is hacked
- No keys to steal there — the server holds your session, settings and encrypted 2FA secrets, never wallet keys
- The danger is a modified page. The engine's hash is pinned in the page and published; compare it with the release file (the check below does)
- Limitation, plainly: hashes published by the same server cannot prove the server is honest — that is what an independent audit and an open-source engine are for
The site is down or gone
- Your trading keys are still here — in this browser's storage and in your backup file
- export a private key (2FA) and import it into any wallet; the backup file opens with your passphrase in any browser via the restore flow
- your Privy wallet is reachable through Privy, independently of Dart
checks you can run now
computed in this browser · nothing shows pass until it ranthe trading keys are stored encrypted; the encryption key cannot be copied out of this browser and lives on the vault origin, not here
not run yet — press Run checks
this origin's storage holds ciphertext only — no private key, no mnemonic
not run yet — press Run checks
the wallet list exposes addresses only; nothing secret hangs on window
not run yet — press Run checks
does the vault run on its own origin, out of reach of the page's scripts?
not run yet — press Run checks
scripts may only come from this origin — no inline, no third-party script hosts
not run yet — press Run checks
the engine file served right now hashes to what the page pins and what /releases.json publishes
not run yet — press Run checks
is 2FA enabled on your account, and which actions does it gate?
not run yet — press Run checks
a real buy, built by the engine, run through eth_call with your balance overridden — nothing signed, nothing sent
not run yet — press Run checks
The fuller, more technical version is the self-test: it also dry-runs a real buy on every venue through eth_call without signing anything.
checked — and not yet
done
vault.dartterminal.fun: a separate origin with its own storage and a policy that names the RPC nodes only; wallets made before were moved in once, encryptednot yet
src/webEngine.ts; publishing it is the next transparency stepevidence
Found a problem? Send the details by direct message to @dartterminal — please do not post them publicly; serious findings are fixed first and credited here.
