Reference · OP Mainnet · 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 Mainnet, chain 10 |
|---|---|
| VaultRegistry v2 | 0xA622c92d3D5b54aeA081Cf410224a8A2eCb08cB7 |
| VaultRegistry v1 | none on this network |
| Deploy block | 158114294 |
| 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 | 0x775dc816594262274E78Ae75D97C8EdB0df5DfED |
| Account implementation | 0x8aA76FaA6629cA1EA8ccC3F9Edf0E8D98816Acd7 |
| WebAuthn RP ID | cryoshield.app (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) |