How the pieces fit
The stack has four main pieces:
┌──────────────────────────────┐ ┌──────────────────────────────┐
│ Quantum Wallet │ │ PQ Signer │
│ Self-custodial extension │ │ Custodian co-signing service │
│ ML-DSA-44 signing │ │ TEE + KMS — no hot key │
│ Safe7579 smart accounts │ │ Threshold ML-DSA via Mithril │
└───────────────┬──────────────┘ └───────────────┬──────────────┘
│ uses │ uses
└──────────────┬────────────────────┘
▼
┌──────────────────────────────────────────────────────────────────┐
│ PQ Smart Account │
│ ERC-7579 validator module + Arbitrum Stylus ML-DSA-65 verifier │
│ Plug-and-play PQ authorization for ERC-4337 accounts │
└─────────────────── ────────┬──────────────────────────────────────┘
│ uses
▼
┌──────────────────────────────────────────────────────────────────┐
│ post-quantum-packages │
│ NIST PQ packages (TS + Rust): OIDs, key encoding, JWS/JWE, │
│ COSE/CMS, FIDO2, TLS, blockchain signers, WASM/Worker runtimes │
└──────────────────────────────────────────────────────────────────┘
post-quantum-packages
A monorepo of NIST PQ packages, all published to npm and crates.io with identical APIs and shared NIST ACVP test vectors. The catalog covers:
- Core primitives — OIDs, algorithm identifiers, key encoding (DER/PEM/JWK/SPKI/PKCS#8), test vectors, key strength, size calculation, fingerprints, RNG, side-channel helpers.
- Certificates — SPKI, PKCS#8, CSR, X.509 parse and verify.
- Web standards — JWS, JWE, JWK, JWT verify, COSE, CMS, PKCS#7, XMLDSig, DKIM.
- Encryption and key exchange — ECIES, HPKE, KEM combiner, Noise.
- Authentication — FIDO2, WebAuthn, SSH agent, Kerberos.
- Network protocols — TLS 1.3 client, DTLS, QUIC crypto.
- Blockchain — Ethereum signer, Solana signer, Bitcoin Taproot.
- Runtime — browser WASM build, Web Worker wrapper.
See Overview and package catalog for the full list and current implementation status.
PQ Smart Account
A three-layer system that lets any ERC-7579-compatible smart account require ML-DSA-65 signatures for selected operations, without protocol changes or new chains:
- Off-chain tools — Rust CLI (
pq-keygen,pq-sign,pq-verify), a MetaMask Snap, and a WalletConnect dapp build UserOperations and sign their hashes with ML-DSA-65. - Solidity validator module (
PQValidatorModule) — ERC-7579 compliant. Stores a 1,952-byte public key per account, exposesvalidateUserOpandisValidSignatureWithSender, and delegates verification to the Stylus contract. - Stylus verifier (
MLDSAVerifier) — Rust/WASM running on Arbitrum Stylus. ML-DSA-65 verification at roughly 374K gas — 10–100× cheaper than the equivalent pure-EVM implementation.
Compatible with Kernel v3, Safe7579, and other ERC-7579 accounts. End-to-end validated locally on a Nitro devnode with the Alto bundler.
See Architecture overview for the request flow.
PQ Signer
A custodian co-signing service for institutions and teams that cannot accept a single hot key. PQ Signer uses hardware Trusted Execution Environments (AWS Nitro Enclaves) and KMS-backed key material to enforce a policy boundary: a signature is only produced when the transaction passes a configurable authorization check, regardless of whether the application host is compromised.
Key properties:
- No hot key — signing key material never exists outside the enclave or KMS; there is no file or environment variable to steal.
- Policy enforcement inside hardware — the enclave verifies authorization before participating in the signing protocol, not afterward.
- Threshold signing via Mithril — supports T-of-N ML-DSA signing (up to 6 parties), producing standard FIPS 204 output accepted by any ML-DSA verifier.
- Drop-in for custodians — PQ Signer slots into any ERC-4337 workflow as a co-signer; it does not replace the wallet, it augments it.
See PQ Signer architecture for the full trust model and end-to-end flow.
Quantum Wallet
A self-custodial Chrome extension and Vite web app:
- Crypto — ML-DSA-44 signing via
wdk-signing-pq, BIP-39 mnemonic, AES-256-GCM encrypted vault, ephemeral master key in session storage. - Accounts — Safe7579 smart accounts with the
PQValidatorModule. Custom viem code path for ERC-4337 UserOp construction (no Safe SDK). - Chains — Arbitrum (USDT today, more ERC-20s queued), native Quantum L1 (QBIT), with an Arbitrum USDT ↔ Quantum qUSDT bridge UI.
- UX — works as a standalone extension or as a "dApp" connected to the extension via EIP-6963, and ships a faucet app for testnet onboarding.
How they share code
- The wallet imports
pq-key-encoder,pq-oid, andpq-algorithm-idfrom npm (transitively, viawdk-signing-pq) to handle JWK / SPKI / fingerprint serialization for backup and recovery. - The smart-account validator stack uses the Rust ML-DSA implementation directly in the Stylus contract; the Solidity module is independent of
pq-*packages because all encoding happens off-chain. - Quantum L1 uses
pq-*packages for transaction signing, key encoding, verifier-contract tooling, and the PQ wallet layer that extends to other EVM chains.
The same packages can be (and are) used outside this stack. They are MIT-licensed.
Where the lines are
A common confusion: the algorithm the wallet uses (ML-DSA-44) is not the same as the algorithm the smart-account validator on Arbitrum uses (ML-DSA-65). This is intentional. ML-DSA-44 is faster to sign and produces smaller signatures, which is what an extension needs for responsive UX on a constrained device. ML-DSA-65 gives a wider security margin (NIST Level 3 vs Level 2) for on-chain verification, where signature size is paid in L1 calldata and verification gas is the dominant cost. The validator can be configured for either; current production uses ML-DSA-65.
Related
- Threat model — what we actually protect and what we deliberately do not
- PQ Signer architecture — TEE + KMS trust model and signing flow
- Quick start — install and run a few lines
- Smart account architecture — the on-chain flow in detail