NIP-60: The Cashu Wallet Revolution on Nostr
We are done watching governments and corporations turn the internet into a surveillance panopticon. Your data is your sovereignty. Your keys are your freedom. Break the Digital Cage.
The Problem: Lightning Network Requires Running a Node#
NIP-47 (Nostr Wallet Connect) was a breakthrough — apps can now request Lightning payments through a wallet relay. But there's a hidden dependency: the app must have a Lightning node operator running behind the scenes.
That's not "own your keys." That's "rent a node."
NIP-60 changes everything.
NIP-60: Portable Cashu Wallets#
NIP-60 defines how Cashu wallets are stored and synced across Nostr relays. Instead of keys locked in a single app, your ecash wallet becomes a portable state — just like your identity.
The Architecture#
┌─────────────────────────────────────────────────────────────┐
│ NIP-60 Wallet State │
├─────────────────────────────────────────────────────────────┤
│ Relay A ───┐ │
│ ├── kind:30060 (wallet metadata) │
│ Relay B ───┤ │
│ ├── kind:30060 (wallet history) │
│ Relay C ───┘ │
│ │
│ Device 1 (phone) ── reads/writes via relay sync │
│ Device 2 (laptop) ── same wallet, same keys, same history │
│ Device 3 (tablet) ── recover by fetching from any relay │
└─────────────────────────────────────────────────────────────┘
The Kind:30060 Event#
{
"kind": 30060,
"pubkey": "<wallet owner's Nostr pubkey>",
"tags": [
["mint", "https://mint.example.com"],
["token", "lntoast1pqd..."],
["balance", "5430"],
["created_at", "1700000000"]
],
"content": "Cashu wallet state for npub1..."
}
Your wallet state is append-only. Every token deposit, spend, or swap becomes a new event. Any device can reconstruct your wallet by fetching all kind:30060 events from your write relays.
The Ecosystem: NDK-Wallet and Cashu Cache#
NDK-wallet (nostr-dev-kit) implements NIP-60:
import { NDKWallet } from '@nostr-dev-kit/ndk-wallet'
import NDK from '@nostr-dev-kit/ndk'
const ndk = new NDK({ relayList: ['wss://relay.damus.io'] })
const wallet = new NDKWallet(ndk)
// Auto-synced across relays
const balance = await wallet.getBalance()
const tokens = await wallet.receiveTokens(21, 'sat')
await wallet.sendTokens(tokens, 'npub1...')
Cashu Cache (NIP-60 compliant) runs on any relay — your wallet is cached in the same place your follows and mute lists live.
Why This Matters for 0xPrivacy#
- No server dependency — your wallet is on the relays you already trust
- Multi-device sync — phone, laptop, tablet all see the same balance
- No KYC — Cashu mints don't need your name
- NutZap integration — NIP-61 lets anyone tip you with Cashu tokens
- Offline resilience — if a relay is down, another copy has your wallet
The Link to NIP-61 (NutZaps)#
NIP-61 defines NutZaps — Cashu-powered tips on Nostr:
- Alice fetches Bob's
kind:10019to see his trusted mints - She mints a P2PK-locked token to Bob's pubkey
- Publishes
kind:9321event tagging Bob - Bob's wallet redeems the token
With NIP-60, Bob's wallet state lives on the same relays as his social graph. The tip is censorship-resistant because it's not a Lightning invoice — it's a signed token that only the recipient can redeem.
The Cypherpunk Math#
- Lightning Network: Requires on-chain escrow, KYC at 2+ points, custodial pools for liquidity
- Cashu + NIP-60: Your keys, your tokens, your privacy. No blockchain. No KYC. No middleman.
The future is ecash-native social networks. Your followers, your mute lists, your wallet — all kind:3 and kind:30060 events synced across the same relay swarm.
🔥 Built by 0xPrivacy.online — "Break the Digital Cage"
