@satoshai/kit 0.2.0 → 0.3.1

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/dist/index.cjs CHANGED
@@ -406,14 +406,12 @@ var StacksWalletProvider = ({
406
406
  },
407
407
  connect: connect$1
408
408
  });
409
- const walletInfos = react.useMemo(() => {
410
- const { installed } = getStacksWallets();
411
- const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];
412
- return configured.map((w) => ({
413
- id: w,
414
- available: w === "wallet-connect" ? !!walletConnect?.projectId : installed.includes(w)
415
- }));
416
- }, [walletsKey, walletConnect?.projectId]);
409
+ const { installed } = getStacksWallets();
410
+ const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];
411
+ const walletInfos = configured.map((w) => ({
412
+ id: w,
413
+ available: w === "wallet-connect" ? !!walletConnect?.projectId : installed.includes(w)
414
+ }));
417
415
  const value = react.useMemo(() => {
418
416
  const walletState = isConnecting ? { status: "connecting", address: void 0, provider: void 0 } : address && provider ? { status: "connected", address, provider } : {
419
417
  status: "disconnected",
@@ -461,37 +459,108 @@ var useAddress = () => {
461
459
  }, [address, status, provider]);
462
460
  };
463
461
  var useConnect = () => {
464
- const { connect, reset, status } = useStacksWalletContext();
462
+ const {
463
+ connect: contextConnect,
464
+ reset: contextReset,
465
+ status: walletStatus
466
+ } = useStacksWalletContext();
467
+ const [error, setError] = react.useState(null);
468
+ const [mutationStatus, setMutationStatus] = react.useState("idle");
469
+ const connect = react.useCallback(
470
+ async (providerId, options) => {
471
+ setError(null);
472
+ setMutationStatus("pending");
473
+ let settled = false;
474
+ try {
475
+ await contextConnect(providerId, {
476
+ onSuccess: (address, provider) => {
477
+ settled = true;
478
+ setMutationStatus("success");
479
+ options?.onSuccess?.(address, provider);
480
+ },
481
+ onError: (err) => {
482
+ settled = true;
483
+ setError(err);
484
+ setMutationStatus("error");
485
+ options?.onError?.(err);
486
+ }
487
+ });
488
+ } finally {
489
+ if (!settled) {
490
+ setMutationStatus("idle");
491
+ }
492
+ }
493
+ },
494
+ [contextConnect]
495
+ );
496
+ const reset = react.useCallback(() => {
497
+ setError(null);
498
+ setMutationStatus("idle");
499
+ contextReset();
500
+ }, [contextReset]);
465
501
  const value = react.useMemo(
466
502
  () => ({
467
503
  connect,
468
504
  reset,
469
- isPending: status === "connecting"
505
+ error,
506
+ isError: mutationStatus === "error",
507
+ isIdle: mutationStatus === "idle",
508
+ isPending: mutationStatus === "pending" || walletStatus === "connecting",
509
+ isSuccess: mutationStatus === "success",
510
+ status: mutationStatus
470
511
  }),
471
- [connect, reset, status]
512
+ [connect, reset, error, mutationStatus, walletStatus]
472
513
  );
473
514
  return value;
474
515
  };
475
516
  var useDisconnect = () => {
476
- const { disconnect } = useStacksWalletContext();
477
- return react.useMemo(
517
+ const { disconnect: contextDisconnect } = useStacksWalletContext();
518
+ const [error, setError] = react.useState(null);
519
+ const [mutationStatus, setMutationStatus] = react.useState("idle");
520
+ const disconnect = react.useCallback(
521
+ (callback) => {
522
+ setError(null);
523
+ try {
524
+ contextDisconnect(callback);
525
+ setMutationStatus("success");
526
+ } catch (err) {
527
+ const normalizedError = err instanceof Error ? err : new Error(String(err));
528
+ setError(normalizedError);
529
+ setMutationStatus("error");
530
+ }
531
+ },
532
+ [contextDisconnect]
533
+ );
534
+ const reset = react.useCallback(() => {
535
+ setError(null);
536
+ setMutationStatus("idle");
537
+ }, []);
538
+ const value = react.useMemo(
478
539
  () => ({
479
- disconnect
540
+ disconnect,
541
+ reset,
542
+ error,
543
+ isError: mutationStatus === "error",
544
+ isIdle: mutationStatus === "idle",
545
+ isPending: mutationStatus === "pending",
546
+ isSuccess: mutationStatus === "success",
547
+ status: mutationStatus
480
548
  }),
481
- [disconnect]
549
+ [disconnect, reset, error, mutationStatus]
482
550
  );
551
+ return value;
483
552
  };
484
553
  var useSignMessage = () => {
485
554
  const { isConnected, provider } = useAddress();
486
555
  const [data, setData] = react.useState(void 0);
487
556
  const [error, setError] = react.useState(null);
488
- const [isPending, setIsPending] = react.useState(false);
557
+ const [status, setStatus] = react.useState("idle");
489
558
  const signMessageAsync = react.useCallback(
490
559
  async (variables) => {
491
560
  if (!isConnected) {
492
561
  throw new Error("Wallet is not connected");
493
562
  }
494
- setIsPending(true);
563
+ setStatus("pending");
495
564
  setError(null);
496
565
  setData(void 0);
497
566
  try {
@@ -512,12 +581,12 @@ var useSignMessage = () => {
512
581
  });
513
582
  }
514
583
  setData(result);
515
- setIsPending(false);
584
+ setStatus("success");
516
585
  return result;
517
586
  } catch (err) {
518
587
  const error2 = err instanceof Error ? err : new Error(String(err));
519
588
  setError(error2);
520
- setIsPending(false);
589
+ setStatus("error");
521
590
  throw error2;
522
591
  }
523
592
  },
@@ -535,13 +604,26 @@ var useSignMessage = () => {
535
604
  },
536
605
  [signMessageAsync]
537
606
  );
538
- return {
539
- signMessage,
540
- signMessageAsync,
541
- data,
542
- error,
543
- isPending
544
- };
607
+ const reset = react.useCallback(() => {
608
+ setData(void 0);
609
+ setError(null);
610
+ setStatus("idle");
611
+ }, []);
612
+ return react.useMemo(
613
+ () => ({
614
+ signMessage,
615
+ signMessageAsync,
616
+ reset,
617
+ data,
618
+ error,
619
+ isError: status === "error",
620
+ isIdle: status === "idle",
621
+ isPending: status === "pending",
622
+ isSuccess: status === "success",
623
+ status
624
+ }),
625
+ [signMessage, signMessageAsync, reset, data, error, status]
626
+ );
545
627
  };
546
628
 
547
629
  // src/utils/get-network-from-address.ts
@@ -562,13 +644,13 @@ var useWriteContract = () => {
562
644
  const { isConnected, address, provider } = useAddress();
563
645
  const [data, setData] = react.useState(void 0);
564
646
  const [error, setError] = react.useState(null);
565
- const [isPending, setIsPending] = react.useState(false);
647
+ const [status, setStatus] = react.useState("idle");
566
648
  const writeContractAsync = react.useCallback(
567
649
  async (variables) => {
568
650
  if (!isConnected || !address) {
569
651
  throw new Error("Wallet is not connected");
570
652
  }
571
- setIsPending(true);
653
+ setStatus("pending");
572
654
  setError(null);
573
655
  setData(void 0);
574
656
  try {
@@ -590,7 +672,7 @@ var useWriteContract = () => {
590
672
  anchorMode: 3
591
673
  });
592
674
  setData(response2.txHash);
593
- setIsPending(false);
675
+ setStatus("success");
594
676
  return response2.txHash;
595
677
  }
596
678
  const response = await connect.request("stx_callContract", {
@@ -606,12 +688,12 @@ var useWriteContract = () => {
606
688
  throw new Error("No transaction ID returned");
607
689
  }
608
690
  setData(response.txid);
609
- setIsPending(false);
691
+ setStatus("success");
610
692
  return response.txid;
611
693
  } catch (err) {
612
694
  const error2 = err instanceof Error ? err : new Error(String(err));
613
695
  setError(error2);
614
- setIsPending(false);
696
+ setStatus("error");
615
697
  throw error2;
616
698
  }
617
699
  },
@@ -629,13 +711,26 @@ var useWriteContract = () => {
629
711
  },
630
712
  [writeContractAsync]
631
713
  );
632
- return {
633
- writeContract,
634
- writeContractAsync,
635
- data,
636
- error,
637
- isPending
638
- };
714
+ const reset = react.useCallback(() => {
715
+ setData(void 0);
716
+ setError(null);
717
+ setStatus("idle");
718
+ }, []);
719
+ return react.useMemo(
720
+ () => ({
721
+ writeContract,
722
+ writeContractAsync,
723
+ reset,
724
+ data,
725
+ error,
726
+ isError: status === "error",
727
+ isIdle: status === "idle",
728
+ isPending: status === "pending",
729
+ isSuccess: status === "success",
730
+ status
731
+ }),
732
+ [writeContract, writeContractAsync, reset, data, error, status]
733
+ );
639
734
  };
640
735
  var useBnsName = (address) => {
641
736
  const [bnsName, setBnsName] = react.useState(null);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/stacks-provider-mapping.ts","../src/constants/storage-keys.ts","../src/constants/wallets.ts","../src/utils/get-stacks-wallets.ts","../src/provider/stacks-wallet-provider.helpers.ts","../src/hooks/use-xverse/use-xverse.helpers.ts","../src/hooks/use-xverse/use-xverse.ts","../src/utils/get-local-storage-wallet.ts","../src/provider/stacks-wallet-provider.tsx","../src/hooks/use-address.ts","../src/hooks/use-connect.ts","../src/hooks/use-disconnect.ts","../src/hooks/use-sign-message.ts","../src/utils/get-network-from-address.ts","../src/hooks/use-write-contract/use-write-contract.helpers.ts","../src/hooks/use-write-contract/use-write-contract.ts","../src/hooks/use-bns-name.ts","../src/hooks/use-wallets.ts"],"names":["WalletConnect","getSelectedProvider","connect","useState","useEffect","createContext","useRef","setSelectedProviderId","useCallback","data","request","clearSelectedProviderId","useMemo","jsx","useContext","error","postConditionToHex","cvToHex","response","PostConditionMode","getPrimaryName"],"mappings":";;;;;;;;;AAEO,IAAM,kCAAA,GAOT;AAAA,EACF,MAAA,EAAQ,iCAAA;AAAA,EACR,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,OAAA,EAAS,+BAAA;AAAA,EACT,gBAAA,EAAkB;AACpB,CAAA;;;ACfO,IAAM,oBAAA,GAAuB,eAAA;;;ACA7B,IAAM,wBAAA,GAA2B;AAAA,EACtC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;;;ACGO,IAAM,mBAAmB,MAAqB;AACjD,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,wBAAwB,CAAA;AAC9C,EAAA,MAAM,YAAY,SAAA,CAAU,MAAA;AAAA,IAAO,CAAC,MAAA,KAChC,gCAAA,CAAiC,MAAM;AAAA,GAC3C;AAEA,EAAA,OAAO,EAAE,WAAW,SAAA,EAAU;AAClC;AAEO,IAAM,gCAAA,GAAmC,CAC5C,MAAA,KACU;AACV,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAG1C,EAAA,QAAQ,MAAA;AAAQ,IACZ,KAAK,QAAA;AACD,MAAA,OAAO,CAAC,CAAE,MAAA,CAAe,eAAA;AAAA,IAC7B,KAAK,SAAA;AACD,MAAA,OACI,CAAC,CAAE,MAAA,CAAe,eAAA,IAClB,CAAC,CAAE,MAAA,CAAe,kBAAA;AAAA,IAE1B,KAAK,QAAA;AACD,MAAA,OAAO,CAAC,CAAE,MAAA,CAAe,cAAA;AAAA,IAC7B,KAAK,KAAA;AACD,MAAA,OAAO,CAAC,CAAE,MAAA,CAAe,SAAA;AAAA,IAC7B,KAAK,SAAA;AACD,MAAA,OAAO,CAAC,CAAE,MAAA,CAAe,gBAAA,EAAkB,YAAA;AAAA,IAC/C,KAAK,gBAAA;AACD,MAAA,OAAO,IAAA;AAAA;AAGnB,CAAA;ACpCA,IAAM,oBAAA,GAAuB;AAAA,EACzB,OAAA,EAASA,qBAAA,CAAc,MAAA,CAAO,MAAA,CAAO,OAAA;AAAA,EACrC,OAAA,EAASA,qBAAA,CAAc,MAAA,CAAO,MAAA,CAAO;AACzC,CAAA;AAEO,IAAM,wBAAA,GAA2B,CACpC,SAAA,EACA,QAAA,EACA,MAAA,KAKC;AACD,EAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,CAAC,SAAS,CAAA;AAC3C,EAAA,MAAM,sBAAsB,cAAA,CAAe,GAAA;AAAA,IACvC,CAAC,KAAA,KAAU,oBAAA,CAAqB,KAAK;AAAA,GACzC;AAEA,EAAA,OAAO;AAAA,IACH,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACN,IAAA,EAAM,qBAAA;AAAA,MACN,WAAA,EAAa,qBAAA;AAAA,MACb,GAAA,EAAK,0BAAA;AAAA,MACL,KAAA,EAAO,CAAC,mCAAmC,CAAA;AAAA,MAC3C,GAAG;AAAA,KACP;AAAA,IACA,QAAA,EAAU;AAAA,MACN;AAAA,QACI,GAAGA,sBAAc,QAAA,CAAS,MAAA;AAAA,QAC1B,MAAA,EAAQ;AAAA;AACZ;AACJ,GACJ;AACJ,CAAA;AAEO,IAAM,sBAAsB,YAAY;AAC3C,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACnB,IAAA,MAAM,IAAI,MAAM,uCAAgC,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,SAAA,CAAU,OAAO,OAAA,EAAQ;AAE7D,EAAA,IAAI,CAAC,cAAA,EAAgB;AACjB,IAAA,MAAM,IAAI,MAAM,6CAAsC,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO;AAAA,IACH,SAAS,cAAA,CAAe,OAAA;AAAA,IACxB,QAAA,EAAU;AAAA,GACd;AACJ,CAAA;AAEO,IAAM,oBAAA,GAAuB,CAChC,aAAA,EACA,SAAA,KACC;AACD,EAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,aAAa,CAAA,OAAA,CAAS,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,aAAA,KAAkB,SAAA,IAAa,aAAA,KAAkB,QAAA,EAAU;AAC3D,IAAA,MAAM,aAAa,SAAA,CAAU,IAAA;AAAA,MACzB,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW;AAAA,KAC9B,EAAG,OAAA;AAEH,IAAA,IAAI,YAAY,OAAO,UAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA;AAAA,IAAK,CAAC,IAAA,KAClC,IAAA,CAAK,OAAA,EAAS,WAAW,GAAG;AAAA,GAChC,EAAG,OAAA;AAEH,EAAA,IAAI,eAAe,OAAO,aAAA;AAE1B,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,CAAC,CAAA,EAAG,OAAA;AAEpC,EAAA,IAAI,aAAA,EAAe,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,aAAA;AAE3C,EAAA,MAAM,IAAI,KAAA;AAAA,IACN,qCAAqC,aAAa,CAAA,OAAA;AAAA,GACtD;AACJ,CAAA;ACxFO,IAAM,uBAAuB,YAI/B,MAAM,OAAO,eAAA,EAAiB,cAAA,EAAgB,kBAAiB,IAAM,IAAA;AAEnE,IAAM,0BAAA,GAA6B,CACtC,OAAA,KACU,OAAA,KAAY,UAAa,OAAA,KAAY,OAAA;AAE5C,IAAM,qBAAA,GAAwB,OACjC,WAAA,GAAc,EAAA,EACd,eAAe,GAAA,KACI;AACnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,WAAWC,2BAAA,EAAoB;AAErC,IAAA,IAAI,QAAA,EAAU,OAAA,IAAW,QAAA,EAAU,WAAA,EAAa,OAAO,IAAA;AAEvD,IAAA,MAAM,IAAI,OAAA;AAAA,MAAQ,CAAC,OAAA,KACf,UAAA,CAAW,OAAA,EAAS,YAAA,GAAe,KAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC;AAAA,KACzD;AAAA,EACJ;AAEA,EAAA,OAAO,KAAA;AACX,CAAA;AAEO,IAAM,+BAAA,GAAkC,CAC3C,SAAA,EAOA,cAAA,EACA,iBACA,OAAA,KACC;AACD,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzC,IAAA,KAAK,OAAA,EAAQ;AACb,IAAA;AAAA,EACJ;AAEA,EAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA;AAAA,IAC5B,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,KAAY,QAAA,IAAY,IAAI,WAAA,KAAgB;AAAA,GAC7D;AAEA,EAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AACzB,IAAA,KAAK,OAAA,EAAQ;AACb,IAAA;AAAA,EACJ;AAEA,EAAA,IAAI,aAAA,CAAc,YAAY,cAAA,EAAgB;AAC1C,IAAA,eAAA,CAAgB,cAAc,OAAO,CAAA;AAAA,EACzC;AACJ,CAAA;;;AC7CO,IAAM,YAAY,CAAC;AAAA,EACtB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,WACAC;AACJ,CAAA,KAQM;AACF,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIC,eAAS,KAAK,CAAA;AAE5D,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,aAAa,QAAA,EAAU;AAE3B,IAAA,MAAM,gBAAgB,YAAY;AAC9B,MAAA,MAAM,KAAA,GAAQ,MAAM,qBAAA,EAAsB;AAE1C,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAExB,MAAA,IAAI,CAAC,KAAA,EAAO;AACR,QAAA,OAAA,CAAQ,MAAM,sCAAsC,CAAA;AAAA,MACxD;AAAA,IACJ,CAAA;AAEA,IAAA,KAAK,aAAA,EAAc;AAAA,EACvB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,QAAA,KAAa,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,eAAA,EAAiB;AAE3D,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,cAAA;AAEJ,IAAA,MAAM,cAAc,YAAY;AAC5B,MAAA,IAAI;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,oBAAA,EAAqB;AAE/C,QAAA,IAAI,SAAA,EAAW;AAEf,QAAA,IAAI,CAAC,0BAAA,CAA2B,WAAA,EAAa,OAAO,CAAA,EAAG;AAEvD,QAAA,MAAM,QAAA,GAAW,MAAMH,2BAAAA,EAAoB,EAAG,OAAA;AAAA,UAC1C,gBAAA;AAAA,UACA;AAAA,SACJ;AAEA,QAAA,IAAI,SAAA,EAAW;AAEf,QAAA,+BAAA;AAAA,UACI,UAAU,MAAA,EAAQ,SAAA;AAAA,UAClB,OAAA;AAAA,UACA,eAAA;AAAA,UACA,MAAMC,UAAQ,QAAQ;AAAA,SAC1B;AAEA,QAAA,cAAA,GAAiBD,6BAAoB,EAAG,WAAA;AAAA,UACpC,eAAA;AAAA,UACA,CAAC,KAAA,KAAoC;AACjC,YAAA,+BAAA;AAAA,cACI,KAAA,EAAO,SAAA;AAAA,cACP,OAAA;AAAA,cACA,eAAA;AAAA,cACA,MAAMC,UAAQ,QAAQ;AAAA,aAC1B;AAAA,UACJ;AAAA,SACJ;AAAA,MACJ,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAAA,MAClD;AAAA,IACJ,CAAA;AAEA,IAAA,KAAK,WAAA,EAAY;AAEjB,IAAA,OAAO,MAAM;AACT,MAAA,SAAA,GAAY,IAAA;AAEZ,MAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,MAAA,IAAI;AACA,QAAA,cAAA,EAAe;AAAA,MACnB,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AAAA,MAC5D;AAAA,IACJ,CAAA;AAAA,EACJ,GAAG,CAAC,OAAA,EAAS,iBAAiB,eAAA,EAAiBA,SAAA,EAAS,QAAQ,CAAC,CAAA;AACrE,CAAA;;;ACnGO,IAAM,wBAAwB,MAGzB;AACR,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,oBAAoB,CAAA;AAExD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAK9B,IAAA,MAAM,UAAU,wBAAA,CAAyB,IAAA;AAAA,MACrC,CAAC,MAAA,KAAW,MAAA,KAAW,IAAA,CAAK;AAAA,KAChC;AAEA,IAAA,OAAO,UAAU,IAAA,GAAO,IAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;ACcA,IAAM,mBAAA,GAAsBG,mBAAA;AAAA,EACxB;AACJ,CAAA;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACjC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA;AACJ,CAAA,KAAiC;AAC7B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,cAAAA,EAA6B;AAC3D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,EAE9B;AACF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AAGtD,EAAA,MAAM,aAAA,GAAgBG,aAAO,CAAC,CAAA;AAG9B,EAAA,MAAM,SAAA,GAAYA,aAA6B,IAAI,CAAA;AAKnD,EAAA,MAAM,UAAA,GAAa,OAAA,EAAS,IAAA,CAAK,GAAG,CAAA;AAGpC,EAAAF,gBAAU,MAAM;AACZ,IAAA,IAAI,SAAS,QAAA,CAAS,gBAAgB,CAAA,IAAK,CAAC,eAAe,SAAA,EAAW;AAClE,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ,CAAA,EAAG,CAAC,UAAA,EAAY,aAAA,EAAe,SAAS,CAAC,CAAA;AAEzC,EAAAA,gBAAU,MAAM;AACZ,IAAA,MAAM,sBAAsB,YAAY;AACpC,MAAA,MAAM,YAAY,qBAAA,EAAsB;AAExC,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACA,QAAA,IAAI,SAAA,CAAU,aAAa,KAAA,EAAO;AAC9B,UAAA,MAAM,IAAA,GAAO,MAAM,mBAAA,EAAoB;AACvC,UAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AACvB,UAAA,WAAA,CAAY,KAAK,QAAQ,CAAA;AACzB,UAAA;AAAA,QACJ;AAEA,QAAA,IACI,SAAA,CAAU,QAAA,KAAa,gBAAA,IACvB,aAAA,EAAe,SAAA,EACjB;AACE,UAAA,MAAM,cAAcJ,qBAAAA,CAAc,kBAAA;AAAA,YAC9B,wBAAA;AAAA,cACI,aAAA,CAAc,SAAA;AAAA,cACd,aAAA,CAAc,QAAA;AAAA,cACd,aAAA,CAAc;AAAA;AAClB,WACJ;AACA,UAAA,SAAA,CAAU,OAAA,GAAU,WAAA;AACpB,UAAA,MAAM,WAAA;AACN,UAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,QACxB;AAEA,QAAA,UAAA,CAAW,UAAU,OAAO,CAAA;AAC5B,QAAA,WAAA,CAAY,UAAU,QAAQ,CAAA;AAC9B,QAAAO,6BAAA;AAAA,UACI,kCAAA,CAAmC,UAAU,QAAQ;AAAA,SACzD;AAAA,MACJ,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,MAC/D,CAAA,SAAE;AACE,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACzB;AAAA,IACJ,CAAA;AAEA,IAAA,KAAK,mBAAA,EAAoB;AAAA,EAC7B,CAAA,EAAG,CAAC,aAAA,EAAe,SAAS,CAAC,CAAA;AAE7B,EAAA,MAAML,SAAA,GAAUM,iBAAA;AAAA,IACZ,OAAO,YAAmC,OAAA,KAA6B;AACnE,MAAA,MAAM,gBAAgB,wBAAA,CAAyB,IAAA;AAAA,QAC3C,CAAC,WAAW,MAAA,KAAW;AAAA,OAC3B;AAEA,MAAA,IAAI,CAAC,aAAA,EAAe;AAChB,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UACd;AAAA,SACJ;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,OAAA,EAAS,UAAU,KAAK,CAAA;AACxB,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,CAAC,gCAAA,CAAiC,aAAa,CAAA,EAAG;AAClD,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UACd,GAAG,aAAa,CAAA,0EAAA;AAAA,SACpB;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,OAAA,EAAS,UAAU,KAAK,CAAA;AACxB,QAAA;AAAA,MACJ;AAEA,MAAA,IACI,aAAA,KAAkB,gBAAA,IAClB,CAAC,aAAA,EAAe,SAAA,EAClB;AACE,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UACd;AAAA,SACJ;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,OAAA,EAAS,UAAU,KAAK,CAAA;AACxB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,GAAA,GAAM,EAAE,aAAA,CAAc,OAAA;AAC5B,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACA,QAAA,IAAI,kBAAkB,KAAA,EAAO;AACzB,UAAA,MAAMC,KAAAA,GAAO,MAAM,mBAAA,EAAoB;AACvC,UAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AACnC,UAAA,UAAA,CAAWA,MAAK,OAAO,CAAA;AACvB,UAAA,WAAA,CAAYA,MAAK,QAAQ,CAAA;AACzB,UAAA,OAAA,EAAS,SAAA,GAAYA,KAAAA,CAAK,OAAA,EAASA,KAAAA,CAAK,QAAQ,CAAA;AAChD,UAAA;AAAA,QACJ;AAEA,QAAAF,6BAAA;AAAA,UACI,mCAAmC,aAAa;AAAA,SACpD;AAEA,QAAA,MAAM,QAAA,GACF,aAAA,KAAkB,gBAAA,IAAoB,aAAA,GAChC,wBAAA;AAAA,UACI,aAAA,CAAc,SAAA;AAAA,UACd,aAAA,CAAc,QAAA;AAAA,UACd,aAAA,CAAc;AAAA,SAClB,GACA,KAAA,CAAA;AAEV,QAAA,IAAI,QAAA,EAAU;AAEV,UAAA,IAAI,SAAA,CAAU,OAAA,EAAS,MAAM,SAAA,CAAU,OAAA;AACvC,UAAA,MAAM,WAAA,GACFP,qBAAAA,CAAc,kBAAA,CAAmB,QAAQ,CAAA;AAC7C,UAAA,SAAA,CAAU,OAAA,GAAU,WAAA;AACpB,UAAA,MAAM,WAAA;AACN,UAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,QACxB;AAEA,QAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AAEnC,QAAA,MAAM,IAAA,GAAO,WACP,MAAMU,eAAA;AAAA,UACF,EAAE,eAAe,QAAA,EAAS;AAAA,UAC1B,cAAA;AAAA,UACA;AAAC,SACL,GACA,MAAMA,eAAA,CAAQ,cAAc,CAAA;AAElC,QAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AAEnC,QAAA,MAAM,gBAAA,GAAmB,oBAAA;AAAA,UACrB,aAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACT;AAEA,QAAA,UAAA,CAAW,gBAAgB,CAAA;AAC3B,QAAA,WAAA,CAAY,aAAa,CAAA;AACzB,QAAA,OAAA,EAAS,SAAA,GAAY,kBAAkB,aAAa,CAAA;AAAA,MACxD,SAAS,KAAA,EAAO;AACZ,QAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AACnC,QAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAIhD,QAAA,IAAI,kBAAkB,KAAA,EAAO;AACzB,UAAAT,2BAAAA,IAAuB,UAAA,IAAa;AACpC,UAAAU,+BAAA,EAAwB;AAAA,QAC5B;AACA,QAAA,OAAA,EAAS,UAAU,KAAc,CAAA;AAAA,MACrC,CAAA,SAAE;AACE,QAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AAC/B,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACzB;AAAA,MACJ;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GAClB;AAEA,EAAA,MAAM,KAAA,GAAQH,kBAAY,MAAM;AAC5B,IAAA,aAAA,CAAc,OAAA,EAAA;AACd,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAAG,+BAAA,EAAwB;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaH,iBAAA;AAAA,IACf,CAAC,QAAA,KAA0B;AACvB,MAAA,YAAA,CAAa,WAAW,oBAAoB,CAAA;AAC5C,MAAA,UAAA,CAAW,MAAS,CAAA;AACpB,MAAA,WAAA,CAAY,MAAS,CAAA;AACrB,MAAAP,2BAAAA,IAAuB,UAAA,IAAa;AACpC,MAAAU,+BAAA,EAAwB;AACxB,MAAA,QAAA,IAAW;AACX,MAAA,YAAA,IAAe;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACjB;AAEA,EAAAP,gBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAU;AAE3B,IAAA,YAAA,CAAa,OAAA;AAAA,MACT,oBAAA;AAAA,MACA,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,UAAU;AAAA,KACxC;AAAA,EACJ,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtB,EAAAA,gBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,IAAY,CAAC,SAAA,EAAW;AAEzC,IAAA,SAAA,CAAU,UAAU,OAAO,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,OAAA,EAAS,QAAA,EAAU,SAAS,CAAC,CAAA;AAEjC,EAAA,SAAA,CAAU;AAAA,IACN,OAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA,EAAiB,CAAC,UAAA,KAAuB;AACrC,MAAA,UAAA,CAAW,UAAU,CAAA;AACrB,MAAA,eAAA,GAAkB,UAAU,CAAA;AAAA,IAChC,CAAA;AAAA,aACAF;AAAA,GACH,CAAA;AAED,EAAA,MAAM,WAAA,GAAcU,cAAQ,MAAM;AAC9B,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,gBAAA,EAAiB;AACvC,IAAA,MAAM,UAAA,GAAa,OAAA,IAAW,CAAC,GAAG,wBAAwB,CAAA;AAE1D,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC1B,EAAA,EAAI,CAAA;AAAA,MACJ,SAAA,EACI,MAAM,gBAAA,GACA,CAAC,CAAC,aAAA,EAAe,SAAA,GACjB,SAAA,CAAU,QAAA,CAAS,CAAC;AAAA,KAClC,CAAE,CAAA;AAAA,EACN,CAAA,EAAG,CAAC,UAAA,EAAY,aAAA,EAAe,SAAS,CAAC,CAAA;AAEzC,EAAA,MAAM,KAAA,GAAQA,cAAQ,MAA0B;AAC5C,IAAA,MAAM,cAA2B,YAAA,GAC3B,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAS,MAAA,EAAW,QAAA,EAAU,MAAA,EAAU,GAChE,WAAW,QAAA,GACX,EAAE,QAAQ,WAAA,EAAa,OAAA,EAAS,UAAS,GACzC;AAAA,MACI,MAAA,EAAQ,cAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACd;AAEN,IAAA,OAAO;AAAA,MACH,GAAG,WAAA;AAAA,eACHV,SAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACb;AAAA,EACJ,CAAA,EAAG,CAAC,OAAA,EAAS,QAAA,EAAU,cAAcA,SAAA,EAAS,UAAA,EAAY,KAAA,EAAO,WAAW,CAAC,CAAA;AAE7E,EAAA,uBACIW,cAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OACzB,QAAA,EACL,CAAA;AAER;AAEO,IAAM,yBAAyB,MAAM;AACxC,EAAA,MAAM,OAAA,GAAUC,iBAAW,mBAAmB,CAAA;AAE9C,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AAEA,EAAA,OAAO,OAAA;AACX,CAAA;ACvTO,IAAM,aAAa,MAAwB;AAC9C,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,KAAa,sBAAA,EAAuB;AAE7D,EAAA,OAAOF,cAAQ,MAAM;AACjB,IAAA,IAAI,MAAA,KAAW,WAAA,IAAe,OAAA,IAAW,QAAA,EAAU;AAC/C,MAAA,OAAO;AAAA,QACH,OAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,YAAA,EAAc,KAAA;AAAA,QACd,cAAA,EAAgB,KAAA;AAAA,QAChB;AAAA,OACJ;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,MAAA;AAAA,MACT,WAAA,EAAa,KAAA;AAAA,MACb,cAAc,MAAA,KAAW,YAAA;AAAA,MACzB,gBAAgB,MAAA,KAAW,cAAA;AAAA,MAC3B,QAAA,EAAU;AAAA,KACd;AAAA,EACJ,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAClC;ACvCO,IAAM,aAAa,MAAM;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,KAAW,sBAAA,EAAuB;AAE1D,EAAA,MAAM,KAAA,GAAQA,aAAAA;AAAA,IACZ,OAAO;AAAA,MACL,OAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAW,MAAA,KAAW;AAAA,KACxB,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,MAAM;AAAA,GACzB;AAEA,EAAA,OAAO,KAAA;AACT;ACbO,IAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,sBAAA,EAAuB;AAE9C,EAAA,OAAOA,aAAAA;AAAA,IACL,OAAO;AAAA,MACL;AAAA,KACF,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AACF;ACWO,IAAM,iBAAiB,MAAM;AAChC,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAS,GAAI,UAAA,EAAW;AAC7C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIT,eAAsC,MAAS,CAAA;AACvE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,gBAAA,GAAmBK,iBAAAA;AAAA,IACrB,OAAO,SAAA,KAA8D;AACjE,MAAA,IAAI,CAAC,WAAA,EAAa;AACd,QAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,MAC7C;AAEA,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAA,CAAQ,MAAS,CAAA;AAEjB,MAAA,IAAI;AACA,QAAA,IAAI,MAAA;AAEJ,QAAA,IAAI,aAAa,KAAA,EAAO;AACpB,UAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACnB,YAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,UAC1C;AAEA,UAAA,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY;AAAA,YAC/C,SAAS,SAAA,CAAU;AAAA,WACtB,CAAA;AAAA,QACL,CAAA,MAAO;AACH,UAAA,MAAA,GAAS,MAAME,gBAAQ,iBAAA,EAAmB;AAAA,YACtC,SAAS,SAAA,CAAU,OAAA;AAAA,YACnB,GAAI,UAAU,SAAA,IAAa;AAAA,cACvB,WAAW,SAAA,CAAU;AAAA;AACzB,WACH,CAAA;AAAA,QACL;AAEA,QAAA,OAAA,CAAQ,MAAM,CAAA;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAO,MAAA;AAAA,MACX,SAAS,GAAA,EAAK;AACV,QAAA,MAAMK,MAAAA,GACF,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACtD,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAMA,MAAAA;AAAA,MACV;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,GAC1B;AAEA,EAAA,MAAM,WAAA,GAAcP,iBAAAA;AAAA,IAChB,CAAC,WAAiC,OAAA,KAAiC;AAC/D,MAAA,gBAAA,CAAiB,SAAS,CAAA,CACrB,IAAA,CAAK,CAACC,KAAAA,KAAS;AACZ,QAAA,OAAA,EAAS,YAAYA,KAAI,CAAA;AACzB,QAAA,OAAA,EAAS,SAAA,GAAYA,OAAM,IAAI,CAAA;AAAA,MACnC,CAAC,CAAA,CACA,KAAA,CAAM,CAACM,MAAAA,KAAU;AACd,QAAA,OAAA,EAAS,UAAUA,MAAK,CAAA;AACxB,QAAA,OAAA,EAAS,SAAA,GAAY,QAAWA,MAAK,CAAA;AAAA,MACzC,CAAC,CAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACrB;AAEA,EAAA,OAAO;AAAA,IACH,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACJ;AACJ;;;AClGO,IAAM,qBAAA,GAAwB,CAAC,OAAA,KAAoB;AACtD,EAAA,IAAI,QAAQ,UAAA,CAAW,IAAI,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACtD,IAAA,OAAO,SAAA;AAAA,EACX;AAEA,EAAA,IAAI,QAAQ,UAAA,CAAW,IAAI,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACtD,IAAA,OAAO,SAAA;AAAA,EACX;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAE,CAAA;AACxD;ACPO,IAAM,2BAAA,GAA8B,CAAC,cAAA,KAC1C,cAAA,CAAe,IAAI,CAAC,EAAA,KAAOC,+BAAA,CAAmB,EAAE,CAAC,CAAA;AAE5C,IAAM,iBAAA,GAAoB,CAAC,IAAA,KAChC,IAAA,CAAK,IAAI,CAAC,GAAA,KAAQC,oBAAA,CAAQ,GAAG,CAAC,CAAA;;;ACWzB,IAAM,mBAAmB,MAAM;AAClC,EAAA,MAAM,EAAE,WAAA,EAAa,OAAA,EAAS,QAAA,KAAa,UAAA,EAAW;AAEtD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAId,eAA6B,MAAS,CAAA;AAC9D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,kBAAA,GAAqBK,iBAAAA;AAAA,IACvB,OAAO,SAAA,KAAuD;AAC1D,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC1B,QAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,MAC7C;AAEA,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAA,CAAQ,MAAS,CAAA;AAEjB,MAAA,IAAI;AACA,QAAA,IAAI,aAAa,KAAA,EAAO;AACpB,UAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACnB,YAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,UAC1C;AAEA,UAAA,MAAMU,SAAAA,GACF,MAAM,MAAA,CAAO,SAAA,CAAU,OAAO,eAAA,CAAgB;AAAA,YAC1C,iBAAiB,SAAA,CAAU,OAAA;AAAA,YAC3B,cAAc,SAAA,CAAU,QAAA;AAAA,YACxB,cAAc,SAAA,CAAU,YAAA;AAAA,YACxB,YAAA,EAAc,iBAAA,CAAkB,SAAA,CAAU,IAAI,CAAA;AAAA,YAC9C,cAAA,EAAgB,2BAAA;AAAA,cACZ,UAAU,EAAA,CAAG;AAAA,aACjB;AAAA,YACA,iBAAA,EAAmB,UAAU,EAAA,CAAG,IAAA;AAAA,YAChC,UAAA,EAAY,OAAA;AAAA,YACZ,MAAA,EAAQ,eAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACf,CAAA;AAEL,UAAA,OAAA,CAAQA,UAAS,MAAM,CAAA;AACvB,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,OAAOA,SAAAA,CAAS,MAAA;AAAA,QACpB;AAEA,QAAA,MAAM,QAAA,GAAW,MAAMR,eAAAA,CAAQ,kBAAA,EAAoB;AAAA,UAC/C,OAAA;AAAA,UACA,UAAU,CAAA,EAAG,SAAA,CAAU,OAAO,CAAA,CAAA,EAAI,UAAU,QAAQ,CAAA,CAAA;AAAA,UACpD,cAAc,SAAA,CAAU,YAAA;AAAA,UACxB,cAAc,SAAA,CAAU,IAAA;AAAA,UACxB,cAAA,EAAgB,UAAU,EAAA,CAAG,cAAA;AAAA,UAC7B,mBACI,SAAA,CAAU,EAAA,CAAG,IAAA,KAASS,8BAAA,CAAkB,QAClC,OAAA,GACA,MAAA;AAAA,UACV,OAAA,EAAS,sBAAsB,OAAO;AAAA,SACzC,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAChB,UAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,QAChD;AAEA,QAAA,OAAA,CAAQ,SAAS,IAAI,CAAA;AACrB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACpB,SAAS,GAAA,EAAK;AACV,QAAA,MAAMJ,MAAAA,GACF,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACtD,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAMA,MAAAA;AAAA,MACV;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,OAAA,EAAS,QAAQ;AAAA,GACnC;AAEA,EAAA,MAAM,aAAA,GAAgBP,iBAAAA;AAAA,IAClB,CAAC,WAAmC,OAAA,KAAmC;AACnE,MAAA,kBAAA,CAAmB,SAAS,CAAA,CACvB,IAAA,CAAK,CAACC,KAAAA,KAAS;AACZ,QAAA,OAAA,EAAS,YAAYA,KAAI,CAAA;AACzB,QAAA,OAAA,EAAS,SAAA,GAAYA,OAAM,IAAI,CAAA;AAAA,MACnC,CAAC,CAAA,CACA,KAAA,CAAM,CAACM,MAAAA,KAAU;AACd,QAAA,OAAA,EAAS,UAAUA,MAAK,CAAA;AACxB,QAAA,OAAA,EAAS,SAAA,GAAY,QAAWA,MAAK,CAAA;AAAA,MACzC,CAAC,CAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,kBAAkB;AAAA,GACvB;AAEA,EAAA,OAAO;AAAA,IACH,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACJ;AACJ;AC3GO,IAAM,UAAA,GAAa,CAAC,OAAA,KAAqB;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIZ,eAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAAC,gBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,eAAe,YAAY;AAC7B,MAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GAAU,sBAAsB,OAAO,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAMgB,uBAAA,CAAe,EAAE,OAAA,EAAS,SAAS,CAAA;AAExD,QAAA,MAAM,QAAA,GAAW,SACX,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,CAAA,GAClC,IAAA;AAEN,QAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AACJ,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACnB,CAAA,SAAE;AACE,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACtB;AAAA,IACJ,CAAA;AAEA,IAAA,KAAK,YAAA,EAAa;AAAA,EACtB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,SAAS,SAAA,EAAU;AAChC;ACnCO,IAAM,aAAa,MAAM;AAC5B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,sBAAA,EAAuB;AAE3C,EAAA,OAAOR,cAAQ,OAAO,EAAE,SAAQ,CAAA,EAAI,CAAC,OAAO,CAAC,CAAA;AACjD","file":"index.cjs","sourcesContent":["import type { SupportedStacksWallet } from \"./wallets\";\n\nexport const STACKS_TO_STACKS_CONNECT_PROVIDERS: Record<\n Exclude<SupportedStacksWallet, \"okx\">,\n | \"LeatherProvider\"\n | \"XverseProviders.BitcoinProvider\"\n | \"AsignaProvider\"\n | \"FordefiProviders.UtxoProvider\"\n | \"WalletConnectProvider\"\n> = {\n xverse: \"XverseProviders.BitcoinProvider\",\n leather: \"LeatherProvider\",\n asigna: \"AsignaProvider\",\n fordefi: \"FordefiProviders.UtxoProvider\",\n \"wallet-connect\": \"WalletConnectProvider\",\n};\n","export const LOCAL_STORAGE_STACKS = \"@satoshai/kit\";\n","export const SUPPORTED_STACKS_WALLETS = [\n \"xverse\",\n \"leather\",\n \"okx\",\n \"asigna\",\n \"fordefi\",\n \"wallet-connect\",\n] as const;\n\nexport type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];\n","import {\n SUPPORTED_STACKS_WALLETS,\n type SupportedStacksWallet,\n} from '../constants/wallets';\n\nexport interface StacksWallets {\n supported: SupportedStacksWallet[];\n installed: SupportedStacksWallet[];\n}\n\nexport const getStacksWallets = (): StacksWallets => {\n const supported = [...SUPPORTED_STACKS_WALLETS];\n const installed = supported.filter((wallet) =>\n checkIfStacksProviderIsInstalled(wallet)\n );\n\n return { supported, installed };\n};\n\nexport const checkIfStacksProviderIsInstalled = (\n wallet: SupportedStacksWallet\n): boolean => {\n if (typeof window === 'undefined') return true;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n switch (wallet) {\n case 'xverse':\n return !!(window as any).XverseProviders;\n case 'leather':\n return (\n !!(window as any).LeatherProvider ||\n !!(window as any).HiroWalletProvider\n );\n case 'asigna':\n return !!(window as any).AsignaProvider;\n case 'okx':\n return !!(window as any).okxwallet;\n case 'fordefi':\n return !!(window as any).FordefiProviders?.UtxoProvider;\n case 'wallet-connect':\n return true;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n};\n","import type { SupportedStacksWallet } from '../constants/wallets';\nimport type {\n WalletConnectMetadata,\n StacksChain,\n} from './stacks-wallet-provider.types';\nimport { WalletConnect } from '@stacks/connect';\n\nconst STACKS_CHAIN_MAPPING = {\n mainnet: WalletConnect.Chains.Stacks.Mainnet,\n testnet: WalletConnect.Chains.Stacks.Testnet,\n} as const;\n\nexport const buildWalletConnectConfig = (\n projectId: string,\n metadata?: Partial<WalletConnectMetadata>,\n chains?: StacksChain[]\n): {\n projectId: string;\n metadata: WalletConnectMetadata;\n networks: (typeof WalletConnect.Networks.Stacks)[];\n} => {\n const selectedChains = chains ?? ['mainnet'];\n const walletConnectChains = selectedChains.map(\n (chain) => STACKS_CHAIN_MAPPING[chain]\n );\n\n return {\n projectId,\n metadata: {\n name: 'Universal Connector',\n description: 'Universal Connector',\n url: 'https://appkit.reown.com',\n icons: ['https://appkit.reown.com/icon.png'],\n ...metadata,\n },\n networks: [\n {\n ...WalletConnect.Networks.Stacks,\n chains: walletConnectChains,\n },\n ],\n };\n};\n\nexport const getOKXStacksAddress = async () => {\n if (!window.okxwallet) {\n throw new Error('🚨 OKX Wallet is not installed');\n }\n\n const stacksResponse = await window.okxwallet.stacks.connect();\n\n if (!stacksResponse) {\n throw new Error('🚨 Failed to connect with OKX Wallet');\n }\n\n return {\n address: stacksResponse.address,\n provider: 'okx' as const,\n };\n};\n\nexport const extractStacksAddress = (\n typedProvider: SupportedStacksWallet,\n addresses: { address?: string; symbol?: string }[]\n) => {\n if (!addresses.length) {\n throw new Error(`No addresses provided for ${typedProvider} wallet`);\n }\n\n if (typedProvider === 'leather' || typedProvider === 'asigna') {\n const stxAddress = addresses.find(\n (addr) => addr.symbol === 'STX'\n )?.address;\n\n if (stxAddress) return stxAddress;\n }\n\n const stacksAddress = addresses.find((addr) =>\n addr.address?.startsWith('S')\n )?.address;\n\n if (stacksAddress) return stacksAddress;\n\n const legacyAddress = addresses[2]?.address;\n\n if (legacyAddress?.startsWith('S')) return legacyAddress;\n\n throw new Error(\n `No valid Stacks address found for ${typedProvider} wallet`\n );\n};\n","import { getSelectedProvider } from '@stacks/connect';\n\nexport const getXverseProductInfo = async (): Promise<{\n version?: string;\n name?: string;\n} | null> =>\n (await window.XverseProviders?.StacksProvider?.getProductInfo?.()) ?? null;\n\nexport const shouldSupportAccountChange = (\n version: string | undefined\n): boolean => version !== undefined && version !== '1.0.0';\n\nexport const waitForXverseProvider = async (\n maxAttempts = 10,\n initialDelay = 200\n): Promise<boolean> => {\n for (let i = 0; i < maxAttempts; i++) {\n const provider = getSelectedProvider();\n\n if (provider?.request && provider?.addListener) return true;\n\n await new Promise((resolve) =>\n setTimeout(resolve, initialDelay * Math.min(i + 1, 5))\n );\n }\n\n return false;\n};\n\nexport const extractAndValidateStacksAddress = (\n addresses:\n | {\n address: string;\n addressType: string;\n purpose: string;\n }[]\n | undefined,\n currentAddress: string | undefined,\n onAddressChange: (address: string) => void,\n connect: () => Promise<void>\n) => {\n if (!addresses || !Array.isArray(addresses)) {\n void connect();\n return;\n }\n\n const stacksAccount = addresses.find(\n (acc) => acc.purpose === 'stacks' || acc.addressType === 'stacks'\n );\n\n if (!stacksAccount?.address) {\n void connect();\n return;\n }\n\n if (stacksAccount.address !== currentAddress) {\n onAddressChange(stacksAccount.address);\n }\n};\n","import { getSelectedProvider } from '@stacks/connect';\nimport { useEffect, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../../constants/wallets';\nimport type { ConnectOptions } from '../../provider/stacks-wallet-provider.types';\nimport type { XverseAccountChangeEvent } from './use-xverse.types';\nimport {\n extractAndValidateStacksAddress,\n getXverseProductInfo,\n shouldSupportAccountChange,\n waitForXverseProvider,\n} from './use-xverse.helpers';\n\nexport const useXverse = ({\n address,\n provider,\n onAddressChange,\n connect,\n}: {\n address: string | undefined;\n provider: SupportedStacksWallet | undefined;\n onAddressChange: (newAddress: string) => void;\n connect: (\n providerId: SupportedStacksWallet,\n options?: ConnectOptions\n ) => Promise<void>;\n}) => {\n const [isProviderReady, setIsProviderReady] = useState(false);\n\n useEffect(() => {\n if (provider !== 'xverse') return;\n\n const checkProvider = async () => {\n const ready = await waitForXverseProvider();\n\n setIsProviderReady(ready);\n\n if (!ready) {\n console.error('Xverse provider failed to initialize');\n }\n };\n\n void checkProvider();\n }, [provider]);\n\n useEffect(() => {\n if (provider !== 'xverse' || !address || !isProviderReady) return;\n\n let cancelled = false;\n let removeListener: (() => void) | undefined;\n\n const setupXverse = async () => {\n try {\n const productInfo = await getXverseProductInfo();\n\n if (cancelled) return;\n\n if (!shouldSupportAccountChange(productInfo?.version)) return;\n\n const response = await getSelectedProvider()?.request(\n 'wallet_connect',\n null\n );\n\n if (cancelled) return;\n\n extractAndValidateStacksAddress(\n response?.result?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n\n removeListener = getSelectedProvider()?.addListener(\n 'accountChange',\n (event: XverseAccountChangeEvent) => {\n extractAndValidateStacksAddress(\n event?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n }\n );\n } catch (error) {\n console.error('Failed to setup Xverse:', error);\n }\n };\n\n void setupXverse();\n\n return () => {\n cancelled = true;\n\n if (!removeListener) return;\n\n try {\n removeListener();\n } catch (error) {\n console.error('Failed to remove Xverse listener:', error);\n }\n };\n }, [address, isProviderReady, onAddressChange, connect, provider]);\n};\n","import { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\n\nexport const getLocalStorageWallet = (): {\n address: string;\n provider: SupportedStacksWallet;\n} | null => {\n if (typeof window === 'undefined') return null;\n\n const stored = localStorage.getItem(LOCAL_STORAGE_STACKS);\n\n if (!stored) return null;\n\n try {\n const data = JSON.parse(stored) as {\n address: string;\n provider: SupportedStacksWallet;\n };\n\n const isValid = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === data.provider\n );\n\n return isValid ? data : null;\n } catch {\n return null;\n }\n};\n","'use client';\n\nimport {\n clearSelectedProviderId,\n setSelectedProviderId,\n request,\n getSelectedProvider,\n WalletConnect,\n} from '@stacks/connect';\nimport {\n createContext,\n useContext,\n useCallback,\n useEffect,\n useRef,\n useState,\n useMemo,\n} from 'react';\n\nimport { STACKS_TO_STACKS_CONNECT_PROVIDERS } from '../constants/stacks-provider-mapping';\nimport { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\nimport {\n checkIfStacksProviderIsInstalled,\n getStacksWallets,\n} from '../utils/get-stacks-wallets';\n\nimport {\n getOKXStacksAddress,\n extractStacksAddress,\n buildWalletConnectConfig,\n} from './stacks-wallet-provider.helpers';\nimport type {\n WalletContextValue,\n WalletState,\n ConnectOptions,\n StacksWalletProviderProps,\n} from './stacks-wallet-provider.types';\nimport { useXverse } from '../hooks/use-xverse/use-xverse';\nimport { getLocalStorageWallet } from '../utils/get-local-storage-wallet';\n\nconst StacksWalletContext = createContext<WalletContextValue | undefined>(\n undefined\n);\n\nexport const StacksWalletProvider = ({\n children,\n wallets,\n walletConnect,\n onConnect,\n onAddressChange,\n onDisconnect,\n}: StacksWalletProviderProps) => {\n const [address, setAddress] = useState<string | undefined>();\n const [provider, setProvider] = useState<\n SupportedStacksWallet | undefined\n >();\n const [isConnecting, setIsConnecting] = useState(false);\n\n // Generation counter — incremented by reset() to invalidate in-flight connect promises\n const connectGenRef = useRef(0);\n\n // Guard against concurrent WalletConnect.initializeProvider calls\n const wcInitRef = useRef<Promise<void> | null>(null);\n\n // Serialize wallets to a stable string for use as a dependency,\n // so inline arrays like wallets={['xverse', 'leather']} don't\n // invalidate memos on every render. (Fixes #5)\n const walletsKey = wallets?.join(',');\n\n // Fix #1: runtime guard in useEffect instead of render body\n useEffect(() => {\n if (wallets?.includes('wallet-connect') && !walletConnect?.projectId) {\n throw new Error(\n 'StacksWalletProvider: \"wallet-connect\" is listed in wallets but no walletConnect.projectId was provided.'\n );\n }\n }, [walletsKey, walletConnect?.projectId]);\n\n useEffect(() => {\n const loadPersistedWallet = async () => {\n const persisted = getLocalStorageWallet();\n\n if (!persisted) return;\n\n setIsConnecting(true);\n\n try {\n if (persisted.provider === 'okx') {\n const data = await getOKXStacksAddress();\n setAddress(data.address);\n setProvider(data.provider);\n return;\n }\n\n if (\n persisted.provider === 'wallet-connect' &&\n walletConnect?.projectId\n ) {\n const initPromise = WalletConnect.initializeProvider(\n buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n );\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n setAddress(persisted.address);\n setProvider(persisted.provider);\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[persisted.provider]\n );\n } catch (error) {\n console.error('Failed to restore wallet connection:', error);\n } finally {\n setIsConnecting(false);\n }\n };\n\n void loadPersistedWallet();\n }, [walletConnect?.projectId]);\n\n const connect = useCallback(\n async (providerId: SupportedStacksWallet, options?: ConnectOptions) => {\n const typedProvider = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === providerId\n );\n\n if (!typedProvider) {\n const error = new Error(\n 'The wallet provider selected is not supported!'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (!checkIfStacksProviderIsInstalled(typedProvider)) {\n const error = new Error(\n `${typedProvider} wallet is not installed. Please install the wallet extension to continue.`\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (\n typedProvider === 'wallet-connect' &&\n !walletConnect?.projectId\n ) {\n const error = new Error(\n 'WalletConnect requires a project ID. Please provide walletConnect.projectId to the StacksWalletProvider.'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n // Capture generation so we can detect if reset() was called during await\n const gen = ++connectGenRef.current;\n setIsConnecting(true);\n\n try {\n if (typedProvider === 'okx') {\n const data = await getOKXStacksAddress();\n if (connectGenRef.current !== gen) return;\n setAddress(data.address);\n setProvider(data.provider);\n options?.onSuccess?.(data.address, data.provider);\n return;\n }\n\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[typedProvider]\n );\n\n const wcConfig =\n typedProvider === 'wallet-connect' && walletConnect\n ? buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n : undefined;\n\n if (wcConfig) {\n // Wait for any in-flight init, then start ours\n if (wcInitRef.current) await wcInitRef.current;\n const initPromise =\n WalletConnect.initializeProvider(wcConfig);\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n if (connectGenRef.current !== gen) return;\n\n const data = wcConfig\n ? await request(\n { walletConnect: wcConfig },\n 'getAddresses',\n {}\n )\n : await request('getAddresses');\n\n if (connectGenRef.current !== gen) return;\n\n const extractedAddress = extractStacksAddress(\n typedProvider,\n data.addresses\n );\n\n setAddress(extractedAddress);\n setProvider(typedProvider);\n options?.onSuccess?.(extractedAddress, typedProvider);\n } catch (error) {\n if (connectGenRef.current !== gen) return;\n console.error('Failed to connect wallet:', error);\n // OKX uses its own SDK and never calls setSelectedProviderId,\n // so getSelectedProvider() would return the previously connected\n // provider — disconnecting the wrong wallet.\n if (typedProvider !== 'okx') {\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n }\n options?.onError?.(error as Error);\n } finally {\n if (connectGenRef.current === gen) {\n setIsConnecting(false);\n }\n }\n },\n [walletConnect]\n );\n\n const reset = useCallback(() => {\n connectGenRef.current++;\n setIsConnecting(false);\n clearSelectedProviderId();\n }, []);\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n localStorage.removeItem(LOCAL_STORAGE_STACKS);\n setAddress(undefined);\n setProvider(undefined);\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n callback?.();\n onDisconnect?.();\n },\n [onDisconnect]\n );\n\n useEffect(() => {\n if (!address || !provider) return;\n\n localStorage.setItem(\n LOCAL_STORAGE_STACKS,\n JSON.stringify({ address, provider })\n );\n }, [address, provider]);\n\n useEffect(() => {\n if (!address || !provider || !onConnect) return;\n\n onConnect(provider, address);\n }, [address, provider, onConnect]);\n\n useXverse({\n address,\n provider,\n onAddressChange: (newAddress: string) => {\n setAddress(newAddress);\n onAddressChange?.(newAddress);\n },\n connect,\n });\n\n const walletInfos = useMemo(() => {\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n\n return configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n }, [walletsKey, walletConnect?.projectId]);\n\n const value = useMemo((): WalletContextValue => {\n const walletState: WalletState = isConnecting\n ? { status: 'connecting', address: undefined, provider: undefined }\n : address && provider\n ? { status: 'connected', address, provider }\n : {\n status: 'disconnected',\n address: undefined,\n provider: undefined,\n };\n\n return {\n ...walletState,\n connect,\n disconnect,\n reset,\n wallets: walletInfos,\n };\n }, [address, provider, isConnecting, connect, disconnect, reset, walletInfos]);\n\n return (\n <StacksWalletContext.Provider value={value}>\n {children}\n </StacksWalletContext.Provider>\n );\n};\n\nexport const useStacksWalletContext = () => {\n const context = useContext(StacksWalletContext);\n\n if (context === undefined) {\n throw new Error(\n '🚨 Stacks wallet hooks must be used within StacksWalletProvider'\n );\n }\n\n return context;\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\ntype UseAddressReturn =\n | {\n address: undefined;\n isConnected: false;\n isConnecting: boolean;\n isDisconnected: boolean;\n provider: undefined;\n }\n | {\n address: string;\n isConnected: true;\n isConnecting: false;\n isDisconnected: false;\n provider: SupportedStacksWallet;\n };\n\nexport const useAddress = (): UseAddressReturn => {\n const { address, status, provider } = useStacksWalletContext();\n\n return useMemo(() => {\n if (status === 'connected' && address && provider) {\n return {\n address,\n isConnected: true as const,\n isConnecting: false as const,\n isDisconnected: false as const,\n provider,\n };\n }\n\n return {\n address: undefined,\n isConnected: false as const,\n isConnecting: status === 'connecting',\n isDisconnected: status === 'disconnected',\n provider: undefined,\n };\n }, [address, status, provider]);\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { useStacksWalletContext } from \"../provider/stacks-wallet-provider\";\n\nexport const useConnect = () => {\n const { connect, reset, status } = useStacksWalletContext();\n\n const value = useMemo(\n () => ({\n connect,\n reset,\n isPending: status === \"connecting\",\n }),\n [connect, reset, status]\n );\n\n return value;\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { useStacksWalletContext } from \"../provider/stacks-wallet-provider\";\n\nexport const useDisconnect = () => {\n const { disconnect } = useStacksWalletContext();\n\n return useMemo(\n () => ({\n disconnect,\n }),\n [disconnect]\n );\n};\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { useCallback, useState } from 'react';\n\nimport { useAddress } from './use-address';\n\nexport interface SignMessageVariables {\n message: string;\n publicKey?: string;\n}\n\nexport interface SignMessageData {\n publicKey: string;\n signature: string;\n}\n\nexport interface SignMessageOptions {\n onSuccess?: (data: SignMessageData) => void;\n onError?: (error: Error) => void;\n onSettled?: (\n data: SignMessageData | undefined,\n error: Error | null\n ) => void;\n}\n\nexport const useSignMessage = () => {\n const { isConnected, provider } = useAddress();\n const [data, setData] = useState<SignMessageData | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [isPending, setIsPending] = useState(false);\n\n const signMessageAsync = useCallback(\n async (variables: SignMessageVariables): Promise<SignMessageData> => {\n if (!isConnected) {\n throw new Error('Wallet is not connected');\n }\n\n setIsPending(true);\n setError(null);\n setData(undefined);\n\n try {\n let result: SignMessageData;\n\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n result = await window.okxwallet.stacks.signMessage({\n message: variables.message,\n });\n } else {\n result = await request('stx_signMessage', {\n message: variables.message,\n ...(variables.publicKey && {\n publicKey: variables.publicKey,\n }),\n });\n }\n\n setData(result);\n setIsPending(false);\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsPending(false);\n throw error;\n }\n },\n [isConnected, provider]\n );\n\n const signMessage = useCallback(\n (variables: SignMessageVariables, options?: SignMessageOptions) => {\n signMessageAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [signMessageAsync]\n );\n\n return {\n signMessage,\n signMessageAsync,\n data,\n error,\n isPending,\n };\n};\n","export const getNetworkFromAddress = (address: string) => {\n if (address.startsWith('SP') || address.startsWith('SM')) {\n return 'mainnet';\n }\n\n if (address.startsWith('ST') || address.startsWith('SN')) {\n return 'testnet';\n }\n\n throw new Error(`Invalid Stacks address: ${address}`);\n};\n","import type { ClarityValue, PostCondition } from \"@stacks/transactions\";\nimport { cvToHex, postConditionToHex } from \"@stacks/transactions\";\n\nexport const preparePostConditionsForOKX = (postConditions: PostCondition[]) =>\n postConditions.map((pc) => postConditionToHex(pc));\n\nexport const prepareArgsForOKX = (args: ClarityValue[]) =>\n args.map((arg) => cvToHex(arg));\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { PostConditionMode } from '@stacks/transactions';\nimport { useCallback, useState } from 'react';\n\nimport { useAddress } from '../use-address';\nimport { getNetworkFromAddress } from '../../utils/get-network-from-address';\n\nimport {\n preparePostConditionsForOKX,\n prepareArgsForOKX,\n} from './use-write-contract.helpers';\nimport type {\n WriteContractVariables,\n WriteContractOptions,\n} from './use-write-contract.types';\n\nexport const useWriteContract = () => {\n const { isConnected, address, provider } = useAddress();\n\n const [data, setData] = useState<string | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [isPending, setIsPending] = useState(false);\n\n const writeContractAsync = useCallback(\n async (variables: WriteContractVariables): Promise<string> => {\n if (!isConnected || !address) {\n throw new Error('Wallet is not connected');\n }\n\n setIsPending(true);\n setError(null);\n setData(undefined);\n\n try {\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n const response =\n await window.okxwallet.stacks.signTransaction({\n contractAddress: variables.address,\n contractName: variables.contract,\n functionName: variables.functionName,\n functionArgs: prepareArgsForOKX(variables.args),\n postConditions: preparePostConditionsForOKX(\n variables.pc.postConditions\n ),\n postConditionMode: variables.pc.mode,\n stxAddress: address,\n txType: 'contract_call',\n anchorMode: 3,\n });\n\n setData(response.txHash);\n setIsPending(false);\n return response.txHash;\n }\n\n const response = await request('stx_callContract', {\n address,\n contract: `${variables.address}.${variables.contract}`,\n functionName: variables.functionName,\n functionArgs: variables.args,\n postConditions: variables.pc.postConditions,\n postConditionMode:\n variables.pc.mode === PostConditionMode.Allow\n ? 'allow'\n : 'deny',\n network: getNetworkFromAddress(address),\n });\n\n if (!response.txid) {\n throw new Error('No transaction ID returned');\n }\n\n setData(response.txid);\n setIsPending(false);\n return response.txid;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsPending(false);\n throw error;\n }\n },\n [isConnected, address, provider]\n );\n\n const writeContract = useCallback(\n (variables: WriteContractVariables, options?: WriteContractOptions) => {\n writeContractAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [writeContractAsync]\n );\n\n return {\n writeContract,\n writeContractAsync,\n data,\n error,\n isPending,\n };\n};\n\nexport type {\n WriteContractVariables,\n WriteContractOptions,\n PostConditionConfig,\n} from './use-write-contract.types';\n","'use client';\n\nimport { getPrimaryName } from 'bns-v2-sdk';\nimport { useEffect, useState } from 'react';\n\nimport { getNetworkFromAddress } from '../utils/get-network-from-address';\n\nexport const useBnsName = (address?: string) => {\n const [bnsName, setBnsName] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (!address) {\n setBnsName(null);\n setIsLoading(false);\n return;\n }\n\n const fetchBnsName = async () => {\n setIsLoading(true);\n\n try {\n const network = getNetworkFromAddress(address);\n const result = await getPrimaryName({ address, network });\n\n const fullName = result\n ? `${result.name}.${result.namespace}`\n : null;\n\n setBnsName(fullName);\n } catch {\n setBnsName(null);\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchBnsName();\n }, [address]);\n\n return { bnsName, isLoading };\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useWallets = () => {\n const { wallets } = useStacksWalletContext();\n\n return useMemo(() => ({ wallets }), [wallets]);\n};\n"]}
1
+ {"version":3,"sources":["../src/constants/stacks-provider-mapping.ts","../src/constants/storage-keys.ts","../src/constants/wallets.ts","../src/utils/get-stacks-wallets.ts","../src/provider/stacks-wallet-provider.helpers.ts","../src/hooks/use-xverse/use-xverse.helpers.ts","../src/hooks/use-xverse/use-xverse.ts","../src/utils/get-local-storage-wallet.ts","../src/provider/stacks-wallet-provider.tsx","../src/hooks/use-address.ts","../src/hooks/use-connect.ts","../src/hooks/use-disconnect.ts","../src/hooks/use-sign-message.ts","../src/utils/get-network-from-address.ts","../src/hooks/use-write-contract/use-write-contract.helpers.ts","../src/hooks/use-write-contract/use-write-contract.ts","../src/hooks/use-bns-name.ts","../src/hooks/use-wallets.ts"],"names":["WalletConnect","getSelectedProvider","connect","useState","useEffect","createContext","useRef","setSelectedProviderId","useCallback","data","request","clearSelectedProviderId","useMemo","jsx","useContext","error","postConditionToHex","cvToHex","response","PostConditionMode","getPrimaryName"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { SupportedStacksWallet } from \"./wallets\";\n\nexport const STACKS_TO_STACKS_CONNECT_PROVIDERS: Record<\n Exclude<SupportedStacksWallet, \"okx\">,\n | \"LeatherProvider\"\n | \"XverseProviders.BitcoinProvider\"\n | \"AsignaProvider\"\n | \"FordefiProviders.UtxoProvider\"\n | \"WalletConnectProvider\"\n> = {\n xverse: \"XverseProviders.BitcoinProvider\",\n leather: \"LeatherProvider\",\n asigna: \"AsignaProvider\",\n fordefi: \"FordefiProviders.UtxoProvider\",\n \"wallet-connect\": \"WalletConnectProvider\",\n};\n","export const LOCAL_STORAGE_STACKS = \"@satoshai/kit\";\n","export const SUPPORTED_STACKS_WALLETS = [\n \"xverse\",\n \"leather\",\n \"okx\",\n \"asigna\",\n \"fordefi\",\n \"wallet-connect\",\n] as const;\n\nexport type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];\n","import {\n SUPPORTED_STACKS_WALLETS,\n type SupportedStacksWallet,\n} from '../constants/wallets';\n\nexport interface StacksWallets {\n supported: SupportedStacksWallet[];\n installed: SupportedStacksWallet[];\n}\n\nexport const getStacksWallets = (): StacksWallets => {\n const supported = [...SUPPORTED_STACKS_WALLETS];\n const installed = supported.filter((wallet) =>\n checkIfStacksProviderIsInstalled(wallet)\n );\n\n return { supported, installed };\n};\n\nexport const checkIfStacksProviderIsInstalled = (\n wallet: SupportedStacksWallet\n): boolean => {\n if (typeof window === 'undefined') return true;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n switch (wallet) {\n case 'xverse':\n return !!(window as any).XverseProviders;\n case 'leather':\n return (\n !!(window as any).LeatherProvider ||\n !!(window as any).HiroWalletProvider\n );\n case 'asigna':\n return !!(window as any).AsignaProvider;\n case 'okx':\n return !!(window as any).okxwallet;\n case 'fordefi':\n return !!(window as any).FordefiProviders?.UtxoProvider;\n case 'wallet-connect':\n return true;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n};\n","import type { SupportedStacksWallet } from '../constants/wallets';\nimport type {\n WalletConnectMetadata,\n StacksChain,\n} from './stacks-wallet-provider.types';\nimport { WalletConnect } from '@stacks/connect';\n\nconst STACKS_CHAIN_MAPPING = {\n mainnet: WalletConnect.Chains.Stacks.Mainnet,\n testnet: WalletConnect.Chains.Stacks.Testnet,\n} as const;\n\nexport const buildWalletConnectConfig = (\n projectId: string,\n metadata?: Partial<WalletConnectMetadata>,\n chains?: StacksChain[]\n): {\n projectId: string;\n metadata: WalletConnectMetadata;\n networks: (typeof WalletConnect.Networks.Stacks)[];\n} => {\n const selectedChains = chains ?? ['mainnet'];\n const walletConnectChains = selectedChains.map(\n (chain) => STACKS_CHAIN_MAPPING[chain]\n );\n\n return {\n projectId,\n metadata: {\n name: 'Universal Connector',\n description: 'Universal Connector',\n url: 'https://appkit.reown.com',\n icons: ['https://appkit.reown.com/icon.png'],\n ...metadata,\n },\n networks: [\n {\n ...WalletConnect.Networks.Stacks,\n chains: walletConnectChains,\n },\n ],\n };\n};\n\nexport const getOKXStacksAddress = async () => {\n if (!window.okxwallet) {\n throw new Error('🚨 OKX Wallet is not installed');\n }\n\n const stacksResponse = await window.okxwallet.stacks.connect();\n\n if (!stacksResponse) {\n throw new Error('🚨 Failed to connect with OKX Wallet');\n }\n\n return {\n address: stacksResponse.address,\n provider: 'okx' as const,\n };\n};\n\nexport const extractStacksAddress = (\n typedProvider: SupportedStacksWallet,\n addresses: { address?: string; symbol?: string }[]\n) => {\n if (!addresses.length) {\n throw new Error(`No addresses provided for ${typedProvider} wallet`);\n }\n\n if (typedProvider === 'leather' || typedProvider === 'asigna') {\n const stxAddress = addresses.find(\n (addr) => addr.symbol === 'STX'\n )?.address;\n\n if (stxAddress) return stxAddress;\n }\n\n const stacksAddress = addresses.find((addr) =>\n addr.address?.startsWith('S')\n )?.address;\n\n if (stacksAddress) return stacksAddress;\n\n const legacyAddress = addresses[2]?.address;\n\n if (legacyAddress?.startsWith('S')) return legacyAddress;\n\n throw new Error(\n `No valid Stacks address found for ${typedProvider} wallet`\n );\n};\n","import { getSelectedProvider } from '@stacks/connect';\n\nexport const getXverseProductInfo = async (): Promise<{\n version?: string;\n name?: string;\n} | null> =>\n (await window.XverseProviders?.StacksProvider?.getProductInfo?.()) ?? null;\n\nexport const shouldSupportAccountChange = (\n version: string | undefined\n): boolean => version !== undefined && version !== '1.0.0';\n\nexport const waitForXverseProvider = async (\n maxAttempts = 10,\n initialDelay = 200\n): Promise<boolean> => {\n for (let i = 0; i < maxAttempts; i++) {\n const provider = getSelectedProvider();\n\n if (provider?.request && provider?.addListener) return true;\n\n await new Promise((resolve) =>\n setTimeout(resolve, initialDelay * Math.min(i + 1, 5))\n );\n }\n\n return false;\n};\n\nexport const extractAndValidateStacksAddress = (\n addresses:\n | {\n address: string;\n addressType: string;\n purpose: string;\n }[]\n | undefined,\n currentAddress: string | undefined,\n onAddressChange: (address: string) => void,\n connect: () => Promise<void>\n) => {\n if (!addresses || !Array.isArray(addresses)) {\n void connect();\n return;\n }\n\n const stacksAccount = addresses.find(\n (acc) => acc.purpose === 'stacks' || acc.addressType === 'stacks'\n );\n\n if (!stacksAccount?.address) {\n void connect();\n return;\n }\n\n if (stacksAccount.address !== currentAddress) {\n onAddressChange(stacksAccount.address);\n }\n};\n","import { getSelectedProvider } from '@stacks/connect';\nimport { useEffect, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../../constants/wallets';\nimport type { ConnectOptions } from '../../provider/stacks-wallet-provider.types';\nimport type { XverseAccountChangeEvent } from './use-xverse.types';\nimport {\n extractAndValidateStacksAddress,\n getXverseProductInfo,\n shouldSupportAccountChange,\n waitForXverseProvider,\n} from './use-xverse.helpers';\n\nexport const useXverse = ({\n address,\n provider,\n onAddressChange,\n connect,\n}: {\n address: string | undefined;\n provider: SupportedStacksWallet | undefined;\n onAddressChange: (newAddress: string) => void;\n connect: (\n providerId: SupportedStacksWallet,\n options?: ConnectOptions\n ) => Promise<void>;\n}) => {\n const [isProviderReady, setIsProviderReady] = useState(false);\n\n useEffect(() => {\n if (provider !== 'xverse') return;\n\n const checkProvider = async () => {\n const ready = await waitForXverseProvider();\n\n setIsProviderReady(ready);\n\n if (!ready) {\n console.error('Xverse provider failed to initialize');\n }\n };\n\n void checkProvider();\n }, [provider]);\n\n useEffect(() => {\n if (provider !== 'xverse' || !address || !isProviderReady) return;\n\n let cancelled = false;\n let removeListener: (() => void) | undefined;\n\n const setupXverse = async () => {\n try {\n const productInfo = await getXverseProductInfo();\n\n if (cancelled) return;\n\n if (!shouldSupportAccountChange(productInfo?.version)) return;\n\n const response = await getSelectedProvider()?.request(\n 'wallet_connect',\n null\n );\n\n if (cancelled) return;\n\n extractAndValidateStacksAddress(\n response?.result?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n\n removeListener = getSelectedProvider()?.addListener(\n 'accountChange',\n (event: XverseAccountChangeEvent) => {\n extractAndValidateStacksAddress(\n event?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n }\n );\n } catch (error) {\n console.error('Failed to setup Xverse:', error);\n }\n };\n\n void setupXverse();\n\n return () => {\n cancelled = true;\n\n if (!removeListener) return;\n\n try {\n removeListener();\n } catch (error) {\n console.error('Failed to remove Xverse listener:', error);\n }\n };\n }, [address, isProviderReady, onAddressChange, connect, provider]);\n};\n","import { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\n\nexport const getLocalStorageWallet = (): {\n address: string;\n provider: SupportedStacksWallet;\n} | null => {\n if (typeof window === 'undefined') return null;\n\n const stored = localStorage.getItem(LOCAL_STORAGE_STACKS);\n\n if (!stored) return null;\n\n try {\n const data = JSON.parse(stored) as {\n address: string;\n provider: SupportedStacksWallet;\n };\n\n const isValid = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === data.provider\n );\n\n return isValid ? data : null;\n } catch {\n return null;\n }\n};\n","'use client';\n\nimport {\n clearSelectedProviderId,\n setSelectedProviderId,\n request,\n getSelectedProvider,\n WalletConnect,\n} from '@stacks/connect';\nimport {\n createContext,\n useContext,\n useCallback,\n useEffect,\n useRef,\n useState,\n useMemo,\n} from 'react';\n\nimport { STACKS_TO_STACKS_CONNECT_PROVIDERS } from '../constants/stacks-provider-mapping';\nimport { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\nimport {\n checkIfStacksProviderIsInstalled,\n getStacksWallets,\n} from '../utils/get-stacks-wallets';\n\nimport {\n getOKXStacksAddress,\n extractStacksAddress,\n buildWalletConnectConfig,\n} from './stacks-wallet-provider.helpers';\nimport type {\n WalletContextValue,\n WalletState,\n ConnectOptions,\n StacksWalletProviderProps,\n} from './stacks-wallet-provider.types';\nimport { useXverse } from '../hooks/use-xverse/use-xverse';\nimport { getLocalStorageWallet } from '../utils/get-local-storage-wallet';\n\nconst StacksWalletContext = createContext<WalletContextValue | undefined>(\n undefined\n);\n\nexport const StacksWalletProvider = ({\n children,\n wallets,\n walletConnect,\n onConnect,\n onAddressChange,\n onDisconnect,\n}: StacksWalletProviderProps) => {\n const [address, setAddress] = useState<string | undefined>();\n const [provider, setProvider] = useState<\n SupportedStacksWallet | undefined\n >();\n const [isConnecting, setIsConnecting] = useState(false);\n\n // Generation counter — incremented by reset() to invalidate in-flight connect promises\n const connectGenRef = useRef(0);\n\n // Guard against concurrent WalletConnect.initializeProvider calls\n const wcInitRef = useRef<Promise<void> | null>(null);\n\n // Serialize wallets to a stable string for use as a dependency,\n // so inline arrays like wallets={['xverse', 'leather']} don't\n // invalidate memos on every render. (Fixes #5)\n const walletsKey = wallets?.join(',');\n\n // Fix #1: runtime guard in useEffect instead of render body\n useEffect(() => {\n if (wallets?.includes('wallet-connect') && !walletConnect?.projectId) {\n throw new Error(\n 'StacksWalletProvider: \"wallet-connect\" is listed in wallets but no walletConnect.projectId was provided.'\n );\n }\n }, [walletsKey, walletConnect?.projectId]);\n\n useEffect(() => {\n const loadPersistedWallet = async () => {\n const persisted = getLocalStorageWallet();\n\n if (!persisted) return;\n\n setIsConnecting(true);\n\n try {\n if (persisted.provider === 'okx') {\n const data = await getOKXStacksAddress();\n setAddress(data.address);\n setProvider(data.provider);\n return;\n }\n\n if (\n persisted.provider === 'wallet-connect' &&\n walletConnect?.projectId\n ) {\n const initPromise = WalletConnect.initializeProvider(\n buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n );\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n setAddress(persisted.address);\n setProvider(persisted.provider);\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[persisted.provider]\n );\n } catch (error) {\n console.error('Failed to restore wallet connection:', error);\n } finally {\n setIsConnecting(false);\n }\n };\n\n void loadPersistedWallet();\n }, [walletConnect?.projectId]);\n\n const connect = useCallback(\n async (providerId: SupportedStacksWallet, options?: ConnectOptions) => {\n const typedProvider = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === providerId\n );\n\n if (!typedProvider) {\n const error = new Error(\n 'The wallet provider selected is not supported!'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (!checkIfStacksProviderIsInstalled(typedProvider)) {\n const error = new Error(\n `${typedProvider} wallet is not installed. Please install the wallet extension to continue.`\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (\n typedProvider === 'wallet-connect' &&\n !walletConnect?.projectId\n ) {\n const error = new Error(\n 'WalletConnect requires a project ID. Please provide walletConnect.projectId to the StacksWalletProvider.'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n // Capture generation so we can detect if reset() was called during await\n const gen = ++connectGenRef.current;\n setIsConnecting(true);\n\n try {\n if (typedProvider === 'okx') {\n const data = await getOKXStacksAddress();\n if (connectGenRef.current !== gen) return;\n setAddress(data.address);\n setProvider(data.provider);\n options?.onSuccess?.(data.address, data.provider);\n return;\n }\n\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[typedProvider]\n );\n\n const wcConfig =\n typedProvider === 'wallet-connect' && walletConnect\n ? buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n : undefined;\n\n if (wcConfig) {\n // Wait for any in-flight init, then start ours\n if (wcInitRef.current) await wcInitRef.current;\n const initPromise =\n WalletConnect.initializeProvider(wcConfig);\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n if (connectGenRef.current !== gen) return;\n\n const data = wcConfig\n ? await request(\n { walletConnect: wcConfig },\n 'getAddresses',\n {}\n )\n : await request('getAddresses');\n\n if (connectGenRef.current !== gen) return;\n\n const extractedAddress = extractStacksAddress(\n typedProvider,\n data.addresses\n );\n\n setAddress(extractedAddress);\n setProvider(typedProvider);\n options?.onSuccess?.(extractedAddress, typedProvider);\n } catch (error) {\n if (connectGenRef.current !== gen) return;\n console.error('Failed to connect wallet:', error);\n // OKX uses its own SDK and never calls setSelectedProviderId,\n // so getSelectedProvider() would return the previously connected\n // provider — disconnecting the wrong wallet.\n if (typedProvider !== 'okx') {\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n }\n options?.onError?.(error as Error);\n } finally {\n if (connectGenRef.current === gen) {\n setIsConnecting(false);\n }\n }\n },\n [walletConnect]\n );\n\n const reset = useCallback(() => {\n connectGenRef.current++;\n setIsConnecting(false);\n clearSelectedProviderId();\n }, []);\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n localStorage.removeItem(LOCAL_STORAGE_STACKS);\n setAddress(undefined);\n setProvider(undefined);\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n callback?.();\n onDisconnect?.();\n },\n [onDisconnect]\n );\n\n useEffect(() => {\n if (!address || !provider) return;\n\n localStorage.setItem(\n LOCAL_STORAGE_STACKS,\n JSON.stringify({ address, provider })\n );\n }, [address, provider]);\n\n useEffect(() => {\n if (!address || !provider || !onConnect) return;\n\n onConnect(provider, address);\n }, [address, provider, onConnect]);\n\n useXverse({\n address,\n provider,\n onAddressChange: (newAddress: string) => {\n setAddress(newAddress);\n onAddressChange?.(newAddress);\n },\n connect,\n });\n\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n const walletInfos = configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n\n const value = useMemo((): WalletContextValue => {\n const walletState: WalletState = isConnecting\n ? { status: 'connecting', address: undefined, provider: undefined }\n : address && provider\n ? { status: 'connected', address, provider }\n : {\n status: 'disconnected',\n address: undefined,\n provider: undefined,\n };\n\n return {\n ...walletState,\n connect,\n disconnect,\n reset,\n wallets: walletInfos,\n };\n }, [address, provider, isConnecting, connect, disconnect, reset, walletInfos]);\n\n return (\n <StacksWalletContext.Provider value={value}>\n {children}\n </StacksWalletContext.Provider>\n );\n};\n\nexport const useStacksWalletContext = () => {\n const context = useContext(StacksWalletContext);\n\n if (context === undefined) {\n throw new Error(\n '🚨 Stacks wallet hooks must be used within StacksWalletProvider'\n );\n }\n\n return context;\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\ntype UseAddressReturn =\n | {\n address: undefined;\n isConnected: false;\n isConnecting: boolean;\n isDisconnected: boolean;\n provider: undefined;\n }\n | {\n address: string;\n isConnected: true;\n isConnecting: false;\n isDisconnected: false;\n provider: SupportedStacksWallet;\n };\n\nexport const useAddress = (): UseAddressReturn => {\n const { address, status, provider } = useStacksWalletContext();\n\n return useMemo(() => {\n if (status === 'connected' && address && provider) {\n return {\n address,\n isConnected: true as const,\n isConnecting: false as const,\n isDisconnected: false as const,\n provider,\n };\n }\n\n return {\n address: undefined,\n isConnected: false as const,\n isConnecting: status === 'connecting',\n isDisconnected: status === 'disconnected',\n provider: undefined,\n };\n }, [address, status, provider]);\n};\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport type { ConnectOptions, MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useConnect = () => {\n const {\n connect: contextConnect,\n reset: contextReset,\n status: walletStatus,\n } = useStacksWalletContext();\n\n const [error, setError] = useState<Error | null>(null);\n const [mutationStatus, setMutationStatus] =\n useState<MutationStatus>('idle');\n\n const connect = useCallback(\n async (\n providerId: SupportedStacksWallet,\n options?: ConnectOptions\n ) => {\n setError(null);\n setMutationStatus('pending');\n\n let settled = false;\n\n try {\n await contextConnect(providerId, {\n onSuccess: (address, provider) => {\n settled = true;\n setMutationStatus('success');\n options?.onSuccess?.(address, provider);\n },\n onError: (err) => {\n settled = true;\n setError(err);\n setMutationStatus('error');\n options?.onError?.(err);\n },\n });\n } finally {\n if (!settled) {\n // connect returned without calling onSuccess or onError\n // (e.g., cancelled by reset or stale generation)\n setMutationStatus('idle');\n }\n }\n },\n [contextConnect]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setMutationStatus('idle');\n contextReset();\n }, [contextReset]);\n\n const value = useMemo(\n () => ({\n connect,\n reset,\n error,\n isError: mutationStatus === 'error',\n isIdle: mutationStatus === 'idle',\n isPending:\n mutationStatus === 'pending' ||\n walletStatus === 'connecting',\n isSuccess: mutationStatus === 'success',\n status: mutationStatus,\n }),\n [connect, reset, error, mutationStatus, walletStatus]\n );\n\n return value;\n};\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useDisconnect = () => {\n const { disconnect: contextDisconnect } = useStacksWalletContext();\n\n const [error, setError] = useState<Error | null>(null);\n const [mutationStatus, setMutationStatus] =\n useState<MutationStatus>('idle');\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n setError(null);\n\n try {\n contextDisconnect(callback);\n setMutationStatus('success');\n } catch (err) {\n const normalizedError =\n err instanceof Error ? err : new Error(String(err));\n setError(normalizedError);\n setMutationStatus('error');\n }\n },\n [contextDisconnect]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setMutationStatus('idle');\n }, []);\n\n const value = useMemo(\n () => ({\n disconnect,\n reset,\n error,\n isError: mutationStatus === 'error',\n isIdle: mutationStatus === 'idle',\n isPending: mutationStatus === 'pending',\n isSuccess: mutationStatus === 'success',\n status: mutationStatus,\n }),\n [disconnect, reset, error, mutationStatus]\n );\n\n return value;\n};\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useAddress } from './use-address';\n\nexport interface SignMessageVariables {\n message: string;\n publicKey?: string;\n}\n\nexport interface SignMessageData {\n publicKey: string;\n signature: string;\n}\n\nexport interface SignMessageOptions {\n onSuccess?: (data: SignMessageData) => void;\n onError?: (error: Error) => void;\n onSettled?: (\n data: SignMessageData | undefined,\n error: Error | null\n ) => void;\n}\n\nexport const useSignMessage = () => {\n const { isConnected, provider } = useAddress();\n const [data, setData] = useState<SignMessageData | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [status, setStatus] = useState<MutationStatus>('idle');\n\n const signMessageAsync = useCallback(\n async (variables: SignMessageVariables): Promise<SignMessageData> => {\n if (!isConnected) {\n throw new Error('Wallet is not connected');\n }\n\n setStatus('pending');\n setError(null);\n setData(undefined);\n\n try {\n let result: SignMessageData;\n\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n result = await window.okxwallet.stacks.signMessage({\n message: variables.message,\n });\n } else {\n result = await request('stx_signMessage', {\n message: variables.message,\n ...(variables.publicKey && {\n publicKey: variables.publicKey,\n }),\n });\n }\n\n setData(result);\n setStatus('success');\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [isConnected, provider]\n );\n\n const signMessage = useCallback(\n (variables: SignMessageVariables, options?: SignMessageOptions) => {\n signMessageAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [signMessageAsync]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setError(null);\n setStatus('idle');\n }, []);\n\n return useMemo(\n () => ({\n signMessage,\n signMessageAsync,\n reset,\n data,\n error,\n isError: status === 'error',\n isIdle: status === 'idle',\n isPending: status === 'pending',\n isSuccess: status === 'success',\n status,\n }),\n [signMessage, signMessageAsync, reset, data, error, status]\n );\n};\n","export const getNetworkFromAddress = (address: string) => {\n if (address.startsWith('SP') || address.startsWith('SM')) {\n return 'mainnet';\n }\n\n if (address.startsWith('ST') || address.startsWith('SN')) {\n return 'testnet';\n }\n\n throw new Error(`Invalid Stacks address: ${address}`);\n};\n","import type { ClarityValue, PostCondition } from \"@stacks/transactions\";\nimport { cvToHex, postConditionToHex } from \"@stacks/transactions\";\n\nexport const preparePostConditionsForOKX = (postConditions: PostCondition[]) =>\n postConditions.map((pc) => postConditionToHex(pc));\n\nexport const prepareArgsForOKX = (args: ClarityValue[]) =>\n args.map((arg) => cvToHex(arg));\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { PostConditionMode } from '@stacks/transactions';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../../provider/stacks-wallet-provider.types';\nimport { useAddress } from '../use-address';\nimport { getNetworkFromAddress } from '../../utils/get-network-from-address';\n\nimport {\n preparePostConditionsForOKX,\n prepareArgsForOKX,\n} from './use-write-contract.helpers';\nimport type {\n WriteContractVariables,\n WriteContractOptions,\n} from './use-write-contract.types';\n\nexport const useWriteContract = () => {\n const { isConnected, address, provider } = useAddress();\n\n const [data, setData] = useState<string | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [status, setStatus] = useState<MutationStatus>('idle');\n\n const writeContractAsync = useCallback(\n async (variables: WriteContractVariables): Promise<string> => {\n if (!isConnected || !address) {\n throw new Error('Wallet is not connected');\n }\n\n setStatus('pending');\n setError(null);\n setData(undefined);\n\n try {\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n const response =\n await window.okxwallet.stacks.signTransaction({\n contractAddress: variables.address,\n contractName: variables.contract,\n functionName: variables.functionName,\n functionArgs: prepareArgsForOKX(variables.args),\n postConditions: preparePostConditionsForOKX(\n variables.pc.postConditions\n ),\n postConditionMode: variables.pc.mode,\n stxAddress: address,\n txType: 'contract_call',\n anchorMode: 3,\n });\n\n setData(response.txHash);\n setStatus('success');\n return response.txHash;\n }\n\n const response = await request('stx_callContract', {\n address,\n contract: `${variables.address}.${variables.contract}`,\n functionName: variables.functionName,\n functionArgs: variables.args,\n postConditions: variables.pc.postConditions,\n postConditionMode:\n variables.pc.mode === PostConditionMode.Allow\n ? 'allow'\n : 'deny',\n network: getNetworkFromAddress(address),\n });\n\n if (!response.txid) {\n throw new Error('No transaction ID returned');\n }\n\n setData(response.txid);\n setStatus('success');\n return response.txid;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [isConnected, address, provider]\n );\n\n const writeContract = useCallback(\n (variables: WriteContractVariables, options?: WriteContractOptions) => {\n writeContractAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [writeContractAsync]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setError(null);\n setStatus('idle');\n }, []);\n\n return useMemo(\n () => ({\n writeContract,\n writeContractAsync,\n reset,\n data,\n error,\n isError: status === 'error',\n isIdle: status === 'idle',\n isPending: status === 'pending',\n isSuccess: status === 'success',\n status,\n }),\n [writeContract, writeContractAsync, reset, data, error, status]\n );\n};\n\nexport type {\n WriteContractVariables,\n WriteContractOptions,\n PostConditionConfig,\n} from './use-write-contract.types';\n","'use client';\n\nimport { getPrimaryName } from 'bns-v2-sdk';\nimport { useEffect, useState } from 'react';\n\nimport { getNetworkFromAddress } from '../utils/get-network-from-address';\n\nexport const useBnsName = (address?: string) => {\n const [bnsName, setBnsName] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (!address) {\n setBnsName(null);\n setIsLoading(false);\n return;\n }\n\n const fetchBnsName = async () => {\n setIsLoading(true);\n\n try {\n const network = getNetworkFromAddress(address);\n const result = await getPrimaryName({ address, network });\n\n const fullName = result\n ? `${result.name}.${result.namespace}`\n : null;\n\n setBnsName(fullName);\n } catch {\n setBnsName(null);\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchBnsName();\n }, [address]);\n\n return { bnsName, isLoading };\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useWallets = () => {\n const { wallets } = useStacksWalletContext();\n\n return useMemo(() => ({ wallets }), [wallets]);\n};\n"]}
package/dist/index.d.cts CHANGED
@@ -5,6 +5,7 @@ declare const SUPPORTED_STACKS_WALLETS: readonly ["xverse", "leather", "okx", "a
5
5
  type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];
6
6
 
7
7
  type StacksChain = 'mainnet' | 'testnet';
8
+ type MutationStatus = 'idle' | 'pending' | 'error' | 'success';
8
9
  interface WalletConnectMetadata {
9
10
  name: string;
10
11
  description: string;
@@ -71,11 +72,23 @@ declare const useAddress: () => UseAddressReturn;
71
72
  declare const useConnect: () => {
72
73
  connect: (providerId: SupportedStacksWallet, options?: ConnectOptions) => Promise<void>;
73
74
  reset: () => void;
75
+ error: Error | null;
76
+ isError: boolean;
77
+ isIdle: boolean;
74
78
  isPending: boolean;
79
+ isSuccess: boolean;
80
+ status: MutationStatus;
75
81
  };
76
82
 
77
83
  declare const useDisconnect: () => {
78
84
  disconnect: (callback?: () => void) => void;
85
+ reset: () => void;
86
+ error: Error | null;
87
+ isError: boolean;
88
+ isIdle: boolean;
89
+ isPending: boolean;
90
+ isSuccess: boolean;
91
+ status: MutationStatus;
79
92
  };
80
93
 
81
94
  interface SignMessageVariables {
@@ -94,9 +107,14 @@ interface SignMessageOptions {
94
107
  declare const useSignMessage: () => {
95
108
  signMessage: (variables: SignMessageVariables, options?: SignMessageOptions) => void;
96
109
  signMessageAsync: (variables: SignMessageVariables) => Promise<SignMessageData>;
110
+ reset: () => void;
97
111
  data: SignMessageData | undefined;
98
112
  error: Error | null;
113
+ isError: boolean;
114
+ isIdle: boolean;
99
115
  isPending: boolean;
116
+ isSuccess: boolean;
117
+ status: MutationStatus;
100
118
  };
101
119
 
102
120
  interface PostConditionConfig {
@@ -119,9 +137,14 @@ interface WriteContractOptions {
119
137
  declare const useWriteContract: () => {
120
138
  writeContract: (variables: WriteContractVariables, options?: WriteContractOptions) => void;
121
139
  writeContractAsync: (variables: WriteContractVariables) => Promise<string>;
140
+ reset: () => void;
122
141
  data: string | undefined;
123
142
  error: Error | null;
143
+ isError: boolean;
144
+ isIdle: boolean;
124
145
  isPending: boolean;
146
+ isSuccess: boolean;
147
+ status: MutationStatus;
125
148
  };
126
149
 
127
150
  declare const useBnsName: (address?: string) => {
@@ -146,4 +169,4 @@ interface StacksWallets {
146
169
  }
147
170
  declare const getStacksWallets: () => StacksWallets;
148
171
 
149
- export { type ConnectOptions, type PostConditionConfig, SUPPORTED_STACKS_WALLETS, type SignMessageData, type SignMessageOptions, type SignMessageVariables, type StacksChain, StacksWalletProvider, type StacksWallets, type SupportedStacksWallet, type WalletConnectMetadata, type WalletContextValue, type WalletInfo, type WalletState, type WriteContractOptions, type WriteContractVariables, getLocalStorageWallet, getNetworkFromAddress, getStacksWallets, useAddress, useBnsName, useConnect, useDisconnect, useSignMessage, useWallets, useWriteContract };
172
+ export { type ConnectOptions, type MutationStatus, type PostConditionConfig, SUPPORTED_STACKS_WALLETS, type SignMessageData, type SignMessageOptions, type SignMessageVariables, type StacksChain, StacksWalletProvider, type StacksWallets, type SupportedStacksWallet, type WalletConnectMetadata, type WalletContextValue, type WalletInfo, type WalletState, type WriteContractOptions, type WriteContractVariables, getLocalStorageWallet, getNetworkFromAddress, getStacksWallets, useAddress, useBnsName, useConnect, useDisconnect, useSignMessage, useWallets, useWriteContract };
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ declare const SUPPORTED_STACKS_WALLETS: readonly ["xverse", "leather", "okx", "a
5
5
  type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];
6
6
 
7
7
  type StacksChain = 'mainnet' | 'testnet';
8
+ type MutationStatus = 'idle' | 'pending' | 'error' | 'success';
8
9
  interface WalletConnectMetadata {
9
10
  name: string;
10
11
  description: string;
@@ -71,11 +72,23 @@ declare const useAddress: () => UseAddressReturn;
71
72
  declare const useConnect: () => {
72
73
  connect: (providerId: SupportedStacksWallet, options?: ConnectOptions) => Promise<void>;
73
74
  reset: () => void;
75
+ error: Error | null;
76
+ isError: boolean;
77
+ isIdle: boolean;
74
78
  isPending: boolean;
79
+ isSuccess: boolean;
80
+ status: MutationStatus;
75
81
  };
76
82
 
77
83
  declare const useDisconnect: () => {
78
84
  disconnect: (callback?: () => void) => void;
85
+ reset: () => void;
86
+ error: Error | null;
87
+ isError: boolean;
88
+ isIdle: boolean;
89
+ isPending: boolean;
90
+ isSuccess: boolean;
91
+ status: MutationStatus;
79
92
  };
80
93
 
81
94
  interface SignMessageVariables {
@@ -94,9 +107,14 @@ interface SignMessageOptions {
94
107
  declare const useSignMessage: () => {
95
108
  signMessage: (variables: SignMessageVariables, options?: SignMessageOptions) => void;
96
109
  signMessageAsync: (variables: SignMessageVariables) => Promise<SignMessageData>;
110
+ reset: () => void;
97
111
  data: SignMessageData | undefined;
98
112
  error: Error | null;
113
+ isError: boolean;
114
+ isIdle: boolean;
99
115
  isPending: boolean;
116
+ isSuccess: boolean;
117
+ status: MutationStatus;
100
118
  };
101
119
 
102
120
  interface PostConditionConfig {
@@ -119,9 +137,14 @@ interface WriteContractOptions {
119
137
  declare const useWriteContract: () => {
120
138
  writeContract: (variables: WriteContractVariables, options?: WriteContractOptions) => void;
121
139
  writeContractAsync: (variables: WriteContractVariables) => Promise<string>;
140
+ reset: () => void;
122
141
  data: string | undefined;
123
142
  error: Error | null;
143
+ isError: boolean;
144
+ isIdle: boolean;
124
145
  isPending: boolean;
146
+ isSuccess: boolean;
147
+ status: MutationStatus;
125
148
  };
126
149
 
127
150
  declare const useBnsName: (address?: string) => {
@@ -146,4 +169,4 @@ interface StacksWallets {
146
169
  }
147
170
  declare const getStacksWallets: () => StacksWallets;
148
171
 
149
- export { type ConnectOptions, type PostConditionConfig, SUPPORTED_STACKS_WALLETS, type SignMessageData, type SignMessageOptions, type SignMessageVariables, type StacksChain, StacksWalletProvider, type StacksWallets, type SupportedStacksWallet, type WalletConnectMetadata, type WalletContextValue, type WalletInfo, type WalletState, type WriteContractOptions, type WriteContractVariables, getLocalStorageWallet, getNetworkFromAddress, getStacksWallets, useAddress, useBnsName, useConnect, useDisconnect, useSignMessage, useWallets, useWriteContract };
172
+ export { type ConnectOptions, type MutationStatus, type PostConditionConfig, SUPPORTED_STACKS_WALLETS, type SignMessageData, type SignMessageOptions, type SignMessageVariables, type StacksChain, StacksWalletProvider, type StacksWallets, type SupportedStacksWallet, type WalletConnectMetadata, type WalletContextValue, type WalletInfo, type WalletState, type WriteContractOptions, type WriteContractVariables, getLocalStorageWallet, getNetworkFromAddress, getStacksWallets, useAddress, useBnsName, useConnect, useDisconnect, useSignMessage, useWallets, useWriteContract };
package/dist/index.js CHANGED
@@ -404,14 +404,12 @@ var StacksWalletProvider = ({
404
404
  },
405
405
  connect
406
406
  });
407
- const walletInfos = useMemo(() => {
408
- const { installed } = getStacksWallets();
409
- const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];
410
- return configured.map((w) => ({
411
- id: w,
412
- available: w === "wallet-connect" ? !!walletConnect?.projectId : installed.includes(w)
413
- }));
414
- }, [walletsKey, walletConnect?.projectId]);
407
+ const { installed } = getStacksWallets();
408
+ const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];
409
+ const walletInfos = configured.map((w) => ({
410
+ id: w,
411
+ available: w === "wallet-connect" ? !!walletConnect?.projectId : installed.includes(w)
412
+ }));
415
413
  const value = useMemo(() => {
416
414
  const walletState = isConnecting ? { status: "connecting", address: void 0, provider: void 0 } : address && provider ? { status: "connected", address, provider } : {
417
415
  status: "disconnected",
@@ -459,37 +457,108 @@ var useAddress = () => {
459
457
  }, [address, status, provider]);
460
458
  };
461
459
  var useConnect = () => {
462
- const { connect, reset, status } = useStacksWalletContext();
460
+ const {
461
+ connect: contextConnect,
462
+ reset: contextReset,
463
+ status: walletStatus
464
+ } = useStacksWalletContext();
465
+ const [error, setError] = useState(null);
466
+ const [mutationStatus, setMutationStatus] = useState("idle");
467
+ const connect = useCallback(
468
+ async (providerId, options) => {
469
+ setError(null);
470
+ setMutationStatus("pending");
471
+ let settled = false;
472
+ try {
473
+ await contextConnect(providerId, {
474
+ onSuccess: (address, provider) => {
475
+ settled = true;
476
+ setMutationStatus("success");
477
+ options?.onSuccess?.(address, provider);
478
+ },
479
+ onError: (err) => {
480
+ settled = true;
481
+ setError(err);
482
+ setMutationStatus("error");
483
+ options?.onError?.(err);
484
+ }
485
+ });
486
+ } finally {
487
+ if (!settled) {
488
+ setMutationStatus("idle");
489
+ }
490
+ }
491
+ },
492
+ [contextConnect]
493
+ );
494
+ const reset = useCallback(() => {
495
+ setError(null);
496
+ setMutationStatus("idle");
497
+ contextReset();
498
+ }, [contextReset]);
463
499
  const value = useMemo(
464
500
  () => ({
465
501
  connect,
466
502
  reset,
467
- isPending: status === "connecting"
503
+ error,
504
+ isError: mutationStatus === "error",
505
+ isIdle: mutationStatus === "idle",
506
+ isPending: mutationStatus === "pending" || walletStatus === "connecting",
507
+ isSuccess: mutationStatus === "success",
508
+ status: mutationStatus
468
509
  }),
469
- [connect, reset, status]
510
+ [connect, reset, error, mutationStatus, walletStatus]
470
511
  );
471
512
  return value;
472
513
  };
473
514
  var useDisconnect = () => {
474
- const { disconnect } = useStacksWalletContext();
475
- return useMemo(
515
+ const { disconnect: contextDisconnect } = useStacksWalletContext();
516
+ const [error, setError] = useState(null);
517
+ const [mutationStatus, setMutationStatus] = useState("idle");
518
+ const disconnect = useCallback(
519
+ (callback) => {
520
+ setError(null);
521
+ try {
522
+ contextDisconnect(callback);
523
+ setMutationStatus("success");
524
+ } catch (err) {
525
+ const normalizedError = err instanceof Error ? err : new Error(String(err));
526
+ setError(normalizedError);
527
+ setMutationStatus("error");
528
+ }
529
+ },
530
+ [contextDisconnect]
531
+ );
532
+ const reset = useCallback(() => {
533
+ setError(null);
534
+ setMutationStatus("idle");
535
+ }, []);
536
+ const value = useMemo(
476
537
  () => ({
477
- disconnect
538
+ disconnect,
539
+ reset,
540
+ error,
541
+ isError: mutationStatus === "error",
542
+ isIdle: mutationStatus === "idle",
543
+ isPending: mutationStatus === "pending",
544
+ isSuccess: mutationStatus === "success",
545
+ status: mutationStatus
478
546
  }),
479
- [disconnect]
547
+ [disconnect, reset, error, mutationStatus]
480
548
  );
549
+ return value;
481
550
  };
482
551
  var useSignMessage = () => {
483
552
  const { isConnected, provider } = useAddress();
484
553
  const [data, setData] = useState(void 0);
485
554
  const [error, setError] = useState(null);
486
- const [isPending, setIsPending] = useState(false);
555
+ const [status, setStatus] = useState("idle");
487
556
  const signMessageAsync = useCallback(
488
557
  async (variables) => {
489
558
  if (!isConnected) {
490
559
  throw new Error("Wallet is not connected");
491
560
  }
492
- setIsPending(true);
561
+ setStatus("pending");
493
562
  setError(null);
494
563
  setData(void 0);
495
564
  try {
@@ -510,12 +579,12 @@ var useSignMessage = () => {
510
579
  });
511
580
  }
512
581
  setData(result);
513
- setIsPending(false);
582
+ setStatus("success");
514
583
  return result;
515
584
  } catch (err) {
516
585
  const error2 = err instanceof Error ? err : new Error(String(err));
517
586
  setError(error2);
518
- setIsPending(false);
587
+ setStatus("error");
519
588
  throw error2;
520
589
  }
521
590
  },
@@ -533,13 +602,26 @@ var useSignMessage = () => {
533
602
  },
534
603
  [signMessageAsync]
535
604
  );
536
- return {
537
- signMessage,
538
- signMessageAsync,
539
- data,
540
- error,
541
- isPending
542
- };
605
+ const reset = useCallback(() => {
606
+ setData(void 0);
607
+ setError(null);
608
+ setStatus("idle");
609
+ }, []);
610
+ return useMemo(
611
+ () => ({
612
+ signMessage,
613
+ signMessageAsync,
614
+ reset,
615
+ data,
616
+ error,
617
+ isError: status === "error",
618
+ isIdle: status === "idle",
619
+ isPending: status === "pending",
620
+ isSuccess: status === "success",
621
+ status
622
+ }),
623
+ [signMessage, signMessageAsync, reset, data, error, status]
624
+ );
543
625
  };
544
626
 
545
627
  // src/utils/get-network-from-address.ts
@@ -560,13 +642,13 @@ var useWriteContract = () => {
560
642
  const { isConnected, address, provider } = useAddress();
561
643
  const [data, setData] = useState(void 0);
562
644
  const [error, setError] = useState(null);
563
- const [isPending, setIsPending] = useState(false);
645
+ const [status, setStatus] = useState("idle");
564
646
  const writeContractAsync = useCallback(
565
647
  async (variables) => {
566
648
  if (!isConnected || !address) {
567
649
  throw new Error("Wallet is not connected");
568
650
  }
569
- setIsPending(true);
651
+ setStatus("pending");
570
652
  setError(null);
571
653
  setData(void 0);
572
654
  try {
@@ -588,7 +670,7 @@ var useWriteContract = () => {
588
670
  anchorMode: 3
589
671
  });
590
672
  setData(response2.txHash);
591
- setIsPending(false);
673
+ setStatus("success");
592
674
  return response2.txHash;
593
675
  }
594
676
  const response = await request("stx_callContract", {
@@ -604,12 +686,12 @@ var useWriteContract = () => {
604
686
  throw new Error("No transaction ID returned");
605
687
  }
606
688
  setData(response.txid);
607
- setIsPending(false);
689
+ setStatus("success");
608
690
  return response.txid;
609
691
  } catch (err) {
610
692
  const error2 = err instanceof Error ? err : new Error(String(err));
611
693
  setError(error2);
612
- setIsPending(false);
694
+ setStatus("error");
613
695
  throw error2;
614
696
  }
615
697
  },
@@ -627,13 +709,26 @@ var useWriteContract = () => {
627
709
  },
628
710
  [writeContractAsync]
629
711
  );
630
- return {
631
- writeContract,
632
- writeContractAsync,
633
- data,
634
- error,
635
- isPending
636
- };
712
+ const reset = useCallback(() => {
713
+ setData(void 0);
714
+ setError(null);
715
+ setStatus("idle");
716
+ }, []);
717
+ return useMemo(
718
+ () => ({
719
+ writeContract,
720
+ writeContractAsync,
721
+ reset,
722
+ data,
723
+ error,
724
+ isError: status === "error",
725
+ isIdle: status === "idle",
726
+ isPending: status === "pending",
727
+ isSuccess: status === "success",
728
+ status
729
+ }),
730
+ [writeContract, writeContractAsync, reset, data, error, status]
731
+ );
637
732
  };
638
733
  var useBnsName = (address) => {
639
734
  const [bnsName, setBnsName] = useState(null);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/stacks-provider-mapping.ts","../src/constants/storage-keys.ts","../src/constants/wallets.ts","../src/utils/get-stacks-wallets.ts","../src/provider/stacks-wallet-provider.helpers.ts","../src/hooks/use-xverse/use-xverse.helpers.ts","../src/hooks/use-xverse/use-xverse.ts","../src/utils/get-local-storage-wallet.ts","../src/provider/stacks-wallet-provider.tsx","../src/hooks/use-address.ts","../src/hooks/use-connect.ts","../src/hooks/use-disconnect.ts","../src/hooks/use-sign-message.ts","../src/utils/get-network-from-address.ts","../src/hooks/use-write-contract/use-write-contract.helpers.ts","../src/hooks/use-write-contract/use-write-contract.ts","../src/hooks/use-bns-name.ts","../src/hooks/use-wallets.ts"],"names":["getSelectedProvider","useState","useEffect","WalletConnect","data","useMemo","useCallback","request","error","response"],"mappings":";;;;;;;AAEO,IAAM,kCAAA,GAOT;AAAA,EACF,MAAA,EAAQ,iCAAA;AAAA,EACR,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,OAAA,EAAS,+BAAA;AAAA,EACT,gBAAA,EAAkB;AACpB,CAAA;;;ACfO,IAAM,oBAAA,GAAuB,eAAA;;;ACA7B,IAAM,wBAAA,GAA2B;AAAA,EACtC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;;;ACGO,IAAM,mBAAmB,MAAqB;AACjD,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,wBAAwB,CAAA;AAC9C,EAAA,MAAM,YAAY,SAAA,CAAU,MAAA;AAAA,IAAO,CAAC,MAAA,KAChC,gCAAA,CAAiC,MAAM;AAAA,GAC3C;AAEA,EAAA,OAAO,EAAE,WAAW,SAAA,EAAU;AAClC;AAEO,IAAM,gCAAA,GAAmC,CAC5C,MAAA,KACU;AACV,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAG1C,EAAA,QAAQ,MAAA;AAAQ,IACZ,KAAK,QAAA;AACD,MAAA,OAAO,CAAC,CAAE,MAAA,CAAe,eAAA;AAAA,IAC7B,KAAK,SAAA;AACD,MAAA,OACI,CAAC,CAAE,MAAA,CAAe,eAAA,IAClB,CAAC,CAAE,MAAA,CAAe,kBAAA;AAAA,IAE1B,KAAK,QAAA;AACD,MAAA,OAAO,CAAC,CAAE,MAAA,CAAe,cAAA;AAAA,IAC7B,KAAK,KAAA;AACD,MAAA,OAAO,CAAC,CAAE,MAAA,CAAe,SAAA;AAAA,IAC7B,KAAK,SAAA;AACD,MAAA,OAAO,CAAC,CAAE,MAAA,CAAe,gBAAA,EAAkB,YAAA;AAAA,IAC/C,KAAK,gBAAA;AACD,MAAA,OAAO,IAAA;AAAA;AAGnB,CAAA;ACpCA,IAAM,oBAAA,GAAuB;AAAA,EACzB,OAAA,EAAS,aAAA,CAAc,MAAA,CAAO,MAAA,CAAO,OAAA;AAAA,EACrC,OAAA,EAAS,aAAA,CAAc,MAAA,CAAO,MAAA,CAAO;AACzC,CAAA;AAEO,IAAM,wBAAA,GAA2B,CACpC,SAAA,EACA,QAAA,EACA,MAAA,KAKC;AACD,EAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,CAAC,SAAS,CAAA;AAC3C,EAAA,MAAM,sBAAsB,cAAA,CAAe,GAAA;AAAA,IACvC,CAAC,KAAA,KAAU,oBAAA,CAAqB,KAAK;AAAA,GACzC;AAEA,EAAA,OAAO;AAAA,IACH,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACN,IAAA,EAAM,qBAAA;AAAA,MACN,WAAA,EAAa,qBAAA;AAAA,MACb,GAAA,EAAK,0BAAA;AAAA,MACL,KAAA,EAAO,CAAC,mCAAmC,CAAA;AAAA,MAC3C,GAAG;AAAA,KACP;AAAA,IACA,QAAA,EAAU;AAAA,MACN;AAAA,QACI,GAAG,cAAc,QAAA,CAAS,MAAA;AAAA,QAC1B,MAAA,EAAQ;AAAA;AACZ;AACJ,GACJ;AACJ,CAAA;AAEO,IAAM,sBAAsB,YAAY;AAC3C,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACnB,IAAA,MAAM,IAAI,MAAM,uCAAgC,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,SAAA,CAAU,OAAO,OAAA,EAAQ;AAE7D,EAAA,IAAI,CAAC,cAAA,EAAgB;AACjB,IAAA,MAAM,IAAI,MAAM,6CAAsC,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO;AAAA,IACH,SAAS,cAAA,CAAe,OAAA;AAAA,IACxB,QAAA,EAAU;AAAA,GACd;AACJ,CAAA;AAEO,IAAM,oBAAA,GAAuB,CAChC,aAAA,EACA,SAAA,KACC;AACD,EAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,aAAa,CAAA,OAAA,CAAS,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,aAAA,KAAkB,SAAA,IAAa,aAAA,KAAkB,QAAA,EAAU;AAC3D,IAAA,MAAM,aAAa,SAAA,CAAU,IAAA;AAAA,MACzB,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW;AAAA,KAC9B,EAAG,OAAA;AAEH,IAAA,IAAI,YAAY,OAAO,UAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA;AAAA,IAAK,CAAC,IAAA,KAClC,IAAA,CAAK,OAAA,EAAS,WAAW,GAAG;AAAA,GAChC,EAAG,OAAA;AAEH,EAAA,IAAI,eAAe,OAAO,aAAA;AAE1B,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,CAAC,CAAA,EAAG,OAAA;AAEpC,EAAA,IAAI,aAAA,EAAe,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,aAAA;AAE3C,EAAA,MAAM,IAAI,KAAA;AAAA,IACN,qCAAqC,aAAa,CAAA,OAAA;AAAA,GACtD;AACJ,CAAA;ACxFO,IAAM,uBAAuB,YAI/B,MAAM,OAAO,eAAA,EAAiB,cAAA,EAAgB,kBAAiB,IAAM,IAAA;AAEnE,IAAM,0BAAA,GAA6B,CACtC,OAAA,KACU,OAAA,KAAY,UAAa,OAAA,KAAY,OAAA;AAE5C,IAAM,qBAAA,GAAwB,OACjC,WAAA,GAAc,EAAA,EACd,eAAe,GAAA,KACI;AACnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,WAAW,mBAAA,EAAoB;AAErC,IAAA,IAAI,QAAA,EAAU,OAAA,IAAW,QAAA,EAAU,WAAA,EAAa,OAAO,IAAA;AAEvD,IAAA,MAAM,IAAI,OAAA;AAAA,MAAQ,CAAC,OAAA,KACf,UAAA,CAAW,OAAA,EAAS,YAAA,GAAe,KAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC;AAAA,KACzD;AAAA,EACJ;AAEA,EAAA,OAAO,KAAA;AACX,CAAA;AAEO,IAAM,+BAAA,GAAkC,CAC3C,SAAA,EAOA,cAAA,EACA,iBACA,OAAA,KACC;AACD,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzC,IAAA,KAAK,OAAA,EAAQ;AACb,IAAA;AAAA,EACJ;AAEA,EAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA;AAAA,IAC5B,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,KAAY,QAAA,IAAY,IAAI,WAAA,KAAgB;AAAA,GAC7D;AAEA,EAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AACzB,IAAA,KAAK,OAAA,EAAQ;AACb,IAAA;AAAA,EACJ;AAEA,EAAA,IAAI,aAAA,CAAc,YAAY,cAAA,EAAgB;AAC1C,IAAA,eAAA,CAAgB,cAAc,OAAO,CAAA;AAAA,EACzC;AACJ,CAAA;;;AC7CO,IAAM,YAAY,CAAC;AAAA,EACtB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA;AACJ,CAAA,KAQM;AACF,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5D,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,aAAa,QAAA,EAAU;AAE3B,IAAA,MAAM,gBAAgB,YAAY;AAC9B,MAAA,MAAM,KAAA,GAAQ,MAAM,qBAAA,EAAsB;AAE1C,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAExB,MAAA,IAAI,CAAC,KAAA,EAAO;AACR,QAAA,OAAA,CAAQ,MAAM,sCAAsC,CAAA;AAAA,MACxD;AAAA,IACJ,CAAA;AAEA,IAAA,KAAK,aAAA,EAAc;AAAA,EACvB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,QAAA,KAAa,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,eAAA,EAAiB;AAE3D,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,cAAA;AAEJ,IAAA,MAAM,cAAc,YAAY;AAC5B,MAAA,IAAI;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,oBAAA,EAAqB;AAE/C,QAAA,IAAI,SAAA,EAAW;AAEf,QAAA,IAAI,CAAC,0BAAA,CAA2B,WAAA,EAAa,OAAO,CAAA,EAAG;AAEvD,QAAA,MAAM,QAAA,GAAW,MAAMA,mBAAAA,EAAoB,EAAG,OAAA;AAAA,UAC1C,gBAAA;AAAA,UACA;AAAA,SACJ;AAEA,QAAA,IAAI,SAAA,EAAW;AAEf,QAAA,+BAAA;AAAA,UACI,UAAU,MAAA,EAAQ,SAAA;AAAA,UAClB,OAAA;AAAA,UACA,eAAA;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA,SAC1B;AAEA,QAAA,cAAA,GAAiBA,qBAAoB,EAAG,WAAA;AAAA,UACpC,eAAA;AAAA,UACA,CAAC,KAAA,KAAoC;AACjC,YAAA,+BAAA;AAAA,cACI,KAAA,EAAO,SAAA;AAAA,cACP,OAAA;AAAA,cACA,eAAA;AAAA,cACA,MAAM,QAAQ,QAAQ;AAAA,aAC1B;AAAA,UACJ;AAAA,SACJ;AAAA,MACJ,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAAA,MAClD;AAAA,IACJ,CAAA;AAEA,IAAA,KAAK,WAAA,EAAY;AAEjB,IAAA,OAAO,MAAM;AACT,MAAA,SAAA,GAAY,IAAA;AAEZ,MAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,MAAA,IAAI;AACA,QAAA,cAAA,EAAe;AAAA,MACnB,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AAAA,MAC5D;AAAA,IACJ,CAAA;AAAA,EACJ,GAAG,CAAC,OAAA,EAAS,iBAAiB,eAAA,EAAiB,OAAA,EAAS,QAAQ,CAAC,CAAA;AACrE,CAAA;;;ACnGO,IAAM,wBAAwB,MAGzB;AACR,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,oBAAoB,CAAA;AAExD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAK9B,IAAA,MAAM,UAAU,wBAAA,CAAyB,IAAA;AAAA,MACrC,CAAC,MAAA,KAAW,MAAA,KAAW,IAAA,CAAK;AAAA,KAChC;AAEA,IAAA,OAAO,UAAU,IAAA,GAAO,IAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;ACcA,IAAM,mBAAA,GAAsB,aAAA;AAAA,EACxB;AACJ,CAAA;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACjC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA;AACJ,CAAA,KAAiC;AAC7B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,QAAAA,EAA6B;AAC3D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,EAE9B;AACF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGtD,EAAA,MAAM,aAAA,GAAgB,OAAO,CAAC,CAAA;AAG9B,EAAA,MAAM,SAAA,GAAY,OAA6B,IAAI,CAAA;AAKnD,EAAA,MAAM,UAAA,GAAa,OAAA,EAAS,IAAA,CAAK,GAAG,CAAA;AAGpC,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,SAAS,QAAA,CAAS,gBAAgB,CAAA,IAAK,CAAC,eAAe,SAAA,EAAW;AAClE,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ,CAAA,EAAG,CAAC,UAAA,EAAY,aAAA,EAAe,SAAS,CAAC,CAAA;AAEzC,EAAAA,UAAU,MAAM;AACZ,IAAA,MAAM,sBAAsB,YAAY;AACpC,MAAA,MAAM,YAAY,qBAAA,EAAsB;AAExC,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACA,QAAA,IAAI,SAAA,CAAU,aAAa,KAAA,EAAO;AAC9B,UAAA,MAAM,IAAA,GAAO,MAAM,mBAAA,EAAoB;AACvC,UAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AACvB,UAAA,WAAA,CAAY,KAAK,QAAQ,CAAA;AACzB,UAAA;AAAA,QACJ;AAEA,QAAA,IACI,SAAA,CAAU,QAAA,KAAa,gBAAA,IACvB,aAAA,EAAe,SAAA,EACjB;AACE,UAAA,MAAM,cAAcC,aAAAA,CAAc,kBAAA;AAAA,YAC9B,wBAAA;AAAA,cACI,aAAA,CAAc,SAAA;AAAA,cACd,aAAA,CAAc,QAAA;AAAA,cACd,aAAA,CAAc;AAAA;AAClB,WACJ;AACA,UAAA,SAAA,CAAU,OAAA,GAAU,WAAA;AACpB,UAAA,MAAM,WAAA;AACN,UAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,QACxB;AAEA,QAAA,UAAA,CAAW,UAAU,OAAO,CAAA;AAC5B,QAAA,WAAA,CAAY,UAAU,QAAQ,CAAA;AAC9B,QAAA,qBAAA;AAAA,UACI,kCAAA,CAAmC,UAAU,QAAQ;AAAA,SACzD;AAAA,MACJ,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,MAC/D,CAAA,SAAE;AACE,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACzB;AAAA,IACJ,CAAA;AAEA,IAAA,KAAK,mBAAA,EAAoB;AAAA,EAC7B,CAAA,EAAG,CAAC,aAAA,EAAe,SAAS,CAAC,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACZ,OAAO,YAAmC,OAAA,KAA6B;AACnE,MAAA,MAAM,gBAAgB,wBAAA,CAAyB,IAAA;AAAA,QAC3C,CAAC,WAAW,MAAA,KAAW;AAAA,OAC3B;AAEA,MAAA,IAAI,CAAC,aAAA,EAAe;AAChB,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UACd;AAAA,SACJ;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,OAAA,EAAS,UAAU,KAAK,CAAA;AACxB,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,CAAC,gCAAA,CAAiC,aAAa,CAAA,EAAG;AAClD,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UACd,GAAG,aAAa,CAAA,0EAAA;AAAA,SACpB;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,OAAA,EAAS,UAAU,KAAK,CAAA;AACxB,QAAA;AAAA,MACJ;AAEA,MAAA,IACI,aAAA,KAAkB,gBAAA,IAClB,CAAC,aAAA,EAAe,SAAA,EAClB;AACE,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UACd;AAAA,SACJ;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,OAAA,EAAS,UAAU,KAAK,CAAA;AACxB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,GAAA,GAAM,EAAE,aAAA,CAAc,OAAA;AAC5B,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACA,QAAA,IAAI,kBAAkB,KAAA,EAAO;AACzB,UAAA,MAAMC,KAAAA,GAAO,MAAM,mBAAA,EAAoB;AACvC,UAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AACnC,UAAA,UAAA,CAAWA,MAAK,OAAO,CAAA;AACvB,UAAA,WAAA,CAAYA,MAAK,QAAQ,CAAA;AACzB,UAAA,OAAA,EAAS,SAAA,GAAYA,KAAAA,CAAK,OAAA,EAASA,KAAAA,CAAK,QAAQ,CAAA;AAChD,UAAA;AAAA,QACJ;AAEA,QAAA,qBAAA;AAAA,UACI,mCAAmC,aAAa;AAAA,SACpD;AAEA,QAAA,MAAM,QAAA,GACF,aAAA,KAAkB,gBAAA,IAAoB,aAAA,GAChC,wBAAA;AAAA,UACI,aAAA,CAAc,SAAA;AAAA,UACd,aAAA,CAAc,QAAA;AAAA,UACd,aAAA,CAAc;AAAA,SAClB,GACA,KAAA,CAAA;AAEV,QAAA,IAAI,QAAA,EAAU;AAEV,UAAA,IAAI,SAAA,CAAU,OAAA,EAAS,MAAM,SAAA,CAAU,OAAA;AACvC,UAAA,MAAM,WAAA,GACFD,aAAAA,CAAc,kBAAA,CAAmB,QAAQ,CAAA;AAC7C,UAAA,SAAA,CAAU,OAAA,GAAU,WAAA;AACpB,UAAA,MAAM,WAAA;AACN,UAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,QACxB;AAEA,QAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AAEnC,QAAA,MAAM,IAAA,GAAO,WACP,MAAM,OAAA;AAAA,UACF,EAAE,eAAe,QAAA,EAAS;AAAA,UAC1B,cAAA;AAAA,UACA;AAAC,SACL,GACA,MAAM,OAAA,CAAQ,cAAc,CAAA;AAElC,QAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AAEnC,QAAA,MAAM,gBAAA,GAAmB,oBAAA;AAAA,UACrB,aAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACT;AAEA,QAAA,UAAA,CAAW,gBAAgB,CAAA;AAC3B,QAAA,WAAA,CAAY,aAAa,CAAA;AACzB,QAAA,OAAA,EAAS,SAAA,GAAY,kBAAkB,aAAa,CAAA;AAAA,MACxD,SAAS,KAAA,EAAO;AACZ,QAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AACnC,QAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAIhD,QAAA,IAAI,kBAAkB,KAAA,EAAO;AACzB,UAAAH,mBAAAA,IAAuB,UAAA,IAAa;AACpC,UAAA,uBAAA,EAAwB;AAAA,QAC5B;AACA,QAAA,OAAA,EAAS,UAAU,KAAc,CAAA;AAAA,MACrC,CAAA,SAAE;AACE,QAAA,IAAI,aAAA,CAAc,YAAY,GAAA,EAAK;AAC/B,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACzB;AAAA,MACJ;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GAClB;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC5B,IAAA,aAAA,CAAc,OAAA,EAAA;AACd,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,uBAAA,EAAwB;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACf,CAAC,QAAA,KAA0B;AACvB,MAAA,YAAA,CAAa,WAAW,oBAAoB,CAAA;AAC5C,MAAA,UAAA,CAAW,MAAS,CAAA;AACpB,MAAA,WAAA,CAAY,MAAS,CAAA;AACrB,MAAAA,mBAAAA,IAAuB,UAAA,IAAa;AACpC,MAAA,uBAAA,EAAwB;AACxB,MAAA,QAAA,IAAW;AACX,MAAA,YAAA,IAAe;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACjB;AAEA,EAAAE,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAU;AAE3B,IAAA,YAAA,CAAa,OAAA;AAAA,MACT,oBAAA;AAAA,MACA,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,UAAU;AAAA,KACxC;AAAA,EACJ,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtB,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,IAAY,CAAC,SAAA,EAAW;AAEzC,IAAA,SAAA,CAAU,UAAU,OAAO,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,OAAA,EAAS,QAAA,EAAU,SAAS,CAAC,CAAA;AAEjC,EAAA,SAAA,CAAU;AAAA,IACN,OAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA,EAAiB,CAAC,UAAA,KAAuB;AACrC,MAAA,UAAA,CAAW,UAAU,CAAA;AACrB,MAAA,eAAA,GAAkB,UAAU,CAAA;AAAA,IAChC,CAAA;AAAA,IACA;AAAA,GACH,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM;AAC9B,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,gBAAA,EAAiB;AACvC,IAAA,MAAM,UAAA,GAAa,OAAA,IAAW,CAAC,GAAG,wBAAwB,CAAA;AAE1D,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC1B,EAAA,EAAI,CAAA;AAAA,MACJ,SAAA,EACI,MAAM,gBAAA,GACA,CAAC,CAAC,aAAA,EAAe,SAAA,GACjB,SAAA,CAAU,QAAA,CAAS,CAAC;AAAA,KAClC,CAAE,CAAA;AAAA,EACN,CAAA,EAAG,CAAC,UAAA,EAAY,aAAA,EAAe,SAAS,CAAC,CAAA;AAEzC,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAA0B;AAC5C,IAAA,MAAM,cAA2B,YAAA,GAC3B,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAS,MAAA,EAAW,QAAA,EAAU,MAAA,EAAU,GAChE,WAAW,QAAA,GACX,EAAE,QAAQ,WAAA,EAAa,OAAA,EAAS,UAAS,GACzC;AAAA,MACI,MAAA,EAAQ,cAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACd;AAEN,IAAA,OAAO;AAAA,MACH,GAAG,WAAA;AAAA,MACH,OAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACb;AAAA,EACJ,CAAA,EAAG,CAAC,OAAA,EAAS,QAAA,EAAU,cAAc,OAAA,EAAS,UAAA,EAAY,KAAA,EAAO,WAAW,CAAC,CAAA;AAE7E,EAAA,uBACI,GAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OACzB,QAAA,EACL,CAAA;AAER;AAEO,IAAM,yBAAyB,MAAM;AACxC,EAAA,MAAM,OAAA,GAAU,WAAW,mBAAmB,CAAA;AAE9C,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AAEA,EAAA,OAAO,OAAA;AACX,CAAA;ACvTO,IAAM,aAAa,MAAwB;AAC9C,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,KAAa,sBAAA,EAAuB;AAE7D,EAAA,OAAOG,QAAQ,MAAM;AACjB,IAAA,IAAI,MAAA,KAAW,WAAA,IAAe,OAAA,IAAW,QAAA,EAAU;AAC/C,MAAA,OAAO;AAAA,QACH,OAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,YAAA,EAAc,KAAA;AAAA,QACd,cAAA,EAAgB,KAAA;AAAA,QAChB;AAAA,OACJ;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,MAAA;AAAA,MACT,WAAA,EAAa,KAAA;AAAA,MACb,cAAc,MAAA,KAAW,YAAA;AAAA,MACzB,gBAAgB,MAAA,KAAW,cAAA;AAAA,MAC3B,QAAA,EAAU;AAAA,KACd;AAAA,EACJ,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAClC;ACvCO,IAAM,aAAa,MAAM;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,KAAW,sBAAA,EAAuB;AAE1D,EAAA,MAAM,KAAA,GAAQA,OAAAA;AAAA,IACZ,OAAO;AAAA,MACL,OAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAW,MAAA,KAAW;AAAA,KACxB,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,MAAM;AAAA,GACzB;AAEA,EAAA,OAAO,KAAA;AACT;ACbO,IAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,sBAAA,EAAuB;AAE9C,EAAA,OAAOA,OAAAA;AAAA,IACL,OAAO;AAAA,MACL;AAAA,KACF,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AACF;ACWO,IAAM,iBAAiB,MAAM;AAChC,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAS,GAAI,UAAA,EAAW;AAC7C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,SAAsC,MAAS,CAAA;AACvE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,gBAAA,GAAmBK,WAAAA;AAAA,IACrB,OAAO,SAAA,KAA8D;AACjE,MAAA,IAAI,CAAC,WAAA,EAAa;AACd,QAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,MAC7C;AAEA,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAA,CAAQ,MAAS,CAAA;AAEjB,MAAA,IAAI;AACA,QAAA,IAAI,MAAA;AAEJ,QAAA,IAAI,aAAa,KAAA,EAAO;AACpB,UAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACnB,YAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,UAC1C;AAEA,UAAA,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY;AAAA,YAC/C,SAAS,SAAA,CAAU;AAAA,WACtB,CAAA;AAAA,QACL,CAAA,MAAO;AACH,UAAA,MAAA,GAAS,MAAMC,QAAQ,iBAAA,EAAmB;AAAA,YACtC,SAAS,SAAA,CAAU,OAAA;AAAA,YACnB,GAAI,UAAU,SAAA,IAAa;AAAA,cACvB,WAAW,SAAA,CAAU;AAAA;AACzB,WACH,CAAA;AAAA,QACL;AAEA,QAAA,OAAA,CAAQ,MAAM,CAAA;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAO,MAAA;AAAA,MACX,SAAS,GAAA,EAAK;AACV,QAAA,MAAMC,MAAAA,GACF,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACtD,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAMA,MAAAA;AAAA,MACV;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,GAC1B;AAEA,EAAA,MAAM,WAAA,GAAcF,WAAAA;AAAA,IAChB,CAAC,WAAiC,OAAA,KAAiC;AAC/D,MAAA,gBAAA,CAAiB,SAAS,CAAA,CACrB,IAAA,CAAK,CAACF,KAAAA,KAAS;AACZ,QAAA,OAAA,EAAS,YAAYA,KAAI,CAAA;AACzB,QAAA,OAAA,EAAS,SAAA,GAAYA,OAAM,IAAI,CAAA;AAAA,MACnC,CAAC,CAAA,CACA,KAAA,CAAM,CAACI,MAAAA,KAAU;AACd,QAAA,OAAA,EAAS,UAAUA,MAAK,CAAA;AACxB,QAAA,OAAA,EAAS,SAAA,GAAY,QAAWA,MAAK,CAAA;AAAA,MACzC,CAAC,CAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACrB;AAEA,EAAA,OAAO;AAAA,IACH,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACJ;AACJ;;;AClGO,IAAM,qBAAA,GAAwB,CAAC,OAAA,KAAoB;AACtD,EAAA,IAAI,QAAQ,UAAA,CAAW,IAAI,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACtD,IAAA,OAAO,SAAA;AAAA,EACX;AAEA,EAAA,IAAI,QAAQ,UAAA,CAAW,IAAI,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACtD,IAAA,OAAO,SAAA;AAAA,EACX;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAE,CAAA;AACxD;ACPO,IAAM,2BAAA,GAA8B,CAAC,cAAA,KAC1C,cAAA,CAAe,IAAI,CAAC,EAAA,KAAO,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAE5C,IAAM,iBAAA,GAAoB,CAAC,IAAA,KAChC,IAAA,CAAK,IAAI,CAAC,GAAA,KAAQ,OAAA,CAAQ,GAAG,CAAC,CAAA;;;ACWzB,IAAM,mBAAmB,MAAM;AAClC,EAAA,MAAM,EAAE,WAAA,EAAa,OAAA,EAAS,QAAA,KAAa,UAAA,EAAW;AAEtD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIP,SAA6B,MAAS,CAAA;AAC9D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,kBAAA,GAAqBK,WAAAA;AAAA,IACvB,OAAO,SAAA,KAAuD;AAC1D,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC1B,QAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,MAC7C;AAEA,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAA,CAAQ,MAAS,CAAA;AAEjB,MAAA,IAAI;AACA,QAAA,IAAI,aAAa,KAAA,EAAO;AACpB,UAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACnB,YAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,UAC1C;AAEA,UAAA,MAAMG,SAAAA,GACF,MAAM,MAAA,CAAO,SAAA,CAAU,OAAO,eAAA,CAAgB;AAAA,YAC1C,iBAAiB,SAAA,CAAU,OAAA;AAAA,YAC3B,cAAc,SAAA,CAAU,QAAA;AAAA,YACxB,cAAc,SAAA,CAAU,YAAA;AAAA,YACxB,YAAA,EAAc,iBAAA,CAAkB,SAAA,CAAU,IAAI,CAAA;AAAA,YAC9C,cAAA,EAAgB,2BAAA;AAAA,cACZ,UAAU,EAAA,CAAG;AAAA,aACjB;AAAA,YACA,iBAAA,EAAmB,UAAU,EAAA,CAAG,IAAA;AAAA,YAChC,UAAA,EAAY,OAAA;AAAA,YACZ,MAAA,EAAQ,eAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACf,CAAA;AAEL,UAAA,OAAA,CAAQA,UAAS,MAAM,CAAA;AACvB,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,OAAOA,SAAAA,CAAS,MAAA;AAAA,QACpB;AAEA,QAAA,MAAM,QAAA,GAAW,MAAMF,OAAAA,CAAQ,kBAAA,EAAoB;AAAA,UAC/C,OAAA;AAAA,UACA,UAAU,CAAA,EAAG,SAAA,CAAU,OAAO,CAAA,CAAA,EAAI,UAAU,QAAQ,CAAA,CAAA;AAAA,UACpD,cAAc,SAAA,CAAU,YAAA;AAAA,UACxB,cAAc,SAAA,CAAU,IAAA;AAAA,UACxB,cAAA,EAAgB,UAAU,EAAA,CAAG,cAAA;AAAA,UAC7B,mBACI,SAAA,CAAU,EAAA,CAAG,IAAA,KAAS,iBAAA,CAAkB,QAClC,OAAA,GACA,MAAA;AAAA,UACV,OAAA,EAAS,sBAAsB,OAAO;AAAA,SACzC,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAChB,UAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,QAChD;AAEA,QAAA,OAAA,CAAQ,SAAS,IAAI,CAAA;AACrB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACpB,SAAS,GAAA,EAAK;AACV,QAAA,MAAMC,MAAAA,GACF,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACtD,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAMA,MAAAA;AAAA,MACV;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,OAAA,EAAS,QAAQ;AAAA,GACnC;AAEA,EAAA,MAAM,aAAA,GAAgBF,WAAAA;AAAA,IAClB,CAAC,WAAmC,OAAA,KAAmC;AACnE,MAAA,kBAAA,CAAmB,SAAS,CAAA,CACvB,IAAA,CAAK,CAACF,KAAAA,KAAS;AACZ,QAAA,OAAA,EAAS,YAAYA,KAAI,CAAA;AACzB,QAAA,OAAA,EAAS,SAAA,GAAYA,OAAM,IAAI,CAAA;AAAA,MACnC,CAAC,CAAA,CACA,KAAA,CAAM,CAACI,MAAAA,KAAU;AACd,QAAA,OAAA,EAAS,UAAUA,MAAK,CAAA;AACxB,QAAA,OAAA,EAAS,SAAA,GAAY,QAAWA,MAAK,CAAA;AAAA,MACzC,CAAC,CAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,kBAAkB;AAAA,GACvB;AAEA,EAAA,OAAO;AAAA,IACH,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACJ;AACJ;AC3GO,IAAM,UAAA,GAAa,CAAC,OAAA,KAAqB;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIP,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEhD,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,eAAe,YAAY;AAC7B,MAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GAAU,sBAAsB,OAAO,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,cAAA,CAAe,EAAE,OAAA,EAAS,SAAS,CAAA;AAExD,QAAA,MAAM,QAAA,GAAW,SACX,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,CAAA,GAClC,IAAA;AAEN,QAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AACJ,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACnB,CAAA,SAAE;AACE,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACtB;AAAA,IACJ,CAAA;AAEA,IAAA,KAAK,YAAA,EAAa;AAAA,EACtB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,SAAS,SAAA,EAAU;AAChC;ACnCO,IAAM,aAAa,MAAM;AAC5B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,sBAAA,EAAuB;AAE3C,EAAA,OAAOG,QAAQ,OAAO,EAAE,SAAQ,CAAA,EAAI,CAAC,OAAO,CAAC,CAAA;AACjD","file":"index.js","sourcesContent":["import type { SupportedStacksWallet } from \"./wallets\";\n\nexport const STACKS_TO_STACKS_CONNECT_PROVIDERS: Record<\n Exclude<SupportedStacksWallet, \"okx\">,\n | \"LeatherProvider\"\n | \"XverseProviders.BitcoinProvider\"\n | \"AsignaProvider\"\n | \"FordefiProviders.UtxoProvider\"\n | \"WalletConnectProvider\"\n> = {\n xverse: \"XverseProviders.BitcoinProvider\",\n leather: \"LeatherProvider\",\n asigna: \"AsignaProvider\",\n fordefi: \"FordefiProviders.UtxoProvider\",\n \"wallet-connect\": \"WalletConnectProvider\",\n};\n","export const LOCAL_STORAGE_STACKS = \"@satoshai/kit\";\n","export const SUPPORTED_STACKS_WALLETS = [\n \"xverse\",\n \"leather\",\n \"okx\",\n \"asigna\",\n \"fordefi\",\n \"wallet-connect\",\n] as const;\n\nexport type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];\n","import {\n SUPPORTED_STACKS_WALLETS,\n type SupportedStacksWallet,\n} from '../constants/wallets';\n\nexport interface StacksWallets {\n supported: SupportedStacksWallet[];\n installed: SupportedStacksWallet[];\n}\n\nexport const getStacksWallets = (): StacksWallets => {\n const supported = [...SUPPORTED_STACKS_WALLETS];\n const installed = supported.filter((wallet) =>\n checkIfStacksProviderIsInstalled(wallet)\n );\n\n return { supported, installed };\n};\n\nexport const checkIfStacksProviderIsInstalled = (\n wallet: SupportedStacksWallet\n): boolean => {\n if (typeof window === 'undefined') return true;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n switch (wallet) {\n case 'xverse':\n return !!(window as any).XverseProviders;\n case 'leather':\n return (\n !!(window as any).LeatherProvider ||\n !!(window as any).HiroWalletProvider\n );\n case 'asigna':\n return !!(window as any).AsignaProvider;\n case 'okx':\n return !!(window as any).okxwallet;\n case 'fordefi':\n return !!(window as any).FordefiProviders?.UtxoProvider;\n case 'wallet-connect':\n return true;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n};\n","import type { SupportedStacksWallet } from '../constants/wallets';\nimport type {\n WalletConnectMetadata,\n StacksChain,\n} from './stacks-wallet-provider.types';\nimport { WalletConnect } from '@stacks/connect';\n\nconst STACKS_CHAIN_MAPPING = {\n mainnet: WalletConnect.Chains.Stacks.Mainnet,\n testnet: WalletConnect.Chains.Stacks.Testnet,\n} as const;\n\nexport const buildWalletConnectConfig = (\n projectId: string,\n metadata?: Partial<WalletConnectMetadata>,\n chains?: StacksChain[]\n): {\n projectId: string;\n metadata: WalletConnectMetadata;\n networks: (typeof WalletConnect.Networks.Stacks)[];\n} => {\n const selectedChains = chains ?? ['mainnet'];\n const walletConnectChains = selectedChains.map(\n (chain) => STACKS_CHAIN_MAPPING[chain]\n );\n\n return {\n projectId,\n metadata: {\n name: 'Universal Connector',\n description: 'Universal Connector',\n url: 'https://appkit.reown.com',\n icons: ['https://appkit.reown.com/icon.png'],\n ...metadata,\n },\n networks: [\n {\n ...WalletConnect.Networks.Stacks,\n chains: walletConnectChains,\n },\n ],\n };\n};\n\nexport const getOKXStacksAddress = async () => {\n if (!window.okxwallet) {\n throw new Error('🚨 OKX Wallet is not installed');\n }\n\n const stacksResponse = await window.okxwallet.stacks.connect();\n\n if (!stacksResponse) {\n throw new Error('🚨 Failed to connect with OKX Wallet');\n }\n\n return {\n address: stacksResponse.address,\n provider: 'okx' as const,\n };\n};\n\nexport const extractStacksAddress = (\n typedProvider: SupportedStacksWallet,\n addresses: { address?: string; symbol?: string }[]\n) => {\n if (!addresses.length) {\n throw new Error(`No addresses provided for ${typedProvider} wallet`);\n }\n\n if (typedProvider === 'leather' || typedProvider === 'asigna') {\n const stxAddress = addresses.find(\n (addr) => addr.symbol === 'STX'\n )?.address;\n\n if (stxAddress) return stxAddress;\n }\n\n const stacksAddress = addresses.find((addr) =>\n addr.address?.startsWith('S')\n )?.address;\n\n if (stacksAddress) return stacksAddress;\n\n const legacyAddress = addresses[2]?.address;\n\n if (legacyAddress?.startsWith('S')) return legacyAddress;\n\n throw new Error(\n `No valid Stacks address found for ${typedProvider} wallet`\n );\n};\n","import { getSelectedProvider } from '@stacks/connect';\n\nexport const getXverseProductInfo = async (): Promise<{\n version?: string;\n name?: string;\n} | null> =>\n (await window.XverseProviders?.StacksProvider?.getProductInfo?.()) ?? null;\n\nexport const shouldSupportAccountChange = (\n version: string | undefined\n): boolean => version !== undefined && version !== '1.0.0';\n\nexport const waitForXverseProvider = async (\n maxAttempts = 10,\n initialDelay = 200\n): Promise<boolean> => {\n for (let i = 0; i < maxAttempts; i++) {\n const provider = getSelectedProvider();\n\n if (provider?.request && provider?.addListener) return true;\n\n await new Promise((resolve) =>\n setTimeout(resolve, initialDelay * Math.min(i + 1, 5))\n );\n }\n\n return false;\n};\n\nexport const extractAndValidateStacksAddress = (\n addresses:\n | {\n address: string;\n addressType: string;\n purpose: string;\n }[]\n | undefined,\n currentAddress: string | undefined,\n onAddressChange: (address: string) => void,\n connect: () => Promise<void>\n) => {\n if (!addresses || !Array.isArray(addresses)) {\n void connect();\n return;\n }\n\n const stacksAccount = addresses.find(\n (acc) => acc.purpose === 'stacks' || acc.addressType === 'stacks'\n );\n\n if (!stacksAccount?.address) {\n void connect();\n return;\n }\n\n if (stacksAccount.address !== currentAddress) {\n onAddressChange(stacksAccount.address);\n }\n};\n","import { getSelectedProvider } from '@stacks/connect';\nimport { useEffect, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../../constants/wallets';\nimport type { ConnectOptions } from '../../provider/stacks-wallet-provider.types';\nimport type { XverseAccountChangeEvent } from './use-xverse.types';\nimport {\n extractAndValidateStacksAddress,\n getXverseProductInfo,\n shouldSupportAccountChange,\n waitForXverseProvider,\n} from './use-xverse.helpers';\n\nexport const useXverse = ({\n address,\n provider,\n onAddressChange,\n connect,\n}: {\n address: string | undefined;\n provider: SupportedStacksWallet | undefined;\n onAddressChange: (newAddress: string) => void;\n connect: (\n providerId: SupportedStacksWallet,\n options?: ConnectOptions\n ) => Promise<void>;\n}) => {\n const [isProviderReady, setIsProviderReady] = useState(false);\n\n useEffect(() => {\n if (provider !== 'xverse') return;\n\n const checkProvider = async () => {\n const ready = await waitForXverseProvider();\n\n setIsProviderReady(ready);\n\n if (!ready) {\n console.error('Xverse provider failed to initialize');\n }\n };\n\n void checkProvider();\n }, [provider]);\n\n useEffect(() => {\n if (provider !== 'xverse' || !address || !isProviderReady) return;\n\n let cancelled = false;\n let removeListener: (() => void) | undefined;\n\n const setupXverse = async () => {\n try {\n const productInfo = await getXverseProductInfo();\n\n if (cancelled) return;\n\n if (!shouldSupportAccountChange(productInfo?.version)) return;\n\n const response = await getSelectedProvider()?.request(\n 'wallet_connect',\n null\n );\n\n if (cancelled) return;\n\n extractAndValidateStacksAddress(\n response?.result?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n\n removeListener = getSelectedProvider()?.addListener(\n 'accountChange',\n (event: XverseAccountChangeEvent) => {\n extractAndValidateStacksAddress(\n event?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n }\n );\n } catch (error) {\n console.error('Failed to setup Xverse:', error);\n }\n };\n\n void setupXverse();\n\n return () => {\n cancelled = true;\n\n if (!removeListener) return;\n\n try {\n removeListener();\n } catch (error) {\n console.error('Failed to remove Xverse listener:', error);\n }\n };\n }, [address, isProviderReady, onAddressChange, connect, provider]);\n};\n","import { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\n\nexport const getLocalStorageWallet = (): {\n address: string;\n provider: SupportedStacksWallet;\n} | null => {\n if (typeof window === 'undefined') return null;\n\n const stored = localStorage.getItem(LOCAL_STORAGE_STACKS);\n\n if (!stored) return null;\n\n try {\n const data = JSON.parse(stored) as {\n address: string;\n provider: SupportedStacksWallet;\n };\n\n const isValid = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === data.provider\n );\n\n return isValid ? data : null;\n } catch {\n return null;\n }\n};\n","'use client';\n\nimport {\n clearSelectedProviderId,\n setSelectedProviderId,\n request,\n getSelectedProvider,\n WalletConnect,\n} from '@stacks/connect';\nimport {\n createContext,\n useContext,\n useCallback,\n useEffect,\n useRef,\n useState,\n useMemo,\n} from 'react';\n\nimport { STACKS_TO_STACKS_CONNECT_PROVIDERS } from '../constants/stacks-provider-mapping';\nimport { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\nimport {\n checkIfStacksProviderIsInstalled,\n getStacksWallets,\n} from '../utils/get-stacks-wallets';\n\nimport {\n getOKXStacksAddress,\n extractStacksAddress,\n buildWalletConnectConfig,\n} from './stacks-wallet-provider.helpers';\nimport type {\n WalletContextValue,\n WalletState,\n ConnectOptions,\n StacksWalletProviderProps,\n} from './stacks-wallet-provider.types';\nimport { useXverse } from '../hooks/use-xverse/use-xverse';\nimport { getLocalStorageWallet } from '../utils/get-local-storage-wallet';\n\nconst StacksWalletContext = createContext<WalletContextValue | undefined>(\n undefined\n);\n\nexport const StacksWalletProvider = ({\n children,\n wallets,\n walletConnect,\n onConnect,\n onAddressChange,\n onDisconnect,\n}: StacksWalletProviderProps) => {\n const [address, setAddress] = useState<string | undefined>();\n const [provider, setProvider] = useState<\n SupportedStacksWallet | undefined\n >();\n const [isConnecting, setIsConnecting] = useState(false);\n\n // Generation counter — incremented by reset() to invalidate in-flight connect promises\n const connectGenRef = useRef(0);\n\n // Guard against concurrent WalletConnect.initializeProvider calls\n const wcInitRef = useRef<Promise<void> | null>(null);\n\n // Serialize wallets to a stable string for use as a dependency,\n // so inline arrays like wallets={['xverse', 'leather']} don't\n // invalidate memos on every render. (Fixes #5)\n const walletsKey = wallets?.join(',');\n\n // Fix #1: runtime guard in useEffect instead of render body\n useEffect(() => {\n if (wallets?.includes('wallet-connect') && !walletConnect?.projectId) {\n throw new Error(\n 'StacksWalletProvider: \"wallet-connect\" is listed in wallets but no walletConnect.projectId was provided.'\n );\n }\n }, [walletsKey, walletConnect?.projectId]);\n\n useEffect(() => {\n const loadPersistedWallet = async () => {\n const persisted = getLocalStorageWallet();\n\n if (!persisted) return;\n\n setIsConnecting(true);\n\n try {\n if (persisted.provider === 'okx') {\n const data = await getOKXStacksAddress();\n setAddress(data.address);\n setProvider(data.provider);\n return;\n }\n\n if (\n persisted.provider === 'wallet-connect' &&\n walletConnect?.projectId\n ) {\n const initPromise = WalletConnect.initializeProvider(\n buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n );\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n setAddress(persisted.address);\n setProvider(persisted.provider);\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[persisted.provider]\n );\n } catch (error) {\n console.error('Failed to restore wallet connection:', error);\n } finally {\n setIsConnecting(false);\n }\n };\n\n void loadPersistedWallet();\n }, [walletConnect?.projectId]);\n\n const connect = useCallback(\n async (providerId: SupportedStacksWallet, options?: ConnectOptions) => {\n const typedProvider = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === providerId\n );\n\n if (!typedProvider) {\n const error = new Error(\n 'The wallet provider selected is not supported!'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (!checkIfStacksProviderIsInstalled(typedProvider)) {\n const error = new Error(\n `${typedProvider} wallet is not installed. Please install the wallet extension to continue.`\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (\n typedProvider === 'wallet-connect' &&\n !walletConnect?.projectId\n ) {\n const error = new Error(\n 'WalletConnect requires a project ID. Please provide walletConnect.projectId to the StacksWalletProvider.'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n // Capture generation so we can detect if reset() was called during await\n const gen = ++connectGenRef.current;\n setIsConnecting(true);\n\n try {\n if (typedProvider === 'okx') {\n const data = await getOKXStacksAddress();\n if (connectGenRef.current !== gen) return;\n setAddress(data.address);\n setProvider(data.provider);\n options?.onSuccess?.(data.address, data.provider);\n return;\n }\n\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[typedProvider]\n );\n\n const wcConfig =\n typedProvider === 'wallet-connect' && walletConnect\n ? buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n : undefined;\n\n if (wcConfig) {\n // Wait for any in-flight init, then start ours\n if (wcInitRef.current) await wcInitRef.current;\n const initPromise =\n WalletConnect.initializeProvider(wcConfig);\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n if (connectGenRef.current !== gen) return;\n\n const data = wcConfig\n ? await request(\n { walletConnect: wcConfig },\n 'getAddresses',\n {}\n )\n : await request('getAddresses');\n\n if (connectGenRef.current !== gen) return;\n\n const extractedAddress = extractStacksAddress(\n typedProvider,\n data.addresses\n );\n\n setAddress(extractedAddress);\n setProvider(typedProvider);\n options?.onSuccess?.(extractedAddress, typedProvider);\n } catch (error) {\n if (connectGenRef.current !== gen) return;\n console.error('Failed to connect wallet:', error);\n // OKX uses its own SDK and never calls setSelectedProviderId,\n // so getSelectedProvider() would return the previously connected\n // provider — disconnecting the wrong wallet.\n if (typedProvider !== 'okx') {\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n }\n options?.onError?.(error as Error);\n } finally {\n if (connectGenRef.current === gen) {\n setIsConnecting(false);\n }\n }\n },\n [walletConnect]\n );\n\n const reset = useCallback(() => {\n connectGenRef.current++;\n setIsConnecting(false);\n clearSelectedProviderId();\n }, []);\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n localStorage.removeItem(LOCAL_STORAGE_STACKS);\n setAddress(undefined);\n setProvider(undefined);\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n callback?.();\n onDisconnect?.();\n },\n [onDisconnect]\n );\n\n useEffect(() => {\n if (!address || !provider) return;\n\n localStorage.setItem(\n LOCAL_STORAGE_STACKS,\n JSON.stringify({ address, provider })\n );\n }, [address, provider]);\n\n useEffect(() => {\n if (!address || !provider || !onConnect) return;\n\n onConnect(provider, address);\n }, [address, provider, onConnect]);\n\n useXverse({\n address,\n provider,\n onAddressChange: (newAddress: string) => {\n setAddress(newAddress);\n onAddressChange?.(newAddress);\n },\n connect,\n });\n\n const walletInfos = useMemo(() => {\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n\n return configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n }, [walletsKey, walletConnect?.projectId]);\n\n const value = useMemo((): WalletContextValue => {\n const walletState: WalletState = isConnecting\n ? { status: 'connecting', address: undefined, provider: undefined }\n : address && provider\n ? { status: 'connected', address, provider }\n : {\n status: 'disconnected',\n address: undefined,\n provider: undefined,\n };\n\n return {\n ...walletState,\n connect,\n disconnect,\n reset,\n wallets: walletInfos,\n };\n }, [address, provider, isConnecting, connect, disconnect, reset, walletInfos]);\n\n return (\n <StacksWalletContext.Provider value={value}>\n {children}\n </StacksWalletContext.Provider>\n );\n};\n\nexport const useStacksWalletContext = () => {\n const context = useContext(StacksWalletContext);\n\n if (context === undefined) {\n throw new Error(\n '🚨 Stacks wallet hooks must be used within StacksWalletProvider'\n );\n }\n\n return context;\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\ntype UseAddressReturn =\n | {\n address: undefined;\n isConnected: false;\n isConnecting: boolean;\n isDisconnected: boolean;\n provider: undefined;\n }\n | {\n address: string;\n isConnected: true;\n isConnecting: false;\n isDisconnected: false;\n provider: SupportedStacksWallet;\n };\n\nexport const useAddress = (): UseAddressReturn => {\n const { address, status, provider } = useStacksWalletContext();\n\n return useMemo(() => {\n if (status === 'connected' && address && provider) {\n return {\n address,\n isConnected: true as const,\n isConnecting: false as const,\n isDisconnected: false as const,\n provider,\n };\n }\n\n return {\n address: undefined,\n isConnected: false as const,\n isConnecting: status === 'connecting',\n isDisconnected: status === 'disconnected',\n provider: undefined,\n };\n }, [address, status, provider]);\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { useStacksWalletContext } from \"../provider/stacks-wallet-provider\";\n\nexport const useConnect = () => {\n const { connect, reset, status } = useStacksWalletContext();\n\n const value = useMemo(\n () => ({\n connect,\n reset,\n isPending: status === \"connecting\",\n }),\n [connect, reset, status]\n );\n\n return value;\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { useStacksWalletContext } from \"../provider/stacks-wallet-provider\";\n\nexport const useDisconnect = () => {\n const { disconnect } = useStacksWalletContext();\n\n return useMemo(\n () => ({\n disconnect,\n }),\n [disconnect]\n );\n};\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { useCallback, useState } from 'react';\n\nimport { useAddress } from './use-address';\n\nexport interface SignMessageVariables {\n message: string;\n publicKey?: string;\n}\n\nexport interface SignMessageData {\n publicKey: string;\n signature: string;\n}\n\nexport interface SignMessageOptions {\n onSuccess?: (data: SignMessageData) => void;\n onError?: (error: Error) => void;\n onSettled?: (\n data: SignMessageData | undefined,\n error: Error | null\n ) => void;\n}\n\nexport const useSignMessage = () => {\n const { isConnected, provider } = useAddress();\n const [data, setData] = useState<SignMessageData | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [isPending, setIsPending] = useState(false);\n\n const signMessageAsync = useCallback(\n async (variables: SignMessageVariables): Promise<SignMessageData> => {\n if (!isConnected) {\n throw new Error('Wallet is not connected');\n }\n\n setIsPending(true);\n setError(null);\n setData(undefined);\n\n try {\n let result: SignMessageData;\n\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n result = await window.okxwallet.stacks.signMessage({\n message: variables.message,\n });\n } else {\n result = await request('stx_signMessage', {\n message: variables.message,\n ...(variables.publicKey && {\n publicKey: variables.publicKey,\n }),\n });\n }\n\n setData(result);\n setIsPending(false);\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsPending(false);\n throw error;\n }\n },\n [isConnected, provider]\n );\n\n const signMessage = useCallback(\n (variables: SignMessageVariables, options?: SignMessageOptions) => {\n signMessageAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [signMessageAsync]\n );\n\n return {\n signMessage,\n signMessageAsync,\n data,\n error,\n isPending,\n };\n};\n","export const getNetworkFromAddress = (address: string) => {\n if (address.startsWith('SP') || address.startsWith('SM')) {\n return 'mainnet';\n }\n\n if (address.startsWith('ST') || address.startsWith('SN')) {\n return 'testnet';\n }\n\n throw new Error(`Invalid Stacks address: ${address}`);\n};\n","import type { ClarityValue, PostCondition } from \"@stacks/transactions\";\nimport { cvToHex, postConditionToHex } from \"@stacks/transactions\";\n\nexport const preparePostConditionsForOKX = (postConditions: PostCondition[]) =>\n postConditions.map((pc) => postConditionToHex(pc));\n\nexport const prepareArgsForOKX = (args: ClarityValue[]) =>\n args.map((arg) => cvToHex(arg));\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { PostConditionMode } from '@stacks/transactions';\nimport { useCallback, useState } from 'react';\n\nimport { useAddress } from '../use-address';\nimport { getNetworkFromAddress } from '../../utils/get-network-from-address';\n\nimport {\n preparePostConditionsForOKX,\n prepareArgsForOKX,\n} from './use-write-contract.helpers';\nimport type {\n WriteContractVariables,\n WriteContractOptions,\n} from './use-write-contract.types';\n\nexport const useWriteContract = () => {\n const { isConnected, address, provider } = useAddress();\n\n const [data, setData] = useState<string | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [isPending, setIsPending] = useState(false);\n\n const writeContractAsync = useCallback(\n async (variables: WriteContractVariables): Promise<string> => {\n if (!isConnected || !address) {\n throw new Error('Wallet is not connected');\n }\n\n setIsPending(true);\n setError(null);\n setData(undefined);\n\n try {\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n const response =\n await window.okxwallet.stacks.signTransaction({\n contractAddress: variables.address,\n contractName: variables.contract,\n functionName: variables.functionName,\n functionArgs: prepareArgsForOKX(variables.args),\n postConditions: preparePostConditionsForOKX(\n variables.pc.postConditions\n ),\n postConditionMode: variables.pc.mode,\n stxAddress: address,\n txType: 'contract_call',\n anchorMode: 3,\n });\n\n setData(response.txHash);\n setIsPending(false);\n return response.txHash;\n }\n\n const response = await request('stx_callContract', {\n address,\n contract: `${variables.address}.${variables.contract}`,\n functionName: variables.functionName,\n functionArgs: variables.args,\n postConditions: variables.pc.postConditions,\n postConditionMode:\n variables.pc.mode === PostConditionMode.Allow\n ? 'allow'\n : 'deny',\n network: getNetworkFromAddress(address),\n });\n\n if (!response.txid) {\n throw new Error('No transaction ID returned');\n }\n\n setData(response.txid);\n setIsPending(false);\n return response.txid;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsPending(false);\n throw error;\n }\n },\n [isConnected, address, provider]\n );\n\n const writeContract = useCallback(\n (variables: WriteContractVariables, options?: WriteContractOptions) => {\n writeContractAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [writeContractAsync]\n );\n\n return {\n writeContract,\n writeContractAsync,\n data,\n error,\n isPending,\n };\n};\n\nexport type {\n WriteContractVariables,\n WriteContractOptions,\n PostConditionConfig,\n} from './use-write-contract.types';\n","'use client';\n\nimport { getPrimaryName } from 'bns-v2-sdk';\nimport { useEffect, useState } from 'react';\n\nimport { getNetworkFromAddress } from '../utils/get-network-from-address';\n\nexport const useBnsName = (address?: string) => {\n const [bnsName, setBnsName] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (!address) {\n setBnsName(null);\n setIsLoading(false);\n return;\n }\n\n const fetchBnsName = async () => {\n setIsLoading(true);\n\n try {\n const network = getNetworkFromAddress(address);\n const result = await getPrimaryName({ address, network });\n\n const fullName = result\n ? `${result.name}.${result.namespace}`\n : null;\n\n setBnsName(fullName);\n } catch {\n setBnsName(null);\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchBnsName();\n }, [address]);\n\n return { bnsName, isLoading };\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useWallets = () => {\n const { wallets } = useStacksWalletContext();\n\n return useMemo(() => ({ wallets }), [wallets]);\n};\n"]}
1
+ {"version":3,"sources":["../src/constants/stacks-provider-mapping.ts","../src/constants/storage-keys.ts","../src/constants/wallets.ts","../src/utils/get-stacks-wallets.ts","../src/provider/stacks-wallet-provider.helpers.ts","../src/hooks/use-xverse/use-xverse.helpers.ts","../src/hooks/use-xverse/use-xverse.ts","../src/utils/get-local-storage-wallet.ts","../src/provider/stacks-wallet-provider.tsx","../src/hooks/use-address.ts","../src/hooks/use-connect.ts","../src/hooks/use-disconnect.ts","../src/hooks/use-sign-message.ts","../src/utils/get-network-from-address.ts","../src/hooks/use-write-contract/use-write-contract.helpers.ts","../src/hooks/use-write-contract/use-write-contract.ts","../src/hooks/use-bns-name.ts","../src/hooks/use-wallets.ts"],"names":["getSelectedProvider","useState","useEffect","WalletConnect","data","useMemo","useCallback","request","error","response"],"mappings":"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","file":"index.js","sourcesContent":["import type { SupportedStacksWallet } from \"./wallets\";\n\nexport const STACKS_TO_STACKS_CONNECT_PROVIDERS: Record<\n Exclude<SupportedStacksWallet, \"okx\">,\n | \"LeatherProvider\"\n | \"XverseProviders.BitcoinProvider\"\n | \"AsignaProvider\"\n | \"FordefiProviders.UtxoProvider\"\n | \"WalletConnectProvider\"\n> = {\n xverse: \"XverseProviders.BitcoinProvider\",\n leather: \"LeatherProvider\",\n asigna: \"AsignaProvider\",\n fordefi: \"FordefiProviders.UtxoProvider\",\n \"wallet-connect\": \"WalletConnectProvider\",\n};\n","export const LOCAL_STORAGE_STACKS = \"@satoshai/kit\";\n","export const SUPPORTED_STACKS_WALLETS = [\n \"xverse\",\n \"leather\",\n \"okx\",\n \"asigna\",\n \"fordefi\",\n \"wallet-connect\",\n] as const;\n\nexport type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];\n","import {\n SUPPORTED_STACKS_WALLETS,\n type SupportedStacksWallet,\n} from '../constants/wallets';\n\nexport interface StacksWallets {\n supported: SupportedStacksWallet[];\n installed: SupportedStacksWallet[];\n}\n\nexport const getStacksWallets = (): StacksWallets => {\n const supported = [...SUPPORTED_STACKS_WALLETS];\n const installed = supported.filter((wallet) =>\n checkIfStacksProviderIsInstalled(wallet)\n );\n\n return { supported, installed };\n};\n\nexport const checkIfStacksProviderIsInstalled = (\n wallet: SupportedStacksWallet\n): boolean => {\n if (typeof window === 'undefined') return true;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n switch (wallet) {\n case 'xverse':\n return !!(window as any).XverseProviders;\n case 'leather':\n return (\n !!(window as any).LeatherProvider ||\n !!(window as any).HiroWalletProvider\n );\n case 'asigna':\n return !!(window as any).AsignaProvider;\n case 'okx':\n return !!(window as any).okxwallet;\n case 'fordefi':\n return !!(window as any).FordefiProviders?.UtxoProvider;\n case 'wallet-connect':\n return true;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n};\n","import type { SupportedStacksWallet } from '../constants/wallets';\nimport type {\n WalletConnectMetadata,\n StacksChain,\n} from './stacks-wallet-provider.types';\nimport { WalletConnect } from '@stacks/connect';\n\nconst STACKS_CHAIN_MAPPING = {\n mainnet: WalletConnect.Chains.Stacks.Mainnet,\n testnet: WalletConnect.Chains.Stacks.Testnet,\n} as const;\n\nexport const buildWalletConnectConfig = (\n projectId: string,\n metadata?: Partial<WalletConnectMetadata>,\n chains?: StacksChain[]\n): {\n projectId: string;\n metadata: WalletConnectMetadata;\n networks: (typeof WalletConnect.Networks.Stacks)[];\n} => {\n const selectedChains = chains ?? ['mainnet'];\n const walletConnectChains = selectedChains.map(\n (chain) => STACKS_CHAIN_MAPPING[chain]\n );\n\n return {\n projectId,\n metadata: {\n name: 'Universal Connector',\n description: 'Universal Connector',\n url: 'https://appkit.reown.com',\n icons: ['https://appkit.reown.com/icon.png'],\n ...metadata,\n },\n networks: [\n {\n ...WalletConnect.Networks.Stacks,\n chains: walletConnectChains,\n },\n ],\n };\n};\n\nexport const getOKXStacksAddress = async () => {\n if (!window.okxwallet) {\n throw new Error('🚨 OKX Wallet is not installed');\n }\n\n const stacksResponse = await window.okxwallet.stacks.connect();\n\n if (!stacksResponse) {\n throw new Error('🚨 Failed to connect with OKX Wallet');\n }\n\n return {\n address: stacksResponse.address,\n provider: 'okx' as const,\n };\n};\n\nexport const extractStacksAddress = (\n typedProvider: SupportedStacksWallet,\n addresses: { address?: string; symbol?: string }[]\n) => {\n if (!addresses.length) {\n throw new Error(`No addresses provided for ${typedProvider} wallet`);\n }\n\n if (typedProvider === 'leather' || typedProvider === 'asigna') {\n const stxAddress = addresses.find(\n (addr) => addr.symbol === 'STX'\n )?.address;\n\n if (stxAddress) return stxAddress;\n }\n\n const stacksAddress = addresses.find((addr) =>\n addr.address?.startsWith('S')\n )?.address;\n\n if (stacksAddress) return stacksAddress;\n\n const legacyAddress = addresses[2]?.address;\n\n if (legacyAddress?.startsWith('S')) return legacyAddress;\n\n throw new Error(\n `No valid Stacks address found for ${typedProvider} wallet`\n );\n};\n","import { getSelectedProvider } from '@stacks/connect';\n\nexport const getXverseProductInfo = async (): Promise<{\n version?: string;\n name?: string;\n} | null> =>\n (await window.XverseProviders?.StacksProvider?.getProductInfo?.()) ?? null;\n\nexport const shouldSupportAccountChange = (\n version: string | undefined\n): boolean => version !== undefined && version !== '1.0.0';\n\nexport const waitForXverseProvider = async (\n maxAttempts = 10,\n initialDelay = 200\n): Promise<boolean> => {\n for (let i = 0; i < maxAttempts; i++) {\n const provider = getSelectedProvider();\n\n if (provider?.request && provider?.addListener) return true;\n\n await new Promise((resolve) =>\n setTimeout(resolve, initialDelay * Math.min(i + 1, 5))\n );\n }\n\n return false;\n};\n\nexport const extractAndValidateStacksAddress = (\n addresses:\n | {\n address: string;\n addressType: string;\n purpose: string;\n }[]\n | undefined,\n currentAddress: string | undefined,\n onAddressChange: (address: string) => void,\n connect: () => Promise<void>\n) => {\n if (!addresses || !Array.isArray(addresses)) {\n void connect();\n return;\n }\n\n const stacksAccount = addresses.find(\n (acc) => acc.purpose === 'stacks' || acc.addressType === 'stacks'\n );\n\n if (!stacksAccount?.address) {\n void connect();\n return;\n }\n\n if (stacksAccount.address !== currentAddress) {\n onAddressChange(stacksAccount.address);\n }\n};\n","import { getSelectedProvider } from '@stacks/connect';\nimport { useEffect, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../../constants/wallets';\nimport type { ConnectOptions } from '../../provider/stacks-wallet-provider.types';\nimport type { XverseAccountChangeEvent } from './use-xverse.types';\nimport {\n extractAndValidateStacksAddress,\n getXverseProductInfo,\n shouldSupportAccountChange,\n waitForXverseProvider,\n} from './use-xverse.helpers';\n\nexport const useXverse = ({\n address,\n provider,\n onAddressChange,\n connect,\n}: {\n address: string | undefined;\n provider: SupportedStacksWallet | undefined;\n onAddressChange: (newAddress: string) => void;\n connect: (\n providerId: SupportedStacksWallet,\n options?: ConnectOptions\n ) => Promise<void>;\n}) => {\n const [isProviderReady, setIsProviderReady] = useState(false);\n\n useEffect(() => {\n if (provider !== 'xverse') return;\n\n const checkProvider = async () => {\n const ready = await waitForXverseProvider();\n\n setIsProviderReady(ready);\n\n if (!ready) {\n console.error('Xverse provider failed to initialize');\n }\n };\n\n void checkProvider();\n }, [provider]);\n\n useEffect(() => {\n if (provider !== 'xverse' || !address || !isProviderReady) return;\n\n let cancelled = false;\n let removeListener: (() => void) | undefined;\n\n const setupXverse = async () => {\n try {\n const productInfo = await getXverseProductInfo();\n\n if (cancelled) return;\n\n if (!shouldSupportAccountChange(productInfo?.version)) return;\n\n const response = await getSelectedProvider()?.request(\n 'wallet_connect',\n null\n );\n\n if (cancelled) return;\n\n extractAndValidateStacksAddress(\n response?.result?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n\n removeListener = getSelectedProvider()?.addListener(\n 'accountChange',\n (event: XverseAccountChangeEvent) => {\n extractAndValidateStacksAddress(\n event?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n }\n );\n } catch (error) {\n console.error('Failed to setup Xverse:', error);\n }\n };\n\n void setupXverse();\n\n return () => {\n cancelled = true;\n\n if (!removeListener) return;\n\n try {\n removeListener();\n } catch (error) {\n console.error('Failed to remove Xverse listener:', error);\n }\n };\n }, [address, isProviderReady, onAddressChange, connect, provider]);\n};\n","import { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\n\nexport const getLocalStorageWallet = (): {\n address: string;\n provider: SupportedStacksWallet;\n} | null => {\n if (typeof window === 'undefined') return null;\n\n const stored = localStorage.getItem(LOCAL_STORAGE_STACKS);\n\n if (!stored) return null;\n\n try {\n const data = JSON.parse(stored) as {\n address: string;\n provider: SupportedStacksWallet;\n };\n\n const isValid = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === data.provider\n );\n\n return isValid ? data : null;\n } catch {\n return null;\n }\n};\n","'use client';\n\nimport {\n clearSelectedProviderId,\n setSelectedProviderId,\n request,\n getSelectedProvider,\n WalletConnect,\n} from '@stacks/connect';\nimport {\n createContext,\n useContext,\n useCallback,\n useEffect,\n useRef,\n useState,\n useMemo,\n} from 'react';\n\nimport { STACKS_TO_STACKS_CONNECT_PROVIDERS } from '../constants/stacks-provider-mapping';\nimport { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\nimport {\n checkIfStacksProviderIsInstalled,\n getStacksWallets,\n} from '../utils/get-stacks-wallets';\n\nimport {\n getOKXStacksAddress,\n extractStacksAddress,\n buildWalletConnectConfig,\n} from './stacks-wallet-provider.helpers';\nimport type {\n WalletContextValue,\n WalletState,\n ConnectOptions,\n StacksWalletProviderProps,\n} from './stacks-wallet-provider.types';\nimport { useXverse } from '../hooks/use-xverse/use-xverse';\nimport { getLocalStorageWallet } from '../utils/get-local-storage-wallet';\n\nconst StacksWalletContext = createContext<WalletContextValue | undefined>(\n undefined\n);\n\nexport const StacksWalletProvider = ({\n children,\n wallets,\n walletConnect,\n onConnect,\n onAddressChange,\n onDisconnect,\n}: StacksWalletProviderProps) => {\n const [address, setAddress] = useState<string | undefined>();\n const [provider, setProvider] = useState<\n SupportedStacksWallet | undefined\n >();\n const [isConnecting, setIsConnecting] = useState(false);\n\n // Generation counter — incremented by reset() to invalidate in-flight connect promises\n const connectGenRef = useRef(0);\n\n // Guard against concurrent WalletConnect.initializeProvider calls\n const wcInitRef = useRef<Promise<void> | null>(null);\n\n // Serialize wallets to a stable string for use as a dependency,\n // so inline arrays like wallets={['xverse', 'leather']} don't\n // invalidate memos on every render. (Fixes #5)\n const walletsKey = wallets?.join(',');\n\n // Fix #1: runtime guard in useEffect instead of render body\n useEffect(() => {\n if (wallets?.includes('wallet-connect') && !walletConnect?.projectId) {\n throw new Error(\n 'StacksWalletProvider: \"wallet-connect\" is listed in wallets but no walletConnect.projectId was provided.'\n );\n }\n }, [walletsKey, walletConnect?.projectId]);\n\n useEffect(() => {\n const loadPersistedWallet = async () => {\n const persisted = getLocalStorageWallet();\n\n if (!persisted) return;\n\n setIsConnecting(true);\n\n try {\n if (persisted.provider === 'okx') {\n const data = await getOKXStacksAddress();\n setAddress(data.address);\n setProvider(data.provider);\n return;\n }\n\n if (\n persisted.provider === 'wallet-connect' &&\n walletConnect?.projectId\n ) {\n const initPromise = WalletConnect.initializeProvider(\n buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n );\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n setAddress(persisted.address);\n setProvider(persisted.provider);\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[persisted.provider]\n );\n } catch (error) {\n console.error('Failed to restore wallet connection:', error);\n } finally {\n setIsConnecting(false);\n }\n };\n\n void loadPersistedWallet();\n }, [walletConnect?.projectId]);\n\n const connect = useCallback(\n async (providerId: SupportedStacksWallet, options?: ConnectOptions) => {\n const typedProvider = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === providerId\n );\n\n if (!typedProvider) {\n const error = new Error(\n 'The wallet provider selected is not supported!'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (!checkIfStacksProviderIsInstalled(typedProvider)) {\n const error = new Error(\n `${typedProvider} wallet is not installed. Please install the wallet extension to continue.`\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (\n typedProvider === 'wallet-connect' &&\n !walletConnect?.projectId\n ) {\n const error = new Error(\n 'WalletConnect requires a project ID. Please provide walletConnect.projectId to the StacksWalletProvider.'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n // Capture generation so we can detect if reset() was called during await\n const gen = ++connectGenRef.current;\n setIsConnecting(true);\n\n try {\n if (typedProvider === 'okx') {\n const data = await getOKXStacksAddress();\n if (connectGenRef.current !== gen) return;\n setAddress(data.address);\n setProvider(data.provider);\n options?.onSuccess?.(data.address, data.provider);\n return;\n }\n\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[typedProvider]\n );\n\n const wcConfig =\n typedProvider === 'wallet-connect' && walletConnect\n ? buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n : undefined;\n\n if (wcConfig) {\n // Wait for any in-flight init, then start ours\n if (wcInitRef.current) await wcInitRef.current;\n const initPromise =\n WalletConnect.initializeProvider(wcConfig);\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n if (connectGenRef.current !== gen) return;\n\n const data = wcConfig\n ? await request(\n { walletConnect: wcConfig },\n 'getAddresses',\n {}\n )\n : await request('getAddresses');\n\n if (connectGenRef.current !== gen) return;\n\n const extractedAddress = extractStacksAddress(\n typedProvider,\n data.addresses\n );\n\n setAddress(extractedAddress);\n setProvider(typedProvider);\n options?.onSuccess?.(extractedAddress, typedProvider);\n } catch (error) {\n if (connectGenRef.current !== gen) return;\n console.error('Failed to connect wallet:', error);\n // OKX uses its own SDK and never calls setSelectedProviderId,\n // so getSelectedProvider() would return the previously connected\n // provider — disconnecting the wrong wallet.\n if (typedProvider !== 'okx') {\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n }\n options?.onError?.(error as Error);\n } finally {\n if (connectGenRef.current === gen) {\n setIsConnecting(false);\n }\n }\n },\n [walletConnect]\n );\n\n const reset = useCallback(() => {\n connectGenRef.current++;\n setIsConnecting(false);\n clearSelectedProviderId();\n }, []);\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n localStorage.removeItem(LOCAL_STORAGE_STACKS);\n setAddress(undefined);\n setProvider(undefined);\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n callback?.();\n onDisconnect?.();\n },\n [onDisconnect]\n );\n\n useEffect(() => {\n if (!address || !provider) return;\n\n localStorage.setItem(\n LOCAL_STORAGE_STACKS,\n JSON.stringify({ address, provider })\n );\n }, [address, provider]);\n\n useEffect(() => {\n if (!address || !provider || !onConnect) return;\n\n onConnect(provider, address);\n }, [address, provider, onConnect]);\n\n useXverse({\n address,\n provider,\n onAddressChange: (newAddress: string) => {\n setAddress(newAddress);\n onAddressChange?.(newAddress);\n },\n connect,\n });\n\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n const walletInfos = configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n\n const value = useMemo((): WalletContextValue => {\n const walletState: WalletState = isConnecting\n ? { status: 'connecting', address: undefined, provider: undefined }\n : address && provider\n ? { status: 'connected', address, provider }\n : {\n status: 'disconnected',\n address: undefined,\n provider: undefined,\n };\n\n return {\n ...walletState,\n connect,\n disconnect,\n reset,\n wallets: walletInfos,\n };\n }, [address, provider, isConnecting, connect, disconnect, reset, walletInfos]);\n\n return (\n <StacksWalletContext.Provider value={value}>\n {children}\n </StacksWalletContext.Provider>\n );\n};\n\nexport const useStacksWalletContext = () => {\n const context = useContext(StacksWalletContext);\n\n if (context === undefined) {\n throw new Error(\n '🚨 Stacks wallet hooks must be used within StacksWalletProvider'\n );\n }\n\n return context;\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\ntype UseAddressReturn =\n | {\n address: undefined;\n isConnected: false;\n isConnecting: boolean;\n isDisconnected: boolean;\n provider: undefined;\n }\n | {\n address: string;\n isConnected: true;\n isConnecting: false;\n isDisconnected: false;\n provider: SupportedStacksWallet;\n };\n\nexport const useAddress = (): UseAddressReturn => {\n const { address, status, provider } = useStacksWalletContext();\n\n return useMemo(() => {\n if (status === 'connected' && address && provider) {\n return {\n address,\n isConnected: true as const,\n isConnecting: false as const,\n isDisconnected: false as const,\n provider,\n };\n }\n\n return {\n address: undefined,\n isConnected: false as const,\n isConnecting: status === 'connecting',\n isDisconnected: status === 'disconnected',\n provider: undefined,\n };\n }, [address, status, provider]);\n};\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport type { ConnectOptions, MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useConnect = () => {\n const {\n connect: contextConnect,\n reset: contextReset,\n status: walletStatus,\n } = useStacksWalletContext();\n\n const [error, setError] = useState<Error | null>(null);\n const [mutationStatus, setMutationStatus] =\n useState<MutationStatus>('idle');\n\n const connect = useCallback(\n async (\n providerId: SupportedStacksWallet,\n options?: ConnectOptions\n ) => {\n setError(null);\n setMutationStatus('pending');\n\n let settled = false;\n\n try {\n await contextConnect(providerId, {\n onSuccess: (address, provider) => {\n settled = true;\n setMutationStatus('success');\n options?.onSuccess?.(address, provider);\n },\n onError: (err) => {\n settled = true;\n setError(err);\n setMutationStatus('error');\n options?.onError?.(err);\n },\n });\n } finally {\n if (!settled) {\n // connect returned without calling onSuccess or onError\n // (e.g., cancelled by reset or stale generation)\n setMutationStatus('idle');\n }\n }\n },\n [contextConnect]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setMutationStatus('idle');\n contextReset();\n }, [contextReset]);\n\n const value = useMemo(\n () => ({\n connect,\n reset,\n error,\n isError: mutationStatus === 'error',\n isIdle: mutationStatus === 'idle',\n isPending:\n mutationStatus === 'pending' ||\n walletStatus === 'connecting',\n isSuccess: mutationStatus === 'success',\n status: mutationStatus,\n }),\n [connect, reset, error, mutationStatus, walletStatus]\n );\n\n return value;\n};\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useDisconnect = () => {\n const { disconnect: contextDisconnect } = useStacksWalletContext();\n\n const [error, setError] = useState<Error | null>(null);\n const [mutationStatus, setMutationStatus] =\n useState<MutationStatus>('idle');\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n setError(null);\n\n try {\n contextDisconnect(callback);\n setMutationStatus('success');\n } catch (err) {\n const normalizedError =\n err instanceof Error ? err : new Error(String(err));\n setError(normalizedError);\n setMutationStatus('error');\n }\n },\n [contextDisconnect]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setMutationStatus('idle');\n }, []);\n\n const value = useMemo(\n () => ({\n disconnect,\n reset,\n error,\n isError: mutationStatus === 'error',\n isIdle: mutationStatus === 'idle',\n isPending: mutationStatus === 'pending',\n isSuccess: mutationStatus === 'success',\n status: mutationStatus,\n }),\n [disconnect, reset, error, mutationStatus]\n );\n\n return value;\n};\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useAddress } from './use-address';\n\nexport interface SignMessageVariables {\n message: string;\n publicKey?: string;\n}\n\nexport interface SignMessageData {\n publicKey: string;\n signature: string;\n}\n\nexport interface SignMessageOptions {\n onSuccess?: (data: SignMessageData) => void;\n onError?: (error: Error) => void;\n onSettled?: (\n data: SignMessageData | undefined,\n error: Error | null\n ) => void;\n}\n\nexport const useSignMessage = () => {\n const { isConnected, provider } = useAddress();\n const [data, setData] = useState<SignMessageData | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [status, setStatus] = useState<MutationStatus>('idle');\n\n const signMessageAsync = useCallback(\n async (variables: SignMessageVariables): Promise<SignMessageData> => {\n if (!isConnected) {\n throw new Error('Wallet is not connected');\n }\n\n setStatus('pending');\n setError(null);\n setData(undefined);\n\n try {\n let result: SignMessageData;\n\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n result = await window.okxwallet.stacks.signMessage({\n message: variables.message,\n });\n } else {\n result = await request('stx_signMessage', {\n message: variables.message,\n ...(variables.publicKey && {\n publicKey: variables.publicKey,\n }),\n });\n }\n\n setData(result);\n setStatus('success');\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [isConnected, provider]\n );\n\n const signMessage = useCallback(\n (variables: SignMessageVariables, options?: SignMessageOptions) => {\n signMessageAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [signMessageAsync]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setError(null);\n setStatus('idle');\n }, []);\n\n return useMemo(\n () => ({\n signMessage,\n signMessageAsync,\n reset,\n data,\n error,\n isError: status === 'error',\n isIdle: status === 'idle',\n isPending: status === 'pending',\n isSuccess: status === 'success',\n status,\n }),\n [signMessage, signMessageAsync, reset, data, error, status]\n );\n};\n","export const getNetworkFromAddress = (address: string) => {\n if (address.startsWith('SP') || address.startsWith('SM')) {\n return 'mainnet';\n }\n\n if (address.startsWith('ST') || address.startsWith('SN')) {\n return 'testnet';\n }\n\n throw new Error(`Invalid Stacks address: ${address}`);\n};\n","import type { ClarityValue, PostCondition } from \"@stacks/transactions\";\nimport { cvToHex, postConditionToHex } from \"@stacks/transactions\";\n\nexport const preparePostConditionsForOKX = (postConditions: PostCondition[]) =>\n postConditions.map((pc) => postConditionToHex(pc));\n\nexport const prepareArgsForOKX = (args: ClarityValue[]) =>\n args.map((arg) => cvToHex(arg));\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { PostConditionMode } from '@stacks/transactions';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../../provider/stacks-wallet-provider.types';\nimport { useAddress } from '../use-address';\nimport { getNetworkFromAddress } from '../../utils/get-network-from-address';\n\nimport {\n preparePostConditionsForOKX,\n prepareArgsForOKX,\n} from './use-write-contract.helpers';\nimport type {\n WriteContractVariables,\n WriteContractOptions,\n} from './use-write-contract.types';\n\nexport const useWriteContract = () => {\n const { isConnected, address, provider } = useAddress();\n\n const [data, setData] = useState<string | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [status, setStatus] = useState<MutationStatus>('idle');\n\n const writeContractAsync = useCallback(\n async (variables: WriteContractVariables): Promise<string> => {\n if (!isConnected || !address) {\n throw new Error('Wallet is not connected');\n }\n\n setStatus('pending');\n setError(null);\n setData(undefined);\n\n try {\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n const response =\n await window.okxwallet.stacks.signTransaction({\n contractAddress: variables.address,\n contractName: variables.contract,\n functionName: variables.functionName,\n functionArgs: prepareArgsForOKX(variables.args),\n postConditions: preparePostConditionsForOKX(\n variables.pc.postConditions\n ),\n postConditionMode: variables.pc.mode,\n stxAddress: address,\n txType: 'contract_call',\n anchorMode: 3,\n });\n\n setData(response.txHash);\n setStatus('success');\n return response.txHash;\n }\n\n const response = await request('stx_callContract', {\n address,\n contract: `${variables.address}.${variables.contract}`,\n functionName: variables.functionName,\n functionArgs: variables.args,\n postConditions: variables.pc.postConditions,\n postConditionMode:\n variables.pc.mode === PostConditionMode.Allow\n ? 'allow'\n : 'deny',\n network: getNetworkFromAddress(address),\n });\n\n if (!response.txid) {\n throw new Error('No transaction ID returned');\n }\n\n setData(response.txid);\n setStatus('success');\n return response.txid;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [isConnected, address, provider]\n );\n\n const writeContract = useCallback(\n (variables: WriteContractVariables, options?: WriteContractOptions) => {\n writeContractAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [writeContractAsync]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setError(null);\n setStatus('idle');\n }, []);\n\n return useMemo(\n () => ({\n writeContract,\n writeContractAsync,\n reset,\n data,\n error,\n isError: status === 'error',\n isIdle: status === 'idle',\n isPending: status === 'pending',\n isSuccess: status === 'success',\n status,\n }),\n [writeContract, writeContractAsync, reset, data, error, status]\n );\n};\n\nexport type {\n WriteContractVariables,\n WriteContractOptions,\n PostConditionConfig,\n} from './use-write-contract.types';\n","'use client';\n\nimport { getPrimaryName } from 'bns-v2-sdk';\nimport { useEffect, useState } from 'react';\n\nimport { getNetworkFromAddress } from '../utils/get-network-from-address';\n\nexport const useBnsName = (address?: string) => {\n const [bnsName, setBnsName] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (!address) {\n setBnsName(null);\n setIsLoading(false);\n return;\n }\n\n const fetchBnsName = async () => {\n setIsLoading(true);\n\n try {\n const network = getNetworkFromAddress(address);\n const result = await getPrimaryName({ address, network });\n\n const fullName = result\n ? `${result.name}.${result.namespace}`\n : null;\n\n setBnsName(fullName);\n } catch {\n setBnsName(null);\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchBnsName();\n }, [address]);\n\n return { bnsName, isLoading };\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useWallets = () => {\n const { wallets } = useStacksWalletContext();\n\n return useMemo(() => ({ wallets }), [wallets]);\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@satoshai/kit",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Typesafe Stacks wallet & contract interaction library for React",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,15 +27,18 @@
27
27
  "bns-v2-sdk": "^2.1.0"
28
28
  },
29
29
  "peerDependencies": {
30
+ "@stacks/transactions": ">=7.0.0",
30
31
  "react": "^18.0.0 || ^19.0.0",
31
- "react-dom": "^18.0.0 || ^19.0.0",
32
- "@stacks/transactions": ">=7.0.0"
32
+ "react-dom": "^18.0.0 || ^19.0.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@stacks/transactions": "^7.2.0",
36
+ "@testing-library/react": "^16.3.2",
37
+ "@types/node": "^22.0.0",
36
38
  "@types/react": "^19.2.2",
37
39
  "@types/react-dom": "^19.2.2",
38
- "@types/node": "^22.0.0",
40
+ "@vitest/coverage-v8": "^3.2.4",
41
+ "happy-dom": "^20.7.0",
39
42
  "react": "^19.0.0",
40
43
  "react-dom": "^19.0.0",
41
44
  "tsup": "^8.3.0",