Security Center · architecture transparency

security

Where your keys live, what motion can and cannot touch, and eight checks you can run in this browser right now.

betano independent audit yetchecks · not run yet
Honestly: no independent audit has been done yet. Below is how the protection is built, what we tested and how, and what remains. When volume justifies it a certified firm audits motion and the report lands here. Until then keep in your trading wallets only what you are actively trading.
01

where your keys are

hover or tap a point on the line

outside the key pathholds no keys · serves the page and the engine · the real risk is altered JavaScript

motion's own description of its architecture, drawn from the code — not an independent verification. The checks below test parts of it in your browser.

02

what motion 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.motion.gift, 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.

03

sign-in · 2fa · signing

1

Sign-in

  • Privy session — email / Google / passkey / wallet
  • sessions expire; the page re-checks them
  • motion stores no password of yours
2

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
3

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
04

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 motion
05

checks you can run now

computed in this browser · nothing shows pass until it ran
a wallet in the vault makes more of them meaningful — create one in Wallets if you have none

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.

06

the same code as on GitHub

you don't have to trust us — check it

in plain words

1
The vault code is publicthe code that keeps your keys and signs your trades is on GitHub: github.com/motiongift/motion-vault
2
It has a fingerprinta hash — a long code computed from every byte. Change one letter in the code and the fingerprint is completely different
3
Your browser checks it every timethe vault page tells your browser to run the code only if its fingerprint matches. A swapped file is refused — the vault simply doesn't open
4
Anyone can rebuild itdownload the code, build it, get the same fingerprint. Same fingerprint = this site runs exactly the code you can read. Nothing hidden, nothing added

check it yourself

✓
1 minute, no codepress “Run checks” above: your browser hashes the vault this site really serves and compares it with the published fingerprint in releases.json
✓
5 minutes, with Node.jsgit clone https://github.com/motiongift/motion-vault → npm ci → npm run build:engine → npm run verify — three “OK” lines mean your build, the live file and the published fingerprint are the same bytes
!
See a mismatch?if the live fingerprint matches no release on GitHub, that is exactly what this is for — tell us and tell people
07

checked — and not yet

done

✓
Internal security review · 13 Oct 2026custody model, vault isolation, 2FA, CSP, server hardening, dependencies — findings and their status in the public summary
✓
Vault on its own isolated origin · 13 Oct 2026the keys live in a frame on vault.motion.gift: a separate origin with its own storage and a policy that names the RPC nodes only; wallets made before were moved in once, encrypted
✓
2FA enforced inside the engineexport, backup and outside transfers need a code the engine verifies with the server; a script that skips the page dialog is refused
✓
308 automated testspin the signing paths, the vault protocol, the CSP and the release pinning on every deploy
✓
Browser self-test on every venuereal calldata, eth_call with your balance overridden, nothing signed
✓
Release integrityengine hash-pinned with SRI, hashes published per release
✓
Open-source vault engine · 15 Oct 2026published at github.com/motiongift/motion-vault with a reproducible build: it rebuilds byte for byte into the engine this site serves

not yet

○
Independent auditplanned once volume justifies it; candidates: Trail of Bits, Cure53, Zellic
○
Public bug bountycoming; until then send a direct message to @motiongift — serious findings are fixed first and credited here
08

evidence

Found a problem? Send the details by direct message to @motiongift — please do not post them publicly; serious findings are fixed first and credited here.