@omnisat/lasereyes 0.0.8 → 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,10 +379,11 @@ 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
  });
@@ -364,6 +403,11 @@ var LaserEyesProvider = ({
364
403
  const unisatLib = window == null ? void 0 : window.unisat;
365
404
  setHasUnisat(!!unisatLib);
366
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
+ }, []);
367
411
  (0, import_react.useEffect)(() => {
368
412
  setBalance(void 0);
369
413
  }, [network]);
@@ -385,7 +429,7 @@ var LaserEyesProvider = ({
385
429
  const defaultWallet = localStorage == null ? void 0 : localStorage.getItem(
386
430
  LOCAL_STORAGE_DEFAULT_WALLET
387
431
  );
388
- if (defaultWallet && !isConnecting) {
432
+ if (defaultWallet) {
389
433
  setProvider(defaultWallet);
390
434
  connect(defaultWallet);
391
435
  }
@@ -414,6 +458,48 @@ var LaserEyesProvider = ({
414
458
  throw error;
415
459
  }
416
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
+ });
417
503
  const handleAccountsChanged = (_accounts) => {
418
504
  if (!_accounts.length) {
419
505
  disconnect();
@@ -422,6 +508,7 @@ var LaserEyesProvider = ({
422
508
  if (self.accounts[0] === _accounts[0]) {
423
509
  return;
424
510
  }
511
+ console.log("acct changed", _accounts[0]);
425
512
  self.accounts = _accounts;
426
513
  if (_accounts.length > 0) {
427
514
  connect(UNISAT);
@@ -436,8 +523,10 @@ var LaserEyesProvider = ({
436
523
  foundNetwork = getNetworkForUnisat(network2);
437
524
  setNetwork(foundNetwork);
438
525
  connect(provider);
526
+ } else if (provider === XVERSE) {
527
+ throw new Error("Not implemented");
439
528
  } else {
440
- throw new Error("Unsupported wallet");
529
+ throw new Error("The connected wallet doesn't support this method..");
441
530
  }
442
531
  } catch (error) {
443
532
  throw error;
@@ -450,14 +539,16 @@ var LaserEyesProvider = ({
450
539
  throw new Error("No wallet provided");
451
540
  if (walletName === UNISAT) {
452
541
  yield connectUnisat();
542
+ } else if (walletName === XVERSE) {
543
+ yield connectXverse();
453
544
  } else {
454
- throw new Error("Unsupported wallet!");
545
+ throw new Error("The connected wallet doesn't support this method..!");
455
546
  }
456
547
  setConnected(true);
457
548
  } catch (error) {
458
549
  setIsConnecting(false);
459
550
  disconnect();
460
- throw new Error("Can't lasereyes to wallet");
551
+ throw error;
461
552
  } finally {
462
553
  setIsConnecting(false);
463
554
  }
@@ -480,14 +571,38 @@ var LaserEyesProvider = ({
480
571
  return;
481
572
  if (provider === UNISAT) {
482
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];
483
597
  } else {
484
- throw new Error("Unsupported wallet");
598
+ throw new Error("The connected wallet doesn't support this method..");
485
599
  }
486
600
  } catch (error) {
487
601
  throw error;
488
602
  }
489
603
  });
490
604
  const getNetwork = () => __async(void 0, null, function* () {
605
+ var _a;
491
606
  try {
492
607
  if (!library)
493
608
  return;
@@ -496,9 +611,13 @@ var LaserEyesProvider = ({
496
611
  const foundNetwork = getNetworkForUnisat(unisatNetwork);
497
612
  setNetwork(foundNetwork);
498
613
  return foundNetwork;
499
- } else {
500
- throw new Error("Unsupported wallet");
614
+ } else if (provider === XVERSE) {
615
+ if (address2.slice(0, 1) === "t") {
616
+ return TESTNET;
617
+ }
618
+ return MAINNET;
501
619
  }
620
+ return (_a = config == null ? void 0 : config.network) != null ? _a : MAINNET;
502
621
  } catch (error) {
503
622
  throw error;
504
623
  }
@@ -512,7 +631,7 @@ var LaserEyesProvider = ({
512
631
  yield library == null ? void 0 : library.switchNetwork(wantedNetwork);
513
632
  setNetwork(network2);
514
633
  } else {
515
- throw new Error("Unsupported wallet");
634
+ throw new Error("The connected wallet doesn't support this method..");
516
635
  }
517
636
  } catch (error) {
518
637
  throw error;
@@ -526,7 +645,7 @@ var LaserEyesProvider = ({
526
645
  const pub = yield library == null ? void 0 : library.getPublicKey();
527
646
  return yield library == null ? void 0 : library.getPublicKey();
528
647
  } else {
529
- throw new Error("Unsupported wallet");
648
+ throw new Error("The connected wallet doesn't support this method..");
530
649
  }
531
650
  } catch (error) {
532
651
  throw error;
@@ -538,8 +657,8 @@ var LaserEyesProvider = ({
538
657
  return;
539
658
  if (provider === UNISAT) {
540
659
  return yield library.getBalance();
541
- } else {
542
- throw new Error("Unsupported wallet");
660
+ } else if (provider === XVERSE) {
661
+ return yield getBTCBalance(paymentAddress);
543
662
  }
544
663
  } catch (error) {
545
664
  throw error;
@@ -552,7 +671,7 @@ var LaserEyesProvider = ({
552
671
  if (provider === UNISAT) {
553
672
  return yield library.getInscriptions(0, 10);
554
673
  } else {
555
- throw new Error("Unsupported wallet");
674
+ throw new Error("The connected wallet doesn't support this method..");
556
675
  }
557
676
  } catch (error) {
558
677
  throw error;
@@ -572,7 +691,7 @@ var LaserEyesProvider = ({
572
691
  throw new Error("Transaction failed");
573
692
  return txId;
574
693
  } else {
575
- throw new Error("Unsupported wallet");
694
+ throw new Error("The connected wallet doesn't support this method..");
576
695
  }
577
696
  } catch (error) {
578
697
  throw error;
@@ -584,8 +703,20 @@ var LaserEyesProvider = ({
584
703
  return;
585
704
  if (provider === UNISAT) {
586
705
  return yield library == null ? void 0 : library.signMessage(message);
587
- } else {
588
- 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
+ }
589
720
  }
590
721
  } catch (error) {
591
722
  throw error;
@@ -623,11 +754,91 @@ var LaserEyesProvider = ({
623
754
  signedPsbtBase64: psbtSignedPsbt.toBase64(),
624
755
  txId: void 0
625
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
+ };
626
837
  } else {
627
- throw new Error("Unsupported wallet");
838
+ throw new Error("The connected wallet doesn't support this method..");
628
839
  }
629
- } catch (error) {
630
- throw error;
840
+ } catch (error2) {
841
+ throw error2;
631
842
  }
632
843
  });
633
844
  const pushPsbt = (psbt) => __async(void 0, null, function* () {
@@ -637,7 +848,7 @@ var LaserEyesProvider = ({
637
848
  if (provider === UNISAT) {
638
849
  return yield library == null ? void 0 : library.pushPsbt(psbt);
639
850
  } else {
640
- throw new Error("Unsupported wallet");
851
+ throw new Error("The connected wallet doesn't support this method..");
641
852
  }
642
853
  } catch (error) {
643
854
  throw error;
@@ -650,7 +861,7 @@ var LaserEyesProvider = ({
650
861
  library,
651
862
  accounts,
652
863
  publicKey,
653
- address,
864
+ address: address2,
654
865
  paymentAddress,
655
866
  paymentPublicKey,
656
867
  provider,
@@ -659,6 +870,7 @@ var LaserEyesProvider = ({
659
870
  connected,
660
871
  isConnecting,
661
872
  hasUnisat,
873
+ hasXverse,
662
874
  // functions
663
875
  connect,
664
876
  disconnect,
@@ -688,6 +900,7 @@ var LaserEyesProvider = ({
688
900
  MEMPOOL_SPACE_URL,
689
901
  OYL,
690
902
  P2PKH,
903
+ P2PSH,
691
904
  P2SH,
692
905
  P2TR,
693
906
  P2WPKH,
@@ -706,6 +919,7 @@ var LaserEyesProvider = ({
706
919
  createConfig,
707
920
  findOrdinalsAddress,
708
921
  findPaymentAddress,
922
+ getAddressType,
709
923
  getBTCBalance,
710
924
  getBitcoinNetwork,
711
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,10 +316,11 @@ 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
  });
@@ -298,6 +340,11 @@ var LaserEyesProvider = ({
298
340
  const unisatLib = window == null ? void 0 : window.unisat;
299
341
  setHasUnisat(!!unisatLib);
300
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
+ }, []);
301
348
  useEffect(() => {
302
349
  setBalance(void 0);
303
350
  }, [network]);
@@ -319,7 +366,7 @@ var LaserEyesProvider = ({
319
366
  const defaultWallet = localStorage == null ? void 0 : localStorage.getItem(
320
367
  LOCAL_STORAGE_DEFAULT_WALLET
321
368
  );
322
- if (defaultWallet && !isConnecting) {
369
+ if (defaultWallet) {
323
370
  setProvider(defaultWallet);
324
371
  connect(defaultWallet);
325
372
  }
@@ -348,6 +395,48 @@ var LaserEyesProvider = ({
348
395
  throw error;
349
396
  }
350
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
+ });
351
440
  const handleAccountsChanged = (_accounts) => {
352
441
  if (!_accounts.length) {
353
442
  disconnect();
@@ -356,6 +445,7 @@ var LaserEyesProvider = ({
356
445
  if (self.accounts[0] === _accounts[0]) {
357
446
  return;
358
447
  }
448
+ console.log("acct changed", _accounts[0]);
359
449
  self.accounts = _accounts;
360
450
  if (_accounts.length > 0) {
361
451
  connect(UNISAT);
@@ -370,8 +460,10 @@ var LaserEyesProvider = ({
370
460
  foundNetwork = getNetworkForUnisat(network2);
371
461
  setNetwork(foundNetwork);
372
462
  connect(provider);
463
+ } else if (provider === XVERSE) {
464
+ throw new Error("Not implemented");
373
465
  } else {
374
- throw new Error("Unsupported wallet");
466
+ throw new Error("The connected wallet doesn't support this method..");
375
467
  }
376
468
  } catch (error) {
377
469
  throw error;
@@ -384,14 +476,16 @@ var LaserEyesProvider = ({
384
476
  throw new Error("No wallet provided");
385
477
  if (walletName === UNISAT) {
386
478
  yield connectUnisat();
479
+ } else if (walletName === XVERSE) {
480
+ yield connectXverse();
387
481
  } else {
388
- throw new Error("Unsupported wallet!");
482
+ throw new Error("The connected wallet doesn't support this method..!");
389
483
  }
390
484
  setConnected(true);
391
485
  } catch (error) {
392
486
  setIsConnecting(false);
393
487
  disconnect();
394
- throw new Error("Can't lasereyes to wallet");
488
+ throw error;
395
489
  } finally {
396
490
  setIsConnecting(false);
397
491
  }
@@ -414,14 +508,38 @@ var LaserEyesProvider = ({
414
508
  return;
415
509
  if (provider === UNISAT) {
416
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];
417
534
  } else {
418
- throw new Error("Unsupported wallet");
535
+ throw new Error("The connected wallet doesn't support this method..");
419
536
  }
420
537
  } catch (error) {
421
538
  throw error;
422
539
  }
423
540
  });
424
541
  const getNetwork = () => __async(void 0, null, function* () {
542
+ var _a;
425
543
  try {
426
544
  if (!library)
427
545
  return;
@@ -430,9 +548,13 @@ var LaserEyesProvider = ({
430
548
  const foundNetwork = getNetworkForUnisat(unisatNetwork);
431
549
  setNetwork(foundNetwork);
432
550
  return foundNetwork;
433
- } else {
434
- throw new Error("Unsupported wallet");
551
+ } else if (provider === XVERSE) {
552
+ if (address2.slice(0, 1) === "t") {
553
+ return TESTNET;
554
+ }
555
+ return MAINNET;
435
556
  }
557
+ return (_a = config == null ? void 0 : config.network) != null ? _a : MAINNET;
436
558
  } catch (error) {
437
559
  throw error;
438
560
  }
@@ -446,7 +568,7 @@ var LaserEyesProvider = ({
446
568
  yield library == null ? void 0 : library.switchNetwork(wantedNetwork);
447
569
  setNetwork(network2);
448
570
  } else {
449
- throw new Error("Unsupported wallet");
571
+ throw new Error("The connected wallet doesn't support this method..");
450
572
  }
451
573
  } catch (error) {
452
574
  throw error;
@@ -460,7 +582,7 @@ var LaserEyesProvider = ({
460
582
  const pub = yield library == null ? void 0 : library.getPublicKey();
461
583
  return yield library == null ? void 0 : library.getPublicKey();
462
584
  } else {
463
- throw new Error("Unsupported wallet");
585
+ throw new Error("The connected wallet doesn't support this method..");
464
586
  }
465
587
  } catch (error) {
466
588
  throw error;
@@ -472,8 +594,8 @@ var LaserEyesProvider = ({
472
594
  return;
473
595
  if (provider === UNISAT) {
474
596
  return yield library.getBalance();
475
- } else {
476
- throw new Error("Unsupported wallet");
597
+ } else if (provider === XVERSE) {
598
+ return yield getBTCBalance(paymentAddress);
477
599
  }
478
600
  } catch (error) {
479
601
  throw error;
@@ -486,7 +608,7 @@ var LaserEyesProvider = ({
486
608
  if (provider === UNISAT) {
487
609
  return yield library.getInscriptions(0, 10);
488
610
  } else {
489
- throw new Error("Unsupported wallet");
611
+ throw new Error("The connected wallet doesn't support this method..");
490
612
  }
491
613
  } catch (error) {
492
614
  throw error;
@@ -506,7 +628,7 @@ var LaserEyesProvider = ({
506
628
  throw new Error("Transaction failed");
507
629
  return txId;
508
630
  } else {
509
- throw new Error("Unsupported wallet");
631
+ throw new Error("The connected wallet doesn't support this method..");
510
632
  }
511
633
  } catch (error) {
512
634
  throw error;
@@ -518,8 +640,20 @@ var LaserEyesProvider = ({
518
640
  return;
519
641
  if (provider === UNISAT) {
520
642
  return yield library == null ? void 0 : library.signMessage(message);
521
- } else {
522
- 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
+ }
523
657
  }
524
658
  } catch (error) {
525
659
  throw error;
@@ -557,11 +691,91 @@ var LaserEyesProvider = ({
557
691
  signedPsbtBase64: psbtSignedPsbt.toBase64(),
558
692
  txId: void 0
559
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
+ };
560
774
  } else {
561
- throw new Error("Unsupported wallet");
775
+ throw new Error("The connected wallet doesn't support this method..");
562
776
  }
563
- } catch (error) {
564
- throw error;
777
+ } catch (error2) {
778
+ throw error2;
565
779
  }
566
780
  });
567
781
  const pushPsbt = (psbt) => __async(void 0, null, function* () {
@@ -571,7 +785,7 @@ var LaserEyesProvider = ({
571
785
  if (provider === UNISAT) {
572
786
  return yield library == null ? void 0 : library.pushPsbt(psbt);
573
787
  } else {
574
- throw new Error("Unsupported wallet");
788
+ throw new Error("The connected wallet doesn't support this method..");
575
789
  }
576
790
  } catch (error) {
577
791
  throw error;
@@ -584,7 +798,7 @@ var LaserEyesProvider = ({
584
798
  library,
585
799
  accounts,
586
800
  publicKey,
587
- address,
801
+ address: address2,
588
802
  paymentAddress,
589
803
  paymentPublicKey,
590
804
  provider,
@@ -593,6 +807,7 @@ var LaserEyesProvider = ({
593
807
  connected,
594
808
  isConnecting,
595
809
  hasUnisat,
810
+ hasXverse,
596
811
  // functions
597
812
  connect,
598
813
  disconnect,
@@ -621,6 +836,7 @@ export {
621
836
  MEMPOOL_SPACE_URL,
622
837
  OYL,
623
838
  P2PKH,
839
+ P2PSH,
624
840
  P2SH,
625
841
  P2TR,
626
842
  P2WPKH,
@@ -639,6 +855,7 @@ export {
639
855
  createConfig,
640
856
  findOrdinalsAddress,
641
857
  findPaymentAddress,
858
+ getAddressType,
642
859
  getBTCBalance,
643
860
  getBitcoinNetwork,
644
861
  getLeatherNetwork,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnisat/lasereyes",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "sideEffects": false,
5
5
  "private": false,
6
6
  "license": "MIT",