402-mcp 3.1.3 → 3.2.0
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/README.md +105 -101
- package/build/config.d.ts +1 -0
- package/build/config.js +9 -1
- package/build/config.js.map +1 -1
- package/build/index.js +16 -4
- package/build/index.js.map +1 -1
- package/build/l402/bolt11.d.ts +1 -0
- package/build/l402/bolt11.js +1 -0
- package/build/l402/bolt11.js.map +1 -1
- package/build/l402/challenge-cache.d.ts +1 -0
- package/build/l402/challenge-cache.js +1 -0
- package/build/l402/challenge-cache.js.map +1 -1
- package/build/l402/detect.d.ts +1 -0
- package/build/l402/detect.js +1 -0
- package/build/l402/detect.js.map +1 -1
- package/build/l402/parse.d.ts +1 -0
- package/build/l402/parse.js +1 -0
- package/build/l402/parse.js.map +1 -1
- package/build/store/cashu-tokens.d.ts +3 -0
- package/build/store/cashu-tokens.js +3 -0
- package/build/store/cashu-tokens.js.map +1 -1
- package/build/store/credentials.d.ts +2 -0
- package/build/store/credentials.js +2 -0
- package/build/store/credentials.js.map +1 -1
- package/build/store/encryption.d.ts +3 -0
- package/build/store/encryption.js +3 -0
- package/build/store/encryption.js.map +1 -1
- package/build/tools/balance.d.ts +2 -0
- package/build/tools/balance.js +2 -0
- package/build/tools/balance.js.map +1 -1
- package/build/tools/buy-credits.d.ts +18 -1
- package/build/tools/buy-credits.js +30 -2
- package/build/tools/buy-credits.js.map +1 -1
- package/build/tools/config.d.ts +2 -0
- package/build/tools/config.js +2 -0
- package/build/tools/config.js.map +1 -1
- package/build/tools/credentials.d.ts +2 -0
- package/build/tools/credentials.js +2 -0
- package/build/tools/credentials.js.map +1 -1
- package/build/tools/discover.d.ts +2 -0
- package/build/tools/discover.js +2 -0
- package/build/tools/discover.js.map +1 -1
- package/build/tools/fetch.d.ts +16 -3
- package/build/tools/fetch.js +39 -2
- package/build/tools/fetch.js.map +1 -1
- package/build/tools/nostr-subscribe.d.ts +1 -0
- package/build/tools/nostr-subscribe.js +1 -5
- package/build/tools/nostr-subscribe.js.map +1 -1
- package/build/tools/pay.d.ts +2 -0
- package/build/tools/pay.js +4 -5
- package/build/tools/pay.js.map +1 -1
- package/build/tools/redeem-cashu.d.ts +11 -0
- package/build/tools/redeem-cashu.js +60 -0
- package/build/tools/redeem-cashu.js.map +1 -1
- package/build/tools/safe-error.d.ts +1 -4
- package/build/tools/safe-error.js +1 -4
- package/build/tools/safe-error.js.map +1 -1
- package/build/tools/safe-headers.d.ts +1 -1
- package/build/tools/safe-headers.js +1 -1
- package/build/tools/safe-headers.js.map +1 -1
- package/build/tools/search.d.ts +3 -2
- package/build/tools/search.js +3 -2
- package/build/tools/search.js.map +1 -1
- package/build/wallet/cashu.d.ts +1 -0
- package/build/wallet/cashu.js +4 -3
- package/build/wallet/cashu.js.map +1 -1
- package/build/wallet/human.d.ts +3 -4
- package/build/wallet/human.js +7 -10
- package/build/wallet/human.js.map +1 -1
- package/build/wallet/nwc.d.ts +1 -0
- package/build/wallet/nwc.js +9 -6
- package/build/wallet/nwc.js.map +1 -1
- package/build/wallet/resolve.d.ts +1 -0
- package/build/wallet/resolve.js +1 -0
- package/build/wallet/resolve.js.map +1 -1
- package/build/wallet/types.d.ts +4 -1
- package/package.json +1 -1
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { ResilientFetchOptions } from '../fetch/resilient-fetch.js';
|
|
3
|
+
import type { SpendTracker } from '../spend-tracker.js';
|
|
3
4
|
export interface RedeemCashuDeps {
|
|
4
5
|
fetchFn: (url: string | URL, init?: RequestInit, options?: ResilientFetchOptions) => Promise<Response>;
|
|
5
6
|
storeCredential: (origin: string, macaroon: string, preimage: string, paymentHash: string) => boolean;
|
|
6
7
|
removeToken: (tokenStr: string) => void;
|
|
8
|
+
decodeToken: (token: string) => {
|
|
9
|
+
proofs: Array<{
|
|
10
|
+
amount: number;
|
|
11
|
+
}>;
|
|
12
|
+
};
|
|
13
|
+
maxAutoPaySats: number;
|
|
14
|
+
maxSpendPerMinuteSats: number;
|
|
15
|
+
spendTracker: SpendTracker;
|
|
7
16
|
}
|
|
17
|
+
/** Redeems Cashu ecash tokens directly with a toll-booth server, bypassing the Lightning round-trip. */
|
|
8
18
|
export declare function handleRedeemCashu(args: {
|
|
9
19
|
url: string;
|
|
10
20
|
token: string;
|
|
@@ -21,4 +31,5 @@ export declare function handleRedeemCashu(args: {
|
|
|
21
31
|
}[];
|
|
22
32
|
isError?: undefined;
|
|
23
33
|
}>;
|
|
34
|
+
/** Registers the l402_redeem_cashu tool with the MCP server. */
|
|
24
35
|
export declare function registerRedeemCashuTool(server: McpServer, deps: RedeemCashuDeps): void;
|
|
@@ -9,8 +9,54 @@ const RedeemResponseSchema = z.object({
|
|
|
9
9
|
token_suffix: z.string().min(1).max(256),
|
|
10
10
|
credited: z.number().optional(),
|
|
11
11
|
});
|
|
12
|
+
/** Redeems Cashu ecash tokens directly with a toll-booth server, bypassing the Lightning round-trip. */
|
|
12
13
|
export async function handleRedeemCashu(args, deps) {
|
|
13
14
|
const origin = new URL(args.url).origin;
|
|
15
|
+
// Decode token to determine its value and enforce spend limits
|
|
16
|
+
let tokenSats;
|
|
17
|
+
try {
|
|
18
|
+
const decoded = deps.decodeToken(args.token);
|
|
19
|
+
tokenSats = decoded.proofs.reduce((sum, p) => sum + p.amount, 0);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return {
|
|
23
|
+
content: [{
|
|
24
|
+
type: 'text',
|
|
25
|
+
text: JSON.stringify({ error: 'Failed to decode Cashu token' }),
|
|
26
|
+
}],
|
|
27
|
+
isError: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (tokenSats <= 0) {
|
|
31
|
+
return {
|
|
32
|
+
content: [{
|
|
33
|
+
type: 'text',
|
|
34
|
+
text: JSON.stringify({ error: 'Cashu token has no value' }),
|
|
35
|
+
}],
|
|
36
|
+
isError: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (tokenSats > deps.maxAutoPaySats) {
|
|
40
|
+
return {
|
|
41
|
+
content: [{
|
|
42
|
+
type: 'text',
|
|
43
|
+
text: JSON.stringify({ error: `Token value (${tokenSats} sats) exceeds MAX_AUTO_PAY_SATS (${deps.maxAutoPaySats}). Increase the limit or use a smaller token.` }),
|
|
44
|
+
}],
|
|
45
|
+
isError: true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (!deps.spendTracker.tryRecord(tokenSats, deps.maxSpendPerMinuteSats)) {
|
|
49
|
+
return {
|
|
50
|
+
content: [{
|
|
51
|
+
type: 'text',
|
|
52
|
+
text: JSON.stringify({ error: 'Per-minute spend limit reached.' }),
|
|
53
|
+
}],
|
|
54
|
+
isError: true,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Track whether the server has consumed the token so the catch block
|
|
58
|
+
// knows whether to roll back the spend-tracker reservation.
|
|
59
|
+
let redeemSucceeded = false;
|
|
14
60
|
try {
|
|
15
61
|
// Step 1: Create invoice to get paymentHash and statusToken
|
|
16
62
|
const invoiceResponse = await deps.fetchFn(`${origin}/create-invoice`, {
|
|
@@ -19,6 +65,7 @@ export async function handleRedeemCashu(args, deps) {
|
|
|
19
65
|
body: JSON.stringify({}),
|
|
20
66
|
}, { retries: 0 });
|
|
21
67
|
if (!invoiceResponse.ok) {
|
|
68
|
+
deps.spendTracker.unrecord(tokenSats);
|
|
22
69
|
return {
|
|
23
70
|
content: [{
|
|
24
71
|
type: 'text',
|
|
@@ -30,6 +77,7 @@ export async function handleRedeemCashu(args, deps) {
|
|
|
30
77
|
const raw = await invoiceResponse.json();
|
|
31
78
|
const invoiceValidated = InvoiceResponse.safeParse(raw);
|
|
32
79
|
if (!invoiceValidated.success) {
|
|
80
|
+
deps.spendTracker.unrecord(tokenSats);
|
|
33
81
|
return {
|
|
34
82
|
content: [{
|
|
35
83
|
type: 'text',
|
|
@@ -52,6 +100,7 @@ export async function handleRedeemCashu(args, deps) {
|
|
|
52
100
|
}),
|
|
53
101
|
}, { retries: 0 });
|
|
54
102
|
if (!redeemResponse.ok) {
|
|
103
|
+
deps.spendTracker.unrecord(tokenSats);
|
|
55
104
|
return {
|
|
56
105
|
content: [{
|
|
57
106
|
type: 'text',
|
|
@@ -60,6 +109,10 @@ export async function handleRedeemCashu(args, deps) {
|
|
|
60
109
|
isError: true,
|
|
61
110
|
};
|
|
62
111
|
}
|
|
112
|
+
// Past this point the server has consumed the token — the spend is
|
|
113
|
+
// irreversible. Do NOT unrecord tokenSats from here on, even if
|
|
114
|
+
// local steps (parsing, credential storage) fail.
|
|
115
|
+
redeemSucceeded = true;
|
|
63
116
|
const redeemRaw = await redeemResponse.json();
|
|
64
117
|
const redeemValidated = RedeemResponseSchema.safeParse(redeemRaw);
|
|
65
118
|
if (!redeemValidated.success) {
|
|
@@ -91,6 +144,12 @@ export async function handleRedeemCashu(args, deps) {
|
|
|
91
144
|
};
|
|
92
145
|
}
|
|
93
146
|
catch (err) {
|
|
147
|
+
// Only roll back spend if the error occurred before the redeem POST
|
|
148
|
+
// succeeded — after that, the server has consumed the token and the
|
|
149
|
+
// spend is irreversible.
|
|
150
|
+
if (!redeemSucceeded) {
|
|
151
|
+
deps.spendTracker.unrecord(tokenSats);
|
|
152
|
+
}
|
|
94
153
|
return {
|
|
95
154
|
content: [{
|
|
96
155
|
type: 'text',
|
|
@@ -100,6 +159,7 @@ export async function handleRedeemCashu(args, deps) {
|
|
|
100
159
|
};
|
|
101
160
|
}
|
|
102
161
|
}
|
|
162
|
+
/** Registers the l402_redeem_cashu tool with the MCP server. */
|
|
103
163
|
export function registerRedeemCashuTool(server, deps) {
|
|
104
164
|
server.registerTool('l402_redeem_cashu', {
|
|
105
165
|
description: 'Redeem Cashu ecash tokens directly on a toll-booth server, avoiding the Lightning round-trip. Handles the two-step flow automatically (create invoice then redeem token). Only works with toll-booth servers.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redeem-cashu.js","sourceRoot":"","sources":["../../src/tools/redeem-cashu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"redeem-cashu.js","sourceRoot":"","sources":["../../src/tools/redeem-cashu.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Convert an error to a safe, user-facing message that does not leak
|
|
3
|
-
* stack traces, file paths, or internal details.
|
|
4
|
-
*/
|
|
1
|
+
/** Converts an error to a user-facing message without leaking internal details or stack traces. */
|
|
5
2
|
export declare function safeErrorMessage(err: unknown): string;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { SsrfError, TimeoutError, RetryExhaustedError, ResponseTooLargeError, DowngradeError } from '../fetch/errors.js';
|
|
2
|
-
/**
|
|
3
|
-
* Convert an error to a safe, user-facing message that does not leak
|
|
4
|
-
* stack traces, file paths, or internal details.
|
|
5
|
-
*/
|
|
2
|
+
/** Converts an error to a user-facing message without leaking internal details or stack traces. */
|
|
6
3
|
export function safeErrorMessage(err) {
|
|
7
4
|
if (err instanceof SsrfError)
|
|
8
5
|
return 'Request blocked: target address is not allowed.';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-error.js","sourceRoot":"","sources":["../../src/tools/safe-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExH
|
|
1
|
+
{"version":3,"file":"safe-error.js","sourceRoot":"","sources":["../../src/tools/safe-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExH,mGAAmG;AACnG,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,GAAG,YAAY,SAAS;QAAE,OAAO,iDAAiD,CAAA;IACtF,IAAI,GAAG,YAAY,YAAY;QAAE,OAAO,oBAAoB,CAAA;IAC5D,IAAI,GAAG,YAAY,qBAAqB;QAAE,OAAO,8CAA8C,CAAA;IAC/F,IAAI,GAAG,YAAY,cAAc;QAAE,OAAO,kCAAkC,CAAA;IAC5E,IAAI,GAAG,YAAY,mBAAmB;QAAE,OAAO,wCAAwC,CAAA;IAEvF,IAAI,GAAG,YAAY,SAAS,IAAK,GAAW,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACxE,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,kEAAkE;IAClE,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAA;QAChD,IAAI,IAAI;YAAE,OAAO,kBAAkB,IAAI,EAAE,CAAA;QACzC,qCAAqC;QACrC,OAAO,mBAAmB,GAAG,CAAC,IAAI,EAAE,CAAA;IACtC,CAAC;IAED,OAAO,+BAA+B,CAAA;AACxC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Returns only whitelisted response headers, stripping security-sensitive values. */
|
|
2
2
|
export declare function filterResponseHeaders(headers: Headers): Record<string, string>;
|
|
@@ -18,7 +18,7 @@ const SAFE_HEADERS = new Set([
|
|
|
18
18
|
'access-control-allow-origin',
|
|
19
19
|
'vary',
|
|
20
20
|
]);
|
|
21
|
-
/**
|
|
21
|
+
/** Returns only whitelisted response headers, stripping security-sensitive values. */
|
|
22
22
|
export function filterResponseHeaders(headers) {
|
|
23
23
|
const filtered = {};
|
|
24
24
|
for (const [key, value] of headers.entries()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-headers.js","sourceRoot":"","sources":["../../src/tools/safe-headers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,MAAM;IACN,eAAe;IACf,MAAM;IACN,kBAAkB;IAClB,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,aAAa;IACb,6BAA6B;IAC7B,MAAM;CACP,CAAC,CAAA;AAEF,
|
|
1
|
+
{"version":3,"file":"safe-headers.js","sourceRoot":"","sources":["../../src/tools/safe-headers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,MAAM;IACN,eAAe;IACf,MAAM;IACN,kBAAkB;IAClB,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,aAAa;IACb,6BAA6B;IAC7B,MAAM;CACP,CAAC,CAAA;AAEF,sFAAsF;AACtF,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,QAAQ,GAA2B,EAAE,CAAA;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACvB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
package/build/tools/search.d.ts
CHANGED
|
@@ -21,9 +21,9 @@ export interface ParsedService {
|
|
|
21
21
|
description: string;
|
|
22
22
|
}[];
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
24
|
+
/** Extracts service metadata (name, URL, pricing, capabilities) from a kind 31402 Nostr event. */
|
|
25
25
|
export declare function parseAnnounceEvent(event: NostrEvent): ParsedService;
|
|
26
|
-
/**
|
|
26
|
+
/** Searches Nostr relays for L402 service announcements matching a query, topic, or payment method. */
|
|
27
27
|
export declare function handleSearch(args: {
|
|
28
28
|
query: string;
|
|
29
29
|
relays?: string[];
|
|
@@ -44,4 +44,5 @@ export declare function handleSearch(args: {
|
|
|
44
44
|
}[];
|
|
45
45
|
isError: true;
|
|
46
46
|
}>;
|
|
47
|
+
/** Registers the l402_search tool with the MCP server. */
|
|
47
48
|
export declare function registerSearchTool(server: McpServer, deps: SearchDeps): void;
|
package/build/tools/search.js
CHANGED
|
@@ -6,7 +6,7 @@ const DEFAULT_RELAYS = [
|
|
|
6
6
|
'wss://nos.lol',
|
|
7
7
|
];
|
|
8
8
|
const KIND_L402_ANNOUNCE = 31402;
|
|
9
|
-
/**
|
|
9
|
+
/** Extracts service metadata (name, URL, pricing, capabilities) from a kind 31402 Nostr event. */
|
|
10
10
|
export function parseAnnounceEvent(event) {
|
|
11
11
|
const getTag = (key) => event.tags.find(t => t[0] === key)?.[1];
|
|
12
12
|
const getAllTags = (key) => event.tags.filter(t => t[0] === key);
|
|
@@ -45,7 +45,7 @@ export function parseAnnounceEvent(event) {
|
|
|
45
45
|
capabilities,
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
-
/**
|
|
48
|
+
/** Searches Nostr relays for L402 service announcements matching a query, topic, or payment method. */
|
|
49
49
|
export async function handleSearch(args, deps) {
|
|
50
50
|
try {
|
|
51
51
|
const relays = args.relays ?? DEFAULT_RELAYS;
|
|
@@ -88,6 +88,7 @@ export async function handleSearch(args, deps) {
|
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
/** Registers the l402_search tool with the MCP server. */
|
|
91
92
|
export function registerSearchTool(server, deps) {
|
|
92
93
|
server.registerTool('l402_search', {
|
|
93
94
|
description: 'Search for L402 services on Nostr. Discovers paid APIs by querying relay announcements (kind 31402). Returns service names, URLs, pricing, and payment methods. Use the URL with l402_discover or l402_fetch to interact.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,cAAc,GAAG;IACrB,sBAAsB;IACtB,wBAAwB;IACxB,eAAe;CAChB,CAAA;AAED,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAiBhC,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
package/build/wallet/cashu.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { WalletProvider } from './types.js';
|
|
2
2
|
import type { CashuTokenStore } from '../store/cashu-tokens.js';
|
|
3
|
+
/** Creates a Cashu wallet provider that melts ecash tokens to pay Lightning invoices. */
|
|
3
4
|
export declare function createCashuWallet(tokenStore: CashuTokenStore): WalletProvider;
|
package/build/wallet/cashu.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
async function doPayInvoice(invoice, tokenStore) {
|
|
1
|
+
async function doPayInvoice(invoice, tokenStore, _options) {
|
|
2
2
|
const token = tokenStore.consumeFirst();
|
|
3
3
|
if (!token) {
|
|
4
4
|
return { paid: false, method: 'cashu', reason: 'No Cashu tokens available' };
|
|
@@ -66,6 +66,7 @@ async function doPayInvoice(invoice, tokenStore) {
|
|
|
66
66
|
return { paid: false, method: 'cashu', reason: 'Cashu payment failed' };
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
+
/** Creates a Cashu wallet provider that melts ecash tokens to pay Lightning invoices. */
|
|
69
70
|
export function createCashuWallet(tokenStore) {
|
|
70
71
|
// Serialise payment attempts to prevent concurrent token consumption races
|
|
71
72
|
let paymentLock = Promise.resolve({ paid: false, method: 'cashu' });
|
|
@@ -74,10 +75,10 @@ export function createCashuWallet(tokenStore) {
|
|
|
74
75
|
get available() {
|
|
75
76
|
return tokenStore.totalBalance() > 0;
|
|
76
77
|
},
|
|
77
|
-
payInvoice(invoice) {
|
|
78
|
+
payInvoice(invoice, options) {
|
|
78
79
|
paymentLock = paymentLock
|
|
79
80
|
.catch(() => { }) // never let a prior rejection block the chain
|
|
80
|
-
.then(() => doPayInvoice(invoice, tokenStore));
|
|
81
|
+
.then(() => doPayInvoice(invoice, tokenStore, options));
|
|
81
82
|
return paymentLock;
|
|
82
83
|
},
|
|
83
84
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cashu.js","sourceRoot":"","sources":["../../src/wallet/cashu.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,UAA2B;
|
|
1
|
+
{"version":3,"file":"cashu.js","sourceRoot":"","sources":["../../src/wallet/cashu.ts"],"names":[],"mappings":"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"}
|
package/build/wallet/human.d.ts
CHANGED
|
@@ -9,14 +9,13 @@ export interface PollOptions {
|
|
|
9
9
|
preimage?: string;
|
|
10
10
|
}>;
|
|
11
11
|
}
|
|
12
|
+
/** Polls a toll-booth server for invoice settlement, returning once paid or timed out. */
|
|
12
13
|
export declare function pollForSettlement(paymentHash: string, options: PollOptions): Promise<PaymentResult>;
|
|
13
14
|
export interface HumanWalletOptions {
|
|
14
15
|
initialIntervalS: number;
|
|
15
16
|
maxIntervalS: number;
|
|
16
17
|
timeoutS: number;
|
|
17
|
-
generateQr: (data: string) => Promise<string>;
|
|
18
18
|
fetchFn: (url: string | URL, init?: RequestInit, options?: ResilientFetchOptions) => Promise<Response>;
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
};
|
|
20
|
+
/** Creates a human-in-the-loop wallet that polls for settlement. */
|
|
21
|
+
export declare function createHumanWallet(options: HumanWalletOptions): WalletProvider;
|
package/build/wallet/human.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** Polls a toll-booth server for invoice settlement, returning once paid or timed out. */
|
|
1
2
|
export async function pollForSettlement(paymentHash, options) {
|
|
2
3
|
const deadline = Date.now() + options.timeoutS * 1000;
|
|
3
4
|
let intervalMs = options.initialIntervalS * 1000;
|
|
@@ -14,24 +15,20 @@ export async function pollForSettlement(paymentHash, options) {
|
|
|
14
15
|
}
|
|
15
16
|
return { paid: false, method: 'human', reason: `Payment timed out after ${options.timeoutS}s` };
|
|
16
17
|
}
|
|
18
|
+
/** Creates a human-in-the-loop wallet that polls for settlement. */
|
|
17
19
|
export function createHumanWallet(options) {
|
|
18
|
-
let serverOrigin = '';
|
|
19
20
|
return {
|
|
20
21
|
method: 'human',
|
|
21
22
|
available: true,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
},
|
|
25
|
-
async payInvoice(invoice) {
|
|
26
|
-
const qrDataUri = await options.generateQr(invoice);
|
|
27
|
-
console.error(`\nScan to pay: ${qrDataUri}\n`);
|
|
23
|
+
async payInvoice(invoice, payOptions) {
|
|
24
|
+
const origin = payOptions?.serverOrigin;
|
|
28
25
|
const { decodeBolt11 } = await import('../l402/bolt11.js');
|
|
29
26
|
const decoded = decodeBolt11(invoice);
|
|
30
27
|
if (!decoded?.paymentHash) {
|
|
31
28
|
return { paid: false, method: 'human', reason: 'Could not decode invoice payment hash' };
|
|
32
29
|
}
|
|
33
|
-
if (!
|
|
34
|
-
return { paid: false, method: 'human', reason: 'No server origin
|
|
30
|
+
if (!origin) {
|
|
31
|
+
return { paid: false, method: 'human', reason: 'No server origin for settlement polling' };
|
|
35
32
|
}
|
|
36
33
|
return pollForSettlement(decoded.paymentHash, {
|
|
37
34
|
initialIntervalS: options.initialIntervalS,
|
|
@@ -39,7 +36,7 @@ export function createHumanWallet(options) {
|
|
|
39
36
|
timeoutS: options.timeoutS,
|
|
40
37
|
checkSettlement: async (hash) => {
|
|
41
38
|
try {
|
|
42
|
-
const res = await options.fetchFn(`${
|
|
39
|
+
const res = await options.fetchFn(`${origin}/invoice-status/${hash}`, undefined, { retries: 0 });
|
|
43
40
|
if (!res.ok)
|
|
44
41
|
return { settled: false };
|
|
45
42
|
const data = await res.json();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"human.js","sourceRoot":"","sources":["../../src/wallet/human.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,OAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;IACrD,IAAI,UAAU,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAA;IAEhD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QACzD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;QACnE,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvC,IAAI,SAAS,IAAI,CAAC;YAAE,MAAK;QACzB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;QAClF,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,2BAA2B,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAA;AACjG,CAAC;
|
|
1
|
+
{"version":3,"file":"human.js","sourceRoot":"","sources":["../../src/wallet/human.ts"],"names":[],"mappings":"AAUA,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,OAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;IACrD,IAAI,UAAU,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAA;IAEhD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QACzD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;QACnE,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvC,IAAI,SAAS,IAAI,CAAC;YAAE,MAAK;QACzB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;QAClF,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,2BAA2B,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAA;AACjG,CAAC;AASD,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,OAAO;QACL,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,IAAI;QAEf,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,UAA8B;YAC9D,MAAM,MAAM,GAAG,UAAU,EAAE,YAAY,CAAA;YAEvC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC1D,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;YACrC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;gBAC1B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAA;YAC1F,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAA;YAC5F,CAAC;YAED,OAAO,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE;gBAC5C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gBAC1C,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,eAAe,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;oBACtC,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,mBAAmB,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;wBAChG,IAAI,CAAC,GAAG,CAAC,EAAE;4BAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;wBACtC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAA;wBACxD,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;4BAC5E,CAAC,CAAC,IAAI,CAAC,QAAQ;4BACf,CAAC,CAAC,SAAS,CAAA;wBACb,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,QAAQ,EAAE,CAAA;oBACrD,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;oBAC3B,CAAC;gBACH,CAAC;aACF,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/build/wallet/nwc.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { WalletProvider } from './types.js';
|
|
2
|
+
/** Creates a Nostr Wallet Connect provider that pays Lightning invoices via the NWC protocol. */
|
|
2
3
|
export declare function createNwcWallet(nwcUri: string): WalletProvider;
|
|
3
4
|
export declare function hexToBytes(hex: string): Uint8Array;
|
package/build/wallet/nwc.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
/** Creates a Nostr Wallet Connect provider that pays Lightning invoices via the NWC protocol. */
|
|
1
2
|
export function createNwcWallet(nwcUri) {
|
|
2
3
|
return {
|
|
3
4
|
method: 'nwc',
|
|
4
5
|
available: true,
|
|
5
|
-
async payInvoice(invoice) {
|
|
6
|
+
async payInvoice(invoice, _options) {
|
|
6
7
|
// Parse NWC URI: nostr+walletconnect://<pubkey>?relay=<relay>&secret=<secret>
|
|
7
8
|
const url = new URL(nwcUri.replace('nostr+walletconnect://', 'https://'));
|
|
8
9
|
const walletPubkey = url.hostname || url.pathname.replace('//', '');
|
|
@@ -57,9 +58,10 @@ export function createNwcWallet(nwcUri) {
|
|
|
57
58
|
onevent: (responseEvent) => {
|
|
58
59
|
clearTimeout(timeout);
|
|
59
60
|
try {
|
|
60
|
-
// Verify event
|
|
61
|
-
// a compromised relay could
|
|
62
|
-
|
|
61
|
+
// Verify the event is from the expected wallet — relay-side
|
|
62
|
+
// filtering is advisory; a compromised relay could inject
|
|
63
|
+
// events from a different pubkey.
|
|
64
|
+
if (responseEvent.pubkey !== walletPubkey || !verifyEvent(responseEvent)) {
|
|
63
65
|
ck.fill(0);
|
|
64
66
|
r.close();
|
|
65
67
|
resolve({ paid: false, method: 'nwc', reason: 'NWC response signature verification failed' });
|
|
@@ -67,10 +69,11 @@ export function createNwcWallet(nwcUri) {
|
|
|
67
69
|
}
|
|
68
70
|
const decrypted = decrypt(responseEvent.content, ck);
|
|
69
71
|
const response = JSON.parse(decrypted);
|
|
70
|
-
|
|
72
|
+
const preimage = response.result?.preimage;
|
|
73
|
+
if (typeof preimage === 'string' && preimage && /^[0-9a-fA-F]{64}$/.test(preimage)) {
|
|
71
74
|
ck.fill(0);
|
|
72
75
|
r.close();
|
|
73
|
-
resolve({ paid: true, preimage
|
|
76
|
+
resolve({ paid: true, preimage, method: 'nwc' });
|
|
74
77
|
}
|
|
75
78
|
else {
|
|
76
79
|
ck.fill(0);
|
package/build/wallet/nwc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nwc.js","sourceRoot":"","sources":["../../src/wallet/nwc.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO;QACL,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,IAAI;QAEf,KAAK,CAAC,UAAU,CAAC,OAAe;
|
|
1
|
+
{"version":3,"file":"nwc.js","sourceRoot":"","sources":["../../src/wallet/nwc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import type { WalletMethod, WalletProvider } from './types.js';
|
|
2
|
+
/** Selects a wallet provider by preferred method, or returns the first available one. */
|
|
2
3
|
export declare function resolveWallet(providers: WalletProvider[], preferredMethod?: WalletMethod): WalletProvider | undefined;
|
package/build/wallet/resolve.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/wallet/resolve.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAC3B,SAA2B,EAC3B,eAA8B;IAE9B,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,CAAC,SAAS,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AACzC,CAAC"}
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/wallet/resolve.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAC3B,SAA2B,EAC3B,eAA8B;IAE9B,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,CAAC,SAAS,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AACzC,CAAC"}
|
package/build/wallet/types.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export type WalletMethod = 'nwc' | 'cashu' | 'human';
|
|
2
|
+
export interface PayInvoiceOptions {
|
|
3
|
+
serverOrigin?: string;
|
|
4
|
+
}
|
|
2
5
|
export interface PaymentResult {
|
|
3
6
|
paid: boolean;
|
|
4
7
|
preimage?: string;
|
|
@@ -8,5 +11,5 @@ export interface PaymentResult {
|
|
|
8
11
|
export interface WalletProvider {
|
|
9
12
|
method: WalletMethod;
|
|
10
13
|
available: boolean;
|
|
11
|
-
payInvoice(invoice: string): Promise<PaymentResult>;
|
|
14
|
+
payInvoice(invoice: string, options?: PayInvoiceOptions): Promise<PaymentResult>;
|
|
12
15
|
}
|