NIP-47: Nostr Wallet Connect
NIP-47 defines Nostr Wallet Connect, a protocol for letting a Nostr app talk to a remote Lightning wallet service without exposing the wallet’s main credentials to every client.
How It Works
A wallet service publishes a replaceable kind 13194 info event describing the methods and encryption modes it supports. A client connects using a nostr+walletconnect:// URI that contains the wallet service pubkey, one or more relays, and a dedicated secret for that connection. Requests are sent as kind 23194 events and responses come back as kind 23195 events.
Commands and Notifications
Common methods include pay_invoice, pay_keysend, make_invoice, lookup_invoice, list_transactions, get_balance, and get_info. Wallet services can also push notifications such as payment_received, payment_sent, and hold_invoice_accepted.
The spec originally grew several optional methods over time, but recent cleanup removed the multi_ payment methods. In practice, interoperability is better when clients stick to the commands advertised by the wallet’s info event instead of assuming a broad method set.
Use Cases
- Zapping - Send sats to posts, profiles, or content creators
- Payments - Pay Lightning invoices from any Nostr app
- Wallet UX separation - Use one wallet service across many Nostr clients
Security and Interop Notes
The connection URI contains a dedicated secret that the client uses for signing and encryption. That gives each app its own wallet identity, which helps both revocation and privacy. A wallet can cap spending, disable methods, or revoke one connection without affecting another.
NIP-44 is now the preferred encryption mode. The spec still documents NIP-04 fallback for older implementations, so clients need to inspect the wallet’s advertised encryption tag instead of assuming every wallet has migrated.
Primary sources:
- NIP-47 Specification
- PR #1913: Hold Invoice Support
- PR #2210: Simplification
- NIP-44 negotiation commit
- Transaction-state commit
- LaWallet NWC 2.0.0 - passkey-derived Nostr keys and a standalone NWC relay bridge
Mentioned in:
Newsletter #39: Primal Android 3.5.27 checks signer and wallet identity
Newsletter #37: Shopstr keeps remote-signer and wallet secrets out of browser storage
Newsletter #13: Shopstr and Milk Market Open MCP Commerce Surfaces
Newsletter #27: Alby Hub v1.23.0 fixes NIP-47 publish for deleted apps and switches Bitrefill to NWC
Newsletter #31: cdk v0.17.3 adds NIP-47 wallet-service support across cdk, cdk-nwc, and cdk-ffi
Newsletter #36: Bray 3.0.0 and Toll Booth 6.0.0 move to a shared wallet-connect library
Newsletter #40: lookup_payment, BOLT12, and client-initiated connections merge
See also: