@lightsparkdev/core 1.0.5 → 1.0.6

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.
@@ -30,21 +30,38 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/utils/index.ts
31
31
  var utils_exports = {};
32
32
  __export(utils_exports, {
33
+ CurrencyUnit: () => CurrencyUnit,
34
+ abbrCurrencyUnit: () => abbrCurrencyUnit,
33
35
  b64decode: () => b64decode,
34
36
  b64encode: () => b64encode,
35
37
  bytesToHex: () => bytesToHex,
38
+ clamp: () => clamp,
36
39
  convertCurrencyAmount: () => convertCurrencyAmount,
40
+ convertCurrencyAmountValue: () => convertCurrencyAmountValue,
41
+ countryCodesToCurrencyCodes: () => countryCodesToCurrencyCodes,
37
42
  createSha256Hash: () => createSha256Hash,
43
+ defaultCurrencyCode: () => defaultCurrencyCode,
44
+ formatCurrencyStr: () => formatCurrencyStr,
45
+ getCurrentLocale: () => getCurrentLocale,
38
46
  getErrorMsg: () => getErrorMsg,
39
47
  hexToBytes: () => hexToBytes,
40
48
  isBrowser: () => isBrowser,
49
+ isCurrencyAmount: () => isCurrencyAmount,
50
+ isCurrencyAmountObj: () => isCurrencyAmountObj,
51
+ isCurrencyMap: () => isCurrencyMap,
41
52
  isError: () => isError,
42
53
  isErrorMsg: () => isErrorMsg,
43
54
  isErrorWithMessage: () => isErrorWithMessage,
44
55
  isNode: () => isNode,
56
+ isNumber: () => isNumber,
45
57
  isTest: () => isTest,
46
58
  isType: () => isType,
59
+ linearInterpolate: () => linearInterpolate,
60
+ localeToCurrencyCode: () => localeToCurrencyCode,
61
+ localeToCurrencySymbol: () => localeToCurrencySymbol,
62
+ mapCurrencyAmount: () => mapCurrencyAmount,
47
63
  pollUntil: () => pollUntil,
64
+ round: () => round,
48
65
  sleep: () => sleep,
49
66
  urlsafe_b64decode: () => urlsafe_b64decode
50
67
  });
@@ -147,7 +164,314 @@ var LightsparkException = class extends Error {
147
164
  };
148
165
  var LightsparkException_default = LightsparkException;
149
166
 
167
+ // src/utils/locale.ts
168
+ function getCurrentLocale() {
169
+ return Intl.NumberFormat().resolvedOptions().locale;
170
+ }
171
+
172
+ // src/utils/localeToCurrencyCodes.ts
173
+ var countryCodesToCurrencyCodes = {
174
+ AD: "EUR",
175
+ // AE: "AED",
176
+ // AF: "AFN",
177
+ // AG: "XCD",
178
+ // AI: "XCD",
179
+ // AL: "ALL",
180
+ // AM: "AMD",
181
+ // AO: "AOA",
182
+ AR: "ARS",
183
+ AS: "USD",
184
+ AT: "EUR",
185
+ AU: "AUD",
186
+ // AW: "AWG",
187
+ AX: "EUR",
188
+ // AZ: "AZN",
189
+ // BA: "BAM",
190
+ // BB: "BBD",
191
+ // BD: "BDT",
192
+ BE: "EUR",
193
+ // BF: "XOF",
194
+ // BG: "BGN",
195
+ // BH: "BHD",
196
+ // BI: "BIF",
197
+ // BJ: "XOF",
198
+ BL: "EUR",
199
+ // BM: "BMD",
200
+ // BN: "BND",
201
+ // BO: "BOB",
202
+ BQ: "USD",
203
+ BR: "BRL",
204
+ // BS: "BSD",
205
+ // BT: "BTN",
206
+ // BV: "NOK",
207
+ // BW: "BWP",
208
+ // BY: "BYN",
209
+ // BZ: "BZD",
210
+ CA: "CAD",
211
+ // CC: "AUD",
212
+ // CD: "CDF",
213
+ // CF: "XAF",
214
+ // CG: "XAF",
215
+ // CH: "CHF",
216
+ // CI: "XOF",
217
+ // CK: "NZD",
218
+ // CL: "CLP",
219
+ // CM: "XAF",
220
+ // CN: "CNY",
221
+ CO: "COP",
222
+ // CR: "CRC",
223
+ // CU: "CUP",
224
+ // CV: "CVE",
225
+ // CW: "ANG",
226
+ // CX: "AUD",
227
+ CY: "EUR",
228
+ // CZ: "CZK",
229
+ DE: "EUR",
230
+ // DJ: "DJF",
231
+ // DK: "DKK",
232
+ // DM: "XCD",
233
+ // DO: "DOP",
234
+ // DZ: "DZD",
235
+ EC: "USD",
236
+ EE: "EUR",
237
+ // EG: "EGP",
238
+ // EH: "MAD",
239
+ // ER: "ERN",
240
+ ES: "EUR",
241
+ // ET: "ETB",
242
+ FI: "EUR",
243
+ // FJ: "FJD",
244
+ // FK: "FKP",
245
+ FM: "USD",
246
+ // FO: "DKK",
247
+ FR: "EUR",
248
+ // GA: "XAF",
249
+ GB: "GBP",
250
+ // GD: "XCD",
251
+ // GE: "GEL",
252
+ GF: "EUR",
253
+ GG: "GBP",
254
+ // GH: "GHS",
255
+ // GI: "GIP",
256
+ // GL: "DKK",
257
+ // GM: "GMD",
258
+ // GN: "GNF",
259
+ GP: "EUR",
260
+ // GQ: "XAF",
261
+ GR: "EUR",
262
+ GS: "GBP",
263
+ // GT: "GTQ",
264
+ GU: "USD",
265
+ // GW: "XOF",
266
+ // GY: "GYD",
267
+ // HK: "HKD",
268
+ // HM: "AUD",
269
+ // HN: "HNL",
270
+ // HR: "HRK",
271
+ // HT: "HTG",
272
+ // HU: "HUF",
273
+ // ID: "IDR",
274
+ IE: "EUR",
275
+ // IL: "ILS",
276
+ IM: "GBP",
277
+ IN: "INR",
278
+ IO: "USD",
279
+ // IQ: "IQD",
280
+ // IR: "IRR",
281
+ // IS: "ISK",
282
+ IT: "EUR",
283
+ JE: "GBP",
284
+ // JM: "JMD",
285
+ // JO: "JOD",
286
+ // JP: "JPY",
287
+ // KE: "KES",
288
+ // KG: "KGS",
289
+ // KH: "KHR",
290
+ // KI: "AUD",
291
+ // KM: "KMF",
292
+ // KN: "XCD",
293
+ // KP: "KPW",
294
+ // KR: "KRW",
295
+ // KW: "KWD",
296
+ // KY: "KYD",
297
+ // KZ: "KZT",
298
+ // LA: "LAK",
299
+ // LB: "LBP",
300
+ // LC: "XCD",
301
+ // LI: "CHF",
302
+ // LK: "LKR",
303
+ // LR: "LRD",
304
+ // LS: "LSL",
305
+ LT: "EUR",
306
+ LU: "EUR",
307
+ LV: "EUR",
308
+ // LY: "LYD",
309
+ // MA: "MAD",
310
+ MC: "EUR",
311
+ // MD: "MDL",
312
+ ME: "EUR",
313
+ MF: "EUR",
314
+ // MG: "MGA",
315
+ MH: "USD",
316
+ // MK: "MKD",
317
+ // ML: "XOF",
318
+ // MM: "MMK",
319
+ // MN: "MNT",
320
+ // MO: "MOP",
321
+ MP: "USD",
322
+ MQ: "EUR",
323
+ // MR: "MRO",
324
+ // MS: "XCD",
325
+ MT: "EUR",
326
+ // MU: "MUR",
327
+ // MV: "MVR",
328
+ // MW: "MWK",
329
+ MX: "MXN",
330
+ // MY: "MYR",
331
+ // MZ: "MZN",
332
+ // NA: "NAD",
333
+ // NC: "XPF",
334
+ // NE: "XOF",
335
+ NF: "AUD",
336
+ // NG: "NGN",
337
+ // NI: "NIO",
338
+ NL: "EUR",
339
+ // NO: "NOK",
340
+ // NP: "NPR",
341
+ NR: "AUD",
342
+ // NU: "NZD",
343
+ // NZ: "NZD",
344
+ // OM: "OMR",
345
+ // PA: "PAB",
346
+ // PE: "PEN",
347
+ // PF: "XPF",
348
+ // PG: "PGK",
349
+ // PH: "PHP",
350
+ // PK: "PKR",
351
+ // PL: "PLN",
352
+ PM: "EUR",
353
+ // PN: "NZD",
354
+ PR: "USD",
355
+ // PS: "ILS",
356
+ PT: "EUR",
357
+ PW: "USD",
358
+ // PY: "PYG",
359
+ // QA: "QAR",
360
+ RE: "EUR",
361
+ // RO: "RON",
362
+ // RS: "RSD",
363
+ // RU: "RUB",
364
+ // RW: "RWF",
365
+ // SA: "SAR",
366
+ // SB: "SBD",
367
+ // SC: "SCR",
368
+ // SD: "SDG",
369
+ // SE: "SEK",
370
+ // SG: "SGD",
371
+ // SH: "SHP",
372
+ SI: "EUR",
373
+ // SJ: "NOK",
374
+ SK: "EUR",
375
+ // SL: "SLL",
376
+ SM: "EUR",
377
+ // SN: "XOF",
378
+ // SO: "SOS",
379
+ // SR: "SRD",
380
+ // ST: "STD",
381
+ // SV: "SVC",
382
+ // SX: "ANG",
383
+ // SY: "SYP",
384
+ // SZ: "SZL",
385
+ TC: "USD",
386
+ // TD: "XAF",
387
+ TF: "EUR",
388
+ // TG: "XOF",
389
+ // TH: "THB",
390
+ // TJ: "TJS",
391
+ // TK: "NZD",
392
+ TL: "USD",
393
+ // TM: "TMT",
394
+ // TN: "TND",
395
+ // TO: "TOP",
396
+ // TR: "TRY",
397
+ // TT: "TTD",
398
+ TV: "AUD",
399
+ // TW: "TWD",
400
+ // TZ: "TZS",
401
+ // UA: "UAH",
402
+ // UG: "UGX",
403
+ UM: "USD",
404
+ US: "USD",
405
+ // UY: "UYU",
406
+ // UZ: "UZS",
407
+ VA: "EUR",
408
+ // VC: "XCD",
409
+ // VE: "VEF",
410
+ VG: "USD",
411
+ VI: "USD",
412
+ // VN: "VND",
413
+ // VU: "VUV",
414
+ // WF: "XPF",
415
+ // WS: "WST",
416
+ // YE: "YER",
417
+ YT: "EUR"
418
+ // ZA: "ZAR",
419
+ // ZM: "ZMW",
420
+ // ZW: "ZWL",
421
+ };
422
+ function getCountryCode(localeString) {
423
+ let components = localeString.split("_");
424
+ if (components.length === 2) {
425
+ return components.pop();
426
+ }
427
+ components = localeString.split("-");
428
+ if (components.length === 2) {
429
+ return components.pop();
430
+ }
431
+ return localeString;
432
+ }
433
+ function localeToCurrencyCode(locale) {
434
+ const countryCode = getCountryCode(locale);
435
+ return countryCodesToCurrencyCodes[countryCode];
436
+ }
437
+
438
+ // src/utils/numbers.ts
439
+ function clamp(val, min, max) {
440
+ return val > max ? max : val < min ? min : val;
441
+ }
442
+ function linearInterpolate(value, fromRangeStart, fromRangeEnd, toRangeStart, toRangeEnd) {
443
+ const fromRangeMax = fromRangeEnd - fromRangeStart;
444
+ const fromRangeVal = value - fromRangeStart;
445
+ const toRangeMax = toRangeEnd - toRangeStart;
446
+ const val = fromRangeVal / fromRangeMax * toRangeMax + toRangeStart;
447
+ return clamp(
448
+ val,
449
+ Math.min(toRangeStart, toRangeEnd),
450
+ Math.max(toRangeStart, toRangeEnd)
451
+ );
452
+ }
453
+ function round(num, decimalPlaces = 0) {
454
+ const p = Math.pow(10, decimalPlaces);
455
+ const n = num * p * (1 + Number.EPSILON);
456
+ return Math.round(n) / p;
457
+ }
458
+ function isNumber(value) {
459
+ return typeof value === "number";
460
+ }
461
+
150
462
  // src/utils/currency.ts
463
+ var defaultCurrencyCode = "USD";
464
+ var CurrencyUnit = /* @__PURE__ */ ((CurrencyUnit2) => {
465
+ CurrencyUnit2["FUTURE_VALUE"] = "FUTURE_VALUE";
466
+ CurrencyUnit2["BITCOIN"] = "BITCOIN";
467
+ CurrencyUnit2["SATOSHI"] = "SATOSHI";
468
+ CurrencyUnit2["MILLISATOSHI"] = "MILLISATOSHI";
469
+ CurrencyUnit2["USD"] = "USD";
470
+ CurrencyUnit2["NANOBITCOIN"] = "NANOBITCOIN";
471
+ CurrencyUnit2["MICROBITCOIN"] = "MICROBITCOIN";
472
+ CurrencyUnit2["MILLIBITCOIN"] = "MILLIBITCOIN";
473
+ return CurrencyUnit2;
474
+ })(CurrencyUnit || {});
151
475
  var CONVERSION_MAP = {
152
476
  ["BITCOIN" /* BITCOIN */]: {
153
477
  ["BITCOIN" /* BITCOIN */]: (v) => v,
@@ -155,67 +479,298 @@ var CONVERSION_MAP = {
155
479
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v * 1e3,
156
480
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e11,
157
481
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e9,
158
- ["SATOSHI" /* SATOSHI */]: (v) => v * 1e8
482
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 1e8,
483
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
484
+ /* Round without decimals since we're returning cents: */
485
+ round(v * centsPerBtc, 2)
486
+ )
159
487
  },
160
488
  ["MICROBITCOIN" /* MICROBITCOIN */]: {
161
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e6),
489
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e6,
162
490
  ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v,
163
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e3),
491
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e3,
164
492
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e5,
165
493
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e3,
166
- ["SATOSHI" /* SATOSHI */]: (v) => v * 100
494
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 100,
495
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
496
+ /* Round without decimals since we're returning cents: */
497
+ round(v / 1e6 * centsPerBtc)
498
+ )
167
499
  },
168
500
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: {
169
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e3),
501
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e3,
170
502
  ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v * 1e3,
171
503
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v,
172
504
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e8,
173
505
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e6,
174
- ["SATOSHI" /* SATOSHI */]: (v) => v * 1e5
506
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 1e5,
507
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
508
+ /* Round without decimals since we're returning cents: */
509
+ round(v / 1e3 * centsPerBtc)
510
+ )
175
511
  },
176
512
  ["MILLISATOSHI" /* MILLISATOSHI */]: {
177
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e11),
178
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 1e5),
179
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e8),
513
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e11,
514
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 1e5,
515
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e8,
180
516
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v,
181
- ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => Math.round(v / 100),
182
- ["SATOSHI" /* SATOSHI */]: (v) => Math.round(v / 1e3)
517
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v / 100,
518
+ ["SATOSHI" /* SATOSHI */]: (v) => v / 1e3,
519
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
520
+ /* Round without decimals since we're returning cents: */
521
+ round(v / 1e11 * centsPerBtc)
522
+ )
183
523
  },
184
524
  ["NANOBITCOIN" /* NANOBITCOIN */]: {
185
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e9),
186
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 1e3),
187
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e6),
525
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e9,
526
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 1e3,
527
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e6,
188
528
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 100,
189
529
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v,
190
- ["SATOSHI" /* SATOSHI */]: (v) => Math.round(v / 10)
530
+ ["SATOSHI" /* SATOSHI */]: (v) => v / 10,
531
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
532
+ /* Round without decimals since we're returning cents: */
533
+ round(v / 1e9 * centsPerBtc)
534
+ )
191
535
  },
192
536
  ["SATOSHI" /* SATOSHI */]: {
193
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e8),
194
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 100),
195
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e5),
537
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e8,
538
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 100,
539
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e5,
196
540
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e3,
197
541
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 10,
198
- ["SATOSHI" /* SATOSHI */]: (v) => v
542
+ ["SATOSHI" /* SATOSHI */]: (v) => v,
543
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
544
+ /* Round without decimals since we're returning cents: */
545
+ round(v / 1e8 * centsPerBtc)
546
+ )
547
+ },
548
+ ["USD" /* USD */]: {
549
+ ["BITCOIN" /* BITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc,
550
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e6,
551
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e3,
552
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e11,
553
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e9,
554
+ ["SATOSHI" /* SATOSHI */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e8,
555
+ ["USD" /* USD */]: (v) => v
199
556
  }
200
557
  };
201
- var convertCurrencyAmount = (from, toUnit) => {
202
- if (from.originalUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || from.originalUnit === "USD" /* USD */ || toUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || toUnit === "USD" /* USD */) {
558
+ function convertCurrencyAmountValue(fromUnit, toUnit, amount, centsPerBtc = 1) {
559
+ if (fromUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || toUnit === "FUTURE_VALUE" /* FUTURE_VALUE */) {
203
560
  throw new LightsparkException_default("CurrencyError", `Unsupported CurrencyUnit.`);
204
561
  }
205
- const conversionFn = CONVERSION_MAP[from.originalUnit][toUnit];
562
+ if (fromUnit === toUnit) {
563
+ return amount;
564
+ }
565
+ const conversionFn = CONVERSION_MAP[fromUnit][toUnit];
206
566
  if (!conversionFn) {
207
567
  throw new LightsparkException_default(
208
568
  "CurrencyError",
209
- `Cannot convert from ${from.originalUnit} to ${toUnit}`
569
+ `Cannot convert from ${fromUnit} to ${toUnit}`
210
570
  );
211
571
  }
572
+ return conversionFn(amount, centsPerBtc);
573
+ }
574
+ var convertCurrencyAmount = (from, toUnit) => {
575
+ const value = convertCurrencyAmountValue(
576
+ from.originalUnit,
577
+ toUnit,
578
+ from.originalValue
579
+ );
212
580
  return {
213
581
  ...from,
214
582
  preferredCurrencyUnit: toUnit,
215
- preferredCurrencyValueApprox: conversionFn(from.originalValue),
216
- preferredCurrencyValueRounded: conversionFn(from.originalValue)
583
+ preferredCurrencyValueApprox: value,
584
+ preferredCurrencyValueRounded: value
585
+ };
586
+ };
587
+ function isCurrencyAmountObj(arg) {
588
+ return typeof arg === "object" && arg !== null && "value" in arg && "unit" in arg;
589
+ }
590
+ function isCurrencyAmount(arg) {
591
+ return typeof arg === "object" && arg !== null && "originalValue" in arg && "originalUnit" in arg && "preferredCurrencyUnit" in arg && "preferredCurrencyValueRounded" in arg && "preferredCurrencyValueApprox" in arg;
592
+ }
593
+ function asNumber(value) {
594
+ if (typeof value === "string") {
595
+ return Number(value);
596
+ }
597
+ return value || 0;
598
+ }
599
+ function getCurrencyAmount(currencyAmountArg) {
600
+ let value = 0;
601
+ let unit = void 0;
602
+ if (isCurrencyAmountObj(currencyAmountArg)) {
603
+ value = asNumber(currencyAmountArg.value);
604
+ unit = currencyAmountArg.unit;
605
+ } else if (isCurrencyAmount(currencyAmountArg)) {
606
+ value = currencyAmountArg.originalValue;
607
+ unit = currencyAmountArg.originalUnit;
608
+ }
609
+ return {
610
+ value: asNumber(value),
611
+ unit: unit || "SATOSHI" /* SATOSHI */
612
+ };
613
+ }
614
+ function mapCurrencyAmount(currencyAmountArg, centsPerBtc = 1) {
615
+ const { value, unit } = getCurrencyAmount(currencyAmountArg);
616
+ const convert = convertCurrencyAmountValue;
617
+ const sats = convert(unit, "SATOSHI" /* SATOSHI */, value, centsPerBtc);
618
+ const btc = convert(unit, "BITCOIN" /* BITCOIN */, value, centsPerBtc);
619
+ const msats = convert(unit, "MILLISATOSHI" /* MILLISATOSHI */, value, centsPerBtc);
620
+ const usd = convert(unit, "USD" /* USD */, value, centsPerBtc);
621
+ const mibtc = convert(unit, "MICROBITCOIN" /* MICROBITCOIN */, value, centsPerBtc);
622
+ const mlbtc = convert(unit, "MILLIBITCOIN" /* MILLIBITCOIN */, value, centsPerBtc);
623
+ const nbtc = convert(unit, "NANOBITCOIN" /* NANOBITCOIN */, value, centsPerBtc);
624
+ const mapWithCurrencyUnits = {
625
+ ["BITCOIN" /* BITCOIN */]: btc,
626
+ ["SATOSHI" /* SATOSHI */]: sats,
627
+ ["MILLISATOSHI" /* MILLISATOSHI */]: msats,
628
+ ["USD" /* USD */]: usd,
629
+ ["MICROBITCOIN" /* MICROBITCOIN */]: mibtc,
630
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: mlbtc,
631
+ ["NANOBITCOIN" /* NANOBITCOIN */]: nbtc,
632
+ ["FUTURE_VALUE" /* FUTURE_VALUE */]: NaN,
633
+ formatted: {
634
+ ["BITCOIN" /* BITCOIN */]: formatCurrencyStr({
635
+ value: btc,
636
+ unit: "BITCOIN" /* BITCOIN */
637
+ }),
638
+ ["SATOSHI" /* SATOSHI */]: formatCurrencyStr({
639
+ value: sats,
640
+ unit: "SATOSHI" /* SATOSHI */
641
+ }),
642
+ ["MILLISATOSHI" /* MILLISATOSHI */]: formatCurrencyStr({
643
+ value: msats,
644
+ unit: "MILLISATOSHI" /* MILLISATOSHI */
645
+ }),
646
+ ["MICROBITCOIN" /* MICROBITCOIN */]: formatCurrencyStr({
647
+ value: mibtc,
648
+ unit: "MICROBITCOIN" /* MICROBITCOIN */
649
+ }),
650
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: formatCurrencyStr({
651
+ value: mlbtc,
652
+ unit: "MILLIBITCOIN" /* MILLIBITCOIN */
653
+ }),
654
+ ["NANOBITCOIN" /* NANOBITCOIN */]: formatCurrencyStr({
655
+ value: nbtc,
656
+ unit: "NANOBITCOIN" /* NANOBITCOIN */
657
+ }),
658
+ ["USD" /* USD */]: formatCurrencyStr({
659
+ value: usd,
660
+ unit: "USD" /* USD */
661
+ }),
662
+ ["FUTURE_VALUE" /* FUTURE_VALUE */]: "-"
663
+ }
217
664
  };
665
+ return {
666
+ ...mapWithCurrencyUnits,
667
+ btc,
668
+ sats,
669
+ msats,
670
+ isZero: msats === 0,
671
+ isLessThan: (other) => {
672
+ if (isNumber(other)) {
673
+ return msats < other;
674
+ }
675
+ if (isCurrencyAmountObj(other)) {
676
+ other = mapCurrencyAmount(other);
677
+ }
678
+ return msats < other.msats;
679
+ },
680
+ isGreaterThan: (other) => {
681
+ if (isNumber(other)) {
682
+ return msats > other;
683
+ }
684
+ if (isCurrencyAmountObj(other)) {
685
+ other = mapCurrencyAmount(other);
686
+ }
687
+ return msats > other.msats;
688
+ },
689
+ isEqualTo: (other) => {
690
+ if (isNumber(other)) {
691
+ return msats === other;
692
+ }
693
+ if (isCurrencyAmountObj(other)) {
694
+ other = mapCurrencyAmount(other);
695
+ }
696
+ return msats === other.msats;
697
+ },
698
+ formatted: {
699
+ ...mapWithCurrencyUnits.formatted,
700
+ btc: mapWithCurrencyUnits.formatted["BITCOIN" /* BITCOIN */],
701
+ sats: mapWithCurrencyUnits.formatted["SATOSHI" /* SATOSHI */],
702
+ msats: mapWithCurrencyUnits.formatted["MILLISATOSHI" /* MILLISATOSHI */]
703
+ },
704
+ type: "CurrencyMap"
705
+ };
706
+ }
707
+ var isCurrencyMap = (currencyMap) => typeof currencyMap === "object" && currencyMap !== null && "type" in currencyMap && typeof currencyMap.type === "string" && currencyMap.type === "CurrencyMap";
708
+ var abbrCurrencyUnit = (unit) => {
709
+ switch (unit) {
710
+ case "BITCOIN" /* BITCOIN */:
711
+ return "BTC";
712
+ case "SATOSHI" /* SATOSHI */:
713
+ return "SAT";
714
+ case "MILLISATOSHI" /* MILLISATOSHI */:
715
+ return "MSAT";
716
+ case "USD" /* USD */:
717
+ return "USD";
718
+ }
719
+ return "Unsupported CurrencyUnit";
218
720
  };
721
+ function formatCurrencyStr(amount, maxFractionDigits, compact, showBtcSymbol = false, options = {}) {
722
+ const currencyAmount = getCurrencyAmount(amount);
723
+ let { value: num } = currencyAmount;
724
+ const { unit } = currencyAmount;
725
+ if (unit === "USD" /* USD */) {
726
+ num = num / 100;
727
+ }
728
+ function getDefaultMaxFractionDigits(defaultDigits) {
729
+ return typeof maxFractionDigits === "undefined" ? compact ? 1 : defaultDigits : maxFractionDigits;
730
+ }
731
+ const symbol = !showBtcSymbol ? "" : unit === "BITCOIN" /* BITCOIN */ ? "\uE903" : unit === "SATOSHI" /* SATOSHI */ ? "\uE902" : "";
732
+ const currentLocale = getCurrentLocale();
733
+ switch (unit) {
734
+ case "BITCOIN" /* BITCOIN */:
735
+ return `${symbol}${num.toLocaleString(currentLocale, {
736
+ notation: compact ? "compact" : void 0,
737
+ maximumFractionDigits: getDefaultMaxFractionDigits(4),
738
+ ...options
739
+ })}`;
740
+ case "MILLISATOSHI" /* MILLISATOSHI */:
741
+ case "SATOSHI" /* SATOSHI */:
742
+ case "MICROBITCOIN" /* MICROBITCOIN */:
743
+ case "MILLIBITCOIN" /* MILLIBITCOIN */:
744
+ case "NANOBITCOIN" /* NANOBITCOIN */:
745
+ default:
746
+ return `${symbol}${num.toLocaleString(currentLocale, {
747
+ notation: compact ? "compact" : void 0,
748
+ maximumFractionDigits: getDefaultMaxFractionDigits(0),
749
+ ...options
750
+ })}`;
751
+ case "USD" /* USD */:
752
+ return num.toLocaleString(currentLocale, {
753
+ style: "currency",
754
+ currency: defaultCurrencyCode,
755
+ notation: compact ? "compact" : void 0,
756
+ maximumFractionDigits: getDefaultMaxFractionDigits(2),
757
+ ...options
758
+ });
759
+ }
760
+ }
761
+ function localeToCurrencySymbol(locale) {
762
+ const currencyCode = localeToCurrencyCode(locale);
763
+ const formatted = new Intl.NumberFormat(locale, {
764
+ style: "currency",
765
+ currency: currencyCode,
766
+ useGrouping: false,
767
+ // to avoid thousands separators
768
+ minimumFractionDigits: 0,
769
+ maximumFractionDigits: 0
770
+ }).format(0);
771
+ const symbol = formatted.replace(/[0-9\s\u00a0]/g, "");
772
+ return symbol;
773
+ }
219
774
 
220
775
  // src/utils/errors.ts
221
776
  var isError = (e) => {
@@ -366,21 +921,38 @@ var isType = (typename) => (node) => {
366
921
  };
367
922
  // Annotate the CommonJS export names for ESM import in node:
368
923
  0 && (module.exports = {
924
+ CurrencyUnit,
925
+ abbrCurrencyUnit,
369
926
  b64decode,
370
927
  b64encode,
371
928
  bytesToHex,
929
+ clamp,
372
930
  convertCurrencyAmount,
931
+ convertCurrencyAmountValue,
932
+ countryCodesToCurrencyCodes,
373
933
  createSha256Hash,
934
+ defaultCurrencyCode,
935
+ formatCurrencyStr,
936
+ getCurrentLocale,
374
937
  getErrorMsg,
375
938
  hexToBytes,
376
939
  isBrowser,
940
+ isCurrencyAmount,
941
+ isCurrencyAmountObj,
942
+ isCurrencyMap,
377
943
  isError,
378
944
  isErrorMsg,
379
945
  isErrorWithMessage,
380
946
  isNode,
947
+ isNumber,
381
948
  isTest,
382
949
  isType,
950
+ linearInterpolate,
951
+ localeToCurrencyCode,
952
+ localeToCurrencySymbol,
953
+ mapCurrencyAmount,
383
954
  pollUntil,
955
+ round,
384
956
  sleep,
385
957
  urlsafe_b64decode
386
958
  });