@sunnyln/lni 0.1.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.
Files changed (62) hide show
  1. package/README.md +118 -0
  2. package/dist/errors.d.ts +13 -0
  3. package/dist/errors.d.ts.map +1 -0
  4. package/dist/errors.js +25 -0
  5. package/dist/errors.js.map +1 -0
  6. package/dist/index.d.ts +11 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +11 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/internal/encoding.d.ts +5 -0
  11. package/dist/internal/encoding.d.ts.map +1 -0
  12. package/dist/internal/encoding.js +79 -0
  13. package/dist/internal/encoding.js.map +1 -0
  14. package/dist/internal/http.d.ts +19 -0
  15. package/dist/internal/http.d.ts.map +1 -0
  16. package/dist/internal/http.js +130 -0
  17. package/dist/internal/http.js.map +1 -0
  18. package/dist/internal/polling.d.ts +8 -0
  19. package/dist/internal/polling.d.ts.map +1 -0
  20. package/dist/internal/polling.js +26 -0
  21. package/dist/internal/polling.js.map +1 -0
  22. package/dist/internal/transform.d.ts +10 -0
  23. package/dist/internal/transform.d.ts.map +1 -0
  24. package/dist/internal/transform.js +91 -0
  25. package/dist/internal/transform.js.map +1 -0
  26. package/dist/lnurl.d.ts +13 -0
  27. package/dist/lnurl.d.ts.map +1 -0
  28. package/dist/lnurl.js +156 -0
  29. package/dist/lnurl.js.map +1 -0
  30. package/dist/nodes/blink.d.ts +23 -0
  31. package/dist/nodes/blink.d.ts.map +1 -0
  32. package/dist/nodes/blink.js +292 -0
  33. package/dist/nodes/blink.js.map +1 -0
  34. package/dist/nodes/cln.d.ts +24 -0
  35. package/dist/nodes/cln.d.ts.map +1 -0
  36. package/dist/nodes/cln.js +266 -0
  37. package/dist/nodes/cln.js.map +1 -0
  38. package/dist/nodes/lnd.d.ts +24 -0
  39. package/dist/nodes/lnd.d.ts.map +1 -0
  40. package/dist/nodes/lnd.js +205 -0
  41. package/dist/nodes/lnd.js.map +1 -0
  42. package/dist/nodes/nwc.d.ts +21 -0
  43. package/dist/nodes/nwc.d.ts.map +1 -0
  44. package/dist/nodes/nwc.js +194 -0
  45. package/dist/nodes/nwc.js.map +1 -0
  46. package/dist/nodes/phoenixd.d.ts +22 -0
  47. package/dist/nodes/phoenixd.d.ts.map +1 -0
  48. package/dist/nodes/phoenixd.js +258 -0
  49. package/dist/nodes/phoenixd.js.map +1 -0
  50. package/dist/nodes/speed.d.ts +25 -0
  51. package/dist/nodes/speed.d.ts.map +1 -0
  52. package/dist/nodes/speed.js +170 -0
  53. package/dist/nodes/speed.js.map +1 -0
  54. package/dist/nodes/strike.d.ts +25 -0
  55. package/dist/nodes/strike.d.ts.map +1 -0
  56. package/dist/nodes/strike.js +231 -0
  57. package/dist/nodes/strike.js.map +1 -0
  58. package/dist/types.d.ts +169 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +6 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +70 -0
@@ -0,0 +1,266 @@
1
+ import { LniError } from '../errors.js';
2
+ import { buildUrl, requestJson, requestText, resolveFetch, toTimeoutMs } from '../internal/http.js';
3
+ import { pollInvoiceEvents } from '../internal/polling.js';
4
+ import { emptyNodeInfo, emptyTransaction, parseOptionalNumber } from '../internal/transform.js';
5
+ import { InvoiceType } from '../types.js';
6
+ export class ClnNode {
7
+ config;
8
+ fetchFn;
9
+ timeoutMs;
10
+ constructor(config, options = {}) {
11
+ this.config = config;
12
+ this.fetchFn = resolveFetch(options.fetch);
13
+ this.timeoutMs = toTimeoutMs(config.httpTimeout);
14
+ }
15
+ headers(extra) {
16
+ return {
17
+ rune: this.config.rune,
18
+ 'content-type': 'application/json',
19
+ ...(extra ?? {}),
20
+ };
21
+ }
22
+ async postJson(path, json = {}) {
23
+ return requestJson(this.fetchFn, buildUrl(this.config.url, path), {
24
+ method: 'POST',
25
+ headers: this.headers(),
26
+ json,
27
+ timeoutMs: this.timeoutMs,
28
+ });
29
+ }
30
+ async postText(path, json = {}) {
31
+ return requestText(this.fetchFn, buildUrl(this.config.url, path), {
32
+ method: 'POST',
33
+ headers: this.headers(),
34
+ json,
35
+ timeoutMs: this.timeoutMs,
36
+ });
37
+ }
38
+ async fetchInvoiceFromOffer(offer, amountMsats, payerNote) {
39
+ const payload = await this.postJson('/v1/fetchinvoice', {
40
+ offer,
41
+ amount_msat: amountMsats,
42
+ payer_note: payerNote,
43
+ timeout: 60,
44
+ });
45
+ if (!payload.invoice) {
46
+ throw new LniError('Api', 'Missing BOLT12 invoice');
47
+ }
48
+ return payload.invoice;
49
+ }
50
+ invoiceToTransaction(invoice) {
51
+ return emptyTransaction({
52
+ type: 'incoming',
53
+ invoice: invoice.bolt11 ?? invoice.bolt12 ?? '',
54
+ preimage: invoice.payment_preimage ?? '',
55
+ paymentHash: invoice.payment_hash,
56
+ amountMsats: invoice.amount_received_msat ?? invoice.amount_msat ?? 0,
57
+ feesPaid: 0,
58
+ createdAt: 0,
59
+ expiresAt: invoice.expires_at ?? 0,
60
+ settledAt: invoice.paid_at ?? 0,
61
+ description: invoice.description ?? '',
62
+ descriptionHash: '',
63
+ payerNote: invoice.invreq_payer_note ?? '',
64
+ externalId: invoice.label,
65
+ });
66
+ }
67
+ async getInfo() {
68
+ const [info, funds] = await Promise.all([
69
+ this.postJson('/v1/getinfo', {}),
70
+ this.postJson('/v1/listfunds', {}),
71
+ ]);
72
+ let sendBalanceMsat = 0;
73
+ let receiveBalanceMsat = 0;
74
+ let unsettledSendBalanceMsat = 0;
75
+ let unsettledReceiveBalanceMsat = 0;
76
+ let pendingOpenSendBalance = 0;
77
+ let pendingOpenReceiveBalance = 0;
78
+ for (const channel of funds.channels) {
79
+ const channelAmount = parseOptionalNumber(channel.amount_msat);
80
+ const localAmount = parseOptionalNumber(channel.our_amount_msat);
81
+ const remoteAmount = channelAmount - localAmount;
82
+ if (channel.state === 'CHANNELD_NORMAL' && channel.connected) {
83
+ sendBalanceMsat += localAmount;
84
+ receiveBalanceMsat += remoteAmount;
85
+ continue;
86
+ }
87
+ if (channel.state === 'CHANNELD_NORMAL' && !channel.connected) {
88
+ unsettledSendBalanceMsat += localAmount;
89
+ unsettledReceiveBalanceMsat += remoteAmount;
90
+ continue;
91
+ }
92
+ if (channel.state === 'CHANNELD_AWAITING_LOCKIN' ||
93
+ channel.state === 'DUALOPEND_AWAITING_LOCKIN' ||
94
+ channel.state === 'DUALOPEND_OPEN_INIT' ||
95
+ channel.state === 'DUALOPEND_OPEN_COMMITTED' ||
96
+ channel.state === 'DUALOPEND_OPEN_COMMIT_READY' ||
97
+ channel.state === 'OPENINGD') {
98
+ pendingOpenSendBalance += localAmount;
99
+ pendingOpenReceiveBalance += remoteAmount;
100
+ }
101
+ }
102
+ return emptyNodeInfo({
103
+ alias: info.alias,
104
+ color: info.color,
105
+ pubkey: info.id,
106
+ network: info.network,
107
+ blockHeight: info.blockheight,
108
+ sendBalanceMsat,
109
+ receiveBalanceMsat,
110
+ unsettledSendBalanceMsat,
111
+ unsettledReceiveBalanceMsat,
112
+ pendingOpenSendBalance,
113
+ pendingOpenReceiveBalance,
114
+ });
115
+ }
116
+ async createInvoice(params) {
117
+ const invoiceType = params.invoiceType ?? InvoiceType.Bolt11;
118
+ if (invoiceType === InvoiceType.Bolt12) {
119
+ if (!params.offer) {
120
+ throw new LniError('InvalidInput', 'Offer is required for BOLT12 invoice creation with CLN.');
121
+ }
122
+ const invoice = await this.fetchInvoiceFromOffer(params.offer, params.amountMsats ?? 0, params.description);
123
+ return emptyTransaction({
124
+ type: 'incoming',
125
+ invoice,
126
+ amountMsats: params.amountMsats ?? 0,
127
+ expiresAt: params.expiry ?? 0,
128
+ description: params.description ?? '',
129
+ descriptionHash: params.descriptionHash ?? '',
130
+ payerNote: '',
131
+ externalId: '',
132
+ });
133
+ }
134
+ const payload = await this.postJson('/v1/invoice', {
135
+ description: params.description ?? '',
136
+ amount_msat: params.amountMsats !== undefined ? String(params.amountMsats) : 'any',
137
+ expiry: params.expiry,
138
+ label: `lni.${Math.floor(Math.random() * 1_000_000_000)}`,
139
+ });
140
+ return emptyTransaction({
141
+ type: 'incoming',
142
+ invoice: payload.bolt11,
143
+ paymentHash: payload.payment_hash,
144
+ amountMsats: params.amountMsats ?? 0,
145
+ expiresAt: params.expiry ?? 3600,
146
+ description: params.description ?? '',
147
+ descriptionHash: params.descriptionHash ?? '',
148
+ payerNote: '',
149
+ externalId: '',
150
+ });
151
+ }
152
+ async payInvoice(params) {
153
+ if (params.feeLimitMsat !== undefined && params.feeLimitPercentage !== undefined) {
154
+ throw new LniError('InvalidInput', 'Cannot set both feeLimitMsat and feeLimitPercentage.');
155
+ }
156
+ const body = {
157
+ bolt11: params.invoice,
158
+ };
159
+ if (params.amountMsats !== undefined) {
160
+ body.amount_msat = String(params.amountMsats);
161
+ }
162
+ if (params.feeLimitMsat !== undefined) {
163
+ body.maxfee = String(params.feeLimitMsat);
164
+ }
165
+ if (params.feeLimitPercentage !== undefined) {
166
+ body.maxfeepercent = params.feeLimitPercentage;
167
+ }
168
+ if (params.timeoutSeconds !== undefined) {
169
+ body.retry_for = String(params.timeoutSeconds);
170
+ }
171
+ const payload = await this.postJson('/v1/pay', body);
172
+ return {
173
+ paymentHash: payload.payment_hash,
174
+ preimage: payload.payment_preimage,
175
+ feeMsats: parseOptionalNumber(payload.amount_sent_msat) - parseOptionalNumber(payload.amount_msat),
176
+ };
177
+ }
178
+ async createOffer(params) {
179
+ const payload = await this.postJson('/v1/offer', {
180
+ amount: params.amountMsats !== undefined ? `${params.amountMsats}msat` : 'any',
181
+ description: params.description,
182
+ });
183
+ return {
184
+ offerId: payload.offer_id ?? '',
185
+ bolt12: payload.bolt12,
186
+ label: params.description,
187
+ active: payload.active,
188
+ singleUse: payload.single_use,
189
+ used: payload.used,
190
+ amountMsats: params.amountMsats,
191
+ };
192
+ }
193
+ async getOffer(search) {
194
+ const offers = await this.listOffers(search);
195
+ return (offers[0] ?? {
196
+ offerId: '',
197
+ bolt12: '',
198
+ });
199
+ }
200
+ async listOffers(search) {
201
+ const payload = await this.postJson('/v1/listoffers', {
202
+ ...(search ? { offer_id: search } : {}),
203
+ });
204
+ return payload.offers;
205
+ }
206
+ async payOffer(offer, amountMsats, payerNote) {
207
+ const bolt11 = await this.fetchInvoiceFromOffer(offer, amountMsats, payerNote);
208
+ const payload = await this.postJson('/v1/pay', {
209
+ bolt11,
210
+ maxfeepercent: 1,
211
+ retry_for: 60,
212
+ });
213
+ return {
214
+ paymentHash: payload.payment_hash,
215
+ preimage: payload.payment_preimage,
216
+ feeMsats: parseOptionalNumber(payload.amount_sent_msat) - parseOptionalNumber(payload.amount_msat),
217
+ };
218
+ }
219
+ async lookupInvoice(params) {
220
+ const query = {};
221
+ if (params.paymentHash) {
222
+ query.payment_hash = params.paymentHash;
223
+ }
224
+ else if (params.search) {
225
+ query.payment_hash = params.search;
226
+ }
227
+ const payload = await this.postJson('/v1/listinvoices', query);
228
+ const invoice = payload.invoices[0];
229
+ if (!invoice) {
230
+ throw new LniError('Api', 'No matching invoice found');
231
+ }
232
+ return this.invoiceToTransaction(invoice);
233
+ }
234
+ async listTransactions(params) {
235
+ const payload = await this.postJson('/v1/listinvoices', {
236
+ start: params.from,
237
+ index: 'created',
238
+ limit: params.limit || undefined,
239
+ payment_hash: params.paymentHash,
240
+ });
241
+ const transactions = payload.invoices.map((invoice) => this.invoiceToTransaction(invoice));
242
+ if (params.search) {
243
+ return transactions.filter((tx) => {
244
+ const normalized = params.search?.toLowerCase() ?? '';
245
+ return (tx.paymentHash.toLowerCase().includes(normalized) ||
246
+ tx.description.toLowerCase().includes(normalized) ||
247
+ (tx.payerNote ?? '').toLowerCase().includes(normalized));
248
+ });
249
+ }
250
+ return transactions;
251
+ }
252
+ async decode(str) {
253
+ return this.postText('/v1/decode', { string: str });
254
+ }
255
+ async onInvoiceEvents(params, callback) {
256
+ await pollInvoiceEvents({
257
+ params,
258
+ callback,
259
+ lookup: () => this.lookupInvoice({
260
+ paymentHash: params.paymentHash,
261
+ search: params.search,
262
+ }),
263
+ });
264
+ }
265
+ }
266
+ //# sourceMappingURL=cln.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cln.js","sourceRoot":"","sources":["../../src/nodes/cln.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type CreateInvoiceParams, type CreateOfferParams, type InvoiceEventCallback, type LightningNode, type ListTransactionsParams, type LookupInvoiceParams, type LndConfig, type NodeInfo, type NodeRequestOptions, type Offer, type OnInvoiceEventParams, type PayInvoiceParams, type PayInvoiceResponse, type Transaction } from '../types.js';
2
+ export declare class LndNode implements LightningNode {
3
+ private readonly config;
4
+ private readonly fetchFn;
5
+ private readonly timeoutMs?;
6
+ constructor(config: LndConfig, options?: NodeRequestOptions);
7
+ private headers;
8
+ private getJson;
9
+ private postJson;
10
+ private isPermissionDenied;
11
+ private mapInvoice;
12
+ getInfo(): Promise<NodeInfo>;
13
+ createInvoice(params: CreateInvoiceParams): Promise<Transaction>;
14
+ payInvoice(params: PayInvoiceParams): Promise<PayInvoiceResponse>;
15
+ createOffer(_params: CreateOfferParams): Promise<Offer>;
16
+ getOffer(_search?: string): Promise<Offer>;
17
+ listOffers(_search?: string): Promise<Offer[]>;
18
+ payOffer(_offer: string, _amountMsats: number, _payerNote?: string): Promise<PayInvoiceResponse>;
19
+ lookupInvoice(params: LookupInvoiceParams): Promise<Transaction>;
20
+ listTransactions(_params: ListTransactionsParams): Promise<Transaction[]>;
21
+ decode(str: string): Promise<string>;
22
+ onInvoiceEvents(params: OnInvoiceEventParams, callback: InvoiceEventCallback): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=lnd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lnd.d.ts","sourceRoot":"","sources":["../../src/nodes/lnd.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAE,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,KAAK,KAAK,EAAE,KAAK,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAsDnW,qBAAa,OAAQ,YAAW,aAAa;IAI/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;gBAEP,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE,kBAAuB;IAKhF,OAAO,CAAC,OAAO;YAOD,OAAO;YAQP,QAAQ;IAStB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,UAAU;IAkBZ,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;IA4B5B,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IA2BhE,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiEjE,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAIvD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAI1C,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAI9C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIhG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAShE,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAKzE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQpC,eAAe,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAOnG"}
@@ -0,0 +1,205 @@
1
+ import { LniError } from '../errors.js';
2
+ import { buildUrl, requestJson, requestText, resolveFetch, toTimeoutMs } from '../internal/http.js';
3
+ import { pollInvoiceEvents } from '../internal/polling.js';
4
+ import { emptyNodeInfo, emptyTransaction, parseOptionalNumber, rHashToHex } from '../internal/transform.js';
5
+ import { InvoiceType } from '../types.js';
6
+ export class LndNode {
7
+ config;
8
+ fetchFn;
9
+ timeoutMs;
10
+ constructor(config, options = {}) {
11
+ this.config = config;
12
+ this.fetchFn = resolveFetch(options.fetch);
13
+ this.timeoutMs = toTimeoutMs(config.httpTimeout);
14
+ }
15
+ headers(extra) {
16
+ return {
17
+ 'grpc-metadata-macaroon': this.config.macaroon,
18
+ ...(extra ?? {}),
19
+ };
20
+ }
21
+ async getJson(path) {
22
+ return requestJson(this.fetchFn, buildUrl(this.config.url, path), {
23
+ method: 'GET',
24
+ headers: this.headers(),
25
+ timeoutMs: this.timeoutMs,
26
+ });
27
+ }
28
+ async postJson(path, json) {
29
+ return requestJson(this.fetchFn, buildUrl(this.config.url, path), {
30
+ method: 'POST',
31
+ headers: this.headers({ 'content-type': 'application/json' }),
32
+ json,
33
+ timeoutMs: this.timeoutMs,
34
+ });
35
+ }
36
+ isPermissionDenied(error) {
37
+ if (!(error instanceof LniError)) {
38
+ return false;
39
+ }
40
+ if (error.code !== 'Http') {
41
+ return false;
42
+ }
43
+ const details = `${error.message} ${error.body ?? ''}`.toLowerCase();
44
+ return details.includes('permission denied');
45
+ }
46
+ mapInvoice(invoice) {
47
+ return emptyTransaction({
48
+ type: 'incoming',
49
+ invoice: invoice.payment_request ?? '',
50
+ preimage: rHashToHex(invoice.r_preimage ?? ''),
51
+ paymentHash: rHashToHex(invoice.r_hash ?? ''),
52
+ amountMsats: parseOptionalNumber(invoice.amt_paid_msat),
53
+ feesPaid: parseOptionalNumber(invoice.value_msat),
54
+ createdAt: parseOptionalNumber(invoice.creation_date),
55
+ expiresAt: parseOptionalNumber(invoice.expiry),
56
+ settledAt: parseOptionalNumber(invoice.settle_date),
57
+ description: invoice.memo ?? '',
58
+ descriptionHash: invoice.description_hash ?? '',
59
+ payerNote: '',
60
+ externalId: '',
61
+ });
62
+ }
63
+ async getInfo() {
64
+ const info = await this.getJson('/v1/getinfo');
65
+ let balances = {};
66
+ try {
67
+ balances = await this.getJson('/v1/balance/channels');
68
+ }
69
+ catch (error) {
70
+ if (!this.isPermissionDenied(error)) {
71
+ throw error;
72
+ }
73
+ }
74
+ return emptyNodeInfo({
75
+ alias: info.alias,
76
+ color: info.color,
77
+ pubkey: info.identity_pubkey,
78
+ network: info.chains[0]?.network ?? '',
79
+ blockHeight: info.block_height,
80
+ blockHash: info.block_hash,
81
+ sendBalanceMsat: parseOptionalNumber(balances.local_balance?.msat),
82
+ receiveBalanceMsat: parseOptionalNumber(balances.remote_balance?.msat),
83
+ unsettledSendBalanceMsat: parseOptionalNumber(balances.unsettled_local_balance?.msat),
84
+ unsettledReceiveBalanceMsat: parseOptionalNumber(balances.unsettled_remote_balance?.msat),
85
+ pendingOpenSendBalance: parseOptionalNumber(balances.pending_open_local_balance?.msat),
86
+ pendingOpenReceiveBalance: parseOptionalNumber(balances.pending_open_remote_balance?.msat),
87
+ });
88
+ }
89
+ async createInvoice(params) {
90
+ if ((params.invoiceType ?? InvoiceType.Bolt11) !== InvoiceType.Bolt11) {
91
+ throw new LniError('Api', 'Bolt12 is not implemented for LndNode.');
92
+ }
93
+ const payload = await this.postJson('/v1/invoices', {
94
+ value_msat: params.amountMsats ?? 0,
95
+ memo: params.description ?? '',
96
+ expiry: params.expiry ?? 86400,
97
+ private: params.isPrivate ?? false,
98
+ ...(params.rPreimage ? { r_preimage: params.rPreimage } : {}),
99
+ ...(params.isBlinded ? { is_blinded: true } : {}),
100
+ });
101
+ return emptyTransaction({
102
+ type: 'incoming',
103
+ invoice: payload.payment_request,
104
+ paymentHash: rHashToHex(payload.r_hash),
105
+ amountMsats: params.amountMsats ?? 0,
106
+ expiresAt: params.expiry ?? 86400,
107
+ description: params.description ?? '',
108
+ descriptionHash: params.descriptionHash ?? '',
109
+ payerNote: '',
110
+ externalId: '',
111
+ });
112
+ }
113
+ async payInvoice(params) {
114
+ const body = {
115
+ payment_request: params.invoice,
116
+ allow_self_payment: params.allowSelfPayment ?? false,
117
+ timeout_seconds: params.timeoutSeconds ?? 60,
118
+ };
119
+ if (params.feeLimitPercentage !== undefined && params.amountMsats !== undefined) {
120
+ body.fee_limit = {
121
+ fixed_msat: String(params.amountMsats),
122
+ percent: params.feeLimitPercentage,
123
+ };
124
+ }
125
+ const responseText = await requestText(this.fetchFn, buildUrl(this.config.url, '/v2/router/send'), {
126
+ method: 'POST',
127
+ headers: this.headers({ 'content-type': 'application/json' }),
128
+ json: body,
129
+ timeoutMs: this.timeoutMs,
130
+ });
131
+ if (responseText.includes('"error"') && !responseText.includes('"result"')) {
132
+ throw new LniError('Api', `Payment failed: ${responseText}`);
133
+ }
134
+ const finalLine = responseText
135
+ .split('\n')
136
+ .map((line) => line.trim())
137
+ .filter(Boolean)
138
+ .at(-1);
139
+ if (!finalLine) {
140
+ throw new LniError('Json', 'Missing payment response from LND router endpoint.');
141
+ }
142
+ let wrapped;
143
+ try {
144
+ wrapped = JSON.parse(finalLine);
145
+ }
146
+ catch (error) {
147
+ throw new LniError('Json', `Failed to parse LND pay response: ${error.message}`);
148
+ }
149
+ if (!wrapped.result) {
150
+ throw new LniError('Json', 'Missing result payload in LND pay response.');
151
+ }
152
+ if (wrapped.result.status === 'FAILED') {
153
+ throw new LniError('Api', `Payment failed: ${wrapped.result.failure_reason ?? 'unknown reason'}`);
154
+ }
155
+ if (wrapped.result.status === 'IN_FLIGHT') {
156
+ throw new LniError('Api', 'Payment is still in-flight. Increase timeoutSeconds and retry.');
157
+ }
158
+ if (wrapped.result.status !== 'SUCCEEDED') {
159
+ throw new LniError('Api', `Unknown payment status: ${wrapped.result.status}`);
160
+ }
161
+ return {
162
+ paymentHash: wrapped.result.payment_hash,
163
+ preimage: wrapped.result.payment_preimage,
164
+ feeMsats: parseOptionalNumber(wrapped.result.fee_msat),
165
+ };
166
+ }
167
+ async createOffer(_params) {
168
+ throw new LniError('Api', 'Bolt12 is not implemented for LndNode.');
169
+ }
170
+ async getOffer(_search) {
171
+ throw new LniError('Api', 'Bolt12 is not implemented for LndNode.');
172
+ }
173
+ async listOffers(_search) {
174
+ throw new LniError('Api', 'Bolt12 is not implemented for LndNode.');
175
+ }
176
+ async payOffer(_offer, _amountMsats, _payerNote) {
177
+ throw new LniError('Api', 'Bolt12 is not implemented for LndNode.');
178
+ }
179
+ async lookupInvoice(params) {
180
+ if (!params.paymentHash) {
181
+ throw new LniError('InvalidInput', 'lookupInvoice requires paymentHash for LndNode.');
182
+ }
183
+ const payload = await this.getJson(`/v1/invoice/${params.paymentHash}`);
184
+ return this.mapInvoice(payload);
185
+ }
186
+ async listTransactions(_params) {
187
+ const payload = await this.getJson('/v1/invoices');
188
+ return payload.invoices.map((invoice) => this.mapInvoice(invoice)).sort((a, b) => b.createdAt - a.createdAt);
189
+ }
190
+ async decode(str) {
191
+ return requestText(this.fetchFn, buildUrl(this.config.url, `/v1/payreq/${encodeURIComponent(str)}`), {
192
+ method: 'GET',
193
+ headers: this.headers(),
194
+ timeoutMs: this.timeoutMs,
195
+ });
196
+ }
197
+ async onInvoiceEvents(params, callback) {
198
+ await pollInvoiceEvents({
199
+ params,
200
+ callback,
201
+ lookup: () => this.lookupInvoice({ paymentHash: params.paymentHash, search: params.search }),
202
+ });
203
+ }
204
+ }
205
+ //# sourceMappingURL=lnd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lnd.js","sourceRoot":"","sources":["../../src/nodes/lnd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CreateInvoiceParams, CreateOfferParams, InvoiceEventCallback, LightningNode, ListTransactionsParams, LookupInvoiceParams, NodeInfo, NodeRequestOptions, NwcConfig, Offer, OnInvoiceEventParams, PayInvoiceParams, PayInvoiceResponse, Transaction } from '../types.js';
2
+ export declare class NwcNode implements LightningNode {
3
+ private readonly config;
4
+ private readonly client;
5
+ constructor(config: NwcConfig, _options?: NodeRequestOptions);
6
+ close(): void;
7
+ getInfo(): Promise<NodeInfo>;
8
+ private mapInfoWithBalance;
9
+ createInvoice(params: CreateInvoiceParams): Promise<Transaction>;
10
+ payInvoice(params: PayInvoiceParams): Promise<PayInvoiceResponse>;
11
+ createOffer(_params: CreateOfferParams): Promise<Offer>;
12
+ getOffer(_search?: string): Promise<Offer>;
13
+ listOffers(_search?: string): Promise<Offer[]>;
14
+ payOffer(_offer: string, _amountMsats: number, _payerNote?: string): Promise<PayInvoiceResponse>;
15
+ lookupInvoice(params: LookupInvoiceParams): Promise<Transaction>;
16
+ listTransactions(params: ListTransactionsParams): Promise<Transaction[]>;
17
+ private filterTransactions;
18
+ decode(str: string): Promise<string>;
19
+ onInvoiceEvents(params: OnInvoiceEventParams, callback: InvoiceEventCallback): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=nwc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nwc.d.ts","sourceRoot":"","sources":["../../src/nodes/nwc.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA+CrR,qBAAa,OAAQ,YAAW,aAAa;IAG/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEN,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAE,kBAAuB;IAMjF,KAAK,IAAI,IAAI;IAIP,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;IAoBlC,OAAO,CAAC,kBAAkB;IAgBpB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAehE,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6BjE,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAIvD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAI1C,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAI9C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIhG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBhE,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAa9E,OAAO,CAAC,kBAAkB;IAwBpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpC,eAAe,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAWnG"}