{"version":3,"sources":["../../src/zap-receipt.ts","../../src/react/useZapReceipts.ts"],"names":["useEffect","getDefaultRelays","getPool"],"mappings":"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","file":"index.cjs","sourcesContent":["// packages/wallet/src/zap-receipt.ts\n// Pure validator for NIP-57 kind 9735 zap-receipt events. Returns the\n// canonical sender + amount when the receipt is well-formed and\n// recipient-matched, else null. Caller is responsible for verifying the\n// signature (callers are responsible for verification); this validator focuses\n// on payload-shape and recipient checks.\n\nexport interface RawNostrEvent {\n  kind: number;\n  pubkey: string;\n  tags: string[][];\n  content: string;\n  id: string;\n  sig: string;\n  created_at: number;\n}\n\nexport interface ValidatedZapReceipt {\n  senderPubkey: string;\n  amountMsat: number;\n  bolt11: string;\n  messageId?: string;\n  comment?: string;\n  /** The id of the receipt event (for de-dup). */\n  receiptId: string;\n  /** The signer of the receipt — the recipient's LNURL provider. */\n  providerPubkey: string;\n}\n\nfunction getTag(ev: RawNostrEvent, name: string): string[] | undefined {\n  return ev.tags.find((t) => t[0] === name);\n}\n\nexport function validateZapReceipt(\n  event: RawNostrEvent,\n  expectedRecipient: string,\n  trustedProviderPubkeys?: Set<string>,\n): ValidatedZapReceipt | null {\n  if (event.kind !== 9735) return null;\n\n  const pTag = getTag(event, 'p');\n  if (!pTag || pTag[1] !== expectedRecipient) return null;\n\n  const bolt11Tag = getTag(event, 'bolt11');\n  if (!bolt11Tag || typeof bolt11Tag[1] !== 'string' || bolt11Tag[1].length === 0) return null;\n\n  const descTag = getTag(event, 'description');\n  if (!descTag || typeof descTag[1] !== 'string') return null;\n\n  let zapRequest: RawNostrEvent | null = null;\n  try {\n    zapRequest = JSON.parse(descTag[1]) as RawNostrEvent;\n  } catch {\n    return null;\n  }\n  if (!zapRequest || zapRequest.kind !== 9734 || typeof zapRequest.pubkey !== 'string') return null;\n\n  const zrPTag = getTag(zapRequest, 'p');\n  if (!zrPTag || zrPTag[1] !== expectedRecipient) return null;\n\n  const amountTag = getTag(zapRequest, 'amount');\n  if (!amountTag) return null;\n  const amountMsat = parseInt(amountTag[1] ?? '', 10);\n  if (!Number.isFinite(amountMsat) || amountMsat <= 0) return null;\n\n  if (trustedProviderPubkeys && !trustedProviderPubkeys.has(event.pubkey)) return null;\n\n  const messageIdTag = getTag(event, 'e') ?? getTag(zapRequest, 'e');\n  return {\n    senderPubkey: zapRequest.pubkey,\n    amountMsat,\n    bolt11: bolt11Tag[1],\n    messageId: messageIdTag?.[1],\n    comment: zapRequest.content || undefined,\n    receiptId: event.id,\n    providerPubkey: event.pubkey,\n  };\n}\n","'use client';\n// packages/wallet/src/react/useZapReceipts.ts\n// React hook that subscribes to NIP-57 kind 9735 zap receipts addressed to\n// `pubkey` on the user's default relays and invokes `onReceipt` for each\n// receipt that passes validation. Cleans up the subscription on unmount or\n// when `pubkey` changes. No replay/cache: callers receive only events that\n// arrive after the hook mounts (zap receipts are typically surfaced as\n// transient toasts).\n\nimport { useEffect } from 'react';\nimport { getPool, getDefaultRelays } from '@nostr-wot/data';\nimport { validateZapReceipt, type RawNostrEvent, type ValidatedZapReceipt } from '../zap-receipt';\n\nexport function useZapReceipts(\n  pubkey: string | null,\n  onReceipt: (receipt: ValidatedZapReceipt) => void,\n): void {\n  useEffect(() => {\n    if (!pubkey) return;\n    const relays = getDefaultRelays();\n    const pool = getPool();\n    const sub = pool.subscribeMany(\n      relays,\n      { kinds: [9735], '#p': [pubkey] },\n      {\n        onevent(event: unknown) {\n          const validated = validateZapReceipt(event as RawNostrEvent, pubkey);\n          if (validated) onReceipt(validated);\n        },\n      },\n    );\n    return () => sub.close();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [pubkey]);\n}\n"]}