On settlement, send the guest their private check-in details as a NIP-59
gift-wrapped DM (nostr/giftwrap.py, built from lnbits core primitives — no
vendored crypto):
- rumor (kind 14) -> seal (kind 13, operator-encrypted + operator-signed via
the signer abstraction) -> gift wrap (kind 1059, ephemeral-key encrypted +
signed locally via core nip44_encrypt + sign_event). created_at randomised
into the past per NIP-59.
- service.send_checkin_dm builds the message (room.checkin_instructions +
settings times/policy) and publishes via nostrclient (_publish_signed,
extracted from _sign_and_publish).
- tasks.on_invoice_paid calls it best-effort — a DM failure never undoes a
confirmed, paid booking.
Encrypted layer (seal) soft-fails on a LocalSigner until bunker/server-
signing (lnbits#18), same as the reservation event; the ephemeral wrap layer
always works.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019VUQCfdqiLSsFS2jcGnaFD