@getalby/lightning-tools 4.0.2 → 4.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.
- package/README.md +52 -25
- package/dist/index.browser.js +3 -2
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.modern.js +1 -1
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/invoice.d.ts +1 -1
- package/dist/invoice.d.ts.map +1 -1
- package/dist/l402/index.d.ts.map +1 -1
- package/dist/lightning-address.d.ts +6 -5
- package/dist/lightning-address.d.ts.map +1 -1
- package/dist/podcasting2/boostagrams.d.ts.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/fiat.d.ts +3 -3
- package/dist/utils/fiat.d.ts.map +1 -1
- package/dist/utils/invoice.d.ts.map +1 -1
- package/dist/utils/keysend.d.ts +1 -1
- package/dist/utils/keysend.d.ts.map +1 -1
- package/dist/utils/lnurl.d.ts +1 -1
- package/dist/utils/lnurl.d.ts.map +1 -1
- package/dist/utils/nostr.d.ts +1 -1
- package/dist/utils/nostr.d.ts.map +1 -1
- package/dist/utils/storage.d.ts.map +1 -1
- package/dist/window.js +1 -1
- package/package.json +19 -3
package/README.md
CHANGED
|
@@ -11,11 +11,15 @@ An npm package that provides useful and common tools and helpers to build lightn
|
|
|
11
11
|
```
|
|
12
12
|
npm install @getalby/lightning-tools
|
|
13
13
|
```
|
|
14
|
+
|
|
14
15
|
or
|
|
16
|
+
|
|
15
17
|
```
|
|
16
18
|
yarn add @getalby/lightning-tools
|
|
17
19
|
```
|
|
20
|
+
|
|
18
21
|
or for use without any build tools:
|
|
22
|
+
|
|
19
23
|
```
|
|
20
24
|
// lightning-tools now available at window.lightningTools
|
|
21
25
|
<script src="https://cdn.jsdelivr.net/npm/@getalby/lightning-tools@latest/dist/index.browser.js"></script>
|
|
@@ -41,7 +45,6 @@ await ln.fetch();
|
|
|
41
45
|
console.log(ln.lnurlpData); // returns a [LNURLPayResponse](https://github.com/getAlby/js-lightning-tools/blob/master/src/types.ts#L1-L15)
|
|
42
46
|
// get the keysend data:
|
|
43
47
|
console.log(ln.keysendData);
|
|
44
|
-
|
|
45
48
|
```
|
|
46
49
|
|
|
47
50
|
#### Get an invoice:
|
|
@@ -54,7 +57,7 @@ const ln = new LightningAddress("hello@getalby.com");
|
|
|
54
57
|
await ln.fetch();
|
|
55
58
|
// request an invoice for 1000 satoshis
|
|
56
59
|
// this returns a new `Invoice` class that can also be used to validate the payment
|
|
57
|
-
const invoice = await ln.requestInvoice({satoshi: 1000});
|
|
60
|
+
const invoice = await ln.requestInvoice({ satoshi: 1000 });
|
|
58
61
|
|
|
59
62
|
console.log(invoice.paymentRequest); // print the payment request
|
|
60
63
|
console.log(invoice.paymentHash); // print the payment hash
|
|
@@ -67,7 +70,7 @@ import { LightningAddress } from "@getalby/lightning-tools";
|
|
|
67
70
|
const ln = new LightningAddress("hello@getalby.com");
|
|
68
71
|
await ln.fetch();
|
|
69
72
|
|
|
70
|
-
const invoice = await ln.requestInvoice({satoshi: 1000});
|
|
73
|
+
const invoice = await ln.requestInvoice({ satoshi: 1000 });
|
|
71
74
|
|
|
72
75
|
// if the LNURL providers supports LNURL-verify:
|
|
73
76
|
const paid = await invoice.verifyPayment(); // returns true of false
|
|
@@ -80,12 +83,11 @@ await window.webln.enable();
|
|
|
80
83
|
const response = await window.webln.sendPayment(invoice.paymentRequest);
|
|
81
84
|
const paid = invoice.validatePreimage(response.preimage); // returns true or false
|
|
82
85
|
if (paid) {
|
|
83
|
-
console.log(
|
|
86
|
+
console.log("paid");
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
// or use the convenenice method:
|
|
87
90
|
await invoice.isPaid();
|
|
88
|
-
|
|
89
91
|
```
|
|
90
92
|
|
|
91
93
|
It is also possible to manually initialize the `Invoice`
|
|
@@ -93,7 +95,7 @@ It is also possible to manually initialize the `Invoice`
|
|
|
93
95
|
```js
|
|
94
96
|
const { Invoice } = require("alby-tools");
|
|
95
97
|
|
|
96
|
-
const invoice = new Invoice({
|
|
98
|
+
const invoice = new Invoice({ pr: pr, preimage: preimage });
|
|
97
99
|
await invoice.isPaid();
|
|
98
100
|
```
|
|
99
101
|
|
|
@@ -118,7 +120,7 @@ const boost = {
|
|
|
118
120
|
ts: 2121,
|
|
119
121
|
name: "Satoshi",
|
|
120
122
|
sender_name: "Alby",
|
|
121
|
-
}
|
|
123
|
+
};
|
|
122
124
|
await ln.boost(boost);
|
|
123
125
|
```
|
|
124
126
|
|
|
@@ -137,7 +139,7 @@ const response = await ln.zap({
|
|
|
137
139
|
satoshi: 1000,
|
|
138
140
|
comment: "Awesome post",
|
|
139
141
|
relays: ["wss://relay.damus.io"],
|
|
140
|
-
e: "44e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"
|
|
142
|
+
e: "44e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
|
141
143
|
});
|
|
142
144
|
console.log(response.preimage); // print the preimage
|
|
143
145
|
```
|
|
@@ -160,12 +162,12 @@ This library includes a `fetchWithL402` function to consume L402 protected resou
|
|
|
160
162
|
|
|
161
163
|
#### fetchWithL402(url: string, fetchArgs, options)
|
|
162
164
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
165
|
+
- url: the L402 protected URL
|
|
166
|
+
- fetchArgs: arguments are passed to the underlaying `fetch()` function used to do the HTTP request
|
|
167
|
+
- options:
|
|
168
|
+
- webln: the webln object used to call `sendPayment()` defaults to globalThis.webln
|
|
169
|
+
- store: a key/value store object to persiste the l402 for each URL. The store must implement a `getItem()`/`setItem()` function as the browser's localStorage. By default a memory storage is used.
|
|
170
|
+
- headerKey: defaults to L402 but if you need to consume an old LSAT API set this to LSAT
|
|
169
171
|
|
|
170
172
|
##### Examples
|
|
171
173
|
|
|
@@ -174,7 +176,13 @@ import { fetchWithL402 } from "@getalby/lightning-tools";
|
|
|
174
176
|
|
|
175
177
|
// this will fetch the resouce and pay the invoice with window.webln.
|
|
176
178
|
// the tokens/preimage data will be stored in the browser's localStorage and used for any following request
|
|
177
|
-
await fetchWithL402(
|
|
179
|
+
await fetchWithL402(
|
|
180
|
+
"https://lsat-weather-api.getalby.repl.co/kigali",
|
|
181
|
+
{},
|
|
182
|
+
{ store: window.localStorage },
|
|
183
|
+
)
|
|
184
|
+
.then((res) => res.json())
|
|
185
|
+
.then(console.log);
|
|
178
186
|
```
|
|
179
187
|
|
|
180
188
|
```js
|
|
@@ -182,29 +190,45 @@ import { fetchWithL402 } from "@getalby/lightning-tools";
|
|
|
182
190
|
import { webln } from "alby-js-sdk";
|
|
183
191
|
|
|
184
192
|
// use a NWC WebLN provide to do the payments
|
|
185
|
-
const nwc = new webln.NostrWebLNProvider({
|
|
193
|
+
const nwc = new webln.NostrWebLNProvider({
|
|
194
|
+
nostrWalletConnectUrl: loadNWCUrl(),
|
|
195
|
+
});
|
|
186
196
|
|
|
187
197
|
// this will fetch the resouce and pay the invoice with a NWC webln object
|
|
188
|
-
await fetchWithL402(
|
|
198
|
+
await fetchWithL402(
|
|
199
|
+
"https://lsat-weather-api.getalby.repl.co/kigali",
|
|
200
|
+
{},
|
|
201
|
+
{ webln: nwc },
|
|
202
|
+
)
|
|
203
|
+
.then((res) => res.json())
|
|
204
|
+
.then(console.log);
|
|
189
205
|
```
|
|
190
206
|
|
|
191
207
|
```js
|
|
192
208
|
import { l402 } from "@getalby/lightning-tools";
|
|
193
209
|
|
|
194
210
|
// do not store the tokens
|
|
195
|
-
await l402.fetchWithL402(
|
|
211
|
+
await l402.fetchWithL402(
|
|
212
|
+
"https://lsat-weather-api.getalby.repl.co/kigali",
|
|
213
|
+
{},
|
|
214
|
+
{ store: new l402.storage.NoStorage() },
|
|
215
|
+
);
|
|
196
216
|
```
|
|
197
217
|
|
|
198
218
|
### 💵 Fiat conversions
|
|
219
|
+
|
|
199
220
|
Helpers to convert sats values to fiat and fiat values to sats.
|
|
200
221
|
|
|
201
222
|
##### getFiatValue(satoshi: number, currency: string): number
|
|
223
|
+
|
|
202
224
|
Returns the fiat value for a specified currrency of a satoshi amount
|
|
203
225
|
|
|
204
226
|
##### getSatoshiValue(amount: number, currency: string): number
|
|
227
|
+
|
|
205
228
|
Returns the satoshi value for a specified amount (in the smallest denomination) and currency
|
|
206
229
|
|
|
207
230
|
##### getFormattedFiatValue(satoshi: number, currency: string, locale: string): string
|
|
231
|
+
|
|
208
232
|
Like `getFiatValue` but returns a formatted string for a given locale using JavaScript's `toLocaleString`
|
|
209
233
|
|
|
210
234
|
#### Examples
|
|
@@ -212,10 +236,11 @@ Like `getFiatValue` but returns a formatted string for a given locale using Java
|
|
|
212
236
|
```js
|
|
213
237
|
await getFiatValue(satoshi: 2100, currency: 'eur');
|
|
214
238
|
await getSatoshiValue(amount: 100, currency: 'eur'); // for 1 EUR
|
|
215
|
-
await getFormattedFiatValue(
|
|
239
|
+
await getFormattedFiatValue(satoshi: 2100, currency: 'usd', locale: 'en')
|
|
216
240
|
```
|
|
217
241
|
|
|
218
242
|
### 🤖 Lightning Address Proxy
|
|
243
|
+
|
|
219
244
|
This library uses a [proxy](https://github.com/getAlby/lightning-address-details-proxy) to simplify requests to lightning providers.
|
|
220
245
|
|
|
221
246
|
- Many ln addresses don't support CORS, which means fetching the data directly in a browser environment will not always work.
|
|
@@ -228,15 +253,17 @@ const lightningAddress = new LightningAddress("hello@getalby.com", {proxy: false
|
|
|
228
253
|
```
|
|
229
254
|
|
|
230
255
|
## fetch() dependency
|
|
256
|
+
|
|
231
257
|
This library relies on a global fetch object which will work in browsers and node v18.x or newer. In old version yoi can manually install a global fetch option or polyfill if needed.
|
|
232
258
|
|
|
233
259
|
For example:
|
|
260
|
+
|
|
234
261
|
```js
|
|
235
262
|
import fetch from "cross-fetch"; // or "@inrupt/universal-fetch"
|
|
236
263
|
globalThis.fetch = fetch;
|
|
237
264
|
|
|
238
265
|
// or as a polyfill:
|
|
239
|
-
import
|
|
266
|
+
import "cross-fetch/polyfill";
|
|
240
267
|
```
|
|
241
268
|
|
|
242
269
|
## 🛠 Development
|
|
@@ -250,11 +277,11 @@ yarn run build
|
|
|
250
277
|
|
|
251
278
|
We are happy to help, please contact us or create an issue.
|
|
252
279
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
280
|
+
- [Twitter: @getAlby](https://twitter.com/getAlby)
|
|
281
|
+
- [Telegram group](https://t.me/getAlby)
|
|
282
|
+
- support at getalby.com
|
|
283
|
+
- [bitcoin.design](https://bitcoin.design/) Discord community (find us on the #alby channel)
|
|
284
|
+
- Read the [Alby developer guide](https://guides.getalby.com/overall-guide/alby-for-developers/getting-started) to better understand how Alby packages and APIs can be used to power your app.
|
|
258
285
|
|
|
259
286
|
## License
|
|
260
287
|
|
package/dist/index.browser.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
|
2
|
-
var e=require("crypto-js/enc-hex.js"),t=require("crypto-js/sha256.js"),r=require("light-bolt11-decoder");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/n(e),a=/*#__PURE__*/n(t),i=/*#__PURE__*/function(){function e(e){this.storage=void 0,this.storage=e||{}}var t=e.prototype;return t.getItem=function(e){return this.storage[e]},t.setItem=function(e,t){this.storage[e]=t},e}(),s={__proto__:null,MemoryStorage:i,NoStorage:/*#__PURE__*/function(){function e(e){}var t=e.prototype;return t.getItem=function(e){return null},t.setItem=function(e,t){},e}(),default:i},u=new i,c=function(e,t,r){try{var n,o=function(r){return n?r:(t.headers["Accept-Authenticate"]=a,Promise.resolve(fetch(e,t)).then(function(r){var n=r.headers.get("www-authenticate");if(!n)return r;var o,u=(o=n.replace("L402","").replace("LSAT","").split(",").map(function(e){var t=e.split("=").map(function(e){return e.trim()});return[t[0],t[1].match(/"?([^"]*)"?/)[1]]}),Object.fromEntries(o)),c=u.token||u.macaroon,l=u.invoice;return Promise.resolve(i.enable()).then(function(){return Promise.resolve(i.sendPayment(l)).then(function(r){return s.setItem(e,JSON.stringify({token:c,preimage:r.preimage})),t.headers.Authorization=a+" "+c+":"+r.preimage,Promise.resolve(fetch(e,t))})})}))};r||(r={});var a=r.headerKey||"L402",i=r.webln||globalThis.webln;if(!i)throw new Error("WebLN is missing");var s=r.store||u;t||(t={}),t.cache="no-store",t.mode="cors",t.headers||(t.headers={});var c=s.getItem(e),l=function(){if(c){var r=JSON.parse(c);return t.headers.Authorization=a+" "+r.token+":"+r.preimage,Promise.resolve(fetch(e,t)).then(function(e){return n=1,e})}}();return Promise.resolve(l&&l.then?l.then(o):o(l))}catch(e){return Promise.reject(e)}},l={__proto__:null,storage:s,fetchWithL402:c,default:c},h=function(e,t){try{var r=e.boost,n=e.amount;t||(t={});var o=t.webln||globalThis.webln;n||(n=Math.floor(r.value_msat/1e3));var a={destination:e.destination,amount:n,customRecords:{7629169:JSON.stringify(r)}};return e.customKey&&e.customValue&&(a.customRecords[e.customKey]=e.customValue),Promise.resolve(o.enable()).then(function(){return Promise.resolve(o.keysend(a))})}catch(e){return Promise.reject(e)}},m={__proto__:null,boost:h,default:h};function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},f.apply(this,arguments)}var v=/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/,p=function(e){return!!e&&v.test(e)},d=function(e){var t=e.amount,r=e.min,n=e.max,o=t>0&&t>=r&&t<=n;return o&&r===n?t===r:o},y=/*#__PURE__*/function(){function e(e){var t,n;this.paymentRequest=void 0,this.paymentHash=void 0,this.preimage=void 0,this.verify=void 0,this.paymentRequest=e.pr,this.paymentHash=function(e){if(!e)return null;try{var t=r.decode(e);if(!t||!t.sections)return null;var n=t.sections.find(function(e){return"payment_hash"===e.name});return n&&n.value?n.value.toString():null}catch(e){return null}}(this.paymentRequest),this.verify=null!=(t=e.verify)?t:null,this.preimage=null!=(n=e.preimage)?n:null}var t=e.prototype;return t.isPaid=function(){try{var e=this;if(e.preimage)return Promise.resolve(e.validatePreimage(e.preimage));if(e.verify)return Promise.resolve(e.verifyPayment());throw new Error("Could not verify payment")}catch(e){return Promise.reject(e)}},t.validatePreimage=function(e){if(!e||!this.paymentHash)return!1;try{var t=a.default(o.default.parse(e)).toString(o.default);return this.paymentHash===t}catch(e){return!1}},t.verifyPayment=function(){try{var e=this;if(!e.verify)throw new Error("LNURL verify not available");return Promise.resolve(fetch(e.verify)).then(function(t){return Promise.resolve(t.json()).then(function(t){return t.preimage&&(e.preimage=t.preimage),t.settled})})}catch(e){return Promise.reject(e)}},e}(),w=function(e,t){var r=e.satoshi,n=e.comment,o=e.p,a=e.e,i=e.relays;void 0===t&&(t={});try{var s=t.nostr||globalThis.nostr;if(!s)throw new Error("nostr option or window.nostr is not available");var u=[["relays"].concat(i),["amount",r.toString()]];return o&&u.push(["p",o]),a&&u.push(["e",a]),Promise.resolve(s.getPublicKey()).then(function(e){var t={pubkey:e,created_at:Math.floor(Date.now()/1e3),kind:9734,tags:u,content:null!=n?n:""};return t.id=P(t),Promise.resolve(s.signEvent(t))})}catch(a){return Promise.reject(a)}};function g(e){if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if(!Array.isArray(e.tags))return!1;for(var t=0;t<e.tags.length;t++){var r=e.tags[t];if(!Array.isArray(r))return!1;for(var n=0;n<r.length;n++)if("object"==typeof r[n])return!1}return!0}function b(e){if(!g(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function P(e){return a.default(b(e)).toString(o.default)}function k(e,t){var r,n,o,a;return t&&e&&(n=(r=null==(o=e.names)?void 0:o[t])?null==(a=e.relays)?void 0:a[r]:void 0),[e,r,n]}var j={__proto__:null,generateZapEvent:w,validateEvent:g,serializeEvent:b,getEventHash:P,parseNostrResponse:k},x=/^((?:[^<>()\[\]\\.,;:\s@"]+(?:\.[^<>()\[\]\\.,;:\s@"]+)*)|(?:".+"))@((?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,D=/*#__PURE__*/function(){function e(e,t){this.address=void 0,this.options=void 0,this.username=void 0,this.domain=void 0,this.pubkey=void 0,this.lnurlpData=void 0,this.keysendData=void 0,this.nostrData=void 0,this.nostrPubkey=void 0,this.nostrRelays=void 0,this.webln=void 0,this.address=e,this.options={proxy:"https://lnaddressproxy.getalby.com",webln:globalThis.webln},this.options=Object.assign(this.options,t),this.parse(),this.webln=this.options.webln}var t=e.prototype;return t.parse=function(){var e=x.exec(this.address.toLowerCase());e&&(this.username=e[1],this.domain=e[2])},t.fetch=function(){try{var e=this;return Promise.resolve(e.options.proxy?e.fetchWithProxy():e.fetchWithoutProxy())}catch(e){return Promise.reject(e)}},t.fetchWithProxy=function(){try{var e=this;return Promise.resolve(fetch(e.options.proxy+"/lightning-address-details?"+new URLSearchParams({ln:e.address}).toString())).then(function(t){return Promise.resolve(t.json()).then(function(t){e.parseResponse(t.lnurlp,t.keysend,t.nostr)})})}catch(e){return Promise.reject(e)}},t.fetchWithoutProxy=function(){try{var e=this;return e.domain&&e.username?Promise.resolve(fetch(e.lnurlpUrl())).then(function(t){return Promise.resolve(fetch(e.keysendUrl())).then(function(r){return Promise.resolve(fetch(e.nostrUrl())).then(function(n){function o(){function t(){function t(){e.parseResponse(a,o,r)}var r,i=function(){if(n.ok)return Promise.resolve(n.json()).then(function(e){r=e})}();return i&&i.then?i.then(t):t()}var o,i=function(){if(r.ok)return Promise.resolve(r.json()).then(function(e){o=e})}();return i&&i.then?i.then(t):t()}var a,i=function(){if(t.ok)return Promise.resolve(t.json()).then(function(e){a=e})}();return i&&i.then?i.then(o):o()})})}):Promise.resolve()}catch(e){return Promise.reject(e)}},t.lnurlpUrl=function(){return"https://"+this.domain+"/.well-known/lnurlp/"+this.username},t.keysendUrl=function(){return"https://"+this.domain+"/.well-known/keysend/"+this.username},t.nostrUrl=function(){return"https://"+this.domain+"/.well-known/nostr.json?name="+this.username},t.generateInvoice=function(e){try{var t,r=function(e){var r=t&&t.pr&&t.pr.toString();if(!r)throw new Error("Invalid pay service invoice");var n={pr:r};return t&&t.verify&&(n.verify=t.verify.toString()),new y(n)},n=this,o=function(){if(n.options.proxy)return Promise.resolve(fetch(n.options.proxy+"/generate-invoice?"+new URLSearchParams(f({ln:n.address},e)).toString())).then(function(e){return Promise.resolve(e.json()).then(function(e){t=e.invoice})});if(!n.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!n.lnurlpData.callback||!p(n.lnurlpData.callback))throw new Error("Valid callback does not exist in lnurlpData");var r=new URL(n.lnurlpData.callback);return r.search=new URLSearchParams(e).toString(),Promise.resolve(fetch(r)).then(function(e){return Promise.resolve(e.json()).then(function(e){t=e})})}();return Promise.resolve(o&&o.then?o.then(r):r())}catch(e){return Promise.reject(e)}},t.requestInvoice=function(e){try{var t=this;if(!t.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");var r=1e3*e.satoshi,n=t.lnurlpData,o=n.commentAllowed;if(!d({amount:r,min:n.min,max:n.max}))throw new Error("Invalid amount");if(e.comment&&o&&o>0&&e.comment.length>o)throw new Error("The comment length must be "+o+" characters or fewer");var a={amount:r.toString()};return e.comment&&(a.comment=e.comment),e.payerdata&&(a.payerdata=JSON.stringify(e.payerdata)),Promise.resolve(t.generateInvoice(a))}catch(e){return Promise.reject(e)}},t.boost=function(e,t){void 0===t&&(t=0);try{var r=this;if(!r.keysendData)throw new Error("No keysendData available. Please call fetch() first.");var n=r.keysendData;return Promise.resolve(h({destination:n.destination,customKey:n.customKey,customValue:n.customValue,amount:t,boost:e},{webln:r.webln}))}catch(e){return Promise.reject(e)}},t.zapInvoice=function(e,t){var r=e.satoshi,n=e.comment,o=e.relays,a=e.e;void 0===t&&(t={});try{var i=this;if(!i.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!i.nostrPubkey)throw new Error("Nostr Pubkey is missing");var s=i.nostrPubkey,u=1e3*r,c=i.lnurlpData,l=c.allowsNostr;if(!d({amount:u,min:c.min,max:c.max}))throw new Error("Invalid amount");if(!l)throw new Error("Your provider does not support zaps");return Promise.resolve(w({satoshi:u,comment:n,p:s,e:a,relays:o},t)).then(function(e){var t={amount:u.toString(),nostr:JSON.stringify(e)};return Promise.resolve(i.generateInvoice(t))})}catch(a){return Promise.reject(a)}},t.zap=function(e,t){void 0===t&&(t={});try{var r=this,n=r.zapInvoice(e,t);if(!r.webln)throw new Error("WebLN not available");return Promise.resolve(r.webln.enable()).then(function(){var e=r.webln,t=e.sendPayment;return Promise.resolve(n).then(function(r){return t.call(e,r.paymentRequest)})})}catch(e){return Promise.reject(e)}},t.parseResponse=function(e,t,r){if(e&&(this.lnurlpData=function(e){if("payRequest"!==e.tag)throw new Error("Invalid pay service params");var t=(e.callback+"").trim();if(!p(t))throw new Error("Callback must be a valid url");var r,n,i=Math.ceil(Number(e.minSendable||0)),s=Math.floor(Number(e.maxSendable));if(!i||!s||i>s)throw new Error("Invalid pay service params");try{r=JSON.parse(e.metadata+""),n=a.default(e.metadata+"").toString(o.default)}catch(e){r=[],n=a.default("[]").toString(o.default)}for(var u="",c="",l="",h=0;h<r.length;h++){var m=r[h],f=m[0],v=m[1];switch(f){case"text/plain":c=v;break;case"text/identifier":l=v;break;case"image/png;base64":case"image/jpeg;base64":u="data:"+f+","+v}}var d,y=e.payerData;try{d=new URL(t).hostname}catch(e){}return{callback:t,fixed:i===s,min:i,max:s,domain:d,metadata:r,metadataHash:n,identifier:l,description:c,image:u,payerData:y,commentAllowed:Number(e.commentAllowed)||0,rawData:e,allowsNostr:e.allowsNostr||!1}}(e)),t&&(this.keysendData=function(e){if("keysend"!==e.tag)throw new Error("Invalid keysend params");if("OK"!==e.status)throw new Error("Keysend status not OK");if(!("customKey"in e.customData[0])||"696969"!=e.customData[0].customKey)throw new Error("Unable to find customKey");if(!("customValue"in e.customData[0])||!e.customData[0].customValue)throw new Error("Unable to find customValue");if(!e.pubkey)throw new Error("Pubkey does not exist");return{destination:e.pubkey,customKey:e.customData[0].customKey,customValue:e.customData[0].customValue}}(t)),r){var n=k(r,this.username);this.nostrData=n[0],this.nostrPubkey=n[1],this.nostrRelays=n[2]}},e}(),E=function(e){try{var t="https://getalby.com/api/rates/"+e.toLowerCase()+".json";return Promise.resolve(fetch(t)).then(function(e){return Promise.resolve(e.json()).then(function(e){return e.rate_float/1e8})})}catch(e){return Promise.reject(e)}},S=function(e){var t=e.satoshi;return Promise.resolve(E(e.currency)).then(function(e){return Number(t)*e})},_={__proto__:null,getFiatBtcRate:E,getFiatValue:S,getSatoshiValue:function(e){var t=e.amount;return Promise.resolve(E(e.currency)).then(function(e){return Math.floor(Number(t)/e)})},getFormattedFiatValue:function(e){var t=e.currency,r=e.locale;return r||(r="en"),Promise.resolve(S({satoshi:e.satoshi,currency:t})).then(function(e){return e.toLocaleString(r,{style:"currency",currency:t})})}};exports.Invoice=y,exports.LightningAddress=D,exports.boostagrams=m,exports.fetchWithL402=c,exports.fiat=_,exports.l402=l,exports.nostr=j,exports.sendBoostagram=h;
|
|
2
|
+
var e=require("crypto-js/enc-hex.js"),t=require("crypto-js/sha256.js"),r=require("light-bolt11-decoder");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/n(e),a=/*#__PURE__*/n(t),i=/*#__PURE__*/function(){function e(e){this.storage=void 0,this.storage=e||{}}var t=e.prototype;return t.getItem=function(e){return this.storage[e]},t.setItem=function(e,t){this.storage[e]=t},e}(),s={__proto__:null,MemoryStorage:i,NoStorage:/*#__PURE__*/function(){function e(e){}var t=e.prototype;return t.getItem=function(e){return null},t.setItem=function(e,t){},e}(),default:i},u=new i,c=function(e,t,r){try{var n,o=function(r){return n?r:(t.headers["Accept-Authenticate"]=a,Promise.resolve(fetch(e,t)).then(function(r){var n=r.headers.get("www-authenticate");if(!n)return r;var o,u=(o=n.replace("L402","").replace("LSAT","").split(",").map(function(e){var t=e.split("=").map(function(e){return e.trim()});return[t[0],t[1].match(/"?([^"]*)"?/)[1]]}),Object.fromEntries(o)),c=u.token||u.macaroon,l=u.invoice;return Promise.resolve(i.enable()).then(function(){return Promise.resolve(i.sendPayment(l)).then(function(r){return s.setItem(e,JSON.stringify({token:c,preimage:r.preimage})),t.headers.Authorization=a+" "+c+":"+r.preimage,Promise.resolve(fetch(e,t))})})}))};r||(r={});var a=r.headerKey||"L402",i=r.webln||globalThis.webln;if(!i)throw new Error("WebLN is missing");var s=r.store||u;t||(t={}),t.cache="no-store",t.mode="cors",t.headers||(t.headers={});var c=s.getItem(e),l=function(){if(c){var r=JSON.parse(c);return t.headers.Authorization=a+" "+r.token+":"+r.preimage,Promise.resolve(fetch(e,t)).then(function(e){return n=1,e})}}();return Promise.resolve(l&&l.then?l.then(o):o(l))}catch(e){return Promise.reject(e)}},l={__proto__:null,storage:s,fetchWithL402:c,default:c},h=function(e,t){try{var r=e.boost,n=e.amount;t||(t={});var o=t.webln||globalThis.webln;n||(n=Math.floor(r.value_msat/1e3));var a={destination:e.destination,amount:n,customRecords:{7629169:JSON.stringify(r)}};return e.customKey&&e.customValue&&(a.customRecords[e.customKey]=e.customValue),Promise.resolve(o.enable()).then(function(){return Promise.resolve(o.keysend(a))})}catch(e){return Promise.reject(e)}},m={__proto__:null,boost:h,default:h};function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},f.apply(this,arguments)}var v=/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/,p=function(e){return!!e&&v.test(e)},d=function(e){var t=e.amount;return t>0&&t>=e.min&&t<=e.max},y=/*#__PURE__*/function(){function e(e){var t,n;this.paymentRequest=void 0,this.paymentHash=void 0,this.preimage=void 0,this.verify=void 0,this.paymentRequest=e.pr,this.paymentHash=function(e){if(!e)return null;try{var t=r.decode(e);if(!t||!t.sections)return null;var n=t.sections.find(function(e){return"payment_hash"===e.name});return n&&n.value?n.value.toString():null}catch(e){return null}}(this.paymentRequest),this.verify=null!=(t=e.verify)?t:null,this.preimage=null!=(n=e.preimage)?n:null}var t=e.prototype;return t.isPaid=function(){try{var e=this;if(e.preimage)return Promise.resolve(e.validatePreimage(e.preimage));if(e.verify)return Promise.resolve(e.verifyPayment());throw new Error("Could not verify payment")}catch(e){return Promise.reject(e)}},t.validatePreimage=function(e){if(!e||!this.paymentHash)return!1;try{var t=a.default(o.default.parse(e)).toString(o.default);return this.paymentHash===t}catch(e){return!1}},t.verifyPayment=function(){try{var e=this;if(!e.verify)throw new Error("LNURL verify not available");return Promise.resolve(fetch(e.verify)).then(function(t){return Promise.resolve(t.json()).then(function(t){return t.preimage&&(e.preimage=t.preimage),t.settled})})}catch(e){return Promise.reject(e)}},e}(),w=function(e,t){var r=e.satoshi,n=e.comment,o=e.p,a=e.e,i=e.relays;void 0===t&&(t={});try{var s=t.nostr||globalThis.nostr;if(!s)throw new Error("nostr option or window.nostr is not available");var u=[["relays"].concat(i),["amount",r.toString()]];return o&&u.push(["p",o]),a&&u.push(["e",a]),Promise.resolve(s.getPublicKey()).then(function(e){var t={pubkey:e,created_at:Math.floor(Date.now()/1e3),kind:9734,tags:u,content:null!=n?n:""};return t.id=P(t),Promise.resolve(s.signEvent(t))})}catch(a){return Promise.reject(a)}};function g(e){if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if(!Array.isArray(e.tags))return!1;for(var t=0;t<e.tags.length;t++){var r=e.tags[t];if(!Array.isArray(r))return!1;for(var n=0;n<r.length;n++)if("object"==typeof r[n])return!1}return!0}function b(e){if(!g(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function P(e){return a.default(b(e)).toString(o.default)}function k(e,t){var r,n,o,a;return t&&e&&(n=(r=null==(o=e.names)?void 0:o[t])?null==(a=e.relays)?void 0:a[r]:void 0),[e,r,n]}var j={__proto__:null,generateZapEvent:w,validateEvent:g,serializeEvent:b,getEventHash:P,parseNostrResponse:k},E=/^((?:[^<>()\[\]\\.,;:\s@"]+(?:\.[^<>()\[\]\\.,;:\s@"]+)*)|(?:".+"))@((?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,x=/*#__PURE__*/function(){function e(e,t){this.address=void 0,this.options=void 0,this.username=void 0,this.domain=void 0,this.pubkey=void 0,this.lnurlpData=void 0,this.keysendData=void 0,this.nostrData=void 0,this.nostrPubkey=void 0,this.nostrRelays=void 0,this.webln=void 0,this.address=e,this.options={proxy:"https://api.getalby.com/lnurl"},this.options=Object.assign(this.options,t),this.parse(),this.webln=this.options.webln}var t=e.prototype;return t.parse=function(){var e=E.exec(this.address.toLowerCase());e&&(this.username=e[1],this.domain=e[2])},t.getWebLN=function(){return this.webln||globalThis.webln},t.fetch=function(){try{var e=this;return Promise.resolve(e.options.proxy?e.fetchWithProxy():e.fetchWithoutProxy())}catch(e){return Promise.reject(e)}},t.fetchWithProxy=function(){try{var e=this;return Promise.resolve(fetch(e.options.proxy+"/lightning-address-details?"+new URLSearchParams({ln:e.address}).toString())).then(function(t){return Promise.resolve(t.json()).then(function(t){e.parseResponse(t.lnurlp,t.keysend,t.nostr)})})}catch(e){return Promise.reject(e)}},t.fetchWithoutProxy=function(){try{var e=this;return e.domain&&e.username?Promise.resolve(fetch(e.lnurlpUrl())).then(function(t){return Promise.resolve(fetch(e.keysendUrl())).then(function(r){return Promise.resolve(fetch(e.nostrUrl())).then(function(n){function o(){function t(){function t(){e.parseResponse(a,o,r)}var r,i=function(){if(n.ok)return Promise.resolve(n.json()).then(function(e){r=e})}();return i&&i.then?i.then(t):t()}var o,i=function(){if(r.ok)return Promise.resolve(r.json()).then(function(e){o=e})}();return i&&i.then?i.then(t):t()}var a,i=function(){if(t.ok)return Promise.resolve(t.json()).then(function(e){a=e})}();return i&&i.then?i.then(o):o()})})}):Promise.resolve()}catch(e){return Promise.reject(e)}},t.lnurlpUrl=function(){return"https://"+this.domain+"/.well-known/lnurlp/"+this.username},t.keysendUrl=function(){return"https://"+this.domain+"/.well-known/keysend/"+this.username},t.nostrUrl=function(){return"https://"+this.domain+"/.well-known/nostr.json?name="+this.username},t.generateInvoice=function(e){try{var t,r=function(e){var r=t&&t.pr&&t.pr.toString();if(!r)throw new Error("Invalid pay service invoice");var n={pr:r};return t&&t.verify&&(n.verify=t.verify.toString()),new y(n)},n=this,o=function(){if(n.options.proxy)return Promise.resolve(fetch(n.options.proxy+"/generate-invoice?"+new URLSearchParams(f({ln:n.address},e)).toString())).then(function(e){return Promise.resolve(e.json()).then(function(e){t=e.invoice})});if(!n.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!n.lnurlpData.callback||!p(n.lnurlpData.callback))throw new Error("Valid callback does not exist in lnurlpData");var r=new URL(n.lnurlpData.callback);return r.search=new URLSearchParams(e).toString(),Promise.resolve(fetch(r)).then(function(e){return Promise.resolve(e.json()).then(function(e){t=e})})}();return Promise.resolve(o&&o.then?o.then(r):r())}catch(e){return Promise.reject(e)}},t.requestInvoice=function(e){try{var t=this;if(!t.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");var r=1e3*e.satoshi,n=t.lnurlpData,o=n.commentAllowed;if(!d({amount:r,min:n.min,max:n.max}))throw new Error("Invalid amount");if(e.comment&&o&&o>0&&e.comment.length>o)throw new Error("The comment length must be "+o+" characters or fewer");var a={amount:r.toString()};return e.comment&&(a.comment=e.comment),e.payerdata&&(a.payerdata=JSON.stringify(e.payerdata)),Promise.resolve(t.generateInvoice(a))}catch(e){return Promise.reject(e)}},t.boost=function(e,t){void 0===t&&(t=0);try{var r=this;if(!r.keysendData)throw new Error("No keysendData available. Please call fetch() first.");var n=r.keysendData,o=n.destination,a=n.customKey,i=n.customValue,s=r.getWebLN();if(!s)throw new Error("WebLN not available");return Promise.resolve(h({destination:o,customKey:a,customValue:i,amount:t,boost:e},{webln:s}))}catch(e){return Promise.reject(e)}},t.zapInvoice=function(e,t){var r=e.satoshi,n=e.comment,o=e.relays,a=e.e;void 0===t&&(t={});try{var i=this;if(!i.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!i.nostrPubkey)throw new Error("Nostr Pubkey is missing");var s=i.nostrPubkey,u=1e3*r,c=i.lnurlpData,l=c.allowsNostr;if(!d({amount:u,min:c.min,max:c.max}))throw new Error("Invalid amount");if(!l)throw new Error("Your provider does not support zaps");return Promise.resolve(w({satoshi:u,comment:n,p:s,e:a,relays:o},t)).then(function(e){var t={amount:u.toString(),nostr:JSON.stringify(e)};return Promise.resolve(i.generateInvoice(t))})}catch(a){return Promise.reject(a)}},t.zap=function(e,t){void 0===t&&(t={});try{var r=this.zapInvoice(e,t),n=this.getWebLN();if(!n)throw new Error("WebLN not available");return Promise.resolve(n.enable()).then(function(){var e=n.sendPayment;return Promise.resolve(r).then(function(t){return e.call(n,t.paymentRequest)})})}catch(e){return Promise.reject(e)}},t.parseResponse=function(e,t,r){if(e&&(this.lnurlpData=function(e){if("payRequest"!==e.tag)throw new Error("Invalid pay service params");var t=(e.callback+"").trim();if(!p(t))throw new Error("Callback must be a valid url");var r,n,i=Math.ceil(Number(e.minSendable||0)),s=Math.floor(Number(e.maxSendable));if(!i||!s||i>s)throw new Error("Invalid pay service params");try{r=JSON.parse(e.metadata+""),n=a.default(e.metadata+"").toString(o.default)}catch(e){r=[],n=a.default("[]").toString(o.default)}for(var u="",c="",l="",h=0;h<r.length;h++){var m=r[h],f=m[0],v=m[1];switch(f){case"text/plain":c=v;break;case"text/identifier":l=v;break;case"image/png;base64":case"image/jpeg;base64":u="data:"+f+","+v}}var d,y=e.payerData;try{d=new URL(t).hostname}catch(e){}return{callback:t,fixed:i===s,min:i,max:s,domain:d,metadata:r,metadataHash:n,identifier:l,description:c,image:u,payerData:y,commentAllowed:Number(e.commentAllowed)||0,rawData:e,allowsNostr:e.allowsNostr||!1}}(e)),t&&(this.keysendData=function(e){if("keysend"!==e.tag)throw new Error("Invalid keysend params");if("OK"!==e.status)throw new Error("Keysend status not OK");if(!("customKey"in e.customData[0])||"696969"!=e.customData[0].customKey)throw new Error("Unable to find customKey");if(!("customValue"in e.customData[0])||!e.customData[0].customValue)throw new Error("Unable to find customValue");if(!e.pubkey)throw new Error("Pubkey does not exist");return{destination:e.pubkey,customKey:e.customData[0].customKey,customValue:e.customData[0].customValue}}(t)),r){var n=k(r,this.username);this.nostrData=n[0],this.nostrPubkey=n[1],this.nostrRelays=n[2]}},e}(),D=function(e){try{var t="https://getalby.com/api/rates/"+e.toLowerCase()+".json";return Promise.resolve(fetch(t)).then(function(e){return Promise.resolve(e.json()).then(function(e){return e.rate_float/1e8})})}catch(e){return Promise.reject(e)}},S=function(e){var t=e.satoshi;return Promise.resolve(D(e.currency)).then(function(e){return Number(t)*e})},N={__proto__:null,getFiatBtcRate:D,getFiatValue:S,getSatoshiValue:function(e){var t=e.amount;return Promise.resolve(D(e.currency)).then(function(e){return Math.floor(Number(t)/e)})},getFormattedFiatValue:function(e){var t=e.currency,r=e.locale;return r||(r="en"),Promise.resolve(S({satoshi:e.satoshi,currency:t})).then(function(e){return e.toLocaleString(r,{style:"currency",currency:t})})}};exports.Invoice=y,exports.LightningAddress=x,exports.boostagrams=m,exports.fetchWithL402=c,exports.fiat=N,exports.l402=l,exports.nostr=j,exports.sendBoostagram=h;
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
},{"crypto-js/enc-hex.js":6,"crypto-js/sha256.js":7,"light-bolt11-decoder":8}],2:[function(require,module,exports){
|
|
6
6
|
// assign alby-tools exports to global window object (for index.browser.js)
|
|
7
7
|
// @ts-ignore
|
|
8
|
-
window["lightningTools"] = require(
|
|
8
|
+
window["lightningTools"] = require("./index.cjs");
|
|
9
|
+
|
|
9
10
|
},{"./index.cjs":1}],3:[function(require,module,exports){
|
|
10
11
|
"use strict";
|
|
11
12
|
/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("crypto-js/enc-hex.js"),t=require("crypto-js/sha256.js"),r=require("light-bolt11-decoder");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/n(e),a=/*#__PURE__*/n(t),i=/*#__PURE__*/function(){function e(e){this.storage=void 0,this.storage=e||{}}var t=e.prototype;return t.getItem=function(e){return this.storage[e]},t.setItem=function(e,t){this.storage[e]=t},e}(),s={__proto__:null,MemoryStorage:i,NoStorage:/*#__PURE__*/function(){function e(e){}var t=e.prototype;return t.getItem=function(e){return null},t.setItem=function(e,t){},e}(),default:i},u=new i,c=function(e,t,r){try{var n,o=function(r){return n?r:(t.headers["Accept-Authenticate"]=a,Promise.resolve(fetch(e,t)).then(function(r){var n=r.headers.get("www-authenticate");if(!n)return r;var o,u=(o=n.replace("L402","").replace("LSAT","").split(",").map(function(e){var t=e.split("=").map(function(e){return e.trim()});return[t[0],t[1].match(/"?([^"]*)"?/)[1]]}),Object.fromEntries(o)),c=u.token||u.macaroon,l=u.invoice;return Promise.resolve(i.enable()).then(function(){return Promise.resolve(i.sendPayment(l)).then(function(r){return s.setItem(e,JSON.stringify({token:c,preimage:r.preimage})),t.headers.Authorization=a+" "+c+":"+r.preimage,Promise.resolve(fetch(e,t))})})}))};r||(r={});var a=r.headerKey||"L402",i=r.webln||globalThis.webln;if(!i)throw new Error("WebLN is missing");var s=r.store||u;t||(t={}),t.cache="no-store",t.mode="cors",t.headers||(t.headers={});var c=s.getItem(e),l=function(){if(c){var r=JSON.parse(c);return t.headers.Authorization=a+" "+r.token+":"+r.preimage,Promise.resolve(fetch(e,t)).then(function(e){return n=1,e})}}();return Promise.resolve(l&&l.then?l.then(o):o(l))}catch(e){return Promise.reject(e)}},l={__proto__:null,storage:s,fetchWithL402:c,default:c},h=function(e,t){try{var r=e.boost,n=e.amount;t||(t={});var o=t.webln||globalThis.webln;n||(n=Math.floor(r.value_msat/1e3));var a={destination:e.destination,amount:n,customRecords:{7629169:JSON.stringify(r)}};return e.customKey&&e.customValue&&(a.customRecords[e.customKey]=e.customValue),Promise.resolve(o.enable()).then(function(){return Promise.resolve(o.keysend(a))})}catch(e){return Promise.reject(e)}},m={__proto__:null,boost:h,default:h};function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},f.apply(this,arguments)}var v=/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/,p=function(e){return!!e&&v.test(e)},d=function(e){var t=e.amount,r=e.min,n=e.max,o=t>0&&t>=r&&t<=n;return o&&r===n?t===r:o},y=/*#__PURE__*/function(){function e(e){var t,n;this.paymentRequest=void 0,this.paymentHash=void 0,this.preimage=void 0,this.verify=void 0,this.paymentRequest=e.pr,this.paymentHash=function(e){if(!e)return null;try{var t=r.decode(e);if(!t||!t.sections)return null;var n=t.sections.find(function(e){return"payment_hash"===e.name});return n&&n.value?n.value.toString():null}catch(e){return null}}(this.paymentRequest),this.verify=null!=(t=e.verify)?t:null,this.preimage=null!=(n=e.preimage)?n:null}var t=e.prototype;return t.isPaid=function(){try{var e=this;if(e.preimage)return Promise.resolve(e.validatePreimage(e.preimage));if(e.verify)return Promise.resolve(e.verifyPayment());throw new Error("Could not verify payment")}catch(e){return Promise.reject(e)}},t.validatePreimage=function(e){if(!e||!this.paymentHash)return!1;try{var t=a.default(o.default.parse(e)).toString(o.default);return this.paymentHash===t}catch(e){return!1}},t.verifyPayment=function(){try{var e=this;if(!e.verify)throw new Error("LNURL verify not available");return Promise.resolve(fetch(e.verify)).then(function(t){return Promise.resolve(t.json()).then(function(t){return t.preimage&&(e.preimage=t.preimage),t.settled})})}catch(e){return Promise.reject(e)}},e}(),w=function(e,t){var r=e.satoshi,n=e.comment,o=e.p,a=e.e,i=e.relays;void 0===t&&(t={});try{var s=t.nostr||globalThis.nostr;if(!s)throw new Error("nostr option or window.nostr is not available");var u=[["relays"].concat(i),["amount",r.toString()]];return o&&u.push(["p",o]),a&&u.push(["e",a]),Promise.resolve(s.getPublicKey()).then(function(e){var t={pubkey:e,created_at:Math.floor(Date.now()/1e3),kind:9734,tags:u,content:null!=n?n:""};return t.id=P(t),Promise.resolve(s.signEvent(t))})}catch(a){return Promise.reject(a)}};function g(e){if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if(!Array.isArray(e.tags))return!1;for(var t=0;t<e.tags.length;t++){var r=e.tags[t];if(!Array.isArray(r))return!1;for(var n=0;n<r.length;n++)if("object"==typeof r[n])return!1}return!0}function b(e){if(!g(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function P(e){return a.default(b(e)).toString(o.default)}function k(e,t){var r,n,o,a;return t&&e&&(n=(r=null==(o=e.names)?void 0:o[t])?null==(a=e.relays)?void 0:a[r]:void 0),[e,r,n]}var j={__proto__:null,generateZapEvent:w,validateEvent:g,serializeEvent:b,getEventHash:P,parseNostrResponse:k},x=/^((?:[^<>()\[\]\\.,;:\s@"]+(?:\.[^<>()\[\]\\.,;:\s@"]+)*)|(?:".+"))@((?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,D=/*#__PURE__*/function(){function e(e,t){this.address=void 0,this.options=void 0,this.username=void 0,this.domain=void 0,this.pubkey=void 0,this.lnurlpData=void 0,this.keysendData=void 0,this.nostrData=void 0,this.nostrPubkey=void 0,this.nostrRelays=void 0,this.webln=void 0,this.address=e,this.options={proxy:"https://lnaddressproxy.getalby.com",webln:globalThis.webln},this.options=Object.assign(this.options,t),this.parse(),this.webln=this.options.webln}var t=e.prototype;return t.parse=function(){var e=x.exec(this.address.toLowerCase());e&&(this.username=e[1],this.domain=e[2])},t.fetch=function(){try{var e=this;return Promise.resolve(e.options.proxy?e.fetchWithProxy():e.fetchWithoutProxy())}catch(e){return Promise.reject(e)}},t.fetchWithProxy=function(){try{var e=this;return Promise.resolve(fetch(e.options.proxy+"/lightning-address-details?"+new URLSearchParams({ln:e.address}).toString())).then(function(t){return Promise.resolve(t.json()).then(function(t){e.parseResponse(t.lnurlp,t.keysend,t.nostr)})})}catch(e){return Promise.reject(e)}},t.fetchWithoutProxy=function(){try{var e=this;return e.domain&&e.username?Promise.resolve(fetch(e.lnurlpUrl())).then(function(t){return Promise.resolve(fetch(e.keysendUrl())).then(function(r){return Promise.resolve(fetch(e.nostrUrl())).then(function(n){function o(){function t(){function t(){e.parseResponse(a,o,r)}var r,i=function(){if(n.ok)return Promise.resolve(n.json()).then(function(e){r=e})}();return i&&i.then?i.then(t):t()}var o,i=function(){if(r.ok)return Promise.resolve(r.json()).then(function(e){o=e})}();return i&&i.then?i.then(t):t()}var a,i=function(){if(t.ok)return Promise.resolve(t.json()).then(function(e){a=e})}();return i&&i.then?i.then(o):o()})})}):Promise.resolve()}catch(e){return Promise.reject(e)}},t.lnurlpUrl=function(){return"https://"+this.domain+"/.well-known/lnurlp/"+this.username},t.keysendUrl=function(){return"https://"+this.domain+"/.well-known/keysend/"+this.username},t.nostrUrl=function(){return"https://"+this.domain+"/.well-known/nostr.json?name="+this.username},t.generateInvoice=function(e){try{var t,r=function(e){var r=t&&t.pr&&t.pr.toString();if(!r)throw new Error("Invalid pay service invoice");var n={pr:r};return t&&t.verify&&(n.verify=t.verify.toString()),new y(n)},n=this,o=function(){if(n.options.proxy)return Promise.resolve(fetch(n.options.proxy+"/generate-invoice?"+new URLSearchParams(f({ln:n.address},e)).toString())).then(function(e){return Promise.resolve(e.json()).then(function(e){t=e.invoice})});if(!n.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!n.lnurlpData.callback||!p(n.lnurlpData.callback))throw new Error("Valid callback does not exist in lnurlpData");var r=new URL(n.lnurlpData.callback);return r.search=new URLSearchParams(e).toString(),Promise.resolve(fetch(r)).then(function(e){return Promise.resolve(e.json()).then(function(e){t=e})})}();return Promise.resolve(o&&o.then?o.then(r):r())}catch(e){return Promise.reject(e)}},t.requestInvoice=function(e){try{var t=this;if(!t.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");var r=1e3*e.satoshi,n=t.lnurlpData,o=n.commentAllowed;if(!d({amount:r,min:n.min,max:n.max}))throw new Error("Invalid amount");if(e.comment&&o&&o>0&&e.comment.length>o)throw new Error("The comment length must be "+o+" characters or fewer");var a={amount:r.toString()};return e.comment&&(a.comment=e.comment),e.payerdata&&(a.payerdata=JSON.stringify(e.payerdata)),Promise.resolve(t.generateInvoice(a))}catch(e){return Promise.reject(e)}},t.boost=function(e,t){void 0===t&&(t=0);try{var r=this;if(!r.keysendData)throw new Error("No keysendData available. Please call fetch() first.");var n=r.keysendData;return Promise.resolve(h({destination:n.destination,customKey:n.customKey,customValue:n.customValue,amount:t,boost:e},{webln:r.webln}))}catch(e){return Promise.reject(e)}},t.zapInvoice=function(e,t){var r=e.satoshi,n=e.comment,o=e.relays,a=e.e;void 0===t&&(t={});try{var i=this;if(!i.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!i.nostrPubkey)throw new Error("Nostr Pubkey is missing");var s=i.nostrPubkey,u=1e3*r,c=i.lnurlpData,l=c.allowsNostr;if(!d({amount:u,min:c.min,max:c.max}))throw new Error("Invalid amount");if(!l)throw new Error("Your provider does not support zaps");return Promise.resolve(w({satoshi:u,comment:n,p:s,e:a,relays:o},t)).then(function(e){var t={amount:u.toString(),nostr:JSON.stringify(e)};return Promise.resolve(i.generateInvoice(t))})}catch(a){return Promise.reject(a)}},t.zap=function(e,t){void 0===t&&(t={});try{var r=this,n=r.zapInvoice(e,t);if(!r.webln)throw new Error("WebLN not available");return Promise.resolve(r.webln.enable()).then(function(){var e=r.webln,t=e.sendPayment;return Promise.resolve(n).then(function(r){return t.call(e,r.paymentRequest)})})}catch(e){return Promise.reject(e)}},t.parseResponse=function(e,t,r){if(e&&(this.lnurlpData=function(e){if("payRequest"!==e.tag)throw new Error("Invalid pay service params");var t=(e.callback+"").trim();if(!p(t))throw new Error("Callback must be a valid url");var r,n,i=Math.ceil(Number(e.minSendable||0)),s=Math.floor(Number(e.maxSendable));if(!i||!s||i>s)throw new Error("Invalid pay service params");try{r=JSON.parse(e.metadata+""),n=a.default(e.metadata+"").toString(o.default)}catch(e){r=[],n=a.default("[]").toString(o.default)}for(var u="",c="",l="",h=0;h<r.length;h++){var m=r[h],f=m[0],v=m[1];switch(f){case"text/plain":c=v;break;case"text/identifier":l=v;break;case"image/png;base64":case"image/jpeg;base64":u="data:"+f+","+v}}var d,y=e.payerData;try{d=new URL(t).hostname}catch(e){}return{callback:t,fixed:i===s,min:i,max:s,domain:d,metadata:r,metadataHash:n,identifier:l,description:c,image:u,payerData:y,commentAllowed:Number(e.commentAllowed)||0,rawData:e,allowsNostr:e.allowsNostr||!1}}(e)),t&&(this.keysendData=function(e){if("keysend"!==e.tag)throw new Error("Invalid keysend params");if("OK"!==e.status)throw new Error("Keysend status not OK");if(!("customKey"in e.customData[0])||"696969"!=e.customData[0].customKey)throw new Error("Unable to find customKey");if(!("customValue"in e.customData[0])||!e.customData[0].customValue)throw new Error("Unable to find customValue");if(!e.pubkey)throw new Error("Pubkey does not exist");return{destination:e.pubkey,customKey:e.customData[0].customKey,customValue:e.customData[0].customValue}}(t)),r){var n=k(r,this.username);this.nostrData=n[0],this.nostrPubkey=n[1],this.nostrRelays=n[2]}},e}(),E=function(e){try{var t="https://getalby.com/api/rates/"+e.toLowerCase()+".json";return Promise.resolve(fetch(t)).then(function(e){return Promise.resolve(e.json()).then(function(e){return e.rate_float/1e8})})}catch(e){return Promise.reject(e)}},S=function(e){var t=e.satoshi;return Promise.resolve(E(e.currency)).then(function(e){return Number(t)*e})},_={__proto__:null,getFiatBtcRate:E,getFiatValue:S,getSatoshiValue:function(e){var t=e.amount;return Promise.resolve(E(e.currency)).then(function(e){return Math.floor(Number(t)/e)})},getFormattedFiatValue:function(e){var t=e.currency,r=e.locale;return r||(r="en"),Promise.resolve(S({satoshi:e.satoshi,currency:t})).then(function(e){return e.toLocaleString(r,{style:"currency",currency:t})})}};exports.Invoice=y,exports.LightningAddress=D,exports.boostagrams=m,exports.fetchWithL402=c,exports.fiat=_,exports.l402=l,exports.nostr=j,exports.sendBoostagram=h;
|
|
1
|
+
var e=require("crypto-js/enc-hex.js"),t=require("crypto-js/sha256.js"),r=require("light-bolt11-decoder");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/n(e),a=/*#__PURE__*/n(t),i=/*#__PURE__*/function(){function e(e){this.storage=void 0,this.storage=e||{}}var t=e.prototype;return t.getItem=function(e){return this.storage[e]},t.setItem=function(e,t){this.storage[e]=t},e}(),s={__proto__:null,MemoryStorage:i,NoStorage:/*#__PURE__*/function(){function e(e){}var t=e.prototype;return t.getItem=function(e){return null},t.setItem=function(e,t){},e}(),default:i},u=new i,c=function(e,t,r){try{var n,o=function(r){return n?r:(t.headers["Accept-Authenticate"]=a,Promise.resolve(fetch(e,t)).then(function(r){var n=r.headers.get("www-authenticate");if(!n)return r;var o,u=(o=n.replace("L402","").replace("LSAT","").split(",").map(function(e){var t=e.split("=").map(function(e){return e.trim()});return[t[0],t[1].match(/"?([^"]*)"?/)[1]]}),Object.fromEntries(o)),c=u.token||u.macaroon,l=u.invoice;return Promise.resolve(i.enable()).then(function(){return Promise.resolve(i.sendPayment(l)).then(function(r){return s.setItem(e,JSON.stringify({token:c,preimage:r.preimage})),t.headers.Authorization=a+" "+c+":"+r.preimage,Promise.resolve(fetch(e,t))})})}))};r||(r={});var a=r.headerKey||"L402",i=r.webln||globalThis.webln;if(!i)throw new Error("WebLN is missing");var s=r.store||u;t||(t={}),t.cache="no-store",t.mode="cors",t.headers||(t.headers={});var c=s.getItem(e),l=function(){if(c){var r=JSON.parse(c);return t.headers.Authorization=a+" "+r.token+":"+r.preimage,Promise.resolve(fetch(e,t)).then(function(e){return n=1,e})}}();return Promise.resolve(l&&l.then?l.then(o):o(l))}catch(e){return Promise.reject(e)}},l={__proto__:null,storage:s,fetchWithL402:c,default:c},h=function(e,t){try{var r=e.boost,n=e.amount;t||(t={});var o=t.webln||globalThis.webln;n||(n=Math.floor(r.value_msat/1e3));var a={destination:e.destination,amount:n,customRecords:{7629169:JSON.stringify(r)}};return e.customKey&&e.customValue&&(a.customRecords[e.customKey]=e.customValue),Promise.resolve(o.enable()).then(function(){return Promise.resolve(o.keysend(a))})}catch(e){return Promise.reject(e)}},m={__proto__:null,boost:h,default:h};function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},f.apply(this,arguments)}var v=/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/,p=function(e){return!!e&&v.test(e)},d=function(e){var t=e.amount;return t>0&&t>=e.min&&t<=e.max},y=/*#__PURE__*/function(){function e(e){var t,n;this.paymentRequest=void 0,this.paymentHash=void 0,this.preimage=void 0,this.verify=void 0,this.paymentRequest=e.pr,this.paymentHash=function(e){if(!e)return null;try{var t=r.decode(e);if(!t||!t.sections)return null;var n=t.sections.find(function(e){return"payment_hash"===e.name});return n&&n.value?n.value.toString():null}catch(e){return null}}(this.paymentRequest),this.verify=null!=(t=e.verify)?t:null,this.preimage=null!=(n=e.preimage)?n:null}var t=e.prototype;return t.isPaid=function(){try{var e=this;if(e.preimage)return Promise.resolve(e.validatePreimage(e.preimage));if(e.verify)return Promise.resolve(e.verifyPayment());throw new Error("Could not verify payment")}catch(e){return Promise.reject(e)}},t.validatePreimage=function(e){if(!e||!this.paymentHash)return!1;try{var t=a.default(o.default.parse(e)).toString(o.default);return this.paymentHash===t}catch(e){return!1}},t.verifyPayment=function(){try{var e=this;if(!e.verify)throw new Error("LNURL verify not available");return Promise.resolve(fetch(e.verify)).then(function(t){return Promise.resolve(t.json()).then(function(t){return t.preimage&&(e.preimage=t.preimage),t.settled})})}catch(e){return Promise.reject(e)}},e}(),w=function(e,t){var r=e.satoshi,n=e.comment,o=e.p,a=e.e,i=e.relays;void 0===t&&(t={});try{var s=t.nostr||globalThis.nostr;if(!s)throw new Error("nostr option or window.nostr is not available");var u=[["relays"].concat(i),["amount",r.toString()]];return o&&u.push(["p",o]),a&&u.push(["e",a]),Promise.resolve(s.getPublicKey()).then(function(e){var t={pubkey:e,created_at:Math.floor(Date.now()/1e3),kind:9734,tags:u,content:null!=n?n:""};return t.id=P(t),Promise.resolve(s.signEvent(t))})}catch(a){return Promise.reject(a)}};function g(e){if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if(!Array.isArray(e.tags))return!1;for(var t=0;t<e.tags.length;t++){var r=e.tags[t];if(!Array.isArray(r))return!1;for(var n=0;n<r.length;n++)if("object"==typeof r[n])return!1}return!0}function b(e){if(!g(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function P(e){return a.default(b(e)).toString(o.default)}function k(e,t){var r,n,o,a;return t&&e&&(n=(r=null==(o=e.names)?void 0:o[t])?null==(a=e.relays)?void 0:a[r]:void 0),[e,r,n]}var j={__proto__:null,generateZapEvent:w,validateEvent:g,serializeEvent:b,getEventHash:P,parseNostrResponse:k},E=/^((?:[^<>()\[\]\\.,;:\s@"]+(?:\.[^<>()\[\]\\.,;:\s@"]+)*)|(?:".+"))@((?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,x=/*#__PURE__*/function(){function e(e,t){this.address=void 0,this.options=void 0,this.username=void 0,this.domain=void 0,this.pubkey=void 0,this.lnurlpData=void 0,this.keysendData=void 0,this.nostrData=void 0,this.nostrPubkey=void 0,this.nostrRelays=void 0,this.webln=void 0,this.address=e,this.options={proxy:"https://api.getalby.com/lnurl"},this.options=Object.assign(this.options,t),this.parse(),this.webln=this.options.webln}var t=e.prototype;return t.parse=function(){var e=E.exec(this.address.toLowerCase());e&&(this.username=e[1],this.domain=e[2])},t.getWebLN=function(){return this.webln||globalThis.webln},t.fetch=function(){try{var e=this;return Promise.resolve(e.options.proxy?e.fetchWithProxy():e.fetchWithoutProxy())}catch(e){return Promise.reject(e)}},t.fetchWithProxy=function(){try{var e=this;return Promise.resolve(fetch(e.options.proxy+"/lightning-address-details?"+new URLSearchParams({ln:e.address}).toString())).then(function(t){return Promise.resolve(t.json()).then(function(t){e.parseResponse(t.lnurlp,t.keysend,t.nostr)})})}catch(e){return Promise.reject(e)}},t.fetchWithoutProxy=function(){try{var e=this;return e.domain&&e.username?Promise.resolve(fetch(e.lnurlpUrl())).then(function(t){return Promise.resolve(fetch(e.keysendUrl())).then(function(r){return Promise.resolve(fetch(e.nostrUrl())).then(function(n){function o(){function t(){function t(){e.parseResponse(a,o,r)}var r,i=function(){if(n.ok)return Promise.resolve(n.json()).then(function(e){r=e})}();return i&&i.then?i.then(t):t()}var o,i=function(){if(r.ok)return Promise.resolve(r.json()).then(function(e){o=e})}();return i&&i.then?i.then(t):t()}var a,i=function(){if(t.ok)return Promise.resolve(t.json()).then(function(e){a=e})}();return i&&i.then?i.then(o):o()})})}):Promise.resolve()}catch(e){return Promise.reject(e)}},t.lnurlpUrl=function(){return"https://"+this.domain+"/.well-known/lnurlp/"+this.username},t.keysendUrl=function(){return"https://"+this.domain+"/.well-known/keysend/"+this.username},t.nostrUrl=function(){return"https://"+this.domain+"/.well-known/nostr.json?name="+this.username},t.generateInvoice=function(e){try{var t,r=function(e){var r=t&&t.pr&&t.pr.toString();if(!r)throw new Error("Invalid pay service invoice");var n={pr:r};return t&&t.verify&&(n.verify=t.verify.toString()),new y(n)},n=this,o=function(){if(n.options.proxy)return Promise.resolve(fetch(n.options.proxy+"/generate-invoice?"+new URLSearchParams(f({ln:n.address},e)).toString())).then(function(e){return Promise.resolve(e.json()).then(function(e){t=e.invoice})});if(!n.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!n.lnurlpData.callback||!p(n.lnurlpData.callback))throw new Error("Valid callback does not exist in lnurlpData");var r=new URL(n.lnurlpData.callback);return r.search=new URLSearchParams(e).toString(),Promise.resolve(fetch(r)).then(function(e){return Promise.resolve(e.json()).then(function(e){t=e})})}();return Promise.resolve(o&&o.then?o.then(r):r())}catch(e){return Promise.reject(e)}},t.requestInvoice=function(e){try{var t=this;if(!t.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");var r=1e3*e.satoshi,n=t.lnurlpData,o=n.commentAllowed;if(!d({amount:r,min:n.min,max:n.max}))throw new Error("Invalid amount");if(e.comment&&o&&o>0&&e.comment.length>o)throw new Error("The comment length must be "+o+" characters or fewer");var a={amount:r.toString()};return e.comment&&(a.comment=e.comment),e.payerdata&&(a.payerdata=JSON.stringify(e.payerdata)),Promise.resolve(t.generateInvoice(a))}catch(e){return Promise.reject(e)}},t.boost=function(e,t){void 0===t&&(t=0);try{var r=this;if(!r.keysendData)throw new Error("No keysendData available. Please call fetch() first.");var n=r.keysendData,o=n.destination,a=n.customKey,i=n.customValue,s=r.getWebLN();if(!s)throw new Error("WebLN not available");return Promise.resolve(h({destination:o,customKey:a,customValue:i,amount:t,boost:e},{webln:s}))}catch(e){return Promise.reject(e)}},t.zapInvoice=function(e,t){var r=e.satoshi,n=e.comment,o=e.relays,a=e.e;void 0===t&&(t={});try{var i=this;if(!i.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!i.nostrPubkey)throw new Error("Nostr Pubkey is missing");var s=i.nostrPubkey,u=1e3*r,c=i.lnurlpData,l=c.allowsNostr;if(!d({amount:u,min:c.min,max:c.max}))throw new Error("Invalid amount");if(!l)throw new Error("Your provider does not support zaps");return Promise.resolve(w({satoshi:u,comment:n,p:s,e:a,relays:o},t)).then(function(e){var t={amount:u.toString(),nostr:JSON.stringify(e)};return Promise.resolve(i.generateInvoice(t))})}catch(a){return Promise.reject(a)}},t.zap=function(e,t){void 0===t&&(t={});try{var r=this.zapInvoice(e,t),n=this.getWebLN();if(!n)throw new Error("WebLN not available");return Promise.resolve(n.enable()).then(function(){var e=n.sendPayment;return Promise.resolve(r).then(function(t){return e.call(n,t.paymentRequest)})})}catch(e){return Promise.reject(e)}},t.parseResponse=function(e,t,r){if(e&&(this.lnurlpData=function(e){if("payRequest"!==e.tag)throw new Error("Invalid pay service params");var t=(e.callback+"").trim();if(!p(t))throw new Error("Callback must be a valid url");var r,n,i=Math.ceil(Number(e.minSendable||0)),s=Math.floor(Number(e.maxSendable));if(!i||!s||i>s)throw new Error("Invalid pay service params");try{r=JSON.parse(e.metadata+""),n=a.default(e.metadata+"").toString(o.default)}catch(e){r=[],n=a.default("[]").toString(o.default)}for(var u="",c="",l="",h=0;h<r.length;h++){var m=r[h],f=m[0],v=m[1];switch(f){case"text/plain":c=v;break;case"text/identifier":l=v;break;case"image/png;base64":case"image/jpeg;base64":u="data:"+f+","+v}}var d,y=e.payerData;try{d=new URL(t).hostname}catch(e){}return{callback:t,fixed:i===s,min:i,max:s,domain:d,metadata:r,metadataHash:n,identifier:l,description:c,image:u,payerData:y,commentAllowed:Number(e.commentAllowed)||0,rawData:e,allowsNostr:e.allowsNostr||!1}}(e)),t&&(this.keysendData=function(e){if("keysend"!==e.tag)throw new Error("Invalid keysend params");if("OK"!==e.status)throw new Error("Keysend status not OK");if(!("customKey"in e.customData[0])||"696969"!=e.customData[0].customKey)throw new Error("Unable to find customKey");if(!("customValue"in e.customData[0])||!e.customData[0].customValue)throw new Error("Unable to find customValue");if(!e.pubkey)throw new Error("Pubkey does not exist");return{destination:e.pubkey,customKey:e.customData[0].customKey,customValue:e.customData[0].customValue}}(t)),r){var n=k(r,this.username);this.nostrData=n[0],this.nostrPubkey=n[1],this.nostrRelays=n[2]}},e}(),D=function(e){try{var t="https://getalby.com/api/rates/"+e.toLowerCase()+".json";return Promise.resolve(fetch(t)).then(function(e){return Promise.resolve(e.json()).then(function(e){return e.rate_float/1e8})})}catch(e){return Promise.reject(e)}},S=function(e){var t=e.satoshi;return Promise.resolve(D(e.currency)).then(function(e){return Number(t)*e})},N={__proto__:null,getFiatBtcRate:D,getFiatValue:S,getSatoshiValue:function(e){var t=e.amount;return Promise.resolve(D(e.currency)).then(function(e){return Math.floor(Number(t)/e)})},getFormattedFiatValue:function(e){var t=e.currency,r=e.locale;return r||(r="en"),Promise.resolve(S({satoshi:e.satoshi,currency:t})).then(function(e){return e.toLocaleString(r,{style:"currency",currency:t})})}};exports.Invoice=y,exports.LightningAddress=x,exports.boostagrams=m,exports.fetchWithL402=c,exports.fiat=N,exports.l402=l,exports.nostr=j,exports.sendBoostagram=h;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/storage.ts","../src/l402/index.ts","../src/l402/parse.js","../src/podcasting2/boostagrams.ts","../src/utils/keysend.ts","../src/utils/lnurl.ts","../src/invoice.ts","../src/utils/invoice.ts","../src/utils/nostr.ts","../src/lightning-address.ts","../src/utils/fiat.ts"],"sourcesContent":["export class MemoryStorage {\n storage;\n\n constructor(initial?: any) {\n this.storage = initial || {};\n }\n\n getItem(key) {\n return this.storage[key];\n }\n\n setItem(key, value) {\n this.storage[key] = value;\n }\n}\n\nexport class NoStorage {\n constructor(initial?: any) {\n }\n\n getItem(key) {\n return null;\n }\n\n setItem(key, value) {\n }\n}\n\nexport default MemoryStorage;\n","import MemoryStorage from \"../utils/storage\";\nimport { WebLNProvider } from '@webbtc/webln-types';\nimport { parseL402 } from \"./parse\";\n\nexport * as storage from \"../utils/storage\";\nconst memoryStorage = new MemoryStorage();\n\nconst HEADER_KEY = \"L402\"; // we have to update this to L402 at some point\n\nexport const fetchWithL402 = async (url: string, fetchArgs: Record<string, any>, options: Record<string, any>) => {\n if (!options) {\n options = {};\n }\n const headerKey = options.headerKey || HEADER_KEY;\n const webln: WebLNProvider = options.webln || globalThis.webln;\n if (!webln) {\n throw new Error(\"WebLN is missing\");\n }\n let store = options.store || memoryStorage;\n if (!fetchArgs) {\n fetchArgs = {};\n }\n fetchArgs.cache = 'no-store';\n fetchArgs.mode = 'cors';\n if (!fetchArgs.headers) {\n fetchArgs.headers = {};\n }\n const cachedL402Data = store.getItem(url);\n if (cachedL402Data) {\n const data = JSON.parse(cachedL402Data);\n fetchArgs.headers[\"Authorization\"] = `${headerKey} ${data.token}:${data.preimage}`;\n return await fetch(url, fetchArgs)\n }\n\n fetchArgs.headers[\"Accept-Authenticate\"] = headerKey;\n const initResp = await fetch(url, fetchArgs);\n const header = initResp.headers.get('www-authenticate');\n if (!header) {\n return initResp\n }\n\n const details = parseL402(header);\n const token = details.token || details.macaroon;\n const inv = details.invoice;\n\n await webln.enable();\n const invResp = await webln.sendPayment(inv);\n\n store.setItem(url, JSON.stringify({\n 'token': token,\n 'preimage': invResp.preimage\n }));\n\n fetchArgs.headers[\"Authorization\"] = `${headerKey} ${token}:${invResp.preimage}`;\n return await fetch(url, fetchArgs);\n}\n\nexport default fetchWithL402;\n","export const parseL402 = (string) => {\n string = string.replace('L402', '');\n string = string.replace('LSAT', '');\n // Split the string into key-value pairs\n const pairs = string.split(',');\n\n // Split each pair into key and value\n const keyValuePairArray = pairs.map(pair => {\n const [key, valuePotentiallyQuoted] = pair.split('=').map(e => e.trim());\n const valueMatch = valuePotentiallyQuoted.match(/\"?([^\"]*)\"?/);\n const value = valueMatch[1]\n return [key, value];\n });\n\n return Object.fromEntries(keyValuePairArray);\n}\n","import { WebLNProvider } from \"@webbtc/webln-types\";\n\ntype BoostOptions = {\n webln?: unknown;\n}\n\ntype BoostArguments = {\n destination: string\n customKey?: string;\n customValue?: string;\n amount?: number;\n boost: Boost;\n}\n\ntype WeblnBoostParams = {\n destination: string;\n amount: number;\n customRecords: Record<string, string>;\n}\n\nexport type Boost = {\n action: string;\n value_msat: number;\n value_msat_total: number;\n app_name: string;\n app_version: string;\n feedId: string;\n podcast: string;\n episode: string;\n ts: number;\n name: string;\n sender_name: string;\n}\n\nexport const boost = async (args: BoostArguments, options?: BoostOptions) => {\n let { boost, amount } = args;\n if (!options) {\n options = {};\n }\n const webln: WebLNProvider = options.webln || globalThis.webln;\n if (!amount) {\n amount = Math.floor(boost.value_msat / 1000);\n }\n\n let weblnParams: WeblnBoostParams = {\n destination: args.destination,\n amount: amount,\n customRecords: {\n '7629169': JSON.stringify(boost)\n }\n };\n if (args.customKey && args.customValue) {\n weblnParams.customRecords[args.customKey] = args.customValue;\n }\n await webln.enable();\n const response = await webln.keysend(weblnParams);\n return response;\n}\n\nexport default boost;\n","import type { KeysendResponse } from '../types'\n\nconst TAG_KEYSEND = 'keysend'\n\nexport const parseKeysendResponse = (\n data: Record<string, any>\n): KeysendResponse => {\n if (data.tag !== TAG_KEYSEND) throw new Error('Invalid keysend params')\n if (data.status !== \"OK\") throw new Error('Keysend status not OK')\n\n if (!('customKey' in data.customData[0]) || data.customData[0]['customKey'] != '696969')\n throw new Error('Unable to find customKey');\n\n if (!('customValue' in data.customData[0]) || !data.customData[0]['customValue'])\n throw new Error('Unable to find customValue');\n\n if (!data.pubkey)\n throw new Error('Pubkey does not exist');\n\n const destination = data.pubkey;\n const customKey = data.customData[0]['customKey'];\n const customValue = data.customData[0]['customValue'];\n \n return {\n destination,\n customKey,\n customValue\n }\n}","import Hex from \"crypto-js/enc-hex.js\";\nimport sha256 from \"crypto-js/sha256.js\";\n\nimport type { LUD18ServicePayerData, LnUrlPayResponse } from '../types'\n\nconst URL_REGEX = /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)/;\n\nexport const isUrl = (url: string | null): url is string => {\n if (!url) return false\n return URL_REGEX.test(url)\n}\n\nexport const isValidAmount = ({\n amount,\n min,\n max,\n}: {\n amount: number\n min: number\n max: number\n}): boolean => {\n const isValid = amount > 0 && amount >= min && amount <= max\n const isFixed = min === max\n return isValid && isFixed ? amount === min : isValid\n}\n\nconst TAG_PAY_REQUEST = 'payRequest'\n\n// From: https://github.com/dolcalmi/lnurl-pay/blob/main/src/request-pay-service-params.ts\nexport const parseLnUrlPayResponse = (\n data: Record<string, any>\n): LnUrlPayResponse => {\n if (data.tag !== TAG_PAY_REQUEST) throw new Error('Invalid pay service params')\n\n const callback = (data.callback + '').trim();\n if (!isUrl(callback)) throw new Error('Callback must be a valid url')\n\n const min = Math.ceil(Number(data.minSendable || 0))\n const max = Math.floor(Number(data.maxSendable))\n if (!(min && max) || min > max) throw new Error('Invalid pay service params')\n\n let metadata: Array<Array<string>>\n let metadataHash: string\n try {\n metadata = JSON.parse(data.metadata + '')\n metadataHash = sha256(data.metadata + '').toString(Hex)\n } catch {\n metadata = []\n metadataHash = sha256('[]').toString(Hex)\n }\n\n let image = ''\n let description = ''\n let identifier = ''\n for (let i = 0; i < metadata.length; i++) {\n const [k, v] = metadata[i]\n switch (k) {\n case 'text/plain':\n description = v\n break\n case 'text/identifier':\n identifier = v\n break\n case 'image/png;base64':\n case 'image/jpeg;base64':\n image = 'data:' + k + ',' + v\n break\n }\n }\n let payerData = data.payerData as LUD18ServicePayerData | undefined;\n\n let domain\n try {\n domain = new URL(callback).hostname\n } catch {\n // fail silently and let domain remain undefined if callback is not a valid URL\n }\n\n return {\n callback,\n fixed: min === max,\n min,\n max,\n domain,\n metadata,\n metadataHash,\n identifier,\n description,\n image,\n payerData,\n commentAllowed: Number(data.commentAllowed) || 0,\n rawData: data,\n allowsNostr: data.allowsNostr || false,\n }\n}\n","import { getHashFromInvoice } from \"./utils/invoice\";\nimport Hex from \"crypto-js/enc-hex.js\";\nimport sha256 from \"crypto-js/sha256.js\";\nimport { InvoiceArgs } from './types';\n\nexport default class Invoice {\n paymentRequest: string;\n paymentHash: string;\n preimage: string | null;\n verify: string | null;\n\n constructor(args: InvoiceArgs) {\n this.paymentRequest = args.pr;\n this.paymentHash = getHashFromInvoice(this.paymentRequest) as string;\n this.verify = args.verify ?? null;\n this.preimage = args.preimage ?? null;\n }\n\n async isPaid(): Promise<boolean> {\n if (this.preimage)\n return this.validatePreimage(this.preimage);\n else if (this.verify) {\n return await this.verifyPayment();\n } else {\n throw new Error('Could not verify payment');\n }\n }\n\n validatePreimage(preimage: string): boolean {\n if (!preimage || !this.paymentHash) return false\n \n try {\n const preimageHash = sha256(Hex.parse(preimage)).toString(Hex)\n return this.paymentHash === preimageHash\n } catch {\n return false\n }\n }\n\n async verifyPayment(): Promise<boolean> {\n if (!this.verify) throw new Error('LNURL verify not available');\n const result = await fetch(this.verify);\n const json = await result.json();\n if (json.preimage) {\n this.preimage = json.preimage;\n }\n \n return json.settled;\n }\n}","import { decode } from 'light-bolt11-decoder';\n\nexport const getHashFromInvoice = (invoice) => {\n if (!invoice) return null\n\n try {\n const decoded = decode(invoice)\n if (!decoded || !decoded.sections) return null\n\n const hashTag = decoded.sections.find(\n (value) => value.name === 'payment_hash'\n )\n if (!hashTag || !hashTag.value) return null\n\n return hashTag.value.toString()\n } catch {\n return null\n }\n}","import Hex from \"crypto-js/enc-hex.js\";\nimport sha256 from \"crypto-js/sha256.js\";\nimport { Event, NostrResponse, ZapArgs, ZapOptions } from '../types';\n\nexport async function generateZapEvent({\n satoshi, comment, p, e, relays\n}: ZapArgs, options: ZapOptions = {}): Promise<Event> {\n const nostr = options.nostr || globalThis.nostr;\n if (!nostr) {\n throw new Error(\"nostr option or window.nostr is not available\");\n }\n\n const nostrTags = [\n [\"relays\", ...relays],\n [\"amount\", satoshi.toString()]\n ]\n if (p) {\n nostrTags.push([\"p\", p]);\n }\n if (e) {\n nostrTags.push([\"e\", e])\n }\n\n const pubkey = await nostr.getPublicKey();\n\n const nostrEvent: Event = {\n pubkey,\n created_at: Math.floor(Date.now() / 1000),\n kind: 9734,\n tags: nostrTags,\n content: comment ?? \"\"\n }\n\n nostrEvent.id = getEventHash(nostrEvent)\n return await nostr.signEvent(nostrEvent)\n}\n\nexport function validateEvent(event: Event): boolean {\n if (typeof event.content !== \"string\") return false;\n if (typeof event.created_at !== \"number\") return false;\n // ignore these checks because if the pubkey is not set we add it to the event. same for the ID.\n // if (typeof event.pubkey !== \"string\") return false;\n // if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false;\n\n if (!Array.isArray(event.tags)) return false;\n for (let i = 0; i < event.tags.length; i++) {\n const tag = event.tags[i];\n if (!Array.isArray(tag)) return false;\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] === \"object\") return false;\n }\n }\n\n return true;\n}\n\nexport function serializeEvent(evt: Event): string {\n if (!validateEvent(evt))\n throw new Error(\"can't serialize event with wrong or missing properties\");\n\n return JSON.stringify([\n 0,\n evt.pubkey,\n evt.created_at,\n evt.kind,\n evt.tags,\n evt.content,\n ]);\n}\n\nexport function getEventHash(event: Event): string {\n return sha256(serializeEvent(event)).toString(Hex);\n}\n\nexport function parseNostrResponse(nostrData: NostrResponse, username: string | undefined) {\n let nostrPubkey: string | undefined;\n let nostrRelays: string[] | undefined;\n if (username && nostrData) {\n nostrPubkey = nostrData.names?.[username];\n nostrRelays = nostrPubkey ? nostrData.relays?.[nostrPubkey] : undefined;\n }\n\n return [nostrData, nostrPubkey, nostrRelays] as const;\n}","import { parseKeysendResponse } from './utils/keysend';\nimport { isUrl, isValidAmount, parseLnUrlPayResponse } from './utils/lnurl';\nimport Invoice from './invoice';\nimport { InvoiceArgs, LnUrlPayResponse, NostrResponse, RequestInvoiceArgs, ZapArgs, ZapOptions } from './types';\nimport { generateZapEvent, parseNostrResponse } from './utils/nostr';\nimport type { Boost } from './podcasting2/boostagrams';\nimport { boost as booster } from './podcasting2/boostagrams';\nimport { WebLNProvider, SendPaymentResponse } from \"@webbtc/webln-types\";\nimport { KeysendResponse } from './types';\n\nconst LN_ADDRESS_REGEX =\n /^((?:[^<>()\\[\\]\\\\.,;:\\s@\"]+(?:\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(?:\".+\"))@((?:\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(?:(?:[a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\n\nexport const DEFAULT_PROXY = \"https://lnaddressproxy.getalby.com\";\n\ntype LightningAddressOptions = {\n proxy?: string | false;\n webln?: WebLNProvider;\n}\n\nexport default class LightningAddress {\n address: string;\n options: LightningAddressOptions;\n username: string | undefined;\n domain: string | undefined;\n pubkey: string | undefined;\n lnurlpData: LnUrlPayResponse | undefined;\n keysendData: KeysendResponse | undefined;\n nostrData: NostrResponse | undefined;\n nostrPubkey: string | undefined;\n nostrRelays: string[] | undefined;\n webln: WebLNProvider | undefined;\n\n constructor(address: string, options?: LightningAddressOptions) {\n this.address = address;\n this.options = { proxy: DEFAULT_PROXY, webln: globalThis.webln };\n this.options = Object.assign(this.options, options);\n this.parse();\n this.webln = this.options.webln;\n }\n\n parse() {\n const result = LN_ADDRESS_REGEX.exec(this.address.toLowerCase());\n if (result) {\n this.username = result[1];\n this.domain = result[2];\n }\n }\n\n async fetch() {\n if (this.options.proxy) {\n return this.fetchWithProxy();\n } else {\n return this.fetchWithoutProxy();\n }\n }\n\n async fetchWithProxy() {\n const result = await fetch(`${this.options.proxy}/lightning-address-details?${new URLSearchParams({ ln: this.address }).toString()}`);\n const json = await result.json();\n\n this.parseResponse(json.lnurlp, json.keysend, json.nostr);\n }\n\n async fetchWithoutProxy() {\n if (!this.domain || !this.username) {\n return;\n }\n const lnurlResult = await fetch(this.lnurlpUrl());\n const keysendResult = await fetch(this.keysendUrl());\n const nostrResult = await fetch(this.nostrUrl());\n\n let lnurlData: Record<string, string> | undefined;\n if (lnurlResult.ok) {\n lnurlData = await lnurlResult.json();\n } \n let keysendData: Record<string, string> | undefined;\n if (keysendResult.ok) {\n keysendData = await keysendResult.json();\n } \n let nostrData: NostrResponse | undefined;\n if (nostrResult.ok) {\n nostrData = await nostrResult.json();\n } \n \n this.parseResponse(lnurlData, keysendData, nostrData);\n }\n\n lnurlpUrl() {\n return `https://${this.domain}/.well-known/lnurlp/${this.username}`;\n }\n\n keysendUrl() {\n return `https://${this.domain}/.well-known/keysend/${this.username}`;\n }\n\n nostrUrl() {\n return `https://${this.domain}/.well-known/nostr.json?name=${this.username}`;\n }\n\n async generateInvoice(params: Record<string, string>): Promise<Invoice> {\n let data;\n if (this.options.proxy) {\n const invoiceResult = await fetch(`${this.options.proxy}/generate-invoice?${new URLSearchParams({ ln: this.address, ...params }).toString()}`);\n const json = await invoiceResult.json();\n data = json.invoice;\n } else {\n if (!this.lnurlpData) {\n throw new Error(\"No lnurlpData available. Please call fetch() first.\")\n }\n if (!this.lnurlpData.callback || !isUrl(this.lnurlpData.callback)) throw new Error('Valid callback does not exist in lnurlpData')\n const callbackUrl = new URL(this.lnurlpData.callback)\n callbackUrl.search = new URLSearchParams(params).toString()\n const invoiceResult = await fetch(callbackUrl);\n data = await invoiceResult.json();\n }\n\n const paymentRequest = data && data.pr && data.pr.toString();\n if (!paymentRequest) throw new Error('Invalid pay service invoice')\n\n const invoiceArgs: InvoiceArgs = { pr: paymentRequest };\n if (data && data.verify) invoiceArgs.verify = data.verify.toString();\n\n return new Invoice(invoiceArgs);\n }\n\n async requestInvoice(args: RequestInvoiceArgs): Promise<Invoice> {\n if (!this.lnurlpData) {\n throw new Error(\"No lnurlpData available. Please call fetch() first.\")\n }\n const msat = args.satoshi * 1000;\n const { commentAllowed, min, max } = this.lnurlpData;\n\n if (!isValidAmount({ amount: msat, min, max }))\n throw new Error('Invalid amount')\n if (args.comment && commentAllowed && commentAllowed > 0 && args.comment.length > commentAllowed)\n throw new Error(\n `The comment length must be ${commentAllowed} characters or fewer`\n )\n\n const invoiceParams: { amount: string, comment?: string, payerdata?: string } = { amount: msat.toString() };\n if (args.comment) invoiceParams.comment = args.comment\n if (args.payerdata) invoiceParams.payerdata = JSON.stringify(args.payerdata)\n\n return this.generateInvoice(invoiceParams);\n }\n\n async boost(boost: Boost, amount: number = 0) {\n if (!this.keysendData) {\n throw new Error(\"No keysendData available. Please call fetch() first.\")\n }\n const { destination, customKey, customValue } = this.keysendData;\n return booster({\n destination,\n customKey,\n customValue,\n amount,\n boost,\n }, {\n webln: this.webln,\n })\n }\n\n async zapInvoice({\n satoshi, comment, relays, e\n }: ZapArgs, options: ZapOptions = {}): Promise<Invoice> {\n if (!this.lnurlpData) {\n throw new Error(\"No lnurlpData available. Please call fetch() first.\")\n }\n if (!this.nostrPubkey) {\n throw new Error(\"Nostr Pubkey is missing\");\n }\n const p = this.nostrPubkey;\n const msat = satoshi * 1000;\n const { allowsNostr, min, max } = this.lnurlpData;\n\n if (!isValidAmount({ amount: msat, min, max }))\n throw new Error('Invalid amount')\n if (!allowsNostr) throw new Error('Your provider does not support zaps')\n\n const event = await generateZapEvent({\n satoshi: msat, comment, p, e, relays\n }, options);\n const zapParams: { amount: string, nostr: string } = {\n amount: msat.toString(),\n nostr: JSON.stringify(event)\n };\n\n const invoice = await this.generateInvoice(zapParams);\n return invoice;\n }\n\n async zap(args: ZapArgs, options: ZapOptions = {}): Promise<SendPaymentResponse> {\n const invoice = this.zapInvoice(args, options);\n if (!this.webln) {\n // mainly for TS\n throw new Error(\"WebLN not available\");\n }\n await this.webln.enable();\n const response = this.webln.sendPayment((await invoice).paymentRequest);\n return response;\n }\n\n private parseResponse(lnurlpData: Record<string, string> | undefined, keysendData: Record<string, string> | undefined, nostrData: NostrResponse | undefined) {\n if (lnurlpData) {\n this.lnurlpData = parseLnUrlPayResponse(lnurlpData);\n }\n if (keysendData) {\n this.keysendData = parseKeysendResponse(keysendData);\n }\n if (nostrData) {\n [this.nostrData, this.nostrPubkey, this.nostrRelays] = parseNostrResponse(nostrData, this.username);\n }\n }\n}\n","const numSatsInBtc = 100_000_000;\n\nexport const getFiatBtcRate = async (currency: string): Promise<number> => {\n const url = \"https://getalby.com/api/rates/\" + currency.toLowerCase() + \".json\";\n const response = await fetch(url);\n const data = await response.json();\n\n return data.rate_float / numSatsInBtc;\n};\n\nexport const getFiatValue = async ({ satoshi, currency }: { satoshi: number | string; currency: string; }) => {\n const rate = await getFiatBtcRate(currency);\n\n return Number(satoshi) * rate;\n};\n\nexport const getSatoshiValue = async ({ amount, currency }: { amount: number | string; currency: string; }) => {\n const rate = await getFiatBtcRate(currency);\n\n return Math.floor(Number(amount) / rate);\n}\n\nexport const getFormattedFiatValue = async ({ satoshi, currency, locale }: { satoshi: number | string; currency: string; locale: string }) => {\n if (!locale) {\n locale = 'en';\n }\n const fiatValue = await getFiatValue({ satoshi, currency });\n return fiatValue.toLocaleString(locale, {\n style: \"currency\",\n currency,\n });\n}"],"names":["MemoryStorage","initial","storage","this","getItem","key","setItem","value","NoStorage","memoryStorage","fetchWithL402","url","fetchArgs","options","_exit2","_temp3","_result","headers","headerKey","fetch","then","initResp","header","get","keyValuePairArray","details","replace","split","map","pair","e","trim","_pair$split$map","match","Object","fromEntries","token","macaroon","inv","invoice","Promise","resolve","webln","enable","sendPayment","invResp","store","JSON","stringify","preimage","globalThis","Error","cache","mode","_temp4","cachedL402Data","data","parse","_await$fetch","reject","boost","args","amount","Math","floor","value_msat","weblnParams","destination","customRecords","customKey","customValue","keysend","URL_REGEX","isUrl","test","isValidAmount","_ref","min","max","isValid","Invoice","_args$verify","_args$preimage","paymentRequest","paymentHash","verify","pr","decoded","decode","sections","hashTag","find","name","toString","_unused","getHashFromInvoice","isPaid","_this2","validatePreimage","verifyPayment","preimageHash","sha256","Hex","_proto","_this4","result","json","settled","generateZapEvent","satoshi","comment","p","relays","nostr","nostrTags","concat","push","getPublicKey","pubkey","nostrEvent","created_at","Date","now","kind","tags","content","id","getEventHash","signEvent","event","Array","isArray","i","length","tag","j","serializeEvent","evt","validateEvent","parseNostrResponse","nostrData","username","nostrPubkey","nostrRelays","_nostrData$names","names","_nostrData$relays","undefined","LN_ADDRESS_REGEX","LightningAddress","address","domain","lnurlpData","keysendData","proxy","assign","exec","toLowerCase","fetchWithProxy","fetchWithoutProxy","URLSearchParams","ln","parseResponse","lnurlp","_this6","lnurlpUrl","lnurlResult","keysendUrl","keysendResult","nostrUrl","nostrResult","lnurlData","ok","_nostrResult$json","_temp","_temp2","_keysendResult$json","_lnurlResult$json","_temp5","_temp6","generateInvoice","params","invoiceArgs","_this8","_temp10","_extends","invoiceResult","callback","callbackUrl","URL","search","_invoiceResult$json","requestInvoice","_this10","msat","_this10$lnurlpData","commentAllowed","invoiceParams","payerdata","_this12","_this12$keysendData","booster","zapInvoice","_this14","_this14$lnurlpData","allowsNostr","zapParams","zap","_this16","_this15$webln","_invoice","_sendPayment","call","metadataHash","ceil","Number","minSendable","maxSendable","metadata","image","description","identifier","_metadata$i","k","v","payerData","hostname","fixed","rawData","parseLnUrlPayResponse","status","customData","parseKeysendResponse","_parseNostrResponse","getFiatBtcRate","currency","response","rate_float","getFiatValue","rate","_ref2","_ref3","locale","fiatValue","toLocaleString","style"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/storage.ts","../src/l402/index.ts","../src/l402/parse.js","../src/podcasting2/boostagrams.ts","../src/utils/keysend.ts","../src/utils/lnurl.ts","../src/invoice.ts","../src/utils/invoice.ts","../src/utils/nostr.ts","../src/lightning-address.ts","../src/utils/fiat.ts"],"sourcesContent":["export class MemoryStorage {\n storage;\n\n constructor(initial?: any) {\n this.storage = initial || {};\n }\n\n getItem(key) {\n return this.storage[key];\n }\n\n setItem(key, value) {\n this.storage[key] = value;\n }\n}\n\nexport class NoStorage {\n constructor(initial?: any) {}\n\n getItem(key) {\n return null;\n }\n\n setItem(key, value) {}\n}\n\nexport default MemoryStorage;\n","import MemoryStorage from \"../utils/storage\";\nimport { WebLNProvider } from \"@webbtc/webln-types\";\nimport { parseL402 } from \"./parse\";\n\nexport * as storage from \"../utils/storage\";\nconst memoryStorage = new MemoryStorage();\n\nconst HEADER_KEY = \"L402\"; // we have to update this to L402 at some point\n\nexport const fetchWithL402 = async (\n url: string,\n fetchArgs: Record<string, any>,\n options: Record<string, any>,\n) => {\n if (!options) {\n options = {};\n }\n const headerKey = options.headerKey || HEADER_KEY;\n const webln: WebLNProvider = options.webln || globalThis.webln;\n if (!webln) {\n throw new Error(\"WebLN is missing\");\n }\n let store = options.store || memoryStorage;\n if (!fetchArgs) {\n fetchArgs = {};\n }\n fetchArgs.cache = \"no-store\";\n fetchArgs.mode = \"cors\";\n if (!fetchArgs.headers) {\n fetchArgs.headers = {};\n }\n const cachedL402Data = store.getItem(url);\n if (cachedL402Data) {\n const data = JSON.parse(cachedL402Data);\n fetchArgs.headers[\n \"Authorization\"\n ] = `${headerKey} ${data.token}:${data.preimage}`;\n return await fetch(url, fetchArgs);\n }\n\n fetchArgs.headers[\"Accept-Authenticate\"] = headerKey;\n const initResp = await fetch(url, fetchArgs);\n const header = initResp.headers.get(\"www-authenticate\");\n if (!header) {\n return initResp;\n }\n\n const details = parseL402(header);\n const token = details.token || details.macaroon;\n const inv = details.invoice;\n\n await webln.enable();\n const invResp = await webln.sendPayment(inv);\n\n store.setItem(\n url,\n JSON.stringify({\n token: token,\n preimage: invResp.preimage,\n }),\n );\n\n fetchArgs.headers[\n \"Authorization\"\n ] = `${headerKey} ${token}:${invResp.preimage}`;\n return await fetch(url, fetchArgs);\n};\n\nexport default fetchWithL402;\n","export const parseL402 = (string) => {\n string = string.replace(\"L402\", \"\");\n string = string.replace(\"LSAT\", \"\");\n // Split the string into key-value pairs\n const pairs = string.split(\",\");\n\n // Split each pair into key and value\n const keyValuePairArray = pairs.map((pair) => {\n const [key, valuePotentiallyQuoted] = pair.split(\"=\").map((e) => e.trim());\n const valueMatch = valuePotentiallyQuoted.match(/\"?([^\"]*)\"?/);\n const value = valueMatch[1];\n return [key, value];\n });\n\n return Object.fromEntries(keyValuePairArray);\n};\n","import { WebLNProvider } from \"@webbtc/webln-types\";\n\ntype BoostOptions = {\n webln?: unknown;\n};\n\ntype BoostArguments = {\n destination: string;\n customKey?: string;\n customValue?: string;\n amount?: number;\n boost: Boost;\n};\n\ntype WeblnBoostParams = {\n destination: string;\n amount: number;\n customRecords: Record<string, string>;\n};\n\nexport type Boost = {\n action: string;\n value_msat: number;\n value_msat_total: number;\n app_name: string;\n app_version: string;\n feedId: string;\n podcast: string;\n episode: string;\n ts: number;\n name: string;\n sender_name: string;\n};\n\nexport const boost = async (args: BoostArguments, options?: BoostOptions) => {\n let { boost, amount } = args;\n if (!options) {\n options = {};\n }\n const webln: WebLNProvider = options.webln || globalThis.webln;\n if (!amount) {\n amount = Math.floor(boost.value_msat / 1000);\n }\n\n let weblnParams: WeblnBoostParams = {\n destination: args.destination,\n amount: amount,\n customRecords: {\n \"7629169\": JSON.stringify(boost),\n },\n };\n if (args.customKey && args.customValue) {\n weblnParams.customRecords[args.customKey] = args.customValue;\n }\n await webln.enable();\n const response = await webln.keysend(weblnParams);\n return response;\n};\n\nexport default boost;\n","import type { KeysendResponse } from \"../types\";\n\nconst TAG_KEYSEND = \"keysend\";\n\nexport const parseKeysendResponse = (\n data: Record<string, any>,\n): KeysendResponse => {\n if (data.tag !== TAG_KEYSEND) throw new Error(\"Invalid keysend params\");\n if (data.status !== \"OK\") throw new Error(\"Keysend status not OK\");\n\n if (\n !(\"customKey\" in data.customData[0]) ||\n data.customData[0][\"customKey\"] != \"696969\"\n )\n throw new Error(\"Unable to find customKey\");\n\n if (\n !(\"customValue\" in data.customData[0]) ||\n !data.customData[0][\"customValue\"]\n )\n throw new Error(\"Unable to find customValue\");\n\n if (!data.pubkey) throw new Error(\"Pubkey does not exist\");\n\n const destination = data.pubkey;\n const customKey = data.customData[0][\"customKey\"];\n const customValue = data.customData[0][\"customValue\"];\n\n return {\n destination,\n customKey,\n customValue,\n };\n};\n","import Hex from \"crypto-js/enc-hex.js\";\nimport sha256 from \"crypto-js/sha256.js\";\n\nimport type { LUD18ServicePayerData, LnUrlPayResponse } from \"../types\";\n\nconst URL_REGEX =\n /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)/;\n\nexport const isUrl = (url: string | null): url is string => {\n if (!url) return false;\n return URL_REGEX.test(url);\n};\n\nexport const isValidAmount = ({\n amount,\n min,\n max,\n}: {\n amount: number;\n min: number;\n max: number;\n}): boolean => {\n return amount > 0 && amount >= min && amount <= max;\n};\n\nconst TAG_PAY_REQUEST = \"payRequest\";\n\n// From: https://github.com/dolcalmi/lnurl-pay/blob/main/src/request-pay-service-params.ts\nexport const parseLnUrlPayResponse = (\n data: Record<string, any>,\n): LnUrlPayResponse => {\n if (data.tag !== TAG_PAY_REQUEST)\n throw new Error(\"Invalid pay service params\");\n\n const callback = (data.callback + \"\").trim();\n if (!isUrl(callback)) throw new Error(\"Callback must be a valid url\");\n\n const min = Math.ceil(Number(data.minSendable || 0));\n const max = Math.floor(Number(data.maxSendable));\n if (!(min && max) || min > max) throw new Error(\"Invalid pay service params\");\n\n let metadata: Array<Array<string>>;\n let metadataHash: string;\n try {\n metadata = JSON.parse(data.metadata + \"\");\n metadataHash = sha256(data.metadata + \"\").toString(Hex);\n } catch {\n metadata = [];\n metadataHash = sha256(\"[]\").toString(Hex);\n }\n\n let image = \"\";\n let description = \"\";\n let identifier = \"\";\n for (let i = 0; i < metadata.length; i++) {\n const [k, v] = metadata[i];\n switch (k) {\n case \"text/plain\":\n description = v;\n break;\n case \"text/identifier\":\n identifier = v;\n break;\n case \"image/png;base64\":\n case \"image/jpeg;base64\":\n image = \"data:\" + k + \",\" + v;\n break;\n }\n }\n let payerData = data.payerData as LUD18ServicePayerData | undefined;\n\n let domain;\n try {\n domain = new URL(callback).hostname;\n } catch {\n // fail silently and let domain remain undefined if callback is not a valid URL\n }\n\n return {\n callback,\n fixed: min === max,\n min,\n max,\n domain,\n metadata,\n metadataHash,\n identifier,\n description,\n image,\n payerData,\n commentAllowed: Number(data.commentAllowed) || 0,\n rawData: data,\n allowsNostr: data.allowsNostr || false,\n };\n};\n","import { getHashFromInvoice } from \"./utils/invoice\";\nimport Hex from \"crypto-js/enc-hex.js\";\nimport sha256 from \"crypto-js/sha256.js\";\nimport { InvoiceArgs } from \"./types\";\n\nexport default class Invoice {\n paymentRequest: string;\n paymentHash: string;\n preimage: string | null;\n verify: string | null;\n\n constructor(args: InvoiceArgs) {\n this.paymentRequest = args.pr;\n this.paymentHash = getHashFromInvoice(this.paymentRequest) as string;\n this.verify = args.verify ?? null;\n this.preimage = args.preimage ?? null;\n }\n\n async isPaid(): Promise<boolean> {\n if (this.preimage) return this.validatePreimage(this.preimage);\n else if (this.verify) {\n return await this.verifyPayment();\n } else {\n throw new Error(\"Could not verify payment\");\n }\n }\n\n validatePreimage(preimage: string): boolean {\n if (!preimage || !this.paymentHash) return false;\n\n try {\n const preimageHash = sha256(Hex.parse(preimage)).toString(Hex);\n return this.paymentHash === preimageHash;\n } catch {\n return false;\n }\n }\n\n async verifyPayment(): Promise<boolean> {\n if (!this.verify) throw new Error(\"LNURL verify not available\");\n const result = await fetch(this.verify);\n const json = await result.json();\n if (json.preimage) {\n this.preimage = json.preimage;\n }\n\n return json.settled;\n }\n}\n","import { decode } from \"light-bolt11-decoder\";\n\nexport const getHashFromInvoice = (invoice) => {\n if (!invoice) return null;\n\n try {\n const decoded = decode(invoice);\n if (!decoded || !decoded.sections) return null;\n\n const hashTag = decoded.sections.find(\n (value) => value.name === \"payment_hash\",\n );\n if (!hashTag || !hashTag.value) return null;\n\n return hashTag.value.toString();\n } catch {\n return null;\n }\n};\n","import Hex from \"crypto-js/enc-hex.js\";\nimport sha256 from \"crypto-js/sha256.js\";\nimport { Event, NostrResponse, ZapArgs, ZapOptions } from \"../types\";\n\nexport async function generateZapEvent(\n { satoshi, comment, p, e, relays }: ZapArgs,\n options: ZapOptions = {},\n): Promise<Event> {\n const nostr = options.nostr || globalThis.nostr;\n if (!nostr) {\n throw new Error(\"nostr option or window.nostr is not available\");\n }\n\n const nostrTags = [\n [\"relays\", ...relays],\n [\"amount\", satoshi.toString()],\n ];\n if (p) {\n nostrTags.push([\"p\", p]);\n }\n if (e) {\n nostrTags.push([\"e\", e]);\n }\n\n const pubkey = await nostr.getPublicKey();\n\n const nostrEvent: Event = {\n pubkey,\n created_at: Math.floor(Date.now() / 1000),\n kind: 9734,\n tags: nostrTags,\n content: comment ?? \"\",\n };\n\n nostrEvent.id = getEventHash(nostrEvent);\n return await nostr.signEvent(nostrEvent);\n}\n\nexport function validateEvent(event: Event): boolean {\n if (typeof event.content !== \"string\") return false;\n if (typeof event.created_at !== \"number\") return false;\n // ignore these checks because if the pubkey is not set we add it to the event. same for the ID.\n // if (typeof event.pubkey !== \"string\") return false;\n // if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false;\n\n if (!Array.isArray(event.tags)) return false;\n for (let i = 0; i < event.tags.length; i++) {\n const tag = event.tags[i];\n if (!Array.isArray(tag)) return false;\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] === \"object\") return false;\n }\n }\n\n return true;\n}\n\nexport function serializeEvent(evt: Event): string {\n if (!validateEvent(evt))\n throw new Error(\"can't serialize event with wrong or missing properties\");\n\n return JSON.stringify([\n 0,\n evt.pubkey,\n evt.created_at,\n evt.kind,\n evt.tags,\n evt.content,\n ]);\n}\n\nexport function getEventHash(event: Event): string {\n return sha256(serializeEvent(event)).toString(Hex);\n}\n\nexport function parseNostrResponse(\n nostrData: NostrResponse,\n username: string | undefined,\n) {\n let nostrPubkey: string | undefined;\n let nostrRelays: string[] | undefined;\n if (username && nostrData) {\n nostrPubkey = nostrData.names?.[username];\n nostrRelays = nostrPubkey ? nostrData.relays?.[nostrPubkey] : undefined;\n }\n\n return [nostrData, nostrPubkey, nostrRelays] as const;\n}\n","import { parseKeysendResponse } from \"./utils/keysend\";\nimport { isUrl, isValidAmount, parseLnUrlPayResponse } from \"./utils/lnurl\";\nimport Invoice from \"./invoice\";\nimport {\n InvoiceArgs,\n LnUrlPayResponse,\n NostrResponse,\n RequestInvoiceArgs,\n ZapArgs,\n ZapOptions,\n} from \"./types\";\nimport { generateZapEvent, parseNostrResponse } from \"./utils/nostr\";\nimport type { Boost } from \"./podcasting2/boostagrams\";\nimport { boost as booster } from \"./podcasting2/boostagrams\";\nimport { WebLNProvider, SendPaymentResponse } from \"@webbtc/webln-types\";\nimport { KeysendResponse } from \"./types\";\n\nconst LN_ADDRESS_REGEX =\n /^((?:[^<>()\\[\\]\\\\.,;:\\s@\"]+(?:\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(?:\".+\"))@((?:\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(?:(?:[a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\nexport const DEFAULT_PROXY = \"https://api.getalby.com/lnurl\";\n\ntype LightningAddressOptions = {\n proxy?: string | false;\n webln?: WebLNProvider;\n};\n\nexport default class LightningAddress {\n address: string;\n options: LightningAddressOptions;\n username: string | undefined;\n domain: string | undefined;\n pubkey: string | undefined;\n lnurlpData: LnUrlPayResponse | undefined;\n keysendData: KeysendResponse | undefined;\n nostrData: NostrResponse | undefined;\n nostrPubkey: string | undefined;\n nostrRelays: string[] | undefined;\n webln: WebLNProvider | undefined;\n\n constructor(address: string, options?: LightningAddressOptions) {\n this.address = address;\n this.options = { proxy: DEFAULT_PROXY };\n this.options = Object.assign(this.options, options);\n this.parse();\n this.webln = this.options.webln;\n }\n\n parse() {\n const result = LN_ADDRESS_REGEX.exec(this.address.toLowerCase());\n if (result) {\n this.username = result[1];\n this.domain = result[2];\n }\n }\n\n getWebLN() {\n return this.webln || globalThis.webln\n }\n\n async fetch() {\n if (this.options.proxy) {\n return this.fetchWithProxy();\n } else {\n return this.fetchWithoutProxy();\n }\n }\n\n async fetchWithProxy() {\n const result = await fetch(\n `${this.options.proxy}/lightning-address-details?${new URLSearchParams({\n ln: this.address,\n }).toString()}`,\n );\n const json = await result.json();\n\n this.parseResponse(json.lnurlp, json.keysend, json.nostr);\n }\n\n async fetchWithoutProxy() {\n if (!this.domain || !this.username) {\n return;\n }\n const lnurlResult = await fetch(this.lnurlpUrl());\n const keysendResult = await fetch(this.keysendUrl());\n const nostrResult = await fetch(this.nostrUrl());\n\n let lnurlData: Record<string, string> | undefined;\n if (lnurlResult.ok) {\n lnurlData = await lnurlResult.json();\n }\n let keysendData: Record<string, string> | undefined;\n if (keysendResult.ok) {\n keysendData = await keysendResult.json();\n }\n let nostrData: NostrResponse | undefined;\n if (nostrResult.ok) {\n nostrData = await nostrResult.json();\n }\n\n this.parseResponse(lnurlData, keysendData, nostrData);\n }\n\n lnurlpUrl() {\n return `https://${this.domain}/.well-known/lnurlp/${this.username}`;\n }\n\n keysendUrl() {\n return `https://${this.domain}/.well-known/keysend/${this.username}`;\n }\n\n nostrUrl() {\n return `https://${this.domain}/.well-known/nostr.json?name=${this.username}`;\n }\n\n async generateInvoice(params: Record<string, string>): Promise<Invoice> {\n let data;\n if (this.options.proxy) {\n const invoiceResult = await fetch(\n `${this.options.proxy}/generate-invoice?${new URLSearchParams({\n ln: this.address,\n ...params,\n }).toString()}`,\n );\n const json = await invoiceResult.json();\n data = json.invoice;\n } else {\n if (!this.lnurlpData) {\n throw new Error(\"No lnurlpData available. Please call fetch() first.\");\n }\n if (!this.lnurlpData.callback || !isUrl(this.lnurlpData.callback))\n throw new Error(\"Valid callback does not exist in lnurlpData\");\n const callbackUrl = new URL(this.lnurlpData.callback);\n callbackUrl.search = new URLSearchParams(params).toString();\n const invoiceResult = await fetch(callbackUrl);\n data = await invoiceResult.json();\n }\n\n const paymentRequest = data && data.pr && data.pr.toString();\n if (!paymentRequest) throw new Error(\"Invalid pay service invoice\");\n\n const invoiceArgs: InvoiceArgs = { pr: paymentRequest };\n if (data && data.verify) invoiceArgs.verify = data.verify.toString();\n\n return new Invoice(invoiceArgs);\n }\n\n async requestInvoice(args: RequestInvoiceArgs): Promise<Invoice> {\n if (!this.lnurlpData) {\n throw new Error(\"No lnurlpData available. Please call fetch() first.\");\n }\n const msat = args.satoshi * 1000;\n const { commentAllowed, min, max } = this.lnurlpData;\n\n if (!isValidAmount({ amount: msat, min, max }))\n throw new Error(\"Invalid amount\");\n if (\n args.comment &&\n commentAllowed &&\n commentAllowed > 0 &&\n args.comment.length > commentAllowed\n )\n throw new Error(\n `The comment length must be ${commentAllowed} characters or fewer`,\n );\n\n const invoiceParams: {\n amount: string;\n comment?: string;\n payerdata?: string;\n } = { amount: msat.toString() };\n if (args.comment) invoiceParams.comment = args.comment;\n if (args.payerdata)\n invoiceParams.payerdata = JSON.stringify(args.payerdata);\n\n return this.generateInvoice(invoiceParams);\n }\n\n async boost(boost: Boost, amount: number = 0) {\n if (!this.keysendData) {\n throw new Error(\"No keysendData available. Please call fetch() first.\");\n }\n const { destination, customKey, customValue } = this.keysendData;\n const webln = this.getWebLN()\n if (!webln) {\n throw new Error(\"WebLN not available\");\n }\n return booster(\n {\n destination,\n customKey,\n customValue,\n amount,\n boost,\n },\n { webln },\n );\n }\n\n async zapInvoice(\n { satoshi, comment, relays, e }: ZapArgs,\n options: ZapOptions = {},\n ): Promise<Invoice> {\n if (!this.lnurlpData) {\n throw new Error(\"No lnurlpData available. Please call fetch() first.\");\n }\n if (!this.nostrPubkey) {\n throw new Error(\"Nostr Pubkey is missing\");\n }\n const p = this.nostrPubkey;\n const msat = satoshi * 1000;\n const { allowsNostr, min, max } = this.lnurlpData;\n\n if (!isValidAmount({ amount: msat, min, max }))\n throw new Error(\"Invalid amount\");\n if (!allowsNostr) throw new Error(\"Your provider does not support zaps\");\n\n const event = await generateZapEvent(\n {\n satoshi: msat,\n comment,\n p,\n e,\n relays,\n },\n options,\n );\n const zapParams: { amount: string; nostr: string } = {\n amount: msat.toString(),\n nostr: JSON.stringify(event),\n };\n\n const invoice = await this.generateInvoice(zapParams);\n return invoice;\n }\n\n async zap(\n args: ZapArgs,\n options: ZapOptions = {},\n ): Promise<SendPaymentResponse> {\n const invoice = this.zapInvoice(args, options);\n const webln = this.getWebLN()\n if (!webln) {\n throw new Error(\"WebLN not available\");\n }\n await webln.enable();\n const response = webln.sendPayment((await invoice).paymentRequest);\n return response;\n }\n\n private parseResponse(\n lnurlpData: Record<string, string> | undefined,\n keysendData: Record<string, string> | undefined,\n nostrData: NostrResponse | undefined,\n ) {\n if (lnurlpData) {\n this.lnurlpData = parseLnUrlPayResponse(lnurlpData);\n }\n if (keysendData) {\n this.keysendData = parseKeysendResponse(keysendData);\n }\n if (nostrData) {\n [this.nostrData, this.nostrPubkey, this.nostrRelays] = parseNostrResponse(\n nostrData,\n this.username,\n );\n }\n }\n}\n","const numSatsInBtc = 100_000_000;\n\nexport const getFiatBtcRate = async (currency: string): Promise<number> => {\n const url =\n \"https://getalby.com/api/rates/\" + currency.toLowerCase() + \".json\";\n const response = await fetch(url);\n const data = await response.json();\n\n return data.rate_float / numSatsInBtc;\n};\n\nexport const getFiatValue = async ({\n satoshi,\n currency,\n}: {\n satoshi: number | string;\n currency: string;\n}) => {\n const rate = await getFiatBtcRate(currency);\n\n return Number(satoshi) * rate;\n};\n\nexport const getSatoshiValue = async ({\n amount,\n currency,\n}: {\n amount: number | string;\n currency: string;\n}) => {\n const rate = await getFiatBtcRate(currency);\n\n return Math.floor(Number(amount) / rate);\n};\n\nexport const getFormattedFiatValue = async ({\n satoshi,\n currency,\n locale,\n}: {\n satoshi: number | string;\n currency: string;\n locale: string;\n}) => {\n if (!locale) {\n locale = \"en\";\n }\n const fiatValue = await getFiatValue({ satoshi, currency });\n return fiatValue.toLocaleString(locale, {\n style: \"currency\",\n currency,\n });\n};\n"],"names":["MemoryStorage","initial","storage","this","getItem","key","setItem","value","NoStorage","memoryStorage","fetchWithL402","url","fetchArgs","options","_exit2","_temp3","_result","headers","headerKey","fetch","then","initResp","header","get","keyValuePairArray","details","replace","split","map","pair","e","trim","_pair$split$map","match","Object","fromEntries","token","macaroon","inv","invoice","Promise","resolve","webln","enable","sendPayment","invResp","store","JSON","stringify","preimage","globalThis","Error","cache","mode","_temp4","cachedL402Data","data","parse","_await$fetch","reject","boost","args","amount","Math","floor","value_msat","weblnParams","destination","customRecords","customKey","customValue","keysend","URL_REGEX","test","_ref","min","max","Invoice","_args$verify","_args$preimage","paymentRequest","paymentHash","verify","pr","decoded","decode","sections","hashTag","find","name","toString","_unused","getHashFromInvoice","isPaid","_this2","validatePreimage","verifyPayment","preimageHash","sha256","Hex","_proto","_this4","result","json","settled","generateZapEvent","satoshi","comment","p","relays","nostr","nostrTags","concat","push","getPublicKey","pubkey","nostrEvent","created_at","Date","now","kind","tags","content","id","getEventHash","signEvent","event","Array","isArray","i","length","tag","j","serializeEvent","evt","validateEvent","parseNostrResponse","nostrData","username","nostrPubkey","nostrRelays","_nostrData$names","names","_nostrData$relays","undefined","LN_ADDRESS_REGEX","LightningAddress","address","domain","lnurlpData","keysendData","proxy","assign","exec","toLowerCase","getWebLN","fetchWithProxy","fetchWithoutProxy","URLSearchParams","ln","parseResponse","lnurlp","_this6","lnurlpUrl","lnurlResult","keysendUrl","keysendResult","nostrUrl","nostrResult","_temp6","_temp2","lnurlData","_temp","ok","_nostrResult$json","_keysendResult$json","_lnurlResult$json","_temp5","generateInvoice","params","_temp9","invoiceArgs","_this8","_extends","invoiceResult","callback","isUrl","callbackUrl","URL","search","_invoiceResult$json","requestInvoice","_this10","msat","_this10$lnurlpData","commentAllowed","isValidAmount","invoiceParams","payerdata","_this12","_this12$keysendData","booster","zapInvoice","_this14","_this14$lnurlpData","allowsNostr","zapParams","zap","_sendPayment","_invoice","metadata","metadataHash","ceil","Number","minSendable","maxSendable","description","_metadata$i","k","v","identifier","image","payerData","hostname","_unused2","fixed","rawData","parseLnUrlPayResponse","status","customData","parseKeysendResponse","_parseNostrResponse","getFiatBtcRate","currency","response","rate_float","getFiatValue","rate","_ref2","_ref3","locale","fiatValue","toLocaleString","style"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,5 +7,5 @@ export * as boostagrams from "./podcasting2/boostagrams";
|
|
|
7
7
|
export * as fiat from "./utils/fiat";
|
|
8
8
|
export * as nostr from "./utils/nostr";
|
|
9
9
|
export { fetchWithL402, sendBoostagram, LightningAddress, Invoice };
|
|
10
|
-
export * from
|
|
10
|
+
export * from "./types";
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.modern.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import t from"crypto-js/enc-hex.js";import e from"crypto-js/sha256.js";import{decode as a}from"light-bolt11-decoder";class r{constructor(t){this.storage=void 0,this.storage=t||{}}getItem(t){return this.storage[t]}setItem(t,e){this.storage[t]=e}}var n={__proto__:null,MemoryStorage:r,NoStorage:class{constructor(t){}getItem(t){return null}setItem(t,e){}},default:r};const s=new r,o=async(t,e,a)=>{a||(a={});const r=a.headerKey||"L402",n=a.webln||globalThis.webln;if(!n)throw new Error("WebLN is missing");let o=a.store||s;e||(e={}),e.cache="no-store",e.mode="cors",e.headers||(e.headers={});const i=o.getItem(t);if(i){const a=JSON.parse(i);return e.headers.Authorization=`${r} ${a.token}:${a.preimage}`,await fetch(t,e)}e.headers["Accept-Authenticate"]=r;const l=await fetch(t,e),c=l.headers.get("www-authenticate");if(!c)return l;const h=(t=>{const e=(t=(t=t.replace("L402","")).replace("LSAT","")).split(",").map(t=>{const[e,a]=t.split("=").map(t=>t.trim());return[e,a.match(/"?([^"]*)"?/)[1]]});return Object.fromEntries(e)})(c),u=h.token||h.macaroon,m=h.invoice;await n.enable();const p=await n.sendPayment(m);return o.setItem(t,JSON.stringify({token:u,preimage:p.preimage})),e.headers.Authorization=`${r} ${u}:${p.preimage}`,await fetch(t,e)};var i={__proto__:null,storage:n,fetchWithL402:o,default:o};const l=async(t,e)=>{let{boost:a,amount:r}=t;e||(e={});const n=e.webln||globalThis.webln;r||(r=Math.floor(a.value_msat/1e3));let s={destination:t.destination,amount:r,customRecords:{7629169:JSON.stringify(a)}};return t.customKey&&t.customValue&&(s.customRecords[t.customKey]=t.customValue),await n.enable(),await n.keysend(s)};var c={__proto__:null,boost:l,default:l};function h(){return h=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var a=arguments[e];for(var r in a)Object.prototype.hasOwnProperty.call(a,r)&&(t[r]=a[r])}return t},h.apply(this,arguments)}const u=/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/,m=t=>!!t&&u.test(t),p=({amount:t,min:e,max:a})=>{const r=t>0&&t>=e&&t<=a;return r&&e===a?t===e:r};class w{constructor(t){var e,r;this.paymentRequest=void 0,this.paymentHash=void 0,this.preimage=void 0,this.verify=void 0,this.paymentRequest=t.pr,this.paymentHash=(t=>{if(!t)return null;try{const e=a(t);if(!e||!e.sections)return null;const r=e.sections.find(t=>"payment_hash"===t.name);return r&&r.value?r.value.toString():null}catch(t){return null}})(this.paymentRequest),this.verify=null!=(e=t.verify)?e:null,this.preimage=null!=(r=t.preimage)?r:null}async isPaid(){if(this.preimage)return this.validatePreimage(this.preimage);if(this.verify)return await this.verifyPayment();throw new Error("Could not verify payment")}validatePreimage(a){if(!a||!this.paymentHash)return!1;try{const r=e(t.parse(a)).toString(t);return this.paymentHash===r}catch(t){return!1}}async verifyPayment(){if(!this.verify)throw new Error("LNURL verify not available");const t=await fetch(this.verify),e=await t.json();return e.preimage&&(this.preimage=e.preimage),e.settled}}async function y({satoshi:t,comment:e,p:a,e:r,relays:n},s={}){const o=s.nostr||globalThis.nostr;if(!o)throw new Error("nostr option or window.nostr is not available");const i=[["relays",...n],["amount",t.toString()]];a&&i.push(["p",a]),r&&i.push(["e",r]);const l={pubkey:await o.getPublicKey(),created_at:Math.floor(Date.now()/1e3),kind:9734,tags:i,content:null!=e?e:""};return l.id=g(l),await o.signEvent(l)}function d(t){if("string"!=typeof t.content)return!1;if("number"!=typeof t.created_at)return!1;if(!Array.isArray(t.tags))return!1;for(let e=0;e<t.tags.length;e++){const a=t.tags[e];if(!Array.isArray(a))return!1;for(let t=0;t<a.length;t++)if("object"==typeof a[t])return!1}return!0}function f(t){if(!d(t))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,t.pubkey,t.created_at,t.kind,t.tags,t.content])}function g(a){return e(f(a)).toString(t)}function v(t,e){let a,r;var n,s;return e&&t&&(a=null==(n=t.names)?void 0:n[e],r=a?null==(s=t.relays)?void 0:s[a]:void 0),[t,a,r]}var b={__proto__:null,generateZapEvent:y,validateEvent:d,serializeEvent:f,getEventHash:g,parseNostrResponse:v};const k=/^((?:[^<>()\[\]\\.,;:\s@"]+(?:\.[^<>()\[\]\\.,;:\s@"]+)*)|(?:".+"))@((?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;class D{constructor(t,e){this.address=void 0,this.options=void 0,this.username=void 0,this.domain=void 0,this.pubkey=void 0,this.lnurlpData=void 0,this.keysendData=void 0,this.nostrData=void 0,this.nostrPubkey=void 0,this.nostrRelays=void 0,this.webln=void 0,this.address=t,this.options={proxy:"https://lnaddressproxy.getalby.com",webln:globalThis.webln},this.options=Object.assign(this.options,e),this.parse(),this.webln=this.options.webln}parse(){const t=k.exec(this.address.toLowerCase());t&&(this.username=t[1],this.domain=t[2])}async fetch(){return this.options.proxy?this.fetchWithProxy():this.fetchWithoutProxy()}async fetchWithProxy(){const t=await fetch(`${this.options.proxy}/lightning-address-details?${new URLSearchParams({ln:this.address}).toString()}`),e=await t.json();this.parseResponse(e.lnurlp,e.keysend,e.nostr)}async fetchWithoutProxy(){if(!this.domain||!this.username)return;const t=await fetch(this.lnurlpUrl()),e=await fetch(this.keysendUrl()),a=await fetch(this.nostrUrl());let r,n,s;t.ok&&(r=await t.json()),e.ok&&(n=await e.json()),a.ok&&(s=await a.json()),this.parseResponse(r,n,s)}lnurlpUrl(){return`https://${this.domain}/.well-known/lnurlp/${this.username}`}keysendUrl(){return`https://${this.domain}/.well-known/keysend/${this.username}`}nostrUrl(){return`https://${this.domain}/.well-known/nostr.json?name=${this.username}`}async generateInvoice(t){let e;if(this.options.proxy){const a=await fetch(`${this.options.proxy}/generate-invoice?${new URLSearchParams(h({ln:this.address},t)).toString()}`);e=(await a.json()).invoice}else{if(!this.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!this.lnurlpData.callback||!m(this.lnurlpData.callback))throw new Error("Valid callback does not exist in lnurlpData");const a=new URL(this.lnurlpData.callback);a.search=new URLSearchParams(t).toString();const r=await fetch(a);e=await r.json()}const a=e&&e.pr&&e.pr.toString();if(!a)throw new Error("Invalid pay service invoice");const r={pr:a};return e&&e.verify&&(r.verify=e.verify.toString()),new w(r)}async requestInvoice(t){if(!this.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");const e=1e3*t.satoshi,{commentAllowed:a,min:r,max:n}=this.lnurlpData;if(!p({amount:e,min:r,max:n}))throw new Error("Invalid amount");if(t.comment&&a&&a>0&&t.comment.length>a)throw new Error(`The comment length must be ${a} characters or fewer`);const s={amount:e.toString()};return t.comment&&(s.comment=t.comment),t.payerdata&&(s.payerdata=JSON.stringify(t.payerdata)),this.generateInvoice(s)}async boost(t,e=0){if(!this.keysendData)throw new Error("No keysendData available. Please call fetch() first.");const{destination:a,customKey:r,customValue:n}=this.keysendData;return l({destination:a,customKey:r,customValue:n,amount:e,boost:t},{webln:this.webln})}async zapInvoice({satoshi:t,comment:e,relays:a,e:r},n={}){if(!this.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!this.nostrPubkey)throw new Error("Nostr Pubkey is missing");const s=this.nostrPubkey,o=1e3*t,{allowsNostr:i,min:l,max:c}=this.lnurlpData;if(!p({amount:o,min:l,max:c}))throw new Error("Invalid amount");if(!i)throw new Error("Your provider does not support zaps");const h=await y({satoshi:o,comment:e,p:s,e:r,relays:a},n),u={amount:o.toString(),nostr:JSON.stringify(h)};return await this.generateInvoice(u)}async zap(t,e={}){const a=this.zapInvoice(t,e);if(!this.webln)throw new Error("WebLN not available");return await this.webln.enable(),this.webln.sendPayment((await a).paymentRequest)}parseResponse(a,r,n){a&&(this.lnurlpData=(a=>{if("payRequest"!==a.tag)throw new Error("Invalid pay service params");const r=(a.callback+"").trim();if(!m(r))throw new Error("Callback must be a valid url");const n=Math.ceil(Number(a.minSendable||0)),s=Math.floor(Number(a.maxSendable));if(!n||!s||n>s)throw new Error("Invalid pay service params");let o,i;try{o=JSON.parse(a.metadata+""),i=e(a.metadata+"").toString(t)}catch(a){o=[],i=e("[]").toString(t)}let l="",c="",h="";for(let t=0;t<o.length;t++){const[e,a]=o[t];switch(e){case"text/plain":c=a;break;case"text/identifier":h=a;break;case"image/png;base64":case"image/jpeg;base64":l="data:"+e+","+a}}let u,p=a.payerData;try{u=new URL(r).hostname}catch(t){}return{callback:r,fixed:n===s,min:n,max:s,domain:u,metadata:o,metadataHash:i,identifier:h,description:c,image:l,payerData:p,commentAllowed:Number(a.commentAllowed)||0,rawData:a,allowsNostr:a.allowsNostr||!1}})(a)),r&&(this.keysendData=(t=>{if("keysend"!==t.tag)throw new Error("Invalid keysend params");if("OK"!==t.status)throw new Error("Keysend status not OK");if(!("customKey"in t.customData[0])||"696969"!=t.customData[0].customKey)throw new Error("Unable to find customKey");if(!("customValue"in t.customData[0])||!t.customData[0].customValue)throw new Error("Unable to find customValue");if(!t.pubkey)throw new Error("Pubkey does not exist");return{destination:t.pubkey,customKey:t.customData[0].customKey,customValue:t.customData[0].customValue}})(r)),n&&([this.nostrData,this.nostrPubkey,this.nostrRelays]=v(n,this.username))}}const E=async t=>{const e="https://getalby.com/api/rates/"+t.toLowerCase()+".json",a=await fetch(e);return(await a.json()).rate_float/1e8},S=async({satoshi:t,currency:e})=>{const a=await E(e);return Number(t)*a};var _={__proto__:null,getFiatBtcRate:E,getFiatValue:S,getSatoshiValue:async({amount:t,currency:e})=>{const a=await E(e);return Math.floor(Number(t)/a)},getFormattedFiatValue:async({satoshi:t,currency:e,locale:a})=>(a||(a="en"),(await S({satoshi:t,currency:e})).toLocaleString(a,{style:"currency",currency:e}))};export{w as Invoice,D as LightningAddress,c as boostagrams,o as fetchWithL402,_ as fiat,i as l402,b as nostr,l as sendBoostagram};
|
|
1
|
+
import t from"crypto-js/enc-hex.js";import e from"crypto-js/sha256.js";import{decode as a}from"light-bolt11-decoder";class r{constructor(t){this.storage=void 0,this.storage=t||{}}getItem(t){return this.storage[t]}setItem(t,e){this.storage[t]=e}}var n={__proto__:null,MemoryStorage:r,NoStorage:class{constructor(t){}getItem(t){return null}setItem(t,e){}},default:r};const s=new r,o=async(t,e,a)=>{a||(a={});const r=a.headerKey||"L402",n=a.webln||globalThis.webln;if(!n)throw new Error("WebLN is missing");let o=a.store||s;e||(e={}),e.cache="no-store",e.mode="cors",e.headers||(e.headers={});const i=o.getItem(t);if(i){const a=JSON.parse(i);return e.headers.Authorization=`${r} ${a.token}:${a.preimage}`,await fetch(t,e)}e.headers["Accept-Authenticate"]=r;const l=await fetch(t,e),c=l.headers.get("www-authenticate");if(!c)return l;const h=(t=>{const e=(t=(t=t.replace("L402","")).replace("LSAT","")).split(",").map(t=>{const[e,a]=t.split("=").map(t=>t.trim());return[e,a.match(/"?([^"]*)"?/)[1]]});return Object.fromEntries(e)})(c),u=h.token||h.macaroon,m=h.invoice;await n.enable();const p=await n.sendPayment(m);return o.setItem(t,JSON.stringify({token:u,preimage:p.preimage})),e.headers.Authorization=`${r} ${u}:${p.preimage}`,await fetch(t,e)};var i={__proto__:null,storage:n,fetchWithL402:o,default:o};const l=async(t,e)=>{let{boost:a,amount:r}=t;e||(e={});const n=e.webln||globalThis.webln;r||(r=Math.floor(a.value_msat/1e3));let s={destination:t.destination,amount:r,customRecords:{7629169:JSON.stringify(a)}};return t.customKey&&t.customValue&&(s.customRecords[t.customKey]=t.customValue),await n.enable(),await n.keysend(s)};var c={__proto__:null,boost:l,default:l};function h(){return h=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var a=arguments[e];for(var r in a)Object.prototype.hasOwnProperty.call(a,r)&&(t[r]=a[r])}return t},h.apply(this,arguments)}const u=/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/,m=t=>!!t&&u.test(t),p=({amount:t,min:e,max:a})=>t>0&&t>=e&&t<=a;class w{constructor(t){var e,r;this.paymentRequest=void 0,this.paymentHash=void 0,this.preimage=void 0,this.verify=void 0,this.paymentRequest=t.pr,this.paymentHash=(t=>{if(!t)return null;try{const e=a(t);if(!e||!e.sections)return null;const r=e.sections.find(t=>"payment_hash"===t.name);return r&&r.value?r.value.toString():null}catch(t){return null}})(this.paymentRequest),this.verify=null!=(e=t.verify)?e:null,this.preimage=null!=(r=t.preimage)?r:null}async isPaid(){if(this.preimage)return this.validatePreimage(this.preimage);if(this.verify)return await this.verifyPayment();throw new Error("Could not verify payment")}validatePreimage(a){if(!a||!this.paymentHash)return!1;try{const r=e(t.parse(a)).toString(t);return this.paymentHash===r}catch(t){return!1}}async verifyPayment(){if(!this.verify)throw new Error("LNURL verify not available");const t=await fetch(this.verify),e=await t.json();return e.preimage&&(this.preimage=e.preimage),e.settled}}async function y({satoshi:t,comment:e,p:a,e:r,relays:n},s={}){const o=s.nostr||globalThis.nostr;if(!o)throw new Error("nostr option or window.nostr is not available");const i=[["relays",...n],["amount",t.toString()]];a&&i.push(["p",a]),r&&i.push(["e",r]);const l={pubkey:await o.getPublicKey(),created_at:Math.floor(Date.now()/1e3),kind:9734,tags:i,content:null!=e?e:""};return l.id=g(l),await o.signEvent(l)}function d(t){if("string"!=typeof t.content)return!1;if("number"!=typeof t.created_at)return!1;if(!Array.isArray(t.tags))return!1;for(let e=0;e<t.tags.length;e++){const a=t.tags[e];if(!Array.isArray(a))return!1;for(let t=0;t<a.length;t++)if("object"==typeof a[t])return!1}return!0}function f(t){if(!d(t))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,t.pubkey,t.created_at,t.kind,t.tags,t.content])}function g(a){return e(f(a)).toString(t)}function v(t,e){let a,r;var n,s;return e&&t&&(a=null==(n=t.names)?void 0:n[e],r=a?null==(s=t.relays)?void 0:s[a]:void 0),[t,a,r]}var b={__proto__:null,generateZapEvent:y,validateEvent:d,serializeEvent:f,getEventHash:g,parseNostrResponse:v};const k=/^((?:[^<>()\[\]\\.,;:\s@"]+(?:\.[^<>()\[\]\\.,;:\s@"]+)*)|(?:".+"))@((?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;class E{constructor(t,e){this.address=void 0,this.options=void 0,this.username=void 0,this.domain=void 0,this.pubkey=void 0,this.lnurlpData=void 0,this.keysendData=void 0,this.nostrData=void 0,this.nostrPubkey=void 0,this.nostrRelays=void 0,this.webln=void 0,this.address=t,this.options={proxy:"https://api.getalby.com/lnurl"},this.options=Object.assign(this.options,e),this.parse(),this.webln=this.options.webln}parse(){const t=k.exec(this.address.toLowerCase());t&&(this.username=t[1],this.domain=t[2])}getWebLN(){return this.webln||globalThis.webln}async fetch(){return this.options.proxy?this.fetchWithProxy():this.fetchWithoutProxy()}async fetchWithProxy(){const t=await fetch(`${this.options.proxy}/lightning-address-details?${new URLSearchParams({ln:this.address}).toString()}`),e=await t.json();this.parseResponse(e.lnurlp,e.keysend,e.nostr)}async fetchWithoutProxy(){if(!this.domain||!this.username)return;const t=await fetch(this.lnurlpUrl()),e=await fetch(this.keysendUrl()),a=await fetch(this.nostrUrl());let r,n,s;t.ok&&(r=await t.json()),e.ok&&(n=await e.json()),a.ok&&(s=await a.json()),this.parseResponse(r,n,s)}lnurlpUrl(){return`https://${this.domain}/.well-known/lnurlp/${this.username}`}keysendUrl(){return`https://${this.domain}/.well-known/keysend/${this.username}`}nostrUrl(){return`https://${this.domain}/.well-known/nostr.json?name=${this.username}`}async generateInvoice(t){let e;if(this.options.proxy){const a=await fetch(`${this.options.proxy}/generate-invoice?${new URLSearchParams(h({ln:this.address},t)).toString()}`);e=(await a.json()).invoice}else{if(!this.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!this.lnurlpData.callback||!m(this.lnurlpData.callback))throw new Error("Valid callback does not exist in lnurlpData");const a=new URL(this.lnurlpData.callback);a.search=new URLSearchParams(t).toString();const r=await fetch(a);e=await r.json()}const a=e&&e.pr&&e.pr.toString();if(!a)throw new Error("Invalid pay service invoice");const r={pr:a};return e&&e.verify&&(r.verify=e.verify.toString()),new w(r)}async requestInvoice(t){if(!this.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");const e=1e3*t.satoshi,{commentAllowed:a,min:r,max:n}=this.lnurlpData;if(!p({amount:e,min:r,max:n}))throw new Error("Invalid amount");if(t.comment&&a&&a>0&&t.comment.length>a)throw new Error(`The comment length must be ${a} characters or fewer`);const s={amount:e.toString()};return t.comment&&(s.comment=t.comment),t.payerdata&&(s.payerdata=JSON.stringify(t.payerdata)),this.generateInvoice(s)}async boost(t,e=0){if(!this.keysendData)throw new Error("No keysendData available. Please call fetch() first.");const{destination:a,customKey:r,customValue:n}=this.keysendData,s=this.getWebLN();if(!s)throw new Error("WebLN not available");return l({destination:a,customKey:r,customValue:n,amount:e,boost:t},{webln:s})}async zapInvoice({satoshi:t,comment:e,relays:a,e:r},n={}){if(!this.lnurlpData)throw new Error("No lnurlpData available. Please call fetch() first.");if(!this.nostrPubkey)throw new Error("Nostr Pubkey is missing");const s=this.nostrPubkey,o=1e3*t,{allowsNostr:i,min:l,max:c}=this.lnurlpData;if(!p({amount:o,min:l,max:c}))throw new Error("Invalid amount");if(!i)throw new Error("Your provider does not support zaps");const h=await y({satoshi:o,comment:e,p:s,e:r,relays:a},n),u={amount:o.toString(),nostr:JSON.stringify(h)};return await this.generateInvoice(u)}async zap(t,e={}){const a=this.zapInvoice(t,e),r=this.getWebLN();if(!r)throw new Error("WebLN not available");return await r.enable(),r.sendPayment((await a).paymentRequest)}parseResponse(a,r,n){a&&(this.lnurlpData=(a=>{if("payRequest"!==a.tag)throw new Error("Invalid pay service params");const r=(a.callback+"").trim();if(!m(r))throw new Error("Callback must be a valid url");const n=Math.ceil(Number(a.minSendable||0)),s=Math.floor(Number(a.maxSendable));if(!n||!s||n>s)throw new Error("Invalid pay service params");let o,i;try{o=JSON.parse(a.metadata+""),i=e(a.metadata+"").toString(t)}catch(a){o=[],i=e("[]").toString(t)}let l="",c="",h="";for(let t=0;t<o.length;t++){const[e,a]=o[t];switch(e){case"text/plain":c=a;break;case"text/identifier":h=a;break;case"image/png;base64":case"image/jpeg;base64":l="data:"+e+","+a}}let u,p=a.payerData;try{u=new URL(r).hostname}catch(t){}return{callback:r,fixed:n===s,min:n,max:s,domain:u,metadata:o,metadataHash:i,identifier:h,description:c,image:l,payerData:p,commentAllowed:Number(a.commentAllowed)||0,rawData:a,allowsNostr:a.allowsNostr||!1}})(a)),r&&(this.keysendData=(t=>{if("keysend"!==t.tag)throw new Error("Invalid keysend params");if("OK"!==t.status)throw new Error("Keysend status not OK");if(!("customKey"in t.customData[0])||"696969"!=t.customData[0].customKey)throw new Error("Unable to find customKey");if(!("customValue"in t.customData[0])||!t.customData[0].customValue)throw new Error("Unable to find customValue");if(!t.pubkey)throw new Error("Pubkey does not exist");return{destination:t.pubkey,customKey:t.customData[0].customKey,customValue:t.customData[0].customValue}})(r)),n&&([this.nostrData,this.nostrPubkey,this.nostrRelays]=v(n,this.username))}}const D=async t=>{const e="https://getalby.com/api/rates/"+t.toLowerCase()+".json",a=await fetch(e);return(await a.json()).rate_float/1e8},S=async({satoshi:t,currency:e})=>{const a=await D(e);return Number(t)*a};var N={__proto__:null,getFiatBtcRate:D,getFiatValue:S,getSatoshiValue:async({amount:t,currency:e})=>{const a=await D(e);return Math.floor(Number(t)/a)},getFormattedFiatValue:async({satoshi:t,currency:e,locale:a})=>(a||(a="en"),(await S({satoshi:t,currency:e})).toLocaleString(a,{style:"currency",currency:e}))};export{w as Invoice,E as LightningAddress,c as boostagrams,o as fetchWithL402,N as fiat,i as l402,b as nostr,l as sendBoostagram};
|
|
2
2
|
//# sourceMappingURL=index.modern.js.map
|