@gluwa/connect-kit 0.1.0-next.0 → 0.1.0-next.2

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.js CHANGED
@@ -1,14 +1,9 @@
1
1
  import React from "react";
2
- import {
3
- getAddress
4
- } from "./chunk-6KUZ225H.js";
5
- import "./chunk-EVEWD66F.js";
6
- import {
7
- __name
8
- } from "./chunk-U2IU7TQD.js";
2
+ var __defProp = Object.defineProperty;
3
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
4
 
10
5
  // src/ConnectModal.tsx
11
- import { useState, useEffect as useEffect4, useCallback as useCallback2, useRef as useRef2, useMemo as useMemo2 } from "react";
6
+ import { useState as useState3, useEffect as useEffect4, useCallback as useCallback3, useRef as useRef3, useMemo as useMemo4 } from "react";
12
7
 
13
8
  // src/ConnectModal.scss
14
9
  var css = `.ck-root {
@@ -146,6 +141,42 @@ var css = `.ck-root {
146
141
  .ck-btn-primary:hover {
147
142
  background: rgba(255, 255, 255, 0.22);
148
143
  }
144
+ .ck-btn-primary:disabled {
145
+ opacity: 0.6;
146
+ cursor: not-allowed;
147
+ }
148
+
149
+ .ck-btn-secondary {
150
+ display: inline-flex;
151
+ align-items: center;
152
+ justify-content: center;
153
+ padding: 8px 16px;
154
+ border-radius: 8px;
155
+ font-size: 14px;
156
+ font-weight: 500;
157
+ cursor: pointer;
158
+ white-space: nowrap;
159
+ color: rgba(255, 255, 255, 0.75);
160
+ background: transparent;
161
+ border: 1px solid rgba(255, 255, 255, 0.18);
162
+ }
163
+ .ck-btn-secondary:hover {
164
+ color: #fff;
165
+ border-color: rgba(255, 255, 255, 0.32);
166
+ }
167
+
168
+ .ck-view__actions {
169
+ display: flex;
170
+ flex-direction: column;
171
+ gap: 8px;
172
+ width: 100%;
173
+ margin-top: 16px;
174
+ }
175
+
176
+ .ck-view__caption--error {
177
+ color: #ff8080;
178
+ margin-top: 8px;
179
+ }
149
180
 
150
181
  .ck-connector-list {
151
182
  display: flex;
@@ -589,7 +620,7 @@ var css = `.ck-root {
589
620
  document.head.appendChild(document.createElement("style")).appendChild(document.createTextNode(css));
590
621
 
591
622
  // src/ConnectModal.tsx
592
- import { useConfig as useConfig2 } from "wagmi";
623
+ import { useAccount, useConfig as useConfig2, useDisconnect } from "wagmi";
593
624
 
594
625
  // assets/creditwallet.png
595
626
  var creditwallet_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAAAtNJREFUeAHVWDFs00AUfWe7oYVSWdAxQEfUCZiQqEQykDUdGBAL0IERlQGxMbAhBpDYGEBMMDCEtUtbqZXYuiHGCDEymDZqqZr4+N/OuW579jmO5aRPcs8+n68v/7//798BYwah65x23Rp8NOltjQa4UmIORfwzgbYE2kJSa+FTx/PWToyJP7iuO9eV+AiJGsqAQMsReOp5XvuwK0amJ7FalDWyc0LbtlBXpCz1gizzpmwyDHJh6JVDgpFmVjFKkJVYUw7fCx8P5GCfY/r9Ezjzl7TvvIVnGBg+FulvSEgKclUGRhM3r0b3cnsX/u8/xnE8ppcw7ggEbnMTWoj8aOJjVWdx/svz6Hnn3iscfP+pHXuhHUkCe2+/0dWCkY+E2+dC5p9xU/lMLjUgZs4e6dv/upFooanlxRN9+x9W4JNV09DZ9kQmQu7G66DNow0mN7XcDL71Da4zEjpzd4GuW2SNTXR//EKPrkHBrrbpqtA8bOXO43dII2SZJnNIoKyVPGQYbBX+noXuzF82jrcwZnB0nXbfMgwWLwxizIKDlS3KLObcotUQm5dD3BSylcYNbfTlBWvIwRCYXLoTWbIIQoyhCOmgUoQJOxRtukAZmaitY65WKNxCuRbWGIYixKK3qpsoEtoo48jhCOLEaFUvYu/lZ+M6ZMK5F/eDsN+luZKQmKm5tFDRwssHEvw9CCYa14MfacLpyNQKvA51aR2y+wtkUv2TBjtw+2zmQu10lR8KZRZoYQnLO8qULdA/mozNHs/C7MpkQs3oPnMJS/uzfhtYaIuaa6kfkIXi9QwXXKwPHZiEAuvGz1bkr3X+enUl6nUTIU4FcVFXKB1YCYTyiJ/3+yEvjNdGMchDwSkEmQyjAh06qJOQKDHSKcQjFjdKBouZT0DUc0SITx9sgTqzRVkgr8RPPsIuDVhTtN9/SFvsK8GuttgDK4/W2HUyRUt3YDV2+A99bkdtt/T4QQAAAABJRU5ErkJggg==";
@@ -645,46 +676,54 @@ var detectMetaMaskExtension = /* @__PURE__ */ __name(() => {
645
676
 
646
677
  // src/hooks/useWagmiConnect.ts
647
678
  import { useEffect, useRef, useCallback } from "react";
648
- import { useConnect, useAccount, useConfig } from "wagmi";
649
- var WAGMI_CONNECTOR_ID = {
650
- METAMASK: "metaMaskSDK",
651
- WALLET_CONNECT: "walletConnect",
652
- CREDIT_WALLET: "walletConnect",
653
- CREDIT_CONNECT: "credit-connect"
654
- };
679
+ import { useConnect, useConfig } from "wagmi";
680
+ var hasMetaMaskKeyword = /* @__PURE__ */ __name((value) => value.toLowerCase().includes("metamask"), "hasMetaMaskKeyword");
681
+ var hasWalletConnectKeyword = /* @__PURE__ */ __name((value) => value.toLowerCase().includes("walletconnect"), "hasWalletConnectKeyword");
682
+ var isMetaMaskConnector = /* @__PURE__ */ __name((connector) => {
683
+ if (connector.id === "injected" || connector.id === "metaMaskSDK") return true;
684
+ if (hasMetaMaskKeyword(connector.id) || hasMetaMaskKeyword(connector.name)) return true;
685
+ if (connector.rdns) {
686
+ const rdnsList = Array.isArray(connector.rdns) ? connector.rdns : [
687
+ connector.rdns
688
+ ];
689
+ if (rdnsList.some((rdns) => hasMetaMaskKeyword(rdns))) return true;
690
+ }
691
+ return false;
692
+ }, "isMetaMaskConnector");
693
+ var isWalletConnectConnector = /* @__PURE__ */ __name((connector) => {
694
+ if (connector.id === "walletConnect") return true;
695
+ if (hasWalletConnectKeyword(connector.id) || hasWalletConnectKeyword(connector.name)) return true;
696
+ return false;
697
+ }, "isWalletConnectConnector");
698
+ var resolveWagmiConnector = /* @__PURE__ */ __name((connectors, connectorId) => {
699
+ switch (connectorId) {
700
+ case "CREDIT_CONNECT":
701
+ return connectors.find((connector) => connector.id === "credit-connect");
702
+ case "METAMASK":
703
+ return connectors.find(isMetaMaskConnector);
704
+ case "CREDIT_WALLET":
705
+ case "WALLET_CONNECT":
706
+ return connectors.find(isWalletConnectConnector);
707
+ default:
708
+ return void 0;
709
+ }
710
+ }, "resolveWagmiConnector");
655
711
  var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri }) => {
656
712
  const config = useConfig();
657
- const { address, status } = useAccount();
658
713
  const pendingConnectorId = useRef(null);
659
714
  const onConnectRef = useRef(onConnect);
660
715
  const onErrorRef = useRef(onError);
661
716
  const onQrUriRef = useRef(onQrUri);
662
717
  useEffect(() => {
663
718
  onConnectRef.current = onConnect;
664
- }, [
665
- onConnect
666
- ]);
667
- useEffect(() => {
668
719
  onErrorRef.current = onError;
669
- }, [
670
- onError
671
- ]);
672
- useEffect(() => {
673
720
  onQrUriRef.current = onQrUri;
674
721
  }, [
722
+ onConnect,
723
+ onError,
675
724
  onQrUri
676
725
  ]);
677
- const { connect, reset, isPending } = useConnect({
678
- mutation: {
679
- onError(error) {
680
- const id = pendingConnectorId.current;
681
- if (id) {
682
- onErrorRef.current(error, id);
683
- pendingConnectorId.current = null;
684
- }
685
- }
686
- }
687
- });
726
+ const { connectAsync, reset, isPending } = useConnect();
688
727
  useEffect(() => {
689
728
  const handler = /* @__PURE__ */ __name((data) => {
690
729
  const msg = data;
@@ -706,38 +745,36 @@ var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri }) =
706
745
  }, [
707
746
  config.connectors
708
747
  ]);
709
- useEffect(() => {
710
- if (status === "connected" && address && pendingConnectorId.current) {
711
- const id = pendingConnectorId.current;
712
- pendingConnectorId.current = null;
713
- onConnectRef.current({
714
- address,
715
- connectorId: id
716
- });
717
- }
718
- }, [
719
- status,
720
- address
721
- ]);
722
748
  const triggerConnect = useCallback((connectorId) => {
723
- const wagmiId = WAGMI_CONNECTOR_ID[connectorId];
724
- if (!wagmiId) {
725
- onErrorRef.current(new Error(`No wagmi connector mapped for ${connectorId}`), connectorId);
726
- return;
727
- }
728
- const connector = config.connectors.find((c) => c.id === wagmiId);
749
+ const connector = resolveWagmiConnector(config.connectors, connectorId);
729
750
  if (!connector) {
730
- onErrorRef.current(new Error(`Wagmi connector '${wagmiId}' not found in config`), connectorId);
751
+ onErrorRef.current(new Error(`No wagmi connector found for ${connectorId}`), connectorId);
731
752
  return;
732
753
  }
733
754
  onQrUriRef.current(null);
734
755
  pendingConnectorId.current = connectorId;
735
- connect({
756
+ connectAsync({
736
757
  connector
758
+ }).then((result) => {
759
+ var _a;
760
+ if (pendingConnectorId.current !== connectorId) return;
761
+ const address = (_a = result.accounts) == null ? void 0 : _a[0];
762
+ if (!address) {
763
+ throw new Error("Connected but no account returned");
764
+ }
765
+ pendingConnectorId.current = null;
766
+ onConnectRef.current({
767
+ address,
768
+ connectorId
769
+ });
770
+ }).catch((error) => {
771
+ if (pendingConnectorId.current !== connectorId) return;
772
+ pendingConnectorId.current = null;
773
+ onErrorRef.current(error, connectorId);
737
774
  });
738
775
  }, [
739
776
  config.connectors,
740
- connect
777
+ connectAsync
741
778
  ]);
742
779
  const cancelConnect = useCallback(() => {
743
780
  pendingConnectorId.current = null;
@@ -753,6 +790,111 @@ var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri }) =
753
790
  };
754
791
  }, "useWagmiConnect");
755
792
 
793
+ // src/hooks/useWCState.ts
794
+ import { useState, useRef as useRef2, useCallback as useCallback2 } from "react";
795
+ var fetchWCWalletList = /* @__PURE__ */ __name(async (projectId) => {
796
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
797
+ const all = [];
798
+ let page = 1;
799
+ const entries = 100;
800
+ while (page <= 10) {
801
+ const url = new URL("https://explorer-api.walletconnect.com/v3/wallets");
802
+ url.searchParams.set("projectId", projectId);
803
+ url.searchParams.set("entries", String(entries));
804
+ url.searchParams.set("page", String(page));
805
+ const res = await fetch(url.toString());
806
+ if (!res.ok) throw new Error(`Failed to fetch wallet list: ${res.status}`);
807
+ const json = await res.json();
808
+ const listings = Object.values((_a = json.listings) != null ? _a : {});
809
+ for (const w of listings) {
810
+ all.push({
811
+ id: w.id,
812
+ name: w.name,
813
+ imageUrl: (_e = (_d = (_b = w.image_url) == null ? void 0 : _b.md) != null ? _d : (_c = w.image_url) == null ? void 0 : _c.sm) != null ? _e : "",
814
+ mobileNative: (_g = (_f = w.mobile) == null ? void 0 : _f.native) != null ? _g : "",
815
+ mobileUniversal: (_i = (_h = w.mobile) == null ? void 0 : _h.universal) != null ? _i : "",
816
+ desktopNative: (_k = (_j = w.desktop) == null ? void 0 : _j.native) != null ? _k : "",
817
+ desktopUniversal: (_m = (_l = w.desktop) == null ? void 0 : _l.universal) != null ? _m : "",
818
+ appIos: (_o = (_n = w.app) == null ? void 0 : _n.ios) != null ? _o : "",
819
+ appAndroid: (_q = (_p = w.app) == null ? void 0 : _p.android) != null ? _q : "",
820
+ homepage: (_r = w.homepage) != null ? _r : ""
821
+ });
822
+ }
823
+ if (listings.length < entries || all.length >= json.total) break;
824
+ page += 1;
825
+ }
826
+ return all;
827
+ }, "fetchWCWalletList");
828
+ var useWCState = /* @__PURE__ */ __name(() => {
829
+ const [subView, setSubView] = useState("qr");
830
+ const [walletList, setWalletList] = useState([]);
831
+ const [walletListLoading, setWalletListLoading] = useState(false);
832
+ const [walletListSearch, setWalletListSearch] = useState("");
833
+ const [filterActive, setFilterActive] = useState(false);
834
+ const [selectedWallet, setSelectedWallet] = useState(null);
835
+ const loadedRef = useRef2(false);
836
+ const loadWalletList = useCallback2(async (projectId) => {
837
+ if (loadedRef.current) return;
838
+ loadedRef.current = true;
839
+ setWalletListLoading(true);
840
+ try {
841
+ const list = await fetchWCWalletList(projectId);
842
+ setWalletList(list);
843
+ } catch {
844
+ loadedRef.current = false;
845
+ } finally {
846
+ setWalletListLoading(false);
847
+ }
848
+ }, []);
849
+ const onShowList = useCallback2(() => setSubView("list"), []);
850
+ const onSelectWallet = useCallback2((wallet) => {
851
+ setSelectedWallet(wallet);
852
+ setSubView("wallet");
853
+ }, []);
854
+ const onSearchChange = useCallback2((q) => setWalletListSearch(q), []);
855
+ const onFilterToggle = useCallback2(() => setFilterActive((prev) => !prev), []);
856
+ const handleBack = useCallback2(() => {
857
+ if (subView === "wallet") {
858
+ setSelectedWallet(null);
859
+ setSubView("list");
860
+ return true;
861
+ }
862
+ if (subView === "list") {
863
+ setSubView("qr");
864
+ return true;
865
+ }
866
+ return false;
867
+ }, [
868
+ subView
869
+ ]);
870
+ const resetView = useCallback2(() => {
871
+ setSubView("qr");
872
+ setSelectedWallet(null);
873
+ }, []);
874
+ const reset = useCallback2(() => {
875
+ setSubView("qr");
876
+ setWalletListSearch("");
877
+ setFilterActive(false);
878
+ setSelectedWallet(null);
879
+ }, []);
880
+ return {
881
+ subView,
882
+ walletList,
883
+ walletListLoading,
884
+ walletListSearch,
885
+ filterActive,
886
+ selectedWallet,
887
+ loadWalletList,
888
+ onShowList,
889
+ onSelectWallet,
890
+ onSearchChange,
891
+ onFilterToggle,
892
+ handleBack,
893
+ resetView,
894
+ reset
895
+ };
896
+ }, "useWCState");
897
+
756
898
  // assets/graphic.png
757
899
  var graphic_default = "data:image/png;base64,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";
758
900
 
@@ -771,11 +913,41 @@ var IdleView = /* @__PURE__ */ __name(() => /* @__PURE__ */ React.createElement(
771
913
  }, "Choose a wallet on the left to start connecting.")), "IdleView");
772
914
 
773
915
  // src/views/CreditWalletView.tsx
774
- import { useEffect as useEffect2 } from "react";
916
+ import { useEffect as useEffect2, useMemo } from "react";
917
+
918
+ // src/components/QRFrame.tsx
775
919
  import { QRCodeSVG } from "qrcode.react";
920
+ var QRFrame = /* @__PURE__ */ __name(({ qrUri, logoUrl }) => /* @__PURE__ */ React.createElement("div", {
921
+ className: `ck-qr-frame ${!qrUri ? "ck-qr-frame--loading" : ""}`
922
+ }, qrUri ? /* @__PURE__ */ React.createElement(QRCodeSVG, {
923
+ value: qrUri,
924
+ size: 196,
925
+ level: "H",
926
+ imageSettings: logoUrl ? {
927
+ src: logoUrl,
928
+ width: 40,
929
+ height: 40,
930
+ excavate: true
931
+ } : void 0
932
+ }) : /* @__PURE__ */ React.createElement("div", {
933
+ className: "ck-qr-spinner",
934
+ "aria-label": "Loading QR code"
935
+ })), "QRFrame");
936
+ var CopyLinkButton = /* @__PURE__ */ __name(({ qrUri }) => {
937
+ if (!qrUri) return null;
938
+ return /* @__PURE__ */ React.createElement("button", {
939
+ type: "button",
940
+ className: "ck-copy-link",
941
+ onClick: /* @__PURE__ */ __name(() => {
942
+ navigator.clipboard.writeText(qrUri);
943
+ }, "onClick")
944
+ }, "Copy link");
945
+ }, "CopyLinkButton");
946
+
947
+ // src/views/CreditWalletView.tsx
776
948
  var CreditWalletView = /* @__PURE__ */ __name(({ connectorId, qrUri }) => {
777
949
  const { downloadUrl: downloadUrl2, logoUrl, deepLinkBase: deepLinkBase2 } = CONNECTOR_META[connectorId];
778
- const isMobile = isMobileDevice();
950
+ const isMobile = useMemo(() => isMobileDevice(), []);
779
951
  useEffect2(() => {
780
952
  if (isMobile && qrUri && deepLinkBase2) {
781
953
  tryOpenDeepLink(qrUri, deepLinkBase2);
@@ -792,22 +964,10 @@ var CreditWalletView = /* @__PURE__ */ __name(({ connectorId, qrUri }) => {
792
964
  }
793
965
  return /* @__PURE__ */ React.createElement("div", {
794
966
  className: "ck-view ck-view--qr"
795
- }, /* @__PURE__ */ React.createElement("div", {
796
- className: `ck-qr-frame ${!qrUri ? "ck-qr-frame--loading" : ""}`
797
- }, qrUri ? /* @__PURE__ */ React.createElement(QRCodeSVG, {
798
- value: qrUri,
799
- size: 196,
800
- level: "H",
801
- imageSettings: logoUrl ? {
802
- src: logoUrl,
803
- width: 40,
804
- height: 40,
805
- excavate: true
806
- } : void 0
807
- }) : /* @__PURE__ */ React.createElement("div", {
808
- className: "ck-qr-spinner",
809
- "aria-label": "Loading QR code"
810
- })), /* @__PURE__ */ React.createElement("p", {
967
+ }, /* @__PURE__ */ React.createElement(QRFrame, {
968
+ qrUri,
969
+ logoUrl
970
+ }), /* @__PURE__ */ React.createElement("p", {
811
971
  className: "ck-view__caption"
812
972
  }, "Open the Credit Wallet app and scan the QR"), downloadUrl2 && /* @__PURE__ */ React.createElement("div", {
813
973
  className: "ck-download-card"
@@ -826,11 +986,10 @@ var CreditWalletView = /* @__PURE__ */ __name(({ connectorId, qrUri }) => {
826
986
  }, "CreditWalletView");
827
987
 
828
988
  // src/views/MetaMaskView.tsx
829
- import { useEffect as useEffect3 } from "react";
830
- import { QRCodeSVG as QRCodeSVG2 } from "qrcode.react";
989
+ import { useEffect as useEffect3, useMemo as useMemo2 } from "react";
831
990
  var { downloadUrl, deepLinkBase } = CONNECTOR_META.METAMASK;
832
991
  var MetaMaskView = /* @__PURE__ */ __name(({ qrUri, hasExtension, logoUrl }) => {
833
- const isMobile = isMobileDevice();
992
+ const isMobile = useMemo2(() => isMobileDevice(), []);
834
993
  useEffect3(() => {
835
994
  if (isMobile && qrUri && deepLinkBase) {
836
995
  tryOpenDeepLink(qrUri, deepLinkBase);
@@ -861,28 +1020,12 @@ var MetaMaskView = /* @__PURE__ */ __name(({ qrUri, hasExtension, logoUrl }) =>
861
1020
  }
862
1021
  return /* @__PURE__ */ React.createElement("div", {
863
1022
  className: "ck-view ck-view--qr"
864
- }, /* @__PURE__ */ React.createElement("div", {
865
- className: `ck-qr-frame ${!qrUri ? "ck-qr-frame--loading" : ""}`
866
- }, qrUri ? /* @__PURE__ */ React.createElement(QRCodeSVG2, {
867
- value: qrUri,
868
- size: 196,
869
- level: "H",
870
- imageSettings: logoUrl ? {
871
- src: logoUrl,
872
- width: 40,
873
- height: 40,
874
- excavate: true
875
- } : void 0
876
- }) : /* @__PURE__ */ React.createElement("div", {
877
- className: "ck-qr-spinner",
878
- "aria-label": "Loading QR code"
879
- })), qrUri && /* @__PURE__ */ React.createElement("button", {
880
- type: "button",
881
- className: "ck-copy-link",
882
- onClick: /* @__PURE__ */ __name(() => {
883
- navigator.clipboard.writeText(qrUri);
884
- }, "onClick")
885
- }, "Copy link"), downloadUrl && /* @__PURE__ */ React.createElement("div", {
1023
+ }, /* @__PURE__ */ React.createElement(QRFrame, {
1024
+ qrUri,
1025
+ logoUrl
1026
+ }), /* @__PURE__ */ React.createElement(CopyLinkButton, {
1027
+ qrUri
1028
+ }), downloadUrl && /* @__PURE__ */ React.createElement("div", {
886
1029
  className: "ck-download-card"
887
1030
  }, /* @__PURE__ */ React.createElement("div", {
888
1031
  className: "ck-download-card__text"
@@ -897,8 +1040,7 @@ var MetaMaskView = /* @__PURE__ */ __name(({ qrUri, hasExtension, logoUrl }) =>
897
1040
  }, "MetaMaskView");
898
1041
 
899
1042
  // src/views/WalletConnectView.tsx
900
- import { useMemo } from "react";
901
- import { QRCodeSVG as QRCodeSVG3 } from "qrcode.react";
1043
+ import { useMemo as useMemo3 } from "react";
902
1044
 
903
1045
  // assets/deeplink.png
904
1046
  var deeplink_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAAAj5JREFUeAGVU0FoE0EU/TO7aVJMTKwUoSDmUqWC2B6EhFwSwYonCYp4UoonKUWiJ/GwG0+9JdKG6ikVz9JepLRSEpB0rZeGKlRtDxak0FOTwzYtuzvf+ZtujLU09JOwM/PnvT9/5j0Gh8L4OJFkQrkNHKOIUEMGEUBRZ3IBfDwbTz3+1b6feYOVUjGyb5saCqwHdoP5ofRI7R/iuakocEdHzne61f3sUCpTaxEQeM8yZ4BhNn5jrAzHRGWhMMgBcwGflSYSTotUWQDLdAJTJIZHq1SoYfs19wRGaSrKLKHFhkdH4ARhzE/owKGsggSjw7PtyUZj+frW1++Ljmj2iEJgMHIq03f53itvz16Xnfdbqu62EL/192ZfPL1//nd1bVEoyruLsYesX/59PvWlWTfz7UVS1D/jF2BpfnLWW9xen9Hlh3vzb59eX1368OYKjZPJpEq57R/unoM2Jqc5Z2znYM4d29HWjWmLxpW5wjW/Gqj29vhXiaRcLouNz5QTmkfAOAurQEJphugbuKtsrb13fhpFi8m0/I3bjtXVe9a/urH8FkOR0+zcpbTiEZDQuECxuVLKtZHc4eGesAvujz14PpB49My2nPFQJOSBhXt8ej06BUlXCEgmbo7pcHxwD+wSLBSKIF+Pk3iYbIOIOhC0wJVSYRBB1On1mkr02Tog075ImXYgcc3GLcx1m0Gd5i0zleQ9kDCk68JHuc71i737BFGcIbBnNvZfBc91DEEKJUw3TS2CA5uoiNnDfvkDT/YDNH96aT8AAAAASUVORK5CYII=";
@@ -915,30 +1057,14 @@ var WalletConnectView = /* @__PURE__ */ __name((props) => {
915
1057
  }, "WalletConnectView");
916
1058
  var WCQRView = /* @__PURE__ */ __name(({ qrUri, logoUrl, walletList, onShowList }) => /* @__PURE__ */ React.createElement("div", {
917
1059
  className: "ck-view ck-view--qr"
918
- }, /* @__PURE__ */ React.createElement("div", {
919
- className: `ck-qr-frame ${!qrUri ? "ck-qr-frame--loading" : ""}`
920
- }, qrUri ? /* @__PURE__ */ React.createElement(QRCodeSVG3, {
921
- value: qrUri,
922
- size: 196,
923
- level: "H",
924
- imageSettings: logoUrl ? {
925
- src: logoUrl,
926
- width: 40,
927
- height: 40,
928
- excavate: true
929
- } : void 0
930
- }) : /* @__PURE__ */ React.createElement("div", {
931
- className: "ck-qr-spinner",
932
- "aria-label": "Loading QR code"
933
- })), /* @__PURE__ */ React.createElement("p", {
1060
+ }, /* @__PURE__ */ React.createElement(QRFrame, {
1061
+ qrUri,
1062
+ logoUrl
1063
+ }), /* @__PURE__ */ React.createElement("p", {
934
1064
  className: "ck-view__caption"
935
- }, "Scan this QR Code with your phone"), qrUri && /* @__PURE__ */ React.createElement("button", {
936
- type: "button",
937
- className: "ck-copy-link",
938
- onClick: /* @__PURE__ */ __name(() => {
939
- navigator.clipboard.writeText(qrUri);
940
- }, "onClick")
941
- }, "Copy link"), /* @__PURE__ */ React.createElement("button", {
1065
+ }, "Scan this QR Code with your phone"), /* @__PURE__ */ React.createElement(CopyLinkButton, {
1066
+ qrUri
1067
+ }), /* @__PURE__ */ React.createElement("button", {
942
1068
  type: "button",
943
1069
  className: "ck-all-wallets-btn",
944
1070
  onClick: onShowList
@@ -950,10 +1076,10 @@ var WCQRView = /* @__PURE__ */ __name(({ qrUri, logoUrl, walletList, onShowList
950
1076
  }, "All Wallets"), walletList.length > 0 && /* @__PURE__ */ React.createElement("span", {
951
1077
  className: "ck-all-wallets-btn__count"
952
1078
  }, walletList.length, "+"))), "WCQRView");
953
- var CREDIT_WALLET_NAME = "Credit Wallet";
1079
+ var CREDIT_WALLET_NAME = CONNECTOR_META.CREDIT_WALLET.label;
954
1080
  var WalletListView = /* @__PURE__ */ __name(({ walletList, walletListLoading, walletListSearch, walletListFilterActive, logoUrl, qrUri, onSelectWallet, onSearchChange, onFilterToggle }) => {
955
- const isMobile = isMobileDevice();
956
- const filtered = useMemo(() => {
1081
+ const isMobile = useMemo3(() => isMobileDevice(), []);
1082
+ const filtered = useMemo3(() => {
957
1083
  const q = walletListSearch.trim().toLowerCase();
958
1084
  let list = walletList;
959
1085
  if (walletListFilterActive) {
@@ -975,11 +1101,10 @@ var WalletListView = /* @__PURE__ */ __name(({ walletList, walletListLoading, wa
975
1101
  walletListFilterActive
976
1102
  ]);
977
1103
  const handleClickWallet = /* @__PURE__ */ __name((wallet) => {
978
- const uri = qrUri;
979
- if (isMobile && uri) {
1104
+ if (isMobile && qrUri) {
980
1105
  const target = wallet.mobileNative || wallet.mobileUniversal;
981
1106
  if (target) {
982
- tryOpenDeepLink(uri, target);
1107
+ tryOpenDeepLink(qrUri, target);
983
1108
  return;
984
1109
  }
985
1110
  }
@@ -1058,32 +1183,14 @@ var WalletQRView = /* @__PURE__ */ __name(({ wallet, qrUri }) => {
1058
1183
  const logoSrc = wallet.imageUrl;
1059
1184
  return /* @__PURE__ */ React.createElement("div", {
1060
1185
  className: "ck-view ck-view--qr"
1061
- }, /* @__PURE__ */ React.createElement("div", {
1062
- className: `ck-qr-frame ${!qrUri ? "ck-qr-frame--loading" : ""}`
1063
- }, qrUri ? /* @__PURE__ */ React.createElement(QRCodeSVG3, {
1064
- value: qrUri,
1065
- size: 196,
1066
- level: "H",
1067
- ...logoSrc && {
1068
- imageSettings: {
1069
- src: logoSrc,
1070
- width: 40,
1071
- height: 40,
1072
- excavate: true
1073
- }
1074
- }
1075
- }) : /* @__PURE__ */ React.createElement("div", {
1076
- className: "ck-qr-spinner",
1077
- "aria-label": "Loading QR code"
1078
- })), /* @__PURE__ */ React.createElement("p", {
1186
+ }, /* @__PURE__ */ React.createElement(QRFrame, {
1187
+ qrUri,
1188
+ logoUrl: logoSrc
1189
+ }), /* @__PURE__ */ React.createElement("p", {
1079
1190
  className: "ck-view__caption"
1080
- }, "Scan this QR Code with your phone"), qrUri && /* @__PURE__ */ React.createElement("button", {
1081
- type: "button",
1082
- className: "ck-copy-link",
1083
- onClick: /* @__PURE__ */ __name(() => {
1084
- navigator.clipboard.writeText(qrUri);
1085
- }, "onClick")
1086
- }, "Copy link"), downloadUrl2 && /* @__PURE__ */ React.createElement("div", {
1191
+ }, "Scan this QR Code with your phone"), /* @__PURE__ */ React.createElement(CopyLinkButton, {
1192
+ qrUri
1193
+ }), downloadUrl2 && /* @__PURE__ */ React.createElement("div", {
1087
1194
  className: "ck-download-card"
1088
1195
  }, /* @__PURE__ */ React.createElement("div", {
1089
1196
  className: "ck-download-card__text"
@@ -1097,6 +1204,50 @@ var WalletQRView = /* @__PURE__ */ __name(({ wallet, qrUri }) => {
1097
1204
  }, "Download")));
1098
1205
  }, "WalletQRView");
1099
1206
 
1207
+ // src/views/SwitchChainView.tsx
1208
+ import { useState as useState2 } from "react";
1209
+ import { useSwitchChain } from "wagmi";
1210
+ var SwitchChainView = /* @__PURE__ */ __name(({ currentChainId, requiredChainId, requiredChainName, onDisconnect, onLog }) => {
1211
+ const { switchChainAsync, isPending } = useSwitchChain();
1212
+ const [error, setError] = useState2(null);
1213
+ const targetLabel = requiredChainName != null ? requiredChainName : `chain ${requiredChainId}`;
1214
+ const handleSwitch = /* @__PURE__ */ __name(() => {
1215
+ setError(null);
1216
+ switchChainAsync({
1217
+ chainId: requiredChainId
1218
+ }).catch((err) => {
1219
+ const normalized = err instanceof Error ? err : new Error(String(err));
1220
+ const code = typeof err === "object" && err !== null && "code" in err ? err.code : void 0;
1221
+ if (code === 4902) {
1222
+ onLog == null ? void 0 : onLog("[connect-kit] chain not registered in wallet (4902)", normalized);
1223
+ } else {
1224
+ onLog == null ? void 0 : onLog(`[connect-kit] switch chain failed: ${normalized.message}`, normalized);
1225
+ }
1226
+ setError(normalized);
1227
+ });
1228
+ }, "handleSwitch");
1229
+ return /* @__PURE__ */ React.createElement("div", {
1230
+ className: "ck-view ck-view--switch-chain"
1231
+ }, /* @__PURE__ */ React.createElement("h4", {
1232
+ className: "ck-view__title"
1233
+ }, "Wrong network"), /* @__PURE__ */ React.createElement("p", {
1234
+ className: "ck-view__description"
1235
+ }, currentChainId != null ? `Connected to chain ${currentChainId}. Please switch to ${targetLabel} to continue.` : `Please switch to ${targetLabel} to continue.`), /* @__PURE__ */ React.createElement("div", {
1236
+ className: "ck-view__actions"
1237
+ }, /* @__PURE__ */ React.createElement("button", {
1238
+ type: "button",
1239
+ className: "ck-btn-primary",
1240
+ onClick: handleSwitch,
1241
+ disabled: isPending
1242
+ }, isPending ? "Waiting for wallet\u2026" : `Switch to ${targetLabel}`), /* @__PURE__ */ React.createElement("button", {
1243
+ type: "button",
1244
+ className: "ck-btn-secondary",
1245
+ onClick: onDisconnect
1246
+ }, "Disconnect")), error && /* @__PURE__ */ React.createElement("p", {
1247
+ className: "ck-view__caption ck-view__caption--error"
1248
+ }, error.message));
1249
+ }, "SwitchChainView");
1250
+
1100
1251
  // src/ConnectModal.tsx
1101
1252
  var RECENT_KEY = "connect-kit:recent";
1102
1253
  var readRecentConnector = /* @__PURE__ */ __name(() => {
@@ -1112,39 +1263,15 @@ var writeRecentConnector = /* @__PURE__ */ __name((id) => {
1112
1263
  } catch {
1113
1264
  }
1114
1265
  }, "writeRecentConnector");
1115
- var fetchWCWalletList = /* @__PURE__ */ __name(async (projectId) => {
1116
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
1117
- const all = [];
1118
- let page = 1;
1119
- const entries = 100;
1120
- while (page <= 10) {
1121
- const url = new URL("https://explorer-api.walletconnect.com/v3/wallets");
1122
- url.searchParams.set("projectId", projectId);
1123
- url.searchParams.set("entries", String(entries));
1124
- url.searchParams.set("page", String(page));
1125
- const res = await fetch(url.toString());
1126
- if (!res.ok) throw new Error(`Failed to fetch wallet list: ${res.status}`);
1127
- const json = await res.json();
1128
- const listings = Object.values((_a = json.listings) != null ? _a : {});
1129
- for (const w of listings) {
1130
- all.push({
1131
- id: w.id,
1132
- name: w.name,
1133
- imageUrl: (_e = (_d = (_b = w.image_url) == null ? void 0 : _b.md) != null ? _d : (_c = w.image_url) == null ? void 0 : _c.sm) != null ? _e : "",
1134
- mobileNative: (_g = (_f = w.mobile) == null ? void 0 : _f.native) != null ? _g : "",
1135
- mobileUniversal: (_i = (_h = w.mobile) == null ? void 0 : _h.universal) != null ? _i : "",
1136
- desktopNative: (_k = (_j = w.desktop) == null ? void 0 : _j.native) != null ? _k : "",
1137
- desktopUniversal: (_m = (_l = w.desktop) == null ? void 0 : _l.universal) != null ? _m : "",
1138
- appIos: (_o = (_n = w.app) == null ? void 0 : _n.ios) != null ? _o : "",
1139
- appAndroid: (_q = (_p = w.app) == null ? void 0 : _p.android) != null ? _q : "",
1140
- homepage: (_r = w.homepage) != null ? _r : ""
1141
- });
1142
- }
1143
- if (listings.length < entries || all.length >= json.total) break;
1144
- page += 1;
1145
- }
1146
- return all;
1147
- }, "fetchWCWalletList");
1266
+ var classifyError = /* @__PURE__ */ __name((error) => {
1267
+ var _a, _b;
1268
+ const code = typeof error === "object" && error !== null && "code" in error ? error.code : void 0;
1269
+ if (code === 4001) return "rejected";
1270
+ const message = (_b = (_a = error.message) == null ? void 0 : _a.toLowerCase()) != null ? _b : "";
1271
+ if (message.includes("user rejected") || message.includes("user denied")) return "rejected";
1272
+ if (message.includes("unsupported") || message.includes("not installed")) return "unsupported";
1273
+ return "unknown";
1274
+ }, "classifyError");
1148
1275
  var SelectorPane = /* @__PURE__ */ __name(({ connectors, selected, recentConnector, onSelect, onClose }) => {
1149
1276
  const hasRecent = recentConnector !== null && connectors.includes(recentConnector);
1150
1277
  const recentConnectors = hasRecent ? [
@@ -1210,8 +1337,8 @@ var ConnectorItem = /* @__PURE__ */ __name(({ id, isSelected, isRecent, onSelect
1210
1337
  className: "ck-connector-item__badge"
1211
1338
  }, "Recent"));
1212
1339
  }, "ConnectorItem");
1213
- var DetailPane = /* @__PURE__ */ __name(({ selectedConnector, qrUri, hasMetaMaskExtension, connectorLogoMap, wcSubView, wcWalletList, wcWalletListLoading, wcWalletListSearch, wcSelectedWallet, wcFilterActive, onBack, onClose, onWCShowList, onWCSelectWallet, onWCSearchChange, onWCFilterToggle }) => {
1214
- const title = getDetailTitle(selectedConnector, hasMetaMaskExtension, wcSubView, wcSelectedWallet);
1340
+ var DetailPane = /* @__PURE__ */ __name(({ selectedConnector, qrUri, hasMetaMaskExtension, connectorLogoMap, wc, errorOverride, onBack, onClose }) => {
1341
+ const title = getDetailTitle(selectedConnector, hasMetaMaskExtension, wc.subView, wc.selectedWallet);
1215
1342
  const showBack = selectedConnector !== null;
1216
1343
  return /* @__PURE__ */ React.createElement("div", {
1217
1344
  className: "ck-pane ck-pane--detail"
@@ -1231,7 +1358,7 @@ var DetailPane = /* @__PURE__ */ __name(({ selectedConnector, qrUri, hasMetaMask
1231
1358
  "aria-label": "Close"
1232
1359
  })), /* @__PURE__ */ React.createElement("div", {
1233
1360
  className: "ck-pane__body"
1234
- }, !selectedConnector && /* @__PURE__ */ React.createElement(IdleView, null), (selectedConnector === "CREDIT_CONNECT" || selectedConnector === "CREDIT_WALLET") && /* @__PURE__ */ React.createElement(CreditWalletView, {
1361
+ }, errorOverride || /* @__PURE__ */ React.createElement(React.Fragment, null, !selectedConnector && /* @__PURE__ */ React.createElement(IdleView, null), (selectedConnector === "CREDIT_CONNECT" || selectedConnector === "CREDIT_WALLET") && /* @__PURE__ */ React.createElement(CreditWalletView, {
1235
1362
  connectorId: selectedConnector,
1236
1363
  qrUri
1237
1364
  }), selectedConnector === "METAMASK" && /* @__PURE__ */ React.createElement(MetaMaskView, {
@@ -1239,19 +1366,19 @@ var DetailPane = /* @__PURE__ */ __name(({ selectedConnector, qrUri, hasMetaMask
1239
1366
  hasExtension: hasMetaMaskExtension,
1240
1367
  logoUrl: connectorLogoMap.METAMASK
1241
1368
  }), selectedConnector === "WALLET_CONNECT" && /* @__PURE__ */ React.createElement(WalletConnectView, {
1242
- subView: wcSubView,
1369
+ subView: wc.subView,
1243
1370
  qrUri,
1244
1371
  logoUrl: connectorLogoMap.WALLET_CONNECT,
1245
- walletList: wcWalletList,
1246
- walletListLoading: wcWalletListLoading,
1247
- walletListSearch: wcWalletListSearch,
1248
- walletListFilterActive: wcFilterActive,
1249
- selectedWallet: wcSelectedWallet,
1250
- onShowList: onWCShowList,
1251
- onSelectWallet: onWCSelectWallet,
1252
- onSearchChange: onWCSearchChange,
1253
- onFilterToggle: onWCFilterToggle
1254
- })));
1372
+ walletList: wc.walletList,
1373
+ walletListLoading: wc.walletListLoading,
1374
+ walletListSearch: wc.walletListSearch,
1375
+ walletListFilterActive: wc.filterActive,
1376
+ selectedWallet: wc.selectedWallet,
1377
+ onShowList: wc.onShowList,
1378
+ onSelectWallet: wc.onSelectWallet,
1379
+ onSearchChange: wc.onSearchChange,
1380
+ onFilterToggle: wc.onFilterToggle
1381
+ }))));
1255
1382
  }, "DetailPane");
1256
1383
  var getDetailTitle = /* @__PURE__ */ __name((connector, hasMetaMaskExtension, wcSubView, wcSelectedWallet) => {
1257
1384
  if (!connector) return "";
@@ -1263,28 +1390,51 @@ var getDetailTitle = /* @__PURE__ */ __name((connector, hasMetaMaskExtension, wc
1263
1390
  if (connector === "METAMASK" && hasMetaMaskExtension) return "MetaMask";
1264
1391
  return CONNECTOR_META[connector].detailTitle;
1265
1392
  }, "getDetailTitle");
1393
+ var resolveConnectorsFromConfig = /* @__PURE__ */ __name((connectorsConfig) => {
1394
+ if (!connectorsConfig) return [];
1395
+ const connectors = [];
1396
+ if (connectorsConfig.creditWallet === "walletConnect") connectors.push("CREDIT_WALLET");
1397
+ if (connectorsConfig.creditWallet === "creditConnect") connectors.push("CREDIT_CONNECT");
1398
+ if (connectorsConfig.metamask) connectors.push("METAMASK");
1399
+ if (connectorsConfig.walletConnect) connectors.push("WALLET_CONNECT");
1400
+ return connectors;
1401
+ }, "resolveConnectorsFromConfig");
1266
1402
  var ConnectModal = /* @__PURE__ */ __name((props) => {
1267
- if (props.connectors.includes("CREDIT_WALLET") && props.connectors.includes("CREDIT_CONNECT")) {
1403
+ if (!props.open) return null;
1404
+ const resolvedConnectors = resolveConnectorsFromConfig(props.connectors);
1405
+ if (resolvedConnectors.includes("CREDIT_WALLET") && resolvedConnectors.includes("CREDIT_CONNECT")) {
1268
1406
  throw new Error("CREDIT_WALLET and CREDIT_CONNECT cannot be used together");
1269
1407
  }
1270
- if (!props.open) return null;
1271
- return /* @__PURE__ */ React.createElement(ConnectModalInner, props);
1408
+ if (resolvedConnectors.length === 0) {
1409
+ throw new Error("At least one connector must be configured");
1410
+ }
1411
+ return /* @__PURE__ */ React.createElement(ConnectModalInner, {
1412
+ ...props,
1413
+ connectors: resolvedConnectors
1414
+ });
1272
1415
  }, "ConnectModal");
1273
- var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, onClose, onLog, wcProjectId }) => {
1416
+ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, onClose, onLog, wcProjectId, requiredChainId, renderConnectError }) => {
1274
1417
  var _a;
1275
- const [selectedConnector, setSelectedConnector] = useState(null);
1276
- const [qrUriMap, setQrUriMap] = useState({});
1277
- const pendingQrConnectorRef = useRef2(null);
1278
- const [recentConnector, setRecentConnector] = useState(null);
1279
- const [hasMetaMaskExtension, setHasMetaMaskExtension] = useState(false);
1280
- const [wcSubView, setWcSubView] = useState("qr");
1281
- const [wcWalletList, setWcWalletList] = useState([]);
1282
- const [wcWalletListLoading, setWcWalletListLoading] = useState(false);
1283
- const [wcWalletListSearch, setWcWalletListSearch] = useState("");
1284
- const [wcFilterActive, setWcFilterActive] = useState(false);
1285
- const [wcSelectedWallet, setWcSelectedWallet] = useState(null);
1286
- const wcLoadedRef = useRef2(false);
1287
- const handleQrUri = useCallback2((uri) => {
1418
+ const [selectedConnector, setSelectedConnector] = useState3(null);
1419
+ const [qrUriMap, setQrUriMap] = useState3({});
1420
+ const pendingQrConnectorRef = useRef3(null);
1421
+ const [recentConnector, setRecentConnector] = useState3(null);
1422
+ const [hasMetaMaskExtension, setHasMetaMaskExtension] = useState3(false);
1423
+ const [errorState, setErrorState] = useState3(null);
1424
+ const wc = useWCState();
1425
+ const account = useAccount();
1426
+ const { disconnectAsync } = useDisconnect();
1427
+ const wagmiConfig = useConfig2();
1428
+ const chainMismatch = requiredChainId != null && account.status === "connected" && account.chainId != null && account.chainId !== requiredChainId;
1429
+ const requiredChainName = useMemo4(() => {
1430
+ var _a2;
1431
+ if (requiredChainId == null) return void 0;
1432
+ return (_a2 = wagmiConfig.chains.find((chain) => chain.id === requiredChainId)) == null ? void 0 : _a2.name;
1433
+ }, [
1434
+ wagmiConfig.chains,
1435
+ requiredChainId
1436
+ ]);
1437
+ const handleQrUri = useCallback3((uri) => {
1288
1438
  if (uri) {
1289
1439
  const id = pendingQrConnectorRef.current;
1290
1440
  if (id) setQrUriMap((prev) => ({
@@ -1293,16 +1443,17 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1293
1443
  }));
1294
1444
  }
1295
1445
  }, []);
1296
- const handleConnect = useCallback2((result) => {
1446
+ const handleConnect = useCallback3((result) => {
1447
+ setErrorState(null);
1297
1448
  onConnect(result);
1298
1449
  onClose();
1299
1450
  }, [
1300
1451
  onConnect,
1301
1452
  onClose
1302
1453
  ]);
1303
- const handleError = useCallback2((error, connectorId) => {
1304
- onLog == null ? void 0 : onLog(`[connect-kit] connection failed (${connectorId}): ${error.message}`, error);
1305
- setSelectedConnector(null);
1454
+ const handleError = useCallback3((error, connectorId) => {
1455
+ const normalizedError = error instanceof Error ? error : new Error(String(error));
1456
+ onLog == null ? void 0 : onLog(`[connect-kit] connection failed (${connectorId}): ${normalizedError.message}`, normalizedError);
1306
1457
  setQrUriMap((prev) => {
1307
1458
  const next = {
1308
1459
  ...prev
@@ -1310,21 +1461,35 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1310
1461
  delete next[connectorId];
1311
1462
  return next;
1312
1463
  });
1313
- setWcSubView("qr");
1314
- setWcSelectedWallet(null);
1464
+ wc.resetView();
1465
+ if (renderConnectError) {
1466
+ setErrorState({
1467
+ connectorId,
1468
+ error: normalizedError
1469
+ });
1470
+ } else {
1471
+ setSelectedConnector(null);
1472
+ }
1315
1473
  }, [
1316
- onLog
1474
+ onLog,
1475
+ wc.resetView,
1476
+ renderConnectError
1317
1477
  ]);
1318
1478
  const { triggerConnect, cancelConnect } = useWagmiConnect({
1319
1479
  onConnect: handleConnect,
1320
1480
  onError: handleError,
1321
1481
  onQrUri: handleQrUri
1322
1482
  });
1323
- const wagmiConfig = useConfig2();
1324
- const connectorLogoMap = useMemo2(() => {
1483
+ const connectorLogoMap = useMemo4(() => {
1325
1484
  const map = {};
1326
- for (const [connectorId, wagmiId] of Object.entries(WAGMI_CONNECTOR_ID)) {
1327
- const wagmiConnector = wagmiConfig.connectors.find((c) => c.id === wagmiId);
1485
+ const connectorIds = [
1486
+ "CREDIT_CONNECT",
1487
+ "CREDIT_WALLET",
1488
+ "METAMASK",
1489
+ "WALLET_CONNECT"
1490
+ ];
1491
+ for (const connectorId of connectorIds) {
1492
+ const wagmiConnector = resolveWagmiConnector(wagmiConfig.connectors, connectorId);
1328
1493
  if (wagmiConnector == null ? void 0 : wagmiConnector.icon) map[connectorId] = wagmiConnector.icon;
1329
1494
  }
1330
1495
  return map;
@@ -1340,86 +1505,144 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1340
1505
  setSelectedConnector(null);
1341
1506
  setQrUriMap({});
1342
1507
  pendingQrConnectorRef.current = null;
1343
- setWcSubView("qr");
1344
- setWcWalletListSearch("");
1345
- setWcFilterActive(false);
1346
- setWcSelectedWallet(null);
1508
+ setErrorState(null);
1509
+ wc.reset();
1347
1510
  cancelConnect();
1348
1511
  }
1349
1512
  }, [
1350
1513
  open,
1351
- cancelConnect
1514
+ cancelConnect,
1515
+ wc.reset
1352
1516
  ]);
1353
- const loadWCWalletList = useCallback2(async (projectId) => {
1354
- if (wcLoadedRef.current) return;
1355
- wcLoadedRef.current = true;
1356
- setWcWalletListLoading(true);
1357
- try {
1358
- const list = await fetchWCWalletList(projectId);
1359
- setWcWalletList(list);
1360
- } catch {
1361
- wcLoadedRef.current = false;
1362
- } finally {
1363
- setWcWalletListLoading(false);
1364
- }
1365
- }, []);
1366
- const handleSelectConnector = useCallback2((id) => {
1367
- if (id === selectedConnector) return;
1517
+ const handleSelectConnector = useCallback3((id) => {
1518
+ if (id === selectedConnector && !errorState) return;
1368
1519
  pendingQrConnectorRef.current = id;
1369
1520
  setSelectedConnector(id);
1370
- setWcSubView("qr");
1371
- setWcSelectedWallet(null);
1521
+ setErrorState(null);
1522
+ wc.resetView();
1372
1523
  writeRecentConnector(id);
1373
1524
  setRecentConnector(id);
1374
1525
  if (id === "WALLET_CONNECT" && wcProjectId) {
1375
- loadWCWalletList(wcProjectId);
1526
+ wc.loadWalletList(wcProjectId);
1376
1527
  }
1377
1528
  cancelConnect();
1378
1529
  triggerConnect(id);
1379
1530
  }, [
1380
1531
  selectedConnector,
1532
+ errorState,
1381
1533
  triggerConnect,
1382
1534
  cancelConnect,
1383
1535
  wcProjectId,
1384
- loadWCWalletList
1536
+ wc.resetView,
1537
+ wc.loadWalletList
1385
1538
  ]);
1386
- const handleWCShowList = useCallback2(() => {
1387
- setWcSubView("list");
1388
- }, []);
1389
- const handleWCSelectWallet = useCallback2((wallet) => {
1390
- setWcSelectedWallet(wallet);
1391
- setWcSubView("wallet");
1392
- }, []);
1393
- const handleWCFilterToggle = useCallback2(() => {
1394
- setWcFilterActive((prev) => !prev);
1395
- }, []);
1396
- const handleBack = useCallback2(() => {
1397
- if (selectedConnector === "WALLET_CONNECT") {
1398
- if (wcSubView === "wallet") {
1399
- setWcSelectedWallet(null);
1400
- setWcSubView("list");
1401
- return;
1402
- }
1403
- if (wcSubView === "list") {
1404
- setWcSubView("qr");
1405
- return;
1406
- }
1539
+ const handleBack = useCallback3(() => {
1540
+ if (errorState) {
1541
+ setErrorState(null);
1542
+ setSelectedConnector(null);
1543
+ return;
1407
1544
  }
1545
+ if (selectedConnector === "WALLET_CONNECT" && wc.handleBack()) return;
1408
1546
  pendingQrConnectorRef.current = null;
1409
1547
  setSelectedConnector(null);
1410
1548
  cancelConnect();
1411
1549
  }, [
1412
1550
  selectedConnector,
1413
- wcSubView,
1551
+ errorState,
1552
+ wc.handleBack,
1553
+ cancelConnect
1554
+ ]);
1555
+ const handleSwitchChainDisconnect = useCallback3(() => {
1556
+ disconnectAsync().catch((err) => {
1557
+ const normalized = err instanceof Error ? err : new Error(String(err));
1558
+ onLog == null ? void 0 : onLog(`[connect-kit] disconnect failed: ${normalized.message}`, normalized);
1559
+ });
1560
+ }, [
1561
+ disconnectAsync,
1562
+ onLog
1563
+ ]);
1564
+ const handleOverlayClick = useCallback3(() => {
1565
+ if (chainMismatch) return;
1566
+ onClose();
1567
+ }, [
1568
+ chainMismatch,
1569
+ onClose
1570
+ ]);
1571
+ const handleCloseClick = useCallback3(() => {
1572
+ if (chainMismatch) {
1573
+ handleSwitchChainDisconnect();
1574
+ return;
1575
+ }
1576
+ onClose();
1577
+ }, [
1578
+ chainMismatch,
1579
+ handleSwitchChainDisconnect,
1580
+ onClose
1581
+ ]);
1582
+ const renderedError = useMemo4(() => {
1583
+ if (!errorState || !renderConnectError) return null;
1584
+ const ctx = {
1585
+ connectorId: errorState.connectorId,
1586
+ reason: classifyError(errorState.error),
1587
+ error: errorState.error,
1588
+ retry: /* @__PURE__ */ __name(() => {
1589
+ const id = errorState.connectorId;
1590
+ setErrorState(null);
1591
+ pendingQrConnectorRef.current = id;
1592
+ cancelConnect();
1593
+ triggerConnect(id);
1594
+ }, "retry"),
1595
+ dismiss: /* @__PURE__ */ __name(() => {
1596
+ setErrorState(null);
1597
+ setSelectedConnector(null);
1598
+ }, "dismiss")
1599
+ };
1600
+ return renderConnectError(ctx);
1601
+ }, [
1602
+ errorState,
1603
+ renderConnectError,
1604
+ triggerConnect,
1414
1605
  cancelConnect
1415
1606
  ]);
1607
+ if (chainMismatch && requiredChainId != null) {
1608
+ return /* @__PURE__ */ React.createElement("div", {
1609
+ className: "ck-root"
1610
+ }, /* @__PURE__ */ React.createElement("div", {
1611
+ className: "ck-overlay",
1612
+ onClick: handleOverlayClick
1613
+ }), /* @__PURE__ */ React.createElement("div", {
1614
+ className: "ck-modal ck-modal--switch-chain",
1615
+ role: "dialog",
1616
+ "aria-modal": "true",
1617
+ "aria-label": "Switch network"
1618
+ }, /* @__PURE__ */ React.createElement("div", {
1619
+ className: "ck-pane"
1620
+ }, /* @__PURE__ */ React.createElement("div", {
1621
+ className: "ck-pane__header"
1622
+ }, /* @__PURE__ */ React.createElement("h3", {
1623
+ className: "ck-pane__title"
1624
+ }, "Switch network"), /* @__PURE__ */ React.createElement("button", {
1625
+ type: "button",
1626
+ className: "ck-btn-close",
1627
+ onClick: handleCloseClick,
1628
+ "aria-label": "Cancel and disconnect"
1629
+ })), /* @__PURE__ */ React.createElement("div", {
1630
+ className: "ck-pane__body"
1631
+ }, /* @__PURE__ */ React.createElement(SwitchChainView, {
1632
+ currentChainId: account.chainId,
1633
+ requiredChainId,
1634
+ requiredChainName,
1635
+ onDisconnect: handleSwitchChainDisconnect,
1636
+ onLog
1637
+ })))));
1638
+ }
1416
1639
  return /* @__PURE__ */ React.createElement("div", {
1417
1640
  className: "ck-root"
1418
1641
  }, /* @__PURE__ */ React.createElement("div", {
1419
1642
  className: "ck-overlay",
1420
- onClick: onClose
1643
+ onClick: handleOverlayClick
1421
1644
  }), /* @__PURE__ */ React.createElement("div", {
1422
- className: `ck-modal${selectedConnector ? " ck-modal--has-detail" : ""}`,
1645
+ className: `ck-modal${(selectedConnector != null ? selectedConnector : errorState) ? " ck-modal--has-detail" : ""}`,
1423
1646
  role: "dialog",
1424
1647
  "aria-modal": "true",
1425
1648
  "aria-label": "Connect Wallet"
@@ -1428,38 +1651,128 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1428
1651
  selected: selectedConnector,
1429
1652
  recentConnector,
1430
1653
  onSelect: handleSelectConnector,
1431
- onClose
1654
+ onClose: handleCloseClick
1432
1655
  }), /* @__PURE__ */ React.createElement(DetailPane, {
1433
1656
  selectedConnector,
1434
1657
  qrUri: selectedConnector ? (_a = qrUriMap[selectedConnector]) != null ? _a : null : null,
1435
1658
  hasMetaMaskExtension,
1436
1659
  connectorLogoMap,
1437
- wcSubView,
1438
- wcWalletList,
1439
- wcWalletListLoading,
1440
- wcWalletListSearch,
1441
- wcFilterActive,
1442
- wcSelectedWallet,
1660
+ wc,
1661
+ errorOverride: renderedError,
1443
1662
  onBack: handleBack,
1444
- onClose,
1445
- onWCShowList: handleWCShowList,
1446
- onWCSelectWallet: handleWCSelectWallet,
1447
- onWCSearchChange: setWcWalletListSearch,
1448
- onWCFilterToggle: handleWCFilterToggle
1663
+ onClose: handleCloseClick
1449
1664
  })));
1450
1665
  }, "ConnectModalInner");
1451
1666
 
1452
- // ../../node_modules/.pnpm/@wagmi+core@2.22.1_@tanstack+query-core@5.100.9_@types+react@18.3.20_react@18.3.1_types_b6cc874872911bd30e0c8a5ffb262d86/node_modules/@wagmi/core/dist/esm/connectors/createConnector.js
1453
- function createConnector(createConnectorFn) {
1454
- return createConnectorFn;
1455
- }
1456
- __name(createConnector, "createConnector");
1667
+ // src/ConnectKitProvider.tsx
1668
+ import { createContext, useCallback as useCallback4, useContext, useEffect as useEffect5, useMemo as useMemo5, useRef as useRef4, useState as useState4 } from "react";
1669
+ import { useAccount as useAccount2, useDisconnect as useDisconnect2 } from "wagmi";
1670
+ var ConnectKitContext = /* @__PURE__ */ createContext(null);
1671
+ var resolveConnectorId = /* @__PURE__ */ __name((wagmiConnectorId) => {
1672
+ if (!wagmiConnectorId) return null;
1673
+ if (wagmiConnectorId === "credit-connect") return "CREDIT_CONNECT";
1674
+ if (wagmiConnectorId === "walletConnect") return "WALLET_CONNECT";
1675
+ const lower = wagmiConnectorId.toLowerCase();
1676
+ if (lower.includes("metamask") || wagmiConnectorId === "injected") return "METAMASK";
1677
+ if (lower.includes("walletconnect")) return "WALLET_CONNECT";
1678
+ return null;
1679
+ }, "resolveConnectorId");
1680
+ var ConnectKitProvider = /* @__PURE__ */ __name(({ children, connectors, wcProjectId, requiredChainId, onConnect, onLog, renderConnectError }) => {
1681
+ var _a;
1682
+ const [isOpen, setIsOpen] = useState4(false);
1683
+ const [pendingResult, setPendingResult] = useState4(null);
1684
+ const account = useAccount2();
1685
+ const { disconnectAsync } = useDisconnect2();
1686
+ const onConnectRef = useRef4(onConnect);
1687
+ useEffect5(() => {
1688
+ onConnectRef.current = onConnect;
1689
+ }, [
1690
+ onConnect
1691
+ ]);
1692
+ const chainMismatch = requiredChainId != null && account.status === "connected" && account.chainId != null && account.chainId !== requiredChainId;
1693
+ const effectiveOpen = isOpen || chainMismatch;
1694
+ const open = useCallback4(() => {
1695
+ setIsOpen(true);
1696
+ }, []);
1697
+ const close = useCallback4(() => {
1698
+ setIsOpen(false);
1699
+ }, []);
1700
+ const disconnect = useCallback4(async () => {
1701
+ await disconnectAsync();
1702
+ }, [
1703
+ disconnectAsync
1704
+ ]);
1705
+ const handleModalConnect = useCallback4((result) => {
1706
+ setPendingResult(result);
1707
+ }, []);
1708
+ useEffect5(() => {
1709
+ var _a2;
1710
+ if (!pendingResult) return;
1711
+ if (account.status !== "connected") {
1712
+ setPendingResult(null);
1713
+ return;
1714
+ }
1715
+ if (requiredChainId != null && account.chainId !== requiredChainId) {
1716
+ return;
1717
+ }
1718
+ (_a2 = onConnectRef.current) == null ? void 0 : _a2.call(onConnectRef, pendingResult);
1719
+ setPendingResult(null);
1720
+ setIsOpen(false);
1721
+ }, [
1722
+ pendingResult,
1723
+ account.status,
1724
+ account.chainId,
1725
+ requiredChainId
1726
+ ]);
1727
+ const value = useMemo5(() => {
1728
+ var _a2;
1729
+ return {
1730
+ isOpen: effectiveOpen,
1731
+ open,
1732
+ close,
1733
+ isConnected: account.status === "connected",
1734
+ address: account.address,
1735
+ connectorId: resolveConnectorId((_a2 = account.connector) == null ? void 0 : _a2.id),
1736
+ disconnect
1737
+ };
1738
+ }, [
1739
+ effectiveOpen,
1740
+ open,
1741
+ close,
1742
+ account.status,
1743
+ account.address,
1744
+ (_a = account.connector) == null ? void 0 : _a.id,
1745
+ disconnect
1746
+ ]);
1747
+ return /* @__PURE__ */ React.createElement(ConnectKitContext.Provider, {
1748
+ value
1749
+ }, children, /* @__PURE__ */ React.createElement(ConnectModal, {
1750
+ open: effectiveOpen,
1751
+ connectors,
1752
+ wcProjectId,
1753
+ requiredChainId,
1754
+ renderConnectError,
1755
+ onConnect: handleModalConnect,
1756
+ onClose: close,
1757
+ onLog
1758
+ }));
1759
+ }, "ConnectKitProvider");
1760
+ var useConnectKit = /* @__PURE__ */ __name(() => {
1761
+ const ctx = useContext(ConnectKitContext);
1762
+ if (!ctx) {
1763
+ throw new Error("useConnectKit must be used within a ConnectKitProvider");
1764
+ }
1765
+ return ctx;
1766
+ }, "useConnectKit");
1457
1767
 
1458
1768
  // src/creditConnectConnector.ts
1769
+ import { createConnector } from "@wagmi/core";
1770
+ import { getAddress } from "viem";
1459
1771
  import { DappSessionManager } from "@gluwa/credit-connect-sdk/dapp";
1460
1772
  var CONNECTOR_ID = "credit-connect";
1461
1773
  var CONNECTOR_NAME = "Credit Wallet";
1462
1774
  var CONNECTOR_TYPE = "credit-connect";
1775
+ var castConnectResult = /* @__PURE__ */ __name((value) => value, "castConnectResult");
1463
1776
  var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1464
1777
  let manager = null;
1465
1778
  let selectedChainId = null;
@@ -1565,10 +1878,19 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1565
1878
  const chainId2 = Number.parseInt(getEvmAddressInfo(session2)[0].networkIdentifier, 10);
1566
1879
  if (!Number.isFinite(chainId2)) throw new Error(`Invalid chainId: ${chainId2}`);
1567
1880
  selectedChainId = chainId2;
1568
- return {
1881
+ if ((parameters == null ? void 0 : parameters.withCapabilities) === true) {
1882
+ return castConnectResult({
1883
+ accounts: accounts2.map((address) => ({
1884
+ address,
1885
+ capabilities: {}
1886
+ })),
1887
+ chainId: chainId2
1888
+ });
1889
+ }
1890
+ return castConnectResult({
1569
1891
  accounts: accounts2,
1570
1892
  chainId: chainId2
1571
- };
1893
+ });
1572
1894
  }
1573
1895
  if (m.state.status === "CONNECTING" && m.state.connectingPayload) {
1574
1896
  (_a = options.onDisplayUri) == null ? void 0 : _a.call(options, m.state.connectingPayload);
@@ -1604,10 +1926,19 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1604
1926
  const chainId = Number.parseInt(getEvmAddressInfo(session)[0].networkIdentifier, 10);
1605
1927
  if (!Number.isFinite(chainId)) throw new Error(`Invalid chainId: ${chainId}`);
1606
1928
  selectedChainId = chainId;
1607
- return {
1929
+ if ((parameters == null ? void 0 : parameters.withCapabilities) === true) {
1930
+ return castConnectResult({
1931
+ accounts: accounts.map((address) => ({
1932
+ address,
1933
+ capabilities: {}
1934
+ })),
1935
+ chainId
1936
+ });
1937
+ }
1938
+ return castConnectResult({
1608
1939
  accounts,
1609
1940
  chainId
1610
- };
1941
+ });
1611
1942
  } catch (error) {
1612
1943
  resetState();
1613
1944
  throw error;
@@ -1669,9 +2000,14 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1669
2000
  async getProvider() {
1670
2001
  if (provider) return provider;
1671
2002
  await ensureManagerInitialized();
1672
- provider = {
2003
+ const createdProvider = {
1673
2004
  request: /* @__PURE__ */ __name(async (args) => {
1674
- const { method, params } = args;
2005
+ const { method, params: rawParams } = args;
2006
+ const params = Array.isArray(rawParams) ? [
2007
+ ...rawParams
2008
+ ] : rawParams === void 0 ? [] : [
2009
+ rawParams
2010
+ ];
1675
2011
  const session = getCurrentSession();
1676
2012
  const getSelectedAddressInfo = /* @__PURE__ */ __name((address) => {
1677
2013
  if (!session) throw new Error("No active session");
@@ -1778,16 +2114,21 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1778
2114
  throw new Error(`Unsupported provider method: ${method}`);
1779
2115
  }, "request"),
1780
2116
  on: /* @__PURE__ */ __name((event, listener) => {
1781
- if (!providerListeners.has(event)) providerListeners.set(event, /* @__PURE__ */ new Set());
1782
- providerListeners.get(event).add(listener);
1783
- return provider;
2117
+ let listeners = providerListeners.get(event);
2118
+ if (!listeners) {
2119
+ listeners = /* @__PURE__ */ new Set();
2120
+ providerListeners.set(event, listeners);
2121
+ }
2122
+ listeners.add(listener);
2123
+ return createdProvider;
1784
2124
  }, "on"),
1785
2125
  removeListener: /* @__PURE__ */ __name((event, listener) => {
1786
2126
  var _a;
1787
2127
  (_a = providerListeners.get(event)) == null ? void 0 : _a.delete(listener);
1788
- return provider;
2128
+ return createdProvider;
1789
2129
  }, "removeListener")
1790
2130
  };
2131
+ provider = createdProvider;
1791
2132
  return provider;
1792
2133
  },
1793
2134
  onAccountsChanged(accounts) {
@@ -1815,6 +2156,8 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1815
2156
  });
1816
2157
  }, "creditConnectConnector");
1817
2158
  export {
2159
+ ConnectKitProvider,
1818
2160
  ConnectModal,
1819
- creditConnectConnector
2161
+ creditConnectConnector,
2162
+ useConnectKit
1820
2163
  };