01
Wallet creation & import
Spin up a fresh wallet, import a 12-word mnemonic, restore from an encrypted backup, or build a scoped SD Key for apps and automation.
- →ZK Wallet (recommended) — private by default, ZK-secured.
- →Classic Wallet (secp256k1) — compatible with existing seed phrases & hardware.
- →SD Key Wallet — scoped key for apps & automation, limited to what you authorize.
- →Import: 12-word mnemonic, raw private key, or full backup JSON.
- →Multiple accounts in one wallet; switch with one click.
02
Private transfers
Send funds privately to a recipient's shield address. The amount, sender, and recipient are hidden on-chain. The recipient is notified over Nostr; a backup packet is downloadable as a fallback.
- →Shield address + npub recipient notation, or combined `shield#npub` paste.
- →ZK note proof generated locally — secrets never leave the device.
- →Nostr (NIP-44 / NIP-59 gift-wrap) delivers the claim packet automatically.
- →Saved backups page for every private send — re-download or retry proof at any time.
- →Auto-claim: spend pending balances and send privately in one signature.
03
Public transfers
Send by Psy ID with the speed and clarity of a normal account-based chain. UPS bundles claims and the transfer into a single proof, so one signature spends many sources.
- →Send by Psy-NNNNNNNN identifier or shorthand userId.
- →Auto-claim incoming public + private + shield-deposit balances in the same UPS.
- →Single guta_fee per UPS regardless of how many calls ride inside it.
- →Validations cover invalid Psy IDs, self-sends, zero amounts, insufficient balance.
04
Deposits from Ethereum
Move USDT (and other supported tokens) from Sepolia/Ethereum to the Psy chain through the bridge. The wallet shows the full settlement trail end-to-end.
- →MetaMask handshake — approve USDT, sign deposit.
- →Settlement trail: Submitted → Confirmed (10 blocks) → Tree Updated → Proof assembling → Claimable.
- →Shield-deposit claims flow into the wallet's Activity tab.
- →Bridge proofs are recursively aggregated up to 65,536 leaves per UPS session.
05
Claims (public, private, shield-deposit)
Inbound funds arrive as claimable rows. Sweep them individually or use Claim All to consolidate. Already-claimed items reconcile silently and never duplicate.
- →Public claims for inbound `simple_transfer`.
- →Private claims that verify the inclusion proof + retire the nullifier.
- →Shield-deposit claims after a bridge deposit lands on Psy.
- →Claim All batches everything in one UPS with a single fee.
- →Friendly fallback: if claim batch fails, the wallet retries the transfer alone (commit 49044fc).
06
Balance management & tokens
PSY and USDT ship by default. Add custom tokens by contract id. Per-token balances render with the correct decimals; the home card shows total available with the fee floor subtracted for native sends.
- →PSY (contract 0, 9 decimals) and USDT (contract 4, 6 decimals) by default.
- →Add / remove custom tokens — PSY cannot be removed.
- →Available = on-chain settled + claimables − native fee floor.
- →Token icons resolve from the symbol; custom tokens fall back to a glyph.
07
Transaction history (Activity)
Every operation lands in the Activity tab with status, amount, counterparty, fee, and a one-glance privacy badge. Batch operations expand to one row per recipient.
- →Status palette: Pending (spinner), Confirmed (foreground), Failed (red).
- →Pre-claim helpers collapse into the primary user-intent row.
- →Multi-recipient batches EXPAND to N rows (one per primary).
- →Self-transfer renders as 'Sent to self'.
- →Faucet auto-detected from operator userId and labelled accordingly.
08
Self-transfers, done right
Sending to your own Psy ID is allowed at the chain level but almost always a typo. The wallet renders it as 'Sent to self' so it's never mistaken for an incoming credit.
- →Wallet-side: detect isFromMe && isToMe and force outgoing styling.
- →Chain-side: companion fix surfaces the slot-balance reconciliation correctly (commit 33d1805).
- →Net result: no phantom 'incoming' rows after a self-send.
09
Saved backups & recovery
Every private send saves a recovery stub the instant the chain commit lands — so closing the popup mid-flight never bricks a transfer. Pending-proof rows can rebuild from stored secrets.
- →Recovery stubs persisted at chain-commit with full proof secrets.
- →Status badges: Delivered, Needs manual delivery, Proof failed — retry.
- →Re-download the packet at any time; recipient imports it under Claim → Import.
- →Retry Proof rebuilds an inclusion proof from stored secrets if the live RPC blipped.
10
Inbox & notifications
A background drain pulls Nostr gift-wraps targeted at every account's npubs. New private notes surface as a bell badge and an Inbox row, ready to claim.
- →Per-account Nostr drain; each account's drain is isolated.
- →Notification bell badge for new inbound private notes.
- →Inbox row shows sender label, amount, token, and a one-tap Claim button.
- →Persistent claim list caches across reloads (commit 7bccb96).