Veil — Invisible Wallet
Veil is a passkey-powered smart wallet built on Stellar Soroban. It lets users register, authenticate, and authorize blockchain transactions using device biometrics — Face ID, fingerprint, or Windows Hello — with no seed phrases and no private key exposure.
Veil implements the WebAuthn / FIDO2 standard and the ES256 (P-256 ECDSA) signature scheme. All cryptographic verification happens on-chain inside a Soroban custom account contract.
Live on Stellar Mainnet
Veil is deployed and source-verified on Stellar mainnet — not a testnet-only project. The factory contract CCZ3JLRE…OQ7BK is built reproducibly through scripts/reproducible-build.sh (Docker rust:1.85.0-bookworm); its on-chain bytecode matches contracts/expected-hashes.json byte for byte (factory.wasm 3a6756d2…, invisible_wallet.wasm b485f817…). A reviewer can rebuild locally and match the ledger directly.
Real transactions on the public network prove the full passkey path works end to end:
| What it proves | Transaction |
|---|---|
A WebAuthn passkey authorizing a mainnet transfer on-chain (__check_auth) | 626e1106…ebcc |
| Soroswap aggregator swap (1 XLM → 0.2024626 USDC) | 5e29e3d8…6f4f |
| Sponsored classic send to an external wallet (LOBSTR) | 3ef7598f…ab5c |
| Passkey wallet deployed via the factory | acbc3147…57fe |
Full receipts (including the wallet contract and funding transaction) are in the repo’s docs/SCF_STRATEGY.md §0. Note there is no public mainnet Soroban RPC — see Choosing a Network for the paid-provider proxy the wallet uses.
Why Veil?
| Traditional Wallet | Veil |
|---|---|
| 24-word seed phrase | Fingerprint / Face ID |
| Private key file | Secure enclave (never exported) |
| User must back up keys | Device + guardian recovery |
| Complex multi-step UX | Single tap to authorize |
| Centralized custody risk | Fully self-custodied, on-chain |
Core Concepts
- WebAuthn — A W3C standard that lets browsers create and use P-256 key pairs stored in hardware secure enclaves.
- Soroban Custom Account — A contract that implements
__check_auth, called by the Soroban runtime for every transaction authorization. - Challenge Binding — The Soroban
signature_payload(32 bytes) is used directly as the WebAuthn challenge, binding the biometric signature to the exact transaction. - P-256 ECDSA — The ES256 algorithm used by WebAuthn, verified on-chain using the
p256Rust crate.
Project Structure
invisible_wallet/
├── contracts/invisible_wallet/ # Rust/Soroban smart contract
│ └── src/
│ ├── lib.rs # Entry points + __check_auth
│ ├── auth.rs # WebAuthn ES256 verification
│ └── storage.rs # Signer/guardian storage
└── sdk/
└── src/
├── useInvisibleWallet.ts # React hook
└── utils.ts # Crypto utilitiesQuick Navigation
Development Status
| Phase | Status | Description |
|---|---|---|
| Phase 1 | Complete | Contract, WalletError, 6 unit tests |
| Phase 2 | Complete | Full WebAuthn pipeline, DER to raw, key extraction |
| Phase 3 | Complete | Factory contract, deterministic deployment |
| Phase 4 | Complete | Testnet + mainnet deployment, end-to-end demo |
| Phase 5 | In Progress | Guardian recovery, multi-signer, replay protection |
Veil is live on Stellar mainnet (see above) but still under active development — the contract and SDK APIs may change before a stable 1.0 release. Test on Testnet before moving real value, and never deploy unaudited changes to Mainnet.