@omnisat/lasereyes 0.0.7 → 0.0.9

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 CHANGED
@@ -7,14 +7,13 @@
7
7
  </a>
8
8
  </p>
9
9
 
10
- <p align="center">
11
- <a href="https://www.npmjs.com/package/@omnisat/lasereyes">
12
- <picture>
13
- <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/npm/v/@omnisat/lasereyes?colorA=21262d&colorB=21262d">
14
- <img src="https://img.shields.io/npm/v/@omnisat/lasereyes?colorA=f6f8fa&colorB=f6f8fa" alt="Version">
15
- </picture>
16
- </a>
17
- </p>
10
+ # lasereyes
11
+
12
+ A common wallet interface for building React applications on Bitcoin.
13
+
14
+ ![Version](https://img.shields.io/npm/v/@omnisat/lasereyes)
15
+ ![license](https://img.shields.io/github/license/omnisat/lasereyes.svg?style=flat-square)
16
+
18
17
 
19
18
  ---
20
19
 
package/dist/index.js CHANGED
@@ -60,6 +60,15 @@ var __async = (__this, __arguments, generator) => {
60
60
  step((generator = generator.apply(__this, __arguments)).next());
61
61
  });
62
62
  };
63
+ var __forAwait = (obj, it, method) => {
64
+ it = obj[Symbol.asyncIterator];
65
+ method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((resolve, reject, done) => {
66
+ arg = fn.call(obj, arg);
67
+ done = arg.done;
68
+ return Promise.resolve(arg.value).then((value) => resolve({ value, done }), reject);
69
+ }));
70
+ return it ? it.call(obj) : (obj = obj[Symbol.iterator](), it = {}, method("next"), method("return"), it);
71
+ };
63
72
 
64
73
  // src/index.tsx
65
74
  var src_exports = {};
@@ -73,6 +82,7 @@ __export(src_exports, {
73
82
  MEMPOOL_SPACE_URL: () => MEMPOOL_SPACE_URL,
74
83
  OYL: () => OYL,
75
84
  P2PKH: () => P2PKH,
85
+ P2PSH: () => P2PSH,
76
86
  P2SH: () => P2SH,
77
87
  P2TR: () => P2TR,
78
88
  P2WPKH: () => P2WPKH,
@@ -91,6 +101,7 @@ __export(src_exports, {
91
101
  createConfig: () => createConfig,
92
102
  findOrdinalsAddress: () => findOrdinalsAddress,
93
103
  findPaymentAddress: () => findPaymentAddress,
104
+ getAddressType: () => getAddressType,
94
105
  getBTCBalance: () => getBTCBalance,
95
106
  getBitcoinNetwork: () => getBitcoinNetwork,
96
107
  getLeatherNetwork: () => getLeatherNetwork,
@@ -173,6 +184,7 @@ var LEATHER = "leather";
173
184
  var P2TR = "p2tr";
174
185
  var P2PKH = "p2pkh";
175
186
  var P2WPKH = "p2wpkh";
187
+ var P2PSH = "p2psh";
176
188
  var P2WSH = "p2wsh";
177
189
  var P2SH = "p2sh";
178
190
  var WALLETS = {
@@ -218,10 +230,8 @@ var bitcoin2 = __toESM(require("bitcoinjs-lib"));
218
230
  // src/consts/settings.ts
219
231
  var LOCAL_STORAGE_DEFAULT_WALLET = "defaultWallet";
220
232
  var initialWalletContext = {
221
- hasOyl: false,
222
233
  hasUnisat: false,
223
234
  hasXverse: false,
224
- hasLeather: false,
225
235
  connected: false,
226
236
  isConnecting: false,
227
237
  publicKey: "",
@@ -297,9 +307,9 @@ var findPaymentAddress = (addresses) => {
297
307
  ({ purpose }) => purpose === "payment"
298
308
  );
299
309
  };
300
- var getBTCBalance = (address) => __async(void 0, null, function* () {
310
+ var getBTCBalance = (address2) => __async(void 0, null, function* () {
301
311
  try {
302
- return yield import_axios.default.get(`https://blockchain.info/q/addressbalance/${address}`).then((response) => response.data);
312
+ return yield import_axios.default.get(`https://blockchain.info/q/addressbalance/${address2}`).then((response) => response.data);
303
313
  } catch (error) {
304
314
  console.error("Error fetching BTC balance:", error);
305
315
  throw new Error("Failed to fetch BTC balance");
@@ -319,8 +329,36 @@ var isHex = (str) => {
319
329
  const hexRegex = /^[a-fA-F0-9]+$/;
320
330
  return hexRegex.test(str);
321
331
  };
332
+ function getAddressType(address2) {
333
+ try {
334
+ bitcoin.address.fromBase58Check(address2);
335
+ return P2PKH;
336
+ } catch (e) {
337
+ }
338
+ try {
339
+ bitcoin.address.fromBase58Check(address2);
340
+ return P2PSH;
341
+ } catch (e) {
342
+ }
343
+ try {
344
+ const { version, data } = bitcoin.address.fromBech32(address2);
345
+ if (version === 0) {
346
+ if (data.length === 20) {
347
+ return P2WPKH;
348
+ } else if (data.length === 32) {
349
+ return P2WSH;
350
+ }
351
+ } else if (version === 1 && data.length === 32) {
352
+ return P2TR;
353
+ }
354
+ } catch (e) {
355
+ }
356
+ throw new Error("Invalid address");
357
+ }
322
358
 
323
359
  // src/providers/LaserEyesProvider.tsx
360
+ var import_sats_connect = require("sats-connect");
361
+ var import_address = require("bitcoinjs-lib/src/address");
324
362
  var import_jsx_runtime = require("react/jsx-runtime");
325
363
  var LaserEyesContext = (0, import_react.createContext)(initialWalletContext);
326
364
  var useLaserEyes = () => {
@@ -341,14 +379,14 @@ var LaserEyesProvider = ({
341
379
  const [accounts, setAccounts] = (0, import_react.useState)([]);
342
380
  const [publicKey, setPublicKey] = (0, import_react.useState)("");
343
381
  const [paymentPublicKey, setPaymentPublicKey] = (0, import_react.useState)("");
344
- const [address, setAddress] = (0, import_react.useState)("");
382
+ const [address2, setAddress] = (0, import_react.useState)("");
345
383
  const [paymentAddress, setPaymentAddress] = (0, import_react.useState)("");
346
384
  const [balance, setBalance] = (0, import_react.useState)();
347
385
  const [hasUnisat, setHasUnisat] = (0, import_react.useState)(false);
386
+ const [hasXverse, setHasXverse] = (0, import_react.useState)(false);
348
387
  const [network, setNetwork] = (0, import_usehooks_ts.useLocalStorage)("network", MAINNET, {
349
388
  initializeWithValue: false
350
389
  });
351
- const defaultWallet = localStorage == null ? void 0 : localStorage.getItem(LOCAL_STORAGE_DEFAULT_WALLET);
352
390
  (0, import_react.useEffect)(() => {
353
391
  if (config) {
354
392
  setNetwork(config.network);
@@ -365,6 +403,11 @@ var LaserEyesProvider = ({
365
403
  const unisatLib = window == null ? void 0 : window.unisat;
366
404
  setHasUnisat(!!unisatLib);
367
405
  }, []);
406
+ (0, import_react.useEffect)(() => {
407
+ var _a;
408
+ const xverseLib = (_a = window == null ? void 0 : window.XverseProviders) == null ? void 0 : _a.BitcoinProvider;
409
+ setHasXverse(!!xverseLib);
410
+ }, []);
368
411
  (0, import_react.useEffect)(() => {
369
412
  setBalance(void 0);
370
413
  }, [network]);
@@ -383,7 +426,10 @@ var LaserEyesProvider = ({
383
426
  };
384
427
  }, [library]);
385
428
  (0, import_react.useEffect)(() => {
386
- if (defaultWallet && !isConnecting) {
429
+ const defaultWallet = localStorage == null ? void 0 : localStorage.getItem(
430
+ LOCAL_STORAGE_DEFAULT_WALLET
431
+ );
432
+ if (defaultWallet) {
387
433
  setProvider(defaultWallet);
388
434
  connect(defaultWallet);
389
435
  }
@@ -412,6 +458,48 @@ var LaserEyesProvider = ({
412
458
  throw error;
413
459
  }
414
460
  });
461
+ const connectXverse = () => __async(void 0, null, function* () {
462
+ try {
463
+ localStorage == null ? void 0 : localStorage.setItem(LOCAL_STORAGE_DEFAULT_WALLET, XVERSE);
464
+ let xverseNetwork = getXverseNetwork((config == null ? void 0 : config.network) || MAINNET);
465
+ console.log({ xverseNetwork });
466
+ const getAddressOptions = {
467
+ payload: {
468
+ purposes: ["ordinals", "payment"],
469
+ message: "Address for receiving Ordinals and payments",
470
+ network: {
471
+ type: xverseNetwork
472
+ }
473
+ },
474
+ onFinish: (response) => {
475
+ setPublicKey(String(response.addresses[0].publicKey));
476
+ setPaymentPublicKey(String(response.addresses[1].publicKey));
477
+ const foundAddress = findOrdinalsAddress(response.addresses);
478
+ const foundPaymentAddress = findPaymentAddress(response.addresses);
479
+ if (foundAddress && foundPaymentAddress) {
480
+ setAddress(foundAddress.address);
481
+ setPaymentAddress(foundPaymentAddress.address);
482
+ setProvider(XVERSE);
483
+ setLibrary(window.BitcoinProvider);
484
+ }
485
+ getBTCBalance(foundPaymentAddress.address).then((totalBalance) => {
486
+ console.log({ totalBalance });
487
+ setBalance(totalBalance);
488
+ });
489
+ },
490
+ onCancel: () => {
491
+ throw new Error(`User canceled lasereyes to ${XVERSE} wallet`);
492
+ },
493
+ onError: (error) => {
494
+ throw new Error(`Can't lasereyes to ${XVERSE} wallet`);
495
+ }
496
+ };
497
+ yield (0, import_sats_connect.getAddress)(getAddressOptions);
498
+ setConnected(true);
499
+ } catch (error) {
500
+ throw error;
501
+ }
502
+ });
415
503
  const handleAccountsChanged = (_accounts) => {
416
504
  if (!_accounts.length) {
417
505
  disconnect();
@@ -420,6 +508,7 @@ var LaserEyesProvider = ({
420
508
  if (self.accounts[0] === _accounts[0]) {
421
509
  return;
422
510
  }
511
+ console.log("acct changed", _accounts[0]);
423
512
  self.accounts = _accounts;
424
513
  if (_accounts.length > 0) {
425
514
  connect(UNISAT);
@@ -434,8 +523,10 @@ var LaserEyesProvider = ({
434
523
  foundNetwork = getNetworkForUnisat(network2);
435
524
  setNetwork(foundNetwork);
436
525
  connect(provider);
526
+ } else if (provider === XVERSE) {
527
+ throw new Error("Not implemented");
437
528
  } else {
438
- throw new Error("Unsupported wallet");
529
+ throw new Error("The connected wallet doesn't support this method..");
439
530
  }
440
531
  } catch (error) {
441
532
  throw error;
@@ -448,14 +539,16 @@ var LaserEyesProvider = ({
448
539
  throw new Error("No wallet provided");
449
540
  if (walletName === UNISAT) {
450
541
  yield connectUnisat();
542
+ } else if (walletName === XVERSE) {
543
+ yield connectXverse();
451
544
  } else {
452
- throw new Error("Unsupported wallet!");
545
+ throw new Error("The connected wallet doesn't support this method..!");
453
546
  }
454
547
  setConnected(true);
455
548
  } catch (error) {
456
549
  setIsConnecting(false);
457
550
  disconnect();
458
- throw new Error("Can't lasereyes to wallet");
551
+ throw error;
459
552
  } finally {
460
553
  setIsConnecting(false);
461
554
  }
@@ -478,14 +571,38 @@ var LaserEyesProvider = ({
478
571
  return;
479
572
  if (provider === UNISAT) {
480
573
  return yield library.requestAccounts();
574
+ } else if (provider === XVERSE) {
575
+ const getAddressOptions = {
576
+ payload: {
577
+ // @ts-ignore
578
+ purposes: ["ordinals", "payment"],
579
+ message: "Address for receiving Ordinals and payments",
580
+ network: {
581
+ type: XVERSE_NETWORK
582
+ }
583
+ },
584
+ onFinish: (response) => __async(void 0, null, function* () {
585
+ const foundAddress = findOrdinalsAddress(response.addresses);
586
+ setAddress(foundAddress.address);
587
+ const foundPaymentAddress = findPaymentAddress(response.addresses);
588
+ setPaymentAddress(foundPaymentAddress);
589
+ setPublicKey(String(response.addresses[0].publicKey));
590
+ setPaymentPublicKey(String(response.addresses[1].publicKey));
591
+ }),
592
+ onCancel: () => {
593
+ console.log("CANCELLED");
594
+ }
595
+ };
596
+ return [address2];
481
597
  } else {
482
- throw new Error("Unsupported wallet");
598
+ throw new Error("The connected wallet doesn't support this method..");
483
599
  }
484
600
  } catch (error) {
485
601
  throw error;
486
602
  }
487
603
  });
488
604
  const getNetwork = () => __async(void 0, null, function* () {
605
+ var _a;
489
606
  try {
490
607
  if (!library)
491
608
  return;
@@ -494,9 +611,13 @@ var LaserEyesProvider = ({
494
611
  const foundNetwork = getNetworkForUnisat(unisatNetwork);
495
612
  setNetwork(foundNetwork);
496
613
  return foundNetwork;
497
- } else {
498
- throw new Error("Unsupported wallet");
614
+ } else if (provider === XVERSE) {
615
+ if (address2.slice(0, 1) === "t") {
616
+ return TESTNET;
617
+ }
618
+ return MAINNET;
499
619
  }
620
+ return (_a = config == null ? void 0 : config.network) != null ? _a : MAINNET;
500
621
  } catch (error) {
501
622
  throw error;
502
623
  }
@@ -510,7 +631,7 @@ var LaserEyesProvider = ({
510
631
  yield library == null ? void 0 : library.switchNetwork(wantedNetwork);
511
632
  setNetwork(network2);
512
633
  } else {
513
- throw new Error("Unsupported wallet");
634
+ throw new Error("The connected wallet doesn't support this method..");
514
635
  }
515
636
  } catch (error) {
516
637
  throw error;
@@ -524,7 +645,7 @@ var LaserEyesProvider = ({
524
645
  const pub = yield library == null ? void 0 : library.getPublicKey();
525
646
  return yield library == null ? void 0 : library.getPublicKey();
526
647
  } else {
527
- throw new Error("Unsupported wallet");
648
+ throw new Error("The connected wallet doesn't support this method..");
528
649
  }
529
650
  } catch (error) {
530
651
  throw error;
@@ -536,8 +657,8 @@ var LaserEyesProvider = ({
536
657
  return;
537
658
  if (provider === UNISAT) {
538
659
  return yield library.getBalance();
539
- } else {
540
- throw new Error("Unsupported wallet");
660
+ } else if (provider === XVERSE) {
661
+ return yield getBTCBalance(paymentAddress);
541
662
  }
542
663
  } catch (error) {
543
664
  throw error;
@@ -550,7 +671,7 @@ var LaserEyesProvider = ({
550
671
  if (provider === UNISAT) {
551
672
  return yield library.getInscriptions(0, 10);
552
673
  } else {
553
- throw new Error("Unsupported wallet");
674
+ throw new Error("The connected wallet doesn't support this method..");
554
675
  }
555
676
  } catch (error) {
556
677
  throw error;
@@ -570,7 +691,7 @@ var LaserEyesProvider = ({
570
691
  throw new Error("Transaction failed");
571
692
  return txId;
572
693
  } else {
573
- throw new Error("Unsupported wallet");
694
+ throw new Error("The connected wallet doesn't support this method..");
574
695
  }
575
696
  } catch (error) {
576
697
  throw error;
@@ -582,8 +703,20 @@ var LaserEyesProvider = ({
582
703
  return;
583
704
  if (provider === UNISAT) {
584
705
  return yield library == null ? void 0 : library.signMessage(message);
585
- } else {
586
- throw new Error("Unsupported wallet");
706
+ } else if (provider === XVERSE) {
707
+ const response = yield (0, import_sats_connect.request)("signMessage", {
708
+ address: address2,
709
+ message
710
+ });
711
+ if (response.status === "success") {
712
+ return response.result.signature;
713
+ } else {
714
+ if (response.error.code === import_sats_connect.RpcErrorCode.USER_REJECTION) {
715
+ throw new Error("User rejected the request");
716
+ } else {
717
+ throw new Error("Error signing message: " + response.error.message);
718
+ }
719
+ }
587
720
  }
588
721
  } catch (error) {
589
722
  throw error;
@@ -621,11 +754,91 @@ var LaserEyesProvider = ({
621
754
  signedPsbtBase64: psbtSignedPsbt.toBase64(),
622
755
  txId: void 0
623
756
  };
757
+ } else if (provider === XVERSE) {
758
+ const toSignPsbt = bitcoin2.Psbt.fromBase64(String(psbtBase64), {
759
+ network: getBitcoinNetwork(network)
760
+ });
761
+ const inputs = toSignPsbt.data.inputs;
762
+ const inputsToSign = [];
763
+ const ordinalAddressData = {
764
+ address: address2,
765
+ signingIndexes: []
766
+ };
767
+ const paymentsAddressData = {
768
+ address: paymentAddress,
769
+ signingIndexes: []
770
+ };
771
+ let counter = 0;
772
+ try {
773
+ for (var iter = __forAwait(inputs), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
774
+ let input = temp.value;
775
+ const { script } = input.witnessUtxo;
776
+ const addressFromScript = (0, import_address.fromOutputScript)(
777
+ script,
778
+ getBitcoinNetwork(network)
779
+ );
780
+ if (addressFromScript === paymentAddress) {
781
+ paymentsAddressData.signingIndexes.push(Number(counter));
782
+ } else if (addressFromScript === address2) {
783
+ ordinalAddressData.signingIndexes.push(Number(counter));
784
+ }
785
+ counter++;
786
+ }
787
+ } catch (temp) {
788
+ error = [temp];
789
+ } finally {
790
+ try {
791
+ more && (temp = iter.return) && (yield temp.call(iter));
792
+ } finally {
793
+ if (error)
794
+ throw error[0];
795
+ }
796
+ }
797
+ if (ordinalAddressData.signingIndexes.length > 0) {
798
+ inputsToSign.push(ordinalAddressData);
799
+ }
800
+ if (paymentsAddressData.signingIndexes.length > 0) {
801
+ inputsToSign.push(paymentsAddressData);
802
+ }
803
+ let txId, signedPsbtHex, signedPsbtBase64;
804
+ const xverseNetwork = getXverseNetwork(network);
805
+ const signPsbtOptions = {
806
+ payload: {
807
+ network: {
808
+ type: xverseNetwork
809
+ },
810
+ message: "Sign Transaction",
811
+ psbtBase64: toSignPsbt.toBase64(),
812
+ broadcast,
813
+ inputsToSign
814
+ },
815
+ onFinish: (response) => {
816
+ if (response.txId) {
817
+ txId = response.txId;
818
+ } else if (response.psbtBase64) {
819
+ const signedPsbt = bitcoin2.Psbt.fromBase64(
820
+ String(response.psbtBase64),
821
+ {
822
+ network: getBitcoinNetwork(network)
823
+ }
824
+ );
825
+ signedPsbtHex = signedPsbt.toHex();
826
+ signedPsbtBase64 = signedPsbt.toBase64();
827
+ }
828
+ },
829
+ onCancel: () => console.log("Canceled")
830
+ };
831
+ yield (0, import_sats_connect.signTransaction)(signPsbtOptions);
832
+ return {
833
+ signedPsbtHex,
834
+ signedPsbtBase64,
835
+ txId
836
+ };
624
837
  } else {
625
- throw new Error("Unsupported wallet");
838
+ throw new Error("The connected wallet doesn't support this method..");
626
839
  }
627
- } catch (error) {
628
- throw error;
840
+ } catch (error2) {
841
+ throw error2;
629
842
  }
630
843
  });
631
844
  const pushPsbt = (psbt) => __async(void 0, null, function* () {
@@ -635,7 +848,7 @@ var LaserEyesProvider = ({
635
848
  if (provider === UNISAT) {
636
849
  return yield library == null ? void 0 : library.pushPsbt(psbt);
637
850
  } else {
638
- throw new Error("Unsupported wallet");
851
+ throw new Error("The connected wallet doesn't support this method..");
639
852
  }
640
853
  } catch (error) {
641
854
  throw error;
@@ -648,7 +861,7 @@ var LaserEyesProvider = ({
648
861
  library,
649
862
  accounts,
650
863
  publicKey,
651
- address,
864
+ address: address2,
652
865
  paymentAddress,
653
866
  paymentPublicKey,
654
867
  provider,
@@ -657,6 +870,7 @@ var LaserEyesProvider = ({
657
870
  connected,
658
871
  isConnecting,
659
872
  hasUnisat,
873
+ hasXverse,
660
874
  // functions
661
875
  connect,
662
876
  disconnect,
@@ -686,6 +900,7 @@ var LaserEyesProvider = ({
686
900
  MEMPOOL_SPACE_URL,
687
901
  OYL,
688
902
  P2PKH,
903
+ P2PSH,
689
904
  P2SH,
690
905
  P2TR,
691
906
  P2WPKH,
@@ -704,6 +919,7 @@ var LaserEyesProvider = ({
704
919
  createConfig,
705
920
  findOrdinalsAddress,
706
921
  findPaymentAddress,
922
+ getAddressType,
707
923
  getBTCBalance,
708
924
  getBitcoinNetwork,
709
925
  getLeatherNetwork,
package/dist/index.mjs CHANGED
@@ -34,6 +34,15 @@ var __async = (__this, __arguments, generator) => {
34
34
  step((generator = generator.apply(__this, __arguments)).next());
35
35
  });
36
36
  };
37
+ var __forAwait = (obj, it, method) => {
38
+ it = obj[Symbol.asyncIterator];
39
+ method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((resolve, reject, done) => {
40
+ arg = fn.call(obj, arg);
41
+ done = arg.done;
42
+ return Promise.resolve(arg.value).then((value) => resolve({ value, done }), reject);
43
+ }));
44
+ return it ? it.call(obj) : (obj = obj[Symbol.iterator](), it = {}, method("next"), method("return"), it);
45
+ };
37
46
 
38
47
  // src/consts/networks.ts
39
48
  var XVERSE_NETWORK = "Mainnet";
@@ -101,6 +110,7 @@ var LEATHER = "leather";
101
110
  var P2TR = "p2tr";
102
111
  var P2PKH = "p2pkh";
103
112
  var P2WPKH = "p2wpkh";
113
+ var P2PSH = "p2psh";
104
114
  var P2WSH = "p2wsh";
105
115
  var P2SH = "p2sh";
106
116
  var WALLETS = {
@@ -152,10 +162,8 @@ import * as bitcoin2 from "bitcoinjs-lib";
152
162
  // src/consts/settings.ts
153
163
  var LOCAL_STORAGE_DEFAULT_WALLET = "defaultWallet";
154
164
  var initialWalletContext = {
155
- hasOyl: false,
156
165
  hasUnisat: false,
157
166
  hasXverse: false,
158
- hasLeather: false,
159
167
  connected: false,
160
168
  isConnecting: false,
161
169
  publicKey: "",
@@ -231,9 +239,9 @@ var findPaymentAddress = (addresses) => {
231
239
  ({ purpose }) => purpose === "payment"
232
240
  );
233
241
  };
234
- var getBTCBalance = (address) => __async(void 0, null, function* () {
242
+ var getBTCBalance = (address2) => __async(void 0, null, function* () {
235
243
  try {
236
- return yield axios.get(`https://blockchain.info/q/addressbalance/${address}`).then((response) => response.data);
244
+ return yield axios.get(`https://blockchain.info/q/addressbalance/${address2}`).then((response) => response.data);
237
245
  } catch (error) {
238
246
  console.error("Error fetching BTC balance:", error);
239
247
  throw new Error("Failed to fetch BTC balance");
@@ -253,8 +261,41 @@ var isHex = (str) => {
253
261
  const hexRegex = /^[a-fA-F0-9]+$/;
254
262
  return hexRegex.test(str);
255
263
  };
264
+ function getAddressType(address2) {
265
+ try {
266
+ bitcoin.address.fromBase58Check(address2);
267
+ return P2PKH;
268
+ } catch (e) {
269
+ }
270
+ try {
271
+ bitcoin.address.fromBase58Check(address2);
272
+ return P2PSH;
273
+ } catch (e) {
274
+ }
275
+ try {
276
+ const { version, data } = bitcoin.address.fromBech32(address2);
277
+ if (version === 0) {
278
+ if (data.length === 20) {
279
+ return P2WPKH;
280
+ } else if (data.length === 32) {
281
+ return P2WSH;
282
+ }
283
+ } else if (version === 1 && data.length === 32) {
284
+ return P2TR;
285
+ }
286
+ } catch (e) {
287
+ }
288
+ throw new Error("Invalid address");
289
+ }
256
290
 
257
291
  // src/providers/LaserEyesProvider.tsx
292
+ import {
293
+ getAddress,
294
+ request,
295
+ RpcErrorCode,
296
+ signTransaction
297
+ } from "sats-connect";
298
+ import { fromOutputScript } from "bitcoinjs-lib/src/address";
258
299
  import { jsx } from "react/jsx-runtime";
259
300
  var LaserEyesContext = createContext(initialWalletContext);
260
301
  var useLaserEyes = () => {
@@ -275,14 +316,14 @@ var LaserEyesProvider = ({
275
316
  const [accounts, setAccounts] = useState([]);
276
317
  const [publicKey, setPublicKey] = useState("");
277
318
  const [paymentPublicKey, setPaymentPublicKey] = useState("");
278
- const [address, setAddress] = useState("");
319
+ const [address2, setAddress] = useState("");
279
320
  const [paymentAddress, setPaymentAddress] = useState("");
280
321
  const [balance, setBalance] = useState();
281
322
  const [hasUnisat, setHasUnisat] = useState(false);
323
+ const [hasXverse, setHasXverse] = useState(false);
282
324
  const [network, setNetwork] = useLocalStorage("network", MAINNET, {
283
325
  initializeWithValue: false
284
326
  });
285
- const defaultWallet = localStorage == null ? void 0 : localStorage.getItem(LOCAL_STORAGE_DEFAULT_WALLET);
286
327
  useEffect(() => {
287
328
  if (config) {
288
329
  setNetwork(config.network);
@@ -299,6 +340,11 @@ var LaserEyesProvider = ({
299
340
  const unisatLib = window == null ? void 0 : window.unisat;
300
341
  setHasUnisat(!!unisatLib);
301
342
  }, []);
343
+ useEffect(() => {
344
+ var _a;
345
+ const xverseLib = (_a = window == null ? void 0 : window.XverseProviders) == null ? void 0 : _a.BitcoinProvider;
346
+ setHasXverse(!!xverseLib);
347
+ }, []);
302
348
  useEffect(() => {
303
349
  setBalance(void 0);
304
350
  }, [network]);
@@ -317,7 +363,10 @@ var LaserEyesProvider = ({
317
363
  };
318
364
  }, [library]);
319
365
  useEffect(() => {
320
- if (defaultWallet && !isConnecting) {
366
+ const defaultWallet = localStorage == null ? void 0 : localStorage.getItem(
367
+ LOCAL_STORAGE_DEFAULT_WALLET
368
+ );
369
+ if (defaultWallet) {
321
370
  setProvider(defaultWallet);
322
371
  connect(defaultWallet);
323
372
  }
@@ -346,6 +395,48 @@ var LaserEyesProvider = ({
346
395
  throw error;
347
396
  }
348
397
  });
398
+ const connectXverse = () => __async(void 0, null, function* () {
399
+ try {
400
+ localStorage == null ? void 0 : localStorage.setItem(LOCAL_STORAGE_DEFAULT_WALLET, XVERSE);
401
+ let xverseNetwork = getXverseNetwork((config == null ? void 0 : config.network) || MAINNET);
402
+ console.log({ xverseNetwork });
403
+ const getAddressOptions = {
404
+ payload: {
405
+ purposes: ["ordinals", "payment"],
406
+ message: "Address for receiving Ordinals and payments",
407
+ network: {
408
+ type: xverseNetwork
409
+ }
410
+ },
411
+ onFinish: (response) => {
412
+ setPublicKey(String(response.addresses[0].publicKey));
413
+ setPaymentPublicKey(String(response.addresses[1].publicKey));
414
+ const foundAddress = findOrdinalsAddress(response.addresses);
415
+ const foundPaymentAddress = findPaymentAddress(response.addresses);
416
+ if (foundAddress && foundPaymentAddress) {
417
+ setAddress(foundAddress.address);
418
+ setPaymentAddress(foundPaymentAddress.address);
419
+ setProvider(XVERSE);
420
+ setLibrary(window.BitcoinProvider);
421
+ }
422
+ getBTCBalance(foundPaymentAddress.address).then((totalBalance) => {
423
+ console.log({ totalBalance });
424
+ setBalance(totalBalance);
425
+ });
426
+ },
427
+ onCancel: () => {
428
+ throw new Error(`User canceled lasereyes to ${XVERSE} wallet`);
429
+ },
430
+ onError: (error) => {
431
+ throw new Error(`Can't lasereyes to ${XVERSE} wallet`);
432
+ }
433
+ };
434
+ yield getAddress(getAddressOptions);
435
+ setConnected(true);
436
+ } catch (error) {
437
+ throw error;
438
+ }
439
+ });
349
440
  const handleAccountsChanged = (_accounts) => {
350
441
  if (!_accounts.length) {
351
442
  disconnect();
@@ -354,6 +445,7 @@ var LaserEyesProvider = ({
354
445
  if (self.accounts[0] === _accounts[0]) {
355
446
  return;
356
447
  }
448
+ console.log("acct changed", _accounts[0]);
357
449
  self.accounts = _accounts;
358
450
  if (_accounts.length > 0) {
359
451
  connect(UNISAT);
@@ -368,8 +460,10 @@ var LaserEyesProvider = ({
368
460
  foundNetwork = getNetworkForUnisat(network2);
369
461
  setNetwork(foundNetwork);
370
462
  connect(provider);
463
+ } else if (provider === XVERSE) {
464
+ throw new Error("Not implemented");
371
465
  } else {
372
- throw new Error("Unsupported wallet");
466
+ throw new Error("The connected wallet doesn't support this method..");
373
467
  }
374
468
  } catch (error) {
375
469
  throw error;
@@ -382,14 +476,16 @@ var LaserEyesProvider = ({
382
476
  throw new Error("No wallet provided");
383
477
  if (walletName === UNISAT) {
384
478
  yield connectUnisat();
479
+ } else if (walletName === XVERSE) {
480
+ yield connectXverse();
385
481
  } else {
386
- throw new Error("Unsupported wallet!");
482
+ throw new Error("The connected wallet doesn't support this method..!");
387
483
  }
388
484
  setConnected(true);
389
485
  } catch (error) {
390
486
  setIsConnecting(false);
391
487
  disconnect();
392
- throw new Error("Can't lasereyes to wallet");
488
+ throw error;
393
489
  } finally {
394
490
  setIsConnecting(false);
395
491
  }
@@ -412,14 +508,38 @@ var LaserEyesProvider = ({
412
508
  return;
413
509
  if (provider === UNISAT) {
414
510
  return yield library.requestAccounts();
511
+ } else if (provider === XVERSE) {
512
+ const getAddressOptions = {
513
+ payload: {
514
+ // @ts-ignore
515
+ purposes: ["ordinals", "payment"],
516
+ message: "Address for receiving Ordinals and payments",
517
+ network: {
518
+ type: XVERSE_NETWORK
519
+ }
520
+ },
521
+ onFinish: (response) => __async(void 0, null, function* () {
522
+ const foundAddress = findOrdinalsAddress(response.addresses);
523
+ setAddress(foundAddress.address);
524
+ const foundPaymentAddress = findPaymentAddress(response.addresses);
525
+ setPaymentAddress(foundPaymentAddress);
526
+ setPublicKey(String(response.addresses[0].publicKey));
527
+ setPaymentPublicKey(String(response.addresses[1].publicKey));
528
+ }),
529
+ onCancel: () => {
530
+ console.log("CANCELLED");
531
+ }
532
+ };
533
+ return [address2];
415
534
  } else {
416
- throw new Error("Unsupported wallet");
535
+ throw new Error("The connected wallet doesn't support this method..");
417
536
  }
418
537
  } catch (error) {
419
538
  throw error;
420
539
  }
421
540
  });
422
541
  const getNetwork = () => __async(void 0, null, function* () {
542
+ var _a;
423
543
  try {
424
544
  if (!library)
425
545
  return;
@@ -428,9 +548,13 @@ var LaserEyesProvider = ({
428
548
  const foundNetwork = getNetworkForUnisat(unisatNetwork);
429
549
  setNetwork(foundNetwork);
430
550
  return foundNetwork;
431
- } else {
432
- throw new Error("Unsupported wallet");
551
+ } else if (provider === XVERSE) {
552
+ if (address2.slice(0, 1) === "t") {
553
+ return TESTNET;
554
+ }
555
+ return MAINNET;
433
556
  }
557
+ return (_a = config == null ? void 0 : config.network) != null ? _a : MAINNET;
434
558
  } catch (error) {
435
559
  throw error;
436
560
  }
@@ -444,7 +568,7 @@ var LaserEyesProvider = ({
444
568
  yield library == null ? void 0 : library.switchNetwork(wantedNetwork);
445
569
  setNetwork(network2);
446
570
  } else {
447
- throw new Error("Unsupported wallet");
571
+ throw new Error("The connected wallet doesn't support this method..");
448
572
  }
449
573
  } catch (error) {
450
574
  throw error;
@@ -458,7 +582,7 @@ var LaserEyesProvider = ({
458
582
  const pub = yield library == null ? void 0 : library.getPublicKey();
459
583
  return yield library == null ? void 0 : library.getPublicKey();
460
584
  } else {
461
- throw new Error("Unsupported wallet");
585
+ throw new Error("The connected wallet doesn't support this method..");
462
586
  }
463
587
  } catch (error) {
464
588
  throw error;
@@ -470,8 +594,8 @@ var LaserEyesProvider = ({
470
594
  return;
471
595
  if (provider === UNISAT) {
472
596
  return yield library.getBalance();
473
- } else {
474
- throw new Error("Unsupported wallet");
597
+ } else if (provider === XVERSE) {
598
+ return yield getBTCBalance(paymentAddress);
475
599
  }
476
600
  } catch (error) {
477
601
  throw error;
@@ -484,7 +608,7 @@ var LaserEyesProvider = ({
484
608
  if (provider === UNISAT) {
485
609
  return yield library.getInscriptions(0, 10);
486
610
  } else {
487
- throw new Error("Unsupported wallet");
611
+ throw new Error("The connected wallet doesn't support this method..");
488
612
  }
489
613
  } catch (error) {
490
614
  throw error;
@@ -504,7 +628,7 @@ var LaserEyesProvider = ({
504
628
  throw new Error("Transaction failed");
505
629
  return txId;
506
630
  } else {
507
- throw new Error("Unsupported wallet");
631
+ throw new Error("The connected wallet doesn't support this method..");
508
632
  }
509
633
  } catch (error) {
510
634
  throw error;
@@ -516,8 +640,20 @@ var LaserEyesProvider = ({
516
640
  return;
517
641
  if (provider === UNISAT) {
518
642
  return yield library == null ? void 0 : library.signMessage(message);
519
- } else {
520
- throw new Error("Unsupported wallet");
643
+ } else if (provider === XVERSE) {
644
+ const response = yield request("signMessage", {
645
+ address: address2,
646
+ message
647
+ });
648
+ if (response.status === "success") {
649
+ return response.result.signature;
650
+ } else {
651
+ if (response.error.code === RpcErrorCode.USER_REJECTION) {
652
+ throw new Error("User rejected the request");
653
+ } else {
654
+ throw new Error("Error signing message: " + response.error.message);
655
+ }
656
+ }
521
657
  }
522
658
  } catch (error) {
523
659
  throw error;
@@ -555,11 +691,91 @@ var LaserEyesProvider = ({
555
691
  signedPsbtBase64: psbtSignedPsbt.toBase64(),
556
692
  txId: void 0
557
693
  };
694
+ } else if (provider === XVERSE) {
695
+ const toSignPsbt = bitcoin2.Psbt.fromBase64(String(psbtBase64), {
696
+ network: getBitcoinNetwork(network)
697
+ });
698
+ const inputs = toSignPsbt.data.inputs;
699
+ const inputsToSign = [];
700
+ const ordinalAddressData = {
701
+ address: address2,
702
+ signingIndexes: []
703
+ };
704
+ const paymentsAddressData = {
705
+ address: paymentAddress,
706
+ signingIndexes: []
707
+ };
708
+ let counter = 0;
709
+ try {
710
+ for (var iter = __forAwait(inputs), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
711
+ let input = temp.value;
712
+ const { script } = input.witnessUtxo;
713
+ const addressFromScript = fromOutputScript(
714
+ script,
715
+ getBitcoinNetwork(network)
716
+ );
717
+ if (addressFromScript === paymentAddress) {
718
+ paymentsAddressData.signingIndexes.push(Number(counter));
719
+ } else if (addressFromScript === address2) {
720
+ ordinalAddressData.signingIndexes.push(Number(counter));
721
+ }
722
+ counter++;
723
+ }
724
+ } catch (temp) {
725
+ error = [temp];
726
+ } finally {
727
+ try {
728
+ more && (temp = iter.return) && (yield temp.call(iter));
729
+ } finally {
730
+ if (error)
731
+ throw error[0];
732
+ }
733
+ }
734
+ if (ordinalAddressData.signingIndexes.length > 0) {
735
+ inputsToSign.push(ordinalAddressData);
736
+ }
737
+ if (paymentsAddressData.signingIndexes.length > 0) {
738
+ inputsToSign.push(paymentsAddressData);
739
+ }
740
+ let txId, signedPsbtHex, signedPsbtBase64;
741
+ const xverseNetwork = getXverseNetwork(network);
742
+ const signPsbtOptions = {
743
+ payload: {
744
+ network: {
745
+ type: xverseNetwork
746
+ },
747
+ message: "Sign Transaction",
748
+ psbtBase64: toSignPsbt.toBase64(),
749
+ broadcast,
750
+ inputsToSign
751
+ },
752
+ onFinish: (response) => {
753
+ if (response.txId) {
754
+ txId = response.txId;
755
+ } else if (response.psbtBase64) {
756
+ const signedPsbt = bitcoin2.Psbt.fromBase64(
757
+ String(response.psbtBase64),
758
+ {
759
+ network: getBitcoinNetwork(network)
760
+ }
761
+ );
762
+ signedPsbtHex = signedPsbt.toHex();
763
+ signedPsbtBase64 = signedPsbt.toBase64();
764
+ }
765
+ },
766
+ onCancel: () => console.log("Canceled")
767
+ };
768
+ yield signTransaction(signPsbtOptions);
769
+ return {
770
+ signedPsbtHex,
771
+ signedPsbtBase64,
772
+ txId
773
+ };
558
774
  } else {
559
- throw new Error("Unsupported wallet");
775
+ throw new Error("The connected wallet doesn't support this method..");
560
776
  }
561
- } catch (error) {
562
- throw error;
777
+ } catch (error2) {
778
+ throw error2;
563
779
  }
564
780
  });
565
781
  const pushPsbt = (psbt) => __async(void 0, null, function* () {
@@ -569,7 +785,7 @@ var LaserEyesProvider = ({
569
785
  if (provider === UNISAT) {
570
786
  return yield library == null ? void 0 : library.pushPsbt(psbt);
571
787
  } else {
572
- throw new Error("Unsupported wallet");
788
+ throw new Error("The connected wallet doesn't support this method..");
573
789
  }
574
790
  } catch (error) {
575
791
  throw error;
@@ -582,7 +798,7 @@ var LaserEyesProvider = ({
582
798
  library,
583
799
  accounts,
584
800
  publicKey,
585
- address,
801
+ address: address2,
586
802
  paymentAddress,
587
803
  paymentPublicKey,
588
804
  provider,
@@ -591,6 +807,7 @@ var LaserEyesProvider = ({
591
807
  connected,
592
808
  isConnecting,
593
809
  hasUnisat,
810
+ hasXverse,
594
811
  // functions
595
812
  connect,
596
813
  disconnect,
@@ -619,6 +836,7 @@ export {
619
836
  MEMPOOL_SPACE_URL,
620
837
  OYL,
621
838
  P2PKH,
839
+ P2PSH,
622
840
  P2SH,
623
841
  P2TR,
624
842
  P2WPKH,
@@ -637,6 +855,7 @@ export {
637
855
  createConfig,
638
856
  findOrdinalsAddress,
639
857
  findPaymentAddress,
858
+ getAddressType,
640
859
  getBTCBalance,
641
860
  getBitcoinNetwork,
642
861
  getLeatherNetwork,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnisat/lasereyes",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "sideEffects": false,
5
5
  "private": false,
6
6
  "license": "MIT",