@welshman/util 0.9.0-pre1 → 0.9.0-pre3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/lib/src/Tools.d.ts +9 -0
  2. package/dist/lib/src/Tools.d.ts.map +1 -1
  3. package/dist/lib/src/Tools.js +26 -1
  4. package/dist/lib/src/Tools.js.map +1 -1
  5. package/dist/tsconfig.build.tsbuildinfo +1 -1
  6. package/dist/util/src/Events.d.ts +0 -12
  7. package/dist/util/src/Events.d.ts.map +1 -1
  8. package/dist/util/src/Events.js +3 -25
  9. package/dist/util/src/Events.js.map +1 -1
  10. package/dist/util/src/Kinds.d.ts +5 -1
  11. package/dist/util/src/Kinds.d.ts.map +1 -1
  12. package/dist/util/src/Kinds.js +7 -2
  13. package/dist/util/src/Kinds.js.map +1 -1
  14. package/dist/util/src/Lightning.d.ts +6 -0
  15. package/dist/util/src/Lightning.d.ts.map +1 -0
  16. package/dist/util/src/Lightning.js +59 -0
  17. package/dist/util/src/Lightning.js.map +1 -0
  18. package/dist/util/src/Nip86.d.ts +74 -30
  19. package/dist/util/src/Nip86.d.ts.map +1 -1
  20. package/dist/util/src/Nip86.js +169 -30
  21. package/dist/util/src/Nip86.js.map +1 -1
  22. package/dist/util/src/Pow.js +2 -2
  23. package/dist/util/src/Pow.js.map +1 -1
  24. package/dist/util/src/Pubkey.d.ts.map +1 -1
  25. package/dist/util/src/Pubkey.js +2 -1
  26. package/dist/util/src/Pubkey.js.map +1 -1
  27. package/dist/util/src/Relay.d.ts +0 -29
  28. package/dist/util/src/Relay.d.ts.map +1 -1
  29. package/dist/util/src/Relay.js +0 -10
  30. package/dist/util/src/Relay.js.map +1 -1
  31. package/dist/util/src/RelaySelection.d.ts +101 -0
  32. package/dist/util/src/RelaySelection.d.ts.map +1 -0
  33. package/dist/util/src/RelaySelection.js +98 -0
  34. package/dist/util/src/RelaySelection.js.map +1 -0
  35. package/dist/util/src/Tags.d.ts +16 -35
  36. package/dist/util/src/Tags.d.ts.map +1 -1
  37. package/dist/util/src/Tags.js +23 -74
  38. package/dist/util/src/Tags.js.map +1 -1
  39. package/dist/util/src/Topics.d.ts +2 -0
  40. package/dist/util/src/Topics.d.ts.map +1 -0
  41. package/dist/util/src/Topics.js +2 -0
  42. package/dist/util/src/Topics.js.map +1 -0
  43. package/dist/util/src/index.d.ts +2 -1
  44. package/dist/util/src/index.d.ts.map +1 -1
  45. package/dist/util/src/index.js +2 -1
  46. package/dist/util/src/index.js.map +1 -1
  47. package/package.json +3 -3
  48. package/dist/util/src/Zaps.d.ts +0 -86
  49. package/dist/util/src/Zaps.d.ts.map +0 -1
  50. package/dist/util/src/Zaps.js +0 -184
  51. package/dist/util/src/Zaps.js.map +0 -1
@@ -1,184 +0,0 @@
1
- import { now, tryCatch, fetchJson, hexToBech32, fromPairs, sum, allPass, nthEq, nth, } from "@welshman/lib";
2
- import { ZAP_RECEIPT, ZAP_REQUEST } from "./Kinds.js";
3
- import { getTagValue } from "./Tags.js";
4
- import { makeEvent } from "./Events.js";
5
- const DIVISORS = {
6
- m: BigInt(1e3),
7
- u: BigInt(1e6),
8
- n: BigInt(1e9),
9
- p: BigInt(1e12),
10
- };
11
- const MAX_MILLISATS = BigInt("2100000000000000000");
12
- const MILLISATS_PER_BTC = BigInt(1e11);
13
- export const toMsats = (sats) => sats * 1000;
14
- export const fromMsats = (msats) => Math.floor(msats / 1000);
15
- export const hrpToMillisat = (hrpString) => {
16
- let divisor, value;
17
- if (hrpString.slice(-1).match(/^[munp]$/)) {
18
- divisor = hrpString.slice(-1);
19
- value = hrpString.slice(0, -1);
20
- }
21
- else if (hrpString.slice(-1).match(/^[^munp0-9]$/)) {
22
- throw new Error("Not a valid multiplier for the amount");
23
- }
24
- else {
25
- value = hrpString;
26
- }
27
- if (!value.match(/^\d+$/))
28
- throw new Error("Not a valid human readable amount");
29
- const valueBN = BigInt(value);
30
- const millisatoshisBN = divisor
31
- ? (valueBN * MILLISATS_PER_BTC) / DIVISORS[divisor]
32
- : valueBN * MILLISATS_PER_BTC;
33
- if ((divisor === "p" && !(valueBN % BigInt(10) === BigInt(0))) ||
34
- millisatoshisBN > MAX_MILLISATS) {
35
- throw new Error("Amount is outside of valid range");
36
- }
37
- return millisatoshisBN;
38
- };
39
- export const getInvoiceAmount = (bolt11) => {
40
- const hrp = bolt11.match(/lnbc(\d+\w)/);
41
- const bn = hrpToMillisat(hrp[1]);
42
- return Number(bn);
43
- };
44
- export const getLnUrl = (address) => {
45
- address = address.toLowerCase();
46
- // If it's already a lud06 we're good
47
- if (address.startsWith("lnurl1")) {
48
- return address;
49
- }
50
- // If it's a regular url, encode it
51
- if (address.includes("://")) {
52
- return hexToBech32("lnurl", address);
53
- }
54
- // Try to parse it as a lud16 address
55
- if (address.includes("@")) {
56
- const [name, domain] = address.split("@");
57
- if (domain && name) {
58
- return hexToBech32("lnurl", `https://${domain}/.well-known/lnurlp/${name}`);
59
- }
60
- }
61
- };
62
- export const zapFromEvent = (response, zapper) => {
63
- const responseMeta = fromPairs(response.tags);
64
- let zap;
65
- try {
66
- zap = {
67
- response,
68
- invoiceAmount: getInvoiceAmount(responseMeta.bolt11),
69
- request: JSON.parse(responseMeta.description),
70
- };
71
- }
72
- catch (e) {
73
- return undefined;
74
- }
75
- // Don't count zaps that the user requested for himself
76
- if (zap.request.pubkey === zapper?.pubkey) {
77
- return undefined;
78
- }
79
- const { amount, lnurl } = fromPairs(zap.request.tags);
80
- // Verify that the zapper actually sent the requested amount (if it was supplied)
81
- if (amount && parseInt(amount) !== zap.invoiceAmount) {
82
- return undefined;
83
- }
84
- // If the recipient and the zapper are the same person, it's legit
85
- if (responseMeta.p === response.pubkey) {
86
- return zap;
87
- }
88
- // If the sending client provided an lnurl tag, verify that too
89
- if (lnurl && lnurl !== zapper?.lnurl) {
90
- return undefined;
91
- }
92
- // Verify that the request actually came from the recipient's zapper
93
- if (zap.response.pubkey !== zapper?.nostrPubkey) {
94
- return undefined;
95
- }
96
- return zap;
97
- };
98
- const parseWeight = (weight) => {
99
- const n = weight === undefined ? NaN : parseFloat(weight);
100
- return Number.isFinite(n) && n > 0 ? n : 0;
101
- };
102
- /**
103
- * Resolve an event's zap-split recipients per NIP-57 Appendix G:
104
- *
105
- * - With no `zap` tags the whole zap goes to the event's author.
106
- * - If no recipient carries a weight, the zap is split equally (weight 1 each).
107
- * - If weights are only partially present, unweighted recipients drop to weight
108
- * 0 (i.e. they should not be zapped).
109
- *
110
- * Weight-0 recipients are still returned so callers have the full recipient set;
111
- * they simply receive 0 from `splitZapAmount`.
112
- */
113
- export const getZapSplits = (event) => {
114
- const zapTags = event.tags.filter(allPass(nthEq(0, "zap"), nth(1)));
115
- if (zapTags.length === 0) {
116
- return [{ pubkey: event.pubkey, weight: 1 }];
117
- }
118
- const anyWeighted = zapTags.some(nth(3));
119
- return zapTags.map(([, pubkey, relay, weight]) => ({
120
- pubkey,
121
- relay: relay || undefined,
122
- weight: anyWeighted ? parseWeight(weight) : 1,
123
- }));
124
- };
125
- /**
126
- * Divide `total` (in any integer unit, e.g. millisats) across an event's
127
- * zap-split recipients proportionally to their weights. Any rounding remainder
128
- * is handed to the highest-weighted recipient so the parts sum back to exactly
129
- * `total`. If every weight is 0, nobody is zapped.
130
- */
131
- export const splitZapAmount = (event, total) => {
132
- const splits = getZapSplits(event);
133
- const totalWeight = sum(splits.map(split => split.weight));
134
- if (totalWeight === 0) {
135
- return splits.map(split => ({ ...split, amount: 0 }));
136
- }
137
- const amounts = splits.map(split => Math.floor((total * split.weight) / totalWeight));
138
- let maxIndex = 0;
139
- splits.forEach((split, i) => {
140
- if (split.weight > splits[maxIndex].weight) {
141
- maxIndex = i;
142
- }
143
- });
144
- amounts[maxIndex] += total - sum(amounts);
145
- return splits.map((split, i) => ({ ...split, amount: amounts[i] }));
146
- };
147
- export const makeZapRequest = ({ msats, zapper, pubkey, relays, content = "", eventId, anonymous, }) => {
148
- const tags = [
149
- ["relays", ...relays],
150
- ["amount", String(msats)],
151
- ["lnurl", zapper.lnurl],
152
- ["p", pubkey],
153
- ];
154
- if (eventId) {
155
- tags.push(["e", eventId]);
156
- }
157
- if (anonymous) {
158
- tags.push(["anon"]);
159
- }
160
- return makeEvent(ZAP_REQUEST, { content, tags });
161
- };
162
- export const requestZap = async ({ zapper, event }) => {
163
- const zapString = encodeURI(JSON.stringify(event));
164
- const msats = parseInt(getTagValue("amount", event.tags));
165
- const qs = `?amount=${msats}&nostr=${zapString}&lnurl=${zapper.lnurl}`;
166
- const res = await tryCatch(() => fetchJson(zapper.callback + qs));
167
- return res?.pr ? { invoice: res.pr } : { error: res.reason || "Failed to request invoice" };
168
- };
169
- export const getZapResponseFilter = ({ zapper, pubkey, eventId }) => {
170
- if (!zapper.nostrPubkey) {
171
- throw new Error("Zapper did not have a nostr pubkey");
172
- }
173
- const filter = {
174
- kinds: [ZAP_RECEIPT],
175
- authors: [zapper.nostrPubkey],
176
- since: now() - 30,
177
- "#p": [pubkey],
178
- };
179
- if (eventId) {
180
- filter["#e"] = [eventId];
181
- }
182
- return filter;
183
- };
184
- //# sourceMappingURL=Zaps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Zaps.js","sourceRoot":"","sources":["../../../src/Zaps.ts"],"names":[],"mappings":"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"}