You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Implement a two-tier signing service for secp256k1 private keys used in EIP-712 permit signing. Users can either import an existing key or generate a fresh wallet during setup. Both paths encrypt immediately — no plaintext ever touches disk.
There is no fishnet signer export command. The full private key is never retrievable after initial generation or import. If the user loses their master password and SE access, the key is gone. This is by design — same as hardware wallets. Recovery path is:
Use the original key from wherever they sourced it (their wallet backup, or the backup they made during generate)
fishnet signer import or fishnet signer generate for a new key
Call setSigner() on smart wallets if address changed
Acceptance Criteria
fishnet init offers choice: import existing key OR generate new wallet
Import path: accepts pasted private key, encrypts immediately, no plaintext on disk
Generate path: creates secp256k1 keypair, displays full key once, requires backup confirmation before encrypting
Tier 1 (encrypted-keyfile) works on Linux and macOS
Tier 2 (secure-enclave) auto-detects and activates on supported macOS hardware
fishnet signer status shows mode, public address, blurred key, SE binding, last used
fishnet signer reveal shows blurred key after master password auth, clears terminal after keypress
fishnet signer import replaces existing key, logs event in audit log, warns about onchain impact
fishnet signer generate creates new keypair, shows full key once, encrypts after confirmation
fishnet signer rotate aliases to import with replace semantics
fishnet signer pubkey outputs address for contract deployment
Blurred key format: 0x + first 4 hex + •••••••••• + last 4 hex — consistent everywhere
Blurred key cached in DB at creation time (no decryption needed to display)
Signing Service: Two-Tier Local Key Management (Encrypted Keyfile + Secure Enclave)
Owner: Yash
Priority: P0 — blocks onchain permit signing
Crate:
signer/Depends on: Credential Vault (#XX), Policy Engine (#XX)
Blocked by: None
Summary
Implement a two-tier signing service for secp256k1 private keys used in EIP-712 permit signing. Users can either import an existing key or generate a fresh wallet during setup. Both paths encrypt immediately — no plaintext ever touches disk.
There is no
fishnet signer exportcommand. The full private key is never retrievable after initial generation or import. If the user loses their master password and SE access, the key is gone. This is by design — same as hardware wallets. Recovery path is:generate)fishnet signer importorfishnet signer generatefor a new keysetSigner()on smart wallets if address changedAcceptance Criteria
fishnet initoffers choice: import existing key OR generate new walletfishnet signer statusshows mode, public address, blurred key, SE binding, last usedfishnet signer revealshows blurred key after master password auth, clears terminal after keypressfishnet signer importreplaces existing key, logs event in audit log, warns about onchain impactfishnet signer generatecreates new keypair, shows full key once, encrypts after confirmationfishnet signer rotatealiases to import with replace semanticsfishnet signer pubkeyoutputs address for contract deployment0x+ first 4 hex +••••••••••+ last 4 hex — consistent everywhere/api/signer/generateis the only endpoint that ever returns a full private keyfishnet doctorvalidates signer health and SE binding