402-mcp 4.2.0 → 4.2.1
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/build/store/lnurlcash-notes.d.ts +37 -0
- package/build/store/lnurlcash-notes.js +25 -0
- package/build/store/lnurlcash-notes.js.map +1 -1
- package/build/wallet/lnurlcash-ops.d.ts +13 -2
- package/build/wallet/lnurlcash-ops.js +63 -2
- package/build/wallet/lnurlcash-ops.js.map +1 -1
- package/build/wallet/lnurlcash.js +43 -6
- package/build/wallet/lnurlcash.js.map +1 -1
- package/build/wallet/types.d.ts +6 -0
- package/package.json +1 -1
|
@@ -20,6 +20,33 @@ export interface StoredNote {
|
|
|
20
20
|
addedAt: string;
|
|
21
21
|
/** For a provisional note, the secret of the note whose split created it. */
|
|
22
22
|
parent?: string;
|
|
23
|
+
/**
|
|
24
|
+
* For a melting note, the mint's LUD-21 verify URL for the invoice being
|
|
25
|
+
* paid, and that invoice's payment hash.
|
|
26
|
+
*
|
|
27
|
+
* Written before the first poll rather than kept in a local variable,
|
|
28
|
+
* because losing it loses the payment. A melt that settles after the
|
|
29
|
+
* client stops waiting still spends the note; without this the only route
|
|
30
|
+
* back to the preimage is gone, and for L402 the preimage is not a
|
|
31
|
+
* receipt, it is the credential being bought. So: sats gone, note gone,
|
|
32
|
+
* no access, and no way to ask again.
|
|
33
|
+
*/
|
|
34
|
+
verifyUrl?: string;
|
|
35
|
+
paymentHashHex?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A melt this wallet paid for, kept after the note itself is gone.
|
|
39
|
+
*
|
|
40
|
+
* The preimage is the thing the payment bought. Reconciling a melt that
|
|
41
|
+
* settled late has to put it somewhere durable, or recovering it and then
|
|
42
|
+
* dropping it on the floor is the same outcome as never recovering it.
|
|
43
|
+
*/
|
|
44
|
+
export interface SettledMelt {
|
|
45
|
+
paymentHashHex: string;
|
|
46
|
+
preimage: string;
|
|
47
|
+
amountMsat: number;
|
|
48
|
+
mint: string;
|
|
49
|
+
settledAt: string;
|
|
23
50
|
}
|
|
24
51
|
/** Encrypted persistent store for LNURLcash bearer notes. */
|
|
25
52
|
export declare class LnurlcashNoteStore {
|
|
@@ -50,6 +77,16 @@ export declare class LnurlcashNoteStore {
|
|
|
50
77
|
/** Promotes a provisional note to spendable with its confirmed value. */
|
|
51
78
|
confirm(secret: string, amountMsat: number): void;
|
|
52
79
|
remove(secret: string): void;
|
|
80
|
+
/** Melts whose preimage was recovered, newest last. */
|
|
81
|
+
settledMelts(): SettledMelt[];
|
|
82
|
+
/**
|
|
83
|
+
* Records a recovered preimage. Idempotent on payment hash: reconcile can
|
|
84
|
+
* run many times over the same late melt, and a duplicate here would look
|
|
85
|
+
* like a second payment.
|
|
86
|
+
*/
|
|
87
|
+
recordSettledMelt(melt: SettledMelt): void;
|
|
88
|
+
/** Attaches the proof a late melt can be recovered with, before polling starts. */
|
|
89
|
+
setMeltProof(secret: string, verifyUrl: string, paymentHashHex: string): void;
|
|
53
90
|
removeMany(secrets: string[]): void;
|
|
54
91
|
private load;
|
|
55
92
|
private save;
|
|
@@ -78,6 +78,31 @@ export class LnurlcashNoteStore {
|
|
|
78
78
|
if (this.data.notes.length !== before)
|
|
79
79
|
this.save();
|
|
80
80
|
}
|
|
81
|
+
/** Melts whose preimage was recovered, newest last. */
|
|
82
|
+
settledMelts() {
|
|
83
|
+
return [...(this.data.settledMelts ?? [])];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Records a recovered preimage. Idempotent on payment hash: reconcile can
|
|
87
|
+
* run many times over the same late melt, and a duplicate here would look
|
|
88
|
+
* like a second payment.
|
|
89
|
+
*/
|
|
90
|
+
recordSettledMelt(melt) {
|
|
91
|
+
const existing = this.data.settledMelts ?? [];
|
|
92
|
+
if (existing.some(m => m.paymentHashHex === melt.paymentHashHex))
|
|
93
|
+
return;
|
|
94
|
+
this.data.settledMelts = [...existing, melt];
|
|
95
|
+
this.save();
|
|
96
|
+
}
|
|
97
|
+
/** Attaches the proof a late melt can be recovered with, before polling starts. */
|
|
98
|
+
setMeltProof(secret, verifyUrl, paymentHashHex) {
|
|
99
|
+
const note = this.find(secret);
|
|
100
|
+
if (!note)
|
|
101
|
+
return;
|
|
102
|
+
note.verifyUrl = verifyUrl;
|
|
103
|
+
note.paymentHashHex = paymentHashHex;
|
|
104
|
+
this.save();
|
|
105
|
+
}
|
|
81
106
|
removeMany(secrets) {
|
|
82
107
|
if (secrets.length === 0)
|
|
83
108
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lnurlcash-notes.js","sourceRoot":"","sources":["../../src/store/lnurlcash-notes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"lnurlcash-notes.js","sourceRoot":"","sources":["../../src/store/lnurlcash-notes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
import type { LnurlcashNoteStore, StoredNote } from '../store/lnurlcash-notes.js';
|
|
1
|
+
import type { LnurlcashNoteStore, StoredNote, SettledMelt } from '../store/lnurlcash-notes.js';
|
|
2
|
+
/** What a reconcile pass turned up that a caller may want to act on. */
|
|
3
|
+
export interface ReconcileReport {
|
|
4
|
+
/**
|
|
5
|
+
* Melts that had already settled by the time we asked again, with the
|
|
6
|
+
* preimage recovered. Empty on a quiet pass. Each one is also written to
|
|
7
|
+
* the store, so nothing depends on the caller reading this.
|
|
8
|
+
*/
|
|
9
|
+
recovered: SettledMelt[];
|
|
10
|
+
}
|
|
2
11
|
/**
|
|
3
12
|
* Note operations shared by the wallet provider (which melts a note to pay a
|
|
4
13
|
* BOLT-11 invoice) and the lnurlcash HTTP rail (which hands a note straight to
|
|
@@ -44,6 +53,8 @@ export interface NoteOpsOptions {
|
|
|
44
53
|
/** Per-request HTTP timeout. */
|
|
45
54
|
httpTimeoutMs?: number;
|
|
46
55
|
fetchImpl?: typeof fetch;
|
|
56
|
+
/** SSRF guard, matching farrier-kit's verifyLud21 hook. */
|
|
57
|
+
urlGuard?: (url: URL) => void | Promise<void>;
|
|
47
58
|
}
|
|
48
59
|
export interface ResolvedNote {
|
|
49
60
|
amountMsat: number;
|
|
@@ -66,7 +77,7 @@ export type NoteProbe = {
|
|
|
66
77
|
export interface NoteOps {
|
|
67
78
|
probeNote(mint: string, secret: string): Promise<NoteProbe>;
|
|
68
79
|
resolveNote(mint: string, secret: string): Promise<ResolvedNote | null>;
|
|
69
|
-
reconcile(): Promise<
|
|
80
|
+
reconcile(): Promise<ReconcileReport>;
|
|
70
81
|
split(parent: StoredNote, amountMsat: number): Promise<StoredNote>;
|
|
71
82
|
}
|
|
72
83
|
/** Appends params to a callback URL that may already carry some. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { generatePreimage, computePaymentHash, fetchJson } from 'farrier-kit';
|
|
1
|
+
import { generatePreimage, computePaymentHash, fetchJson, verifyLud21 } from 'farrier-kit';
|
|
2
2
|
export function isError(res) {
|
|
3
3
|
return typeof res === 'object' && res !== null && res.status === 'ERROR';
|
|
4
4
|
}
|
|
@@ -69,7 +69,8 @@ export function createNoteOps(store, options = {}) {
|
|
|
69
69
|
* the mint still honours means the spend failed and the mint restored it.
|
|
70
70
|
*/
|
|
71
71
|
async function reconcile() {
|
|
72
|
-
|
|
72
|
+
const recovered = [];
|
|
73
|
+
for (const note of store.byState('provisional')) {
|
|
73
74
|
const resolved = await resolveNote(note.mint, note.secret);
|
|
74
75
|
if (resolved) {
|
|
75
76
|
store.confirm(note.secret, resolved.amountMsat);
|
|
@@ -81,6 +82,66 @@ export function createNoteOps(store, options = {}) {
|
|
|
81
82
|
store.remove(note.secret);
|
|
82
83
|
}
|
|
83
84
|
}
|
|
85
|
+
// A melting note is asked about in a different order, and the order is
|
|
86
|
+
// the whole fix. Previously the mint was asked whether it still had the
|
|
87
|
+
// note, and a "no" meant remove: but "no" is exactly what a SETTLED melt
|
|
88
|
+
// looks like, because settling burns the note. The preimage the payment
|
|
89
|
+
// bought went in the bin with it.
|
|
90
|
+
//
|
|
91
|
+
// So the verify URL is consulted FIRST, while the note is still on disk.
|
|
92
|
+
// Only once settlement has been ruled out is the note's own fate asked
|
|
93
|
+
// about, and even then an unrecognised note with an unsettled verify URL
|
|
94
|
+
// is left alone rather than dropped: that is a melt still in flight.
|
|
95
|
+
for (const note of store.byState('melting')) {
|
|
96
|
+
if (note.verifyUrl && note.paymentHashHex) {
|
|
97
|
+
let result;
|
|
98
|
+
try {
|
|
99
|
+
result = await verifyLud21({
|
|
100
|
+
verifyUrl: note.verifyUrl,
|
|
101
|
+
paymentHashHex: note.paymentHashHex,
|
|
102
|
+
fetchImpl: options.fetchImpl,
|
|
103
|
+
timeoutMs: httpTimeoutMs,
|
|
104
|
+
...(options.urlGuard ? { urlGuard: options.urlGuard } : {}),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// The mint said nothing. Nothing said is not a verdict, and this
|
|
109
|
+
// note is holding a payment that may have landed.
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (result?.settled) {
|
|
113
|
+
if (result.verified && result.preimage) {
|
|
114
|
+
const melt = {
|
|
115
|
+
paymentHashHex: note.paymentHashHex,
|
|
116
|
+
preimage: result.preimage,
|
|
117
|
+
amountMsat: note.amountMsat,
|
|
118
|
+
mint: note.mint,
|
|
119
|
+
settledAt: new Date().toISOString(),
|
|
120
|
+
};
|
|
121
|
+
store.recordSettledMelt(melt);
|
|
122
|
+
recovered.push(melt);
|
|
123
|
+
}
|
|
124
|
+
// Settled either way, so the note is spent and must not come back.
|
|
125
|
+
store.remove(note.secret);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// Not settled. If the mint still has the note the melt failed and it
|
|
129
|
+
// is spendable again; if it does not, the payment is still in flight
|
|
130
|
+
// and this note stays put with its URL for the next pass.
|
|
131
|
+
const resolved = await resolveNote(note.mint, note.secret);
|
|
132
|
+
if (resolved)
|
|
133
|
+
store.confirm(note.secret, resolved.amountMsat);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
// No proof to consult - an older record, or a mint that offered no
|
|
137
|
+
// verify URL. Nothing better than the previous behaviour is available.
|
|
138
|
+
const resolved = await resolveNote(note.mint, note.secret);
|
|
139
|
+
if (resolved)
|
|
140
|
+
store.confirm(note.secret, resolved.amountMsat);
|
|
141
|
+
else
|
|
142
|
+
store.remove(note.secret);
|
|
143
|
+
}
|
|
144
|
+
return { recovered };
|
|
84
145
|
}
|
|
85
146
|
/**
|
|
86
147
|
* Splits `parent` into a note worth exactly `amountMsat` plus change, and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lnurlcash-ops.js","sourceRoot":"","sources":["../../src/wallet/lnurlcash-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"lnurlcash-ops.js","sourceRoot":"","sources":["../../src/wallet/lnurlcash-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,12 @@ function sleep(ms) {
|
|
|
11
11
|
}
|
|
12
12
|
export function createLnurlcashWallet(store, options = {}, lock) {
|
|
13
13
|
const cfg = { ...DEFAULTS, ...options };
|
|
14
|
-
const ops = createNoteOps(store, {
|
|
14
|
+
const ops = createNoteOps(store, {
|
|
15
|
+
httpTimeoutMs: cfg.httpTimeoutMs,
|
|
16
|
+
fetchImpl: cfg.fetchImpl,
|
|
17
|
+
// reconcile polls verify URLs of its own now, so the guard has to reach it
|
|
18
|
+
...(cfg.urlGuard ? { urlGuard: cfg.urlGuard } : {}),
|
|
19
|
+
});
|
|
15
20
|
let internalLock = Promise.resolve();
|
|
16
21
|
const defaultLock = (fn) => {
|
|
17
22
|
const result = internalLock.catch(() => { }).then(() => fn());
|
|
@@ -60,6 +65,12 @@ export function createLnurlcashWallet(store, options = {}, lock) {
|
|
|
60
65
|
reason: 'Mint accepted the melt but offers no LUD-21 verify URL, so settlement cannot be proven.',
|
|
61
66
|
};
|
|
62
67
|
}
|
|
68
|
+
// Persisted before the first poll, not after the last one. A melt that
|
|
69
|
+
// settles late still spends the note, and the verify URL is the only
|
|
70
|
+
// route back to the preimage it bought. Keeping it in a local variable
|
|
71
|
+
// meant a timeout - or a crash, or the process being killed - threw the
|
|
72
|
+
// credential away while the sats were already gone.
|
|
73
|
+
store.setMeltProof(note.secret, res.verify, paymentHashHex);
|
|
63
74
|
const deadline = Date.now() + cfg.meltTimeoutMs;
|
|
64
75
|
for (;;) {
|
|
65
76
|
let result;
|
|
@@ -76,10 +87,20 @@ export function createLnurlcashWallet(store, options = {}, lock) {
|
|
|
76
87
|
result = undefined;
|
|
77
88
|
}
|
|
78
89
|
if (result?.settled) {
|
|
79
|
-
store.remove(note.secret);
|
|
80
90
|
if (result.verified && result.preimage) {
|
|
91
|
+
// Recorded before the note goes, so a crash between the two lines
|
|
92
|
+
// cannot lose what the payment bought.
|
|
93
|
+
store.recordSettledMelt({
|
|
94
|
+
paymentHashHex,
|
|
95
|
+
preimage: result.preimage,
|
|
96
|
+
amountMsat: note.amountMsat,
|
|
97
|
+
mint: note.mint,
|
|
98
|
+
settledAt: new Date().toISOString(),
|
|
99
|
+
});
|
|
100
|
+
store.remove(note.secret);
|
|
81
101
|
return { paid: true, preimage: result.preimage, method: METHOD };
|
|
82
102
|
}
|
|
103
|
+
store.remove(note.secret);
|
|
83
104
|
// Settled per the mint, but unproven. Same stance as the NWC provider:
|
|
84
105
|
// the note is spent either way, so it must not go back in the store.
|
|
85
106
|
return {
|
|
@@ -94,7 +115,8 @@ export function createLnurlcashWallet(store, options = {}, lock) {
|
|
|
94
115
|
paid: false,
|
|
95
116
|
method: METHOD,
|
|
96
117
|
outcome: 'unknown',
|
|
97
|
-
|
|
118
|
+
verifyUrl: res.verify,
|
|
119
|
+
reason: 'Melt did not settle before the timeout. The note is held with its verify URL, so a later reconcile can still recover the preimage if the payment lands.',
|
|
98
120
|
};
|
|
99
121
|
}
|
|
100
122
|
await sleep(cfg.meltPollMs);
|
|
@@ -111,8 +133,20 @@ export function createLnurlcashWallet(store, options = {}, lock) {
|
|
|
111
133
|
if (needMsat === null) {
|
|
112
134
|
return { paid: false, method: METHOD, reason: 'Amountless BOLT-11 invoices require an explicit amount and are refused' };
|
|
113
135
|
}
|
|
136
|
+
// A reconcile can turn up a payment that landed after an earlier attempt
|
|
137
|
+
// gave up on it. That preimage is a credential somebody paid for, so it
|
|
138
|
+
// is said out loud here rather than only filed: the caller is a wallet
|
|
139
|
+
// asking to spend, and "by the way, that payment you wrote off did go
|
|
140
|
+
// through" changes what they do next.
|
|
141
|
+
let recoveredNote = '';
|
|
114
142
|
try {
|
|
115
|
-
await ops.reconcile();
|
|
143
|
+
const report = await ops.reconcile();
|
|
144
|
+
if (report.recovered.length > 0) {
|
|
145
|
+
const each = report.recovered
|
|
146
|
+
.map(m => `${m.paymentHashHex.slice(0, 12)}… preimage ${m.preimage}`)
|
|
147
|
+
.join('; ');
|
|
148
|
+
recoveredNote = ` Also recovered ${report.recovered.length} earlier melt(s) that settled after being written off: ${each}.`;
|
|
149
|
+
}
|
|
116
150
|
}
|
|
117
151
|
catch { /* best effort; selection below simply sees fewer notes */ }
|
|
118
152
|
const live = store.live();
|
|
@@ -131,7 +165,10 @@ export function createLnurlcashWallet(store, options = {}, lock) {
|
|
|
131
165
|
const exact = candidate.amountMsat === needMsat
|
|
132
166
|
? candidate
|
|
133
167
|
: await ops.split(candidate, needMsat);
|
|
134
|
-
|
|
168
|
+
const result = await melt(exact, invoice, decoded.paymentHashHex);
|
|
169
|
+
return recoveredNote
|
|
170
|
+
? { ...result, reason: `${result.reason ?? 'Paid.'}${recoveredNote}` }
|
|
171
|
+
: result;
|
|
135
172
|
}
|
|
136
173
|
catch (error) {
|
|
137
174
|
if (error instanceof NoteGone) {
|
|
@@ -150,7 +187,7 @@ export function createLnurlcashWallet(store, options = {}, lock) {
|
|
|
150
187
|
return {
|
|
151
188
|
paid: false,
|
|
152
189
|
method: METHOD,
|
|
153
|
-
reason: `No note large enough: need ${needMsat} msat, largest available is ${best} msat${staleNote}`,
|
|
190
|
+
reason: `No note large enough: need ${needMsat} msat, largest available is ${best} msat${staleNote}${recoveredNote}`,
|
|
154
191
|
};
|
|
155
192
|
}
|
|
156
193
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lnurlcash.js","sourceRoot":"","sources":["../../src/wallet/lnurlcash.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,SAAS,GACV,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,aAAa,EACb,WAAW,EACX,OAAO,EACP,WAAW,EACX,QAAQ,GAGT,MAAM,oBAAoB,CAAA;AAE3B,MAAM,MAAM,GAAG,WAAoB,CAAA;AAcnC,MAAM,QAAQ,GAAG;IACf,aAAa,EAAE,MAAM;IACrB,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,KAAK;CACrB,CAAA;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAyB,EACzB,UAAkC,EAAE,EACpC,IAA8C;IAE9C,MAAM,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAA;IACvC,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"lnurlcash.js","sourceRoot":"","sources":["../../src/wallet/lnurlcash.ts"],"names":[],"mappings":"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"}
|
package/build/wallet/types.d.ts
CHANGED
|
@@ -9,6 +9,12 @@ export interface PaymentResult {
|
|
|
9
9
|
reason?: string;
|
|
10
10
|
/** The request may have executed but settlement could not be proven. */
|
|
11
11
|
outcome?: 'unknown';
|
|
12
|
+
/**
|
|
13
|
+
* Where settlement can still be proven later, for an `unknown` outcome
|
|
14
|
+
* that has one. A caller holding this can ask again rather than treating
|
|
15
|
+
* the payment as lost; reconcile also polls it on its own.
|
|
16
|
+
*/
|
|
17
|
+
verifyUrl?: string;
|
|
12
18
|
}
|
|
13
19
|
export interface WalletProvider {
|
|
14
20
|
method: WalletMethod;
|