Reference · OP Sepolia testnet · updated 12 Oct 2026
CryoShield system map
How a secret goes from your browser to permanent storage and back, which pieces we run, and how code reaches production.
This page mirrors docs/system-design.md in the open-source repository.
Components and trust boundaries
CryoShield runs exactly one thing: a static website on Fly. Everything else is either on your device or third-party infrastructure that never sees a plaintext secret.
From one key tap to your secret
Each tap returns one 32-byte PRF output for a fixed salt. Two separate keys are derived from it: one is public (the lookup), one never leaves memory (the wrap key).
What each flow touches
Create a vault
- Tap key 1, then key 2. Each creates a discoverable credential and returns its PRF output; their P-256 public keys become smart-account owners.
- The browser picks a random vaultId, encrypts the secret and wraps the data key once per key.
- One more tap signs the userOp. Pimlico sponsors it and EntryPoint calls
createVault. - The same blob is uploaded to Arweave with
CryoShield-Vault-IdandCryoShield-Locatortags.
Unlock or recover
- Tap any enrolled key once. The PRF output gives the locator and, after the lookup, the wrap key.
resolveLocatorover public RPCs returns candidate vaultIds. No account and no gas needed.- Each candidate is tried; only the genuine vault authenticates, so clones and junk are skipped.
- The recovery CLI does the same over USB, falls back to Arweave, and checks copies against the latest on-chain event hash.
How code reaches cryoshield.app
Nothing reaches main or production without a spec, a pull request and a green ci-ok. There is no bypass, including for admins.
Live reference values
| Network | OP Sepolia testnet, chain 11155420 (mainnet will be OP Mainnet) |
|---|---|
| VaultRegistry v2 | 0xA622c92d3D5b54aeA081Cf410224a8A2eCb08cB7 |
| VaultRegistry v1 | 0xB43f58cF17e64B603aE5588a1DD17E96a0849e44 (read-only) |
| Deploy block | 49755277 |
| Smart account | CryoShield Smart Wallet (Coinbase Smart Wallet v1.1 code that also requires the key's PIN and this RP ID on every signature) on EntryPoint v0.6, P-256 precompile at 0x100 |
| Account factory | 0x59454AD6Af26BEfF43851356B9Dc95a875C673d3 |
| Account implementation | 0x8bFfA95505bAbe88d86694a245E7768fa052395c |
| WebAuthn RP ID | cryoshield-web-dev.fly.dev (permanent) |
| Hosting | Fly app cryoshield-web, org cryoshield, region sin; DNSSEC and CAA on |
| Vault limits | blob ≤ 1024 bytes · 2–8 keys · v2: vault ID derived from the owner account, no per-locator cap, paged lookups (v1: 16 vaults per locator) |
| Source | github.com/prix0007/cryoshield (MIT, public) |