# Zaps

high level

# Example

zap, receipt
  final amount = 21;
  final lnurl = "opensats@vlt.ge";
  final comment = "enjoy this zap from NDK";

  ZapResponse response = await ndk.zaps.zap(
      nwcConnection: connection,
      lnurl: lnurl,
      comment: comment,
      amountSats: amount,
      fetchZapReceipt: true,
      signer: Bip340EventSigner(
          privateKey: key.privateKey, publicKey: key.publicKey),
      relays: ["wss://relay.damus.io"],
      pubKey:
          "787338757fc25d65cd929394d5e7713cf43638e8d259e8dcf5c73b834eb851f2",
      eventId:
          "906a0c5920b59e5754d0df5164bfea2a8d48ce5d73beaa1e854b3e6725e3288a");

  if (response.payInvoiceResponse != null &&
      response.payInvoiceResponse!.preimage.isNotEmpty) {
    print(
        "Payed $amount to $lnurl, preimage = ${response.payInvoiceResponse!.preimage}");

    print("Waiting for Zap Receipt...");
    ZapReceipt? receipt = await response.zapReceipt;
    if (receipt != null) {
      print("Receipt : $receipt");
    } else {
      print("No Receipt");
    }
  }

  await ndk.destroy();
}
receipts for profile
print("fetching zap receipts for profile ");
final profileReceipts = await ndk.zaps
    .fetchZappedReceipts(
      pubKey:
          "30782a8323b7c98b172c5a2af7206bb8283c655be6ddce11133611a03d5f1177",
    )
    .toList();

// Sort profileReceipts by amountSats in descending order
profileReceipts
    .sort((a, b) => (b.amountSats ?? 0).compareTo(a.amountSats ?? 0));

int profileSum = 0;
for (var receipt in profileReceipts) {
  String? sender;
  if (receipt.sender != null) {
    Metadata? metadata = await ndk.metadata.loadMetadata(receipt.sender!);
    sender = metadata?.name;
  }
  print(
      "${sender != null ? "from $sender " : ""} ${receipt.amountSats} sats ${receipt.comment}");
  profileSum += receipt.amountSats ?? 0;
}
print("${profileReceipts.length} receipts, total of $profileSum sats");
receipts for event
print("fetching zap receipts for single event ");
final receipts = await ndk.zaps
    .fetchZappedReceipts(
        pubKey:
            "787338757fc25d65cd929394d5e7713cf43638e8d259e8dcf5c73b834eb851f2",
        eventId:
            "906a0c5920b59e5754d0df5164bfea2a8d48ce5d73beaa1e854b3e6725e3288a")
    .toList();

// Sort eventReceipts by amountSats in descending order
receipts.sort((a, b) => (b.amountSats ?? 0).compareTo(a.amountSats ?? 0));

int eventSum = 0;
for (var receipt in receipts) {
  String? sender;
  if (receipt.sender != null) {
    Metadata? metadata = await ndk.metadata.loadMetadata(receipt.sender!);
    sender = metadata?.name;
  }
  print(
      "${sender != null ? "from $sender " : ""} ${receipt.amountSats} sats ${receipt.comment}");
  eventSum += receipt.amountSats ?? 0;
}
print("${receipts.length} receipts, total of $eventSum sats");

# How to use

You need a nostr+walletconnect://... uri from your NWC wallet service provider.

see https://github.com/getAlby/awesome-nwc for more info how to get a wallet supporting NWC