@welshman/net 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.
- package/dist/lib/src/Tools.d.ts +9 -0
- package/dist/lib/src/Tools.d.ts.map +1 -1
- package/dist/lib/src/Tools.js +26 -1
- package/dist/lib/src/Tools.js.map +1 -1
- package/dist/net/src/auth.d.ts.map +1 -1
- package/dist/net/src/auth.js +2 -2
- package/dist/net/src/auth.js.map +1 -1
- package/dist/net/src/context.d.ts +1 -1
- package/dist/net/src/context.d.ts.map +1 -1
- package/dist/net/src/message.d.ts +1 -1
- package/dist/net/src/message.d.ts.map +1 -1
- package/dist/net/src/message.js +1 -1
- package/dist/net/src/message.js.map +1 -1
- package/dist/net/src/publish.d.ts.map +1 -1
- package/dist/net/src/publish.js +13 -0
- package/dist/net/src/publish.js.map +1 -1
- package/dist/net/src/repository.d.ts +3 -0
- package/dist/net/src/repository.d.ts.map +1 -1
- package/dist/net/src/repository.js +49 -12
- package/dist/net/src/repository.js.map +1 -1
- package/dist/net/src/request.d.ts +3 -3
- package/dist/net/src/request.d.ts.map +1 -1
- package/dist/net/src/request.js +16 -2
- package/dist/net/src/request.js.map +1 -1
- package/dist/util/src/Events.d.ts +0 -12
- package/dist/util/src/Events.d.ts.map +1 -1
- package/dist/util/src/Events.js +3 -25
- package/dist/util/src/Events.js.map +1 -1
- package/dist/util/src/Kinds.d.ts +5 -1
- package/dist/util/src/Kinds.d.ts.map +1 -1
- package/dist/util/src/Kinds.js +7 -2
- package/dist/util/src/Kinds.js.map +1 -1
- package/dist/util/src/Lightning.d.ts +6 -0
- package/dist/util/src/Lightning.d.ts.map +1 -0
- package/dist/util/src/Lightning.js +59 -0
- package/dist/util/src/Lightning.js.map +1 -0
- package/dist/util/src/Nip86.d.ts +74 -30
- package/dist/util/src/Nip86.d.ts.map +1 -1
- package/dist/util/src/Nip86.js +169 -30
- package/dist/util/src/Nip86.js.map +1 -1
- package/dist/util/src/Pow.js +2 -2
- package/dist/util/src/Pow.js.map +1 -1
- package/dist/util/src/Pubkey.d.ts.map +1 -1
- package/dist/util/src/Pubkey.js +2 -1
- package/dist/util/src/Pubkey.js.map +1 -1
- package/dist/util/src/Relay.d.ts +0 -29
- package/dist/util/src/Relay.d.ts.map +1 -1
- package/dist/util/src/Relay.js +0 -10
- package/dist/util/src/Relay.js.map +1 -1
- package/dist/util/src/RelaySelection.d.ts +101 -0
- package/dist/util/src/RelaySelection.d.ts.map +1 -0
- package/dist/util/src/RelaySelection.js +98 -0
- package/dist/util/src/RelaySelection.js.map +1 -0
- package/dist/util/src/Tags.d.ts +16 -35
- package/dist/util/src/Tags.d.ts.map +1 -1
- package/dist/util/src/Tags.js +23 -74
- package/dist/util/src/Tags.js.map +1 -1
- package/dist/util/src/Topics.d.ts +2 -0
- package/dist/util/src/Topics.d.ts.map +1 -0
- package/dist/util/src/Topics.js +2 -0
- package/dist/util/src/Topics.js.map +1 -0
- package/dist/util/src/index.d.ts +2 -1
- package/dist/util/src/index.d.ts.map +1 -1
- package/dist/util/src/index.js +2 -1
- package/dist/util/src/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/util/src/Zaps.d.ts +0 -86
- package/dist/util/src/Zaps.d.ts.map +0 -1
- package/dist/util/src/Zaps.js +0 -184
- package/dist/util/src/Zaps.js.map +0 -1
package/dist/util/src/Zaps.js
DELETED
|
@@ -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":["../../../../util/src/Zaps.ts"],"names":[],"mappings":"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"}
|