@gluwa/connect-kit 0.1.0-next.0 → 0.1.0-next.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.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 useState2, 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 {
@@ -645,46 +640,54 @@ var detectMetaMaskExtension = /* @__PURE__ */ __name(() => {
645
640
 
646
641
  // src/hooks/useWagmiConnect.ts
647
642
  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
- };
643
+ import { useConnect, useConfig } from "wagmi";
644
+ var hasMetaMaskKeyword = /* @__PURE__ */ __name((value) => value.toLowerCase().includes("metamask"), "hasMetaMaskKeyword");
645
+ var hasWalletConnectKeyword = /* @__PURE__ */ __name((value) => value.toLowerCase().includes("walletconnect"), "hasWalletConnectKeyword");
646
+ var isMetaMaskConnector = /* @__PURE__ */ __name((connector) => {
647
+ if (connector.id === "injected" || connector.id === "metaMaskSDK") return true;
648
+ if (hasMetaMaskKeyword(connector.id) || hasMetaMaskKeyword(connector.name)) return true;
649
+ if (connector.rdns) {
650
+ const rdnsList = Array.isArray(connector.rdns) ? connector.rdns : [
651
+ connector.rdns
652
+ ];
653
+ if (rdnsList.some((rdns) => hasMetaMaskKeyword(rdns))) return true;
654
+ }
655
+ return false;
656
+ }, "isMetaMaskConnector");
657
+ var isWalletConnectConnector = /* @__PURE__ */ __name((connector) => {
658
+ if (connector.id === "walletConnect") return true;
659
+ if (hasWalletConnectKeyword(connector.id) || hasWalletConnectKeyword(connector.name)) return true;
660
+ return false;
661
+ }, "isWalletConnectConnector");
662
+ var resolveWagmiConnector = /* @__PURE__ */ __name((connectors, connectorId) => {
663
+ switch (connectorId) {
664
+ case "CREDIT_CONNECT":
665
+ return connectors.find((connector) => connector.id === "credit-connect");
666
+ case "METAMASK":
667
+ return connectors.find(isMetaMaskConnector);
668
+ case "CREDIT_WALLET":
669
+ case "WALLET_CONNECT":
670
+ return connectors.find(isWalletConnectConnector);
671
+ default:
672
+ return void 0;
673
+ }
674
+ }, "resolveWagmiConnector");
655
675
  var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri }) => {
656
676
  const config = useConfig();
657
- const { address, status } = useAccount();
658
677
  const pendingConnectorId = useRef(null);
659
678
  const onConnectRef = useRef(onConnect);
660
679
  const onErrorRef = useRef(onError);
661
680
  const onQrUriRef = useRef(onQrUri);
662
681
  useEffect(() => {
663
682
  onConnectRef.current = onConnect;
664
- }, [
665
- onConnect
666
- ]);
667
- useEffect(() => {
668
683
  onErrorRef.current = onError;
669
- }, [
670
- onError
671
- ]);
672
- useEffect(() => {
673
684
  onQrUriRef.current = onQrUri;
674
685
  }, [
686
+ onConnect,
687
+ onError,
675
688
  onQrUri
676
689
  ]);
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
- });
690
+ const { connectAsync, reset, isPending } = useConnect();
688
691
  useEffect(() => {
689
692
  const handler = /* @__PURE__ */ __name((data) => {
690
693
  const msg = data;
@@ -706,38 +709,36 @@ var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri }) =
706
709
  }, [
707
710
  config.connectors
708
711
  ]);
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
712
  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);
713
+ const connector = resolveWagmiConnector(config.connectors, connectorId);
729
714
  if (!connector) {
730
- onErrorRef.current(new Error(`Wagmi connector '${wagmiId}' not found in config`), connectorId);
715
+ onErrorRef.current(new Error(`No wagmi connector found for ${connectorId}`), connectorId);
731
716
  return;
732
717
  }
733
718
  onQrUriRef.current(null);
734
719
  pendingConnectorId.current = connectorId;
735
- connect({
720
+ connectAsync({
736
721
  connector
722
+ }).then((result) => {
723
+ var _a;
724
+ if (pendingConnectorId.current !== connectorId) return;
725
+ const address = (_a = result.accounts) == null ? void 0 : _a[0];
726
+ if (!address) {
727
+ throw new Error("Connected but no account returned");
728
+ }
729
+ pendingConnectorId.current = null;
730
+ onConnectRef.current({
731
+ address,
732
+ connectorId
733
+ });
734
+ }).catch((error) => {
735
+ if (pendingConnectorId.current !== connectorId) return;
736
+ pendingConnectorId.current = null;
737
+ onErrorRef.current(error, connectorId);
737
738
  });
738
739
  }, [
739
740
  config.connectors,
740
- connect
741
+ connectAsync
741
742
  ]);
742
743
  const cancelConnect = useCallback(() => {
743
744
  pendingConnectorId.current = null;
@@ -753,6 +754,111 @@ var useWagmiConnect = /* @__PURE__ */ __name(({ onConnect, onError, onQrUri }) =
753
754
  };
754
755
  }, "useWagmiConnect");
755
756
 
757
+ // src/hooks/useWCState.ts
758
+ import { useState, useRef as useRef2, useCallback as useCallback2 } from "react";
759
+ var fetchWCWalletList = /* @__PURE__ */ __name(async (projectId) => {
760
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
761
+ const all = [];
762
+ let page = 1;
763
+ const entries = 100;
764
+ while (page <= 10) {
765
+ const url = new URL("https://explorer-api.walletconnect.com/v3/wallets");
766
+ url.searchParams.set("projectId", projectId);
767
+ url.searchParams.set("entries", String(entries));
768
+ url.searchParams.set("page", String(page));
769
+ const res = await fetch(url.toString());
770
+ if (!res.ok) throw new Error(`Failed to fetch wallet list: ${res.status}`);
771
+ const json = await res.json();
772
+ const listings = Object.values((_a = json.listings) != null ? _a : {});
773
+ for (const w of listings) {
774
+ all.push({
775
+ id: w.id,
776
+ name: w.name,
777
+ 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 : "",
778
+ mobileNative: (_g = (_f = w.mobile) == null ? void 0 : _f.native) != null ? _g : "",
779
+ mobileUniversal: (_i = (_h = w.mobile) == null ? void 0 : _h.universal) != null ? _i : "",
780
+ desktopNative: (_k = (_j = w.desktop) == null ? void 0 : _j.native) != null ? _k : "",
781
+ desktopUniversal: (_m = (_l = w.desktop) == null ? void 0 : _l.universal) != null ? _m : "",
782
+ appIos: (_o = (_n = w.app) == null ? void 0 : _n.ios) != null ? _o : "",
783
+ appAndroid: (_q = (_p = w.app) == null ? void 0 : _p.android) != null ? _q : "",
784
+ homepage: (_r = w.homepage) != null ? _r : ""
785
+ });
786
+ }
787
+ if (listings.length < entries || all.length >= json.total) break;
788
+ page += 1;
789
+ }
790
+ return all;
791
+ }, "fetchWCWalletList");
792
+ var useWCState = /* @__PURE__ */ __name(() => {
793
+ const [subView, setSubView] = useState("qr");
794
+ const [walletList, setWalletList] = useState([]);
795
+ const [walletListLoading, setWalletListLoading] = useState(false);
796
+ const [walletListSearch, setWalletListSearch] = useState("");
797
+ const [filterActive, setFilterActive] = useState(false);
798
+ const [selectedWallet, setSelectedWallet] = useState(null);
799
+ const loadedRef = useRef2(false);
800
+ const loadWalletList = useCallback2(async (projectId) => {
801
+ if (loadedRef.current) return;
802
+ loadedRef.current = true;
803
+ setWalletListLoading(true);
804
+ try {
805
+ const list = await fetchWCWalletList(projectId);
806
+ setWalletList(list);
807
+ } catch {
808
+ loadedRef.current = false;
809
+ } finally {
810
+ setWalletListLoading(false);
811
+ }
812
+ }, []);
813
+ const onShowList = useCallback2(() => setSubView("list"), []);
814
+ const onSelectWallet = useCallback2((wallet) => {
815
+ setSelectedWallet(wallet);
816
+ setSubView("wallet");
817
+ }, []);
818
+ const onSearchChange = useCallback2((q) => setWalletListSearch(q), []);
819
+ const onFilterToggle = useCallback2(() => setFilterActive((prev) => !prev), []);
820
+ const handleBack = useCallback2(() => {
821
+ if (subView === "wallet") {
822
+ setSelectedWallet(null);
823
+ setSubView("list");
824
+ return true;
825
+ }
826
+ if (subView === "list") {
827
+ setSubView("qr");
828
+ return true;
829
+ }
830
+ return false;
831
+ }, [
832
+ subView
833
+ ]);
834
+ const resetView = useCallback2(() => {
835
+ setSubView("qr");
836
+ setSelectedWallet(null);
837
+ }, []);
838
+ const reset = useCallback2(() => {
839
+ setSubView("qr");
840
+ setWalletListSearch("");
841
+ setFilterActive(false);
842
+ setSelectedWallet(null);
843
+ }, []);
844
+ return {
845
+ subView,
846
+ walletList,
847
+ walletListLoading,
848
+ walletListSearch,
849
+ filterActive,
850
+ selectedWallet,
851
+ loadWalletList,
852
+ onShowList,
853
+ onSelectWallet,
854
+ onSearchChange,
855
+ onFilterToggle,
856
+ handleBack,
857
+ resetView,
858
+ reset
859
+ };
860
+ }, "useWCState");
861
+
756
862
  // assets/graphic.png
757
863
  var graphic_default = "data:image/png;base64,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";
758
864
 
@@ -771,11 +877,41 @@ var IdleView = /* @__PURE__ */ __name(() => /* @__PURE__ */ React.createElement(
771
877
  }, "Choose a wallet on the left to start connecting.")), "IdleView");
772
878
 
773
879
  // src/views/CreditWalletView.tsx
774
- import { useEffect as useEffect2 } from "react";
880
+ import { useEffect as useEffect2, useMemo } from "react";
881
+
882
+ // src/components/QRFrame.tsx
775
883
  import { QRCodeSVG } from "qrcode.react";
884
+ var QRFrame = /* @__PURE__ */ __name(({ qrUri, logoUrl }) => /* @__PURE__ */ React.createElement("div", {
885
+ className: `ck-qr-frame ${!qrUri ? "ck-qr-frame--loading" : ""}`
886
+ }, qrUri ? /* @__PURE__ */ React.createElement(QRCodeSVG, {
887
+ value: qrUri,
888
+ size: 196,
889
+ level: "H",
890
+ imageSettings: logoUrl ? {
891
+ src: logoUrl,
892
+ width: 40,
893
+ height: 40,
894
+ excavate: true
895
+ } : void 0
896
+ }) : /* @__PURE__ */ React.createElement("div", {
897
+ className: "ck-qr-spinner",
898
+ "aria-label": "Loading QR code"
899
+ })), "QRFrame");
900
+ var CopyLinkButton = /* @__PURE__ */ __name(({ qrUri }) => {
901
+ if (!qrUri) return null;
902
+ return /* @__PURE__ */ React.createElement("button", {
903
+ type: "button",
904
+ className: "ck-copy-link",
905
+ onClick: /* @__PURE__ */ __name(() => {
906
+ navigator.clipboard.writeText(qrUri);
907
+ }, "onClick")
908
+ }, "Copy link");
909
+ }, "CopyLinkButton");
910
+
911
+ // src/views/CreditWalletView.tsx
776
912
  var CreditWalletView = /* @__PURE__ */ __name(({ connectorId, qrUri }) => {
777
913
  const { downloadUrl: downloadUrl2, logoUrl, deepLinkBase: deepLinkBase2 } = CONNECTOR_META[connectorId];
778
- const isMobile = isMobileDevice();
914
+ const isMobile = useMemo(() => isMobileDevice(), []);
779
915
  useEffect2(() => {
780
916
  if (isMobile && qrUri && deepLinkBase2) {
781
917
  tryOpenDeepLink(qrUri, deepLinkBase2);
@@ -792,22 +928,10 @@ var CreditWalletView = /* @__PURE__ */ __name(({ connectorId, qrUri }) => {
792
928
  }
793
929
  return /* @__PURE__ */ React.createElement("div", {
794
930
  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", {
931
+ }, /* @__PURE__ */ React.createElement(QRFrame, {
932
+ qrUri,
933
+ logoUrl
934
+ }), /* @__PURE__ */ React.createElement("p", {
811
935
  className: "ck-view__caption"
812
936
  }, "Open the Credit Wallet app and scan the QR"), downloadUrl2 && /* @__PURE__ */ React.createElement("div", {
813
937
  className: "ck-download-card"
@@ -826,11 +950,10 @@ var CreditWalletView = /* @__PURE__ */ __name(({ connectorId, qrUri }) => {
826
950
  }, "CreditWalletView");
827
951
 
828
952
  // src/views/MetaMaskView.tsx
829
- import { useEffect as useEffect3 } from "react";
830
- import { QRCodeSVG as QRCodeSVG2 } from "qrcode.react";
953
+ import { useEffect as useEffect3, useMemo as useMemo2 } from "react";
831
954
  var { downloadUrl, deepLinkBase } = CONNECTOR_META.METAMASK;
832
955
  var MetaMaskView = /* @__PURE__ */ __name(({ qrUri, hasExtension, logoUrl }) => {
833
- const isMobile = isMobileDevice();
956
+ const isMobile = useMemo2(() => isMobileDevice(), []);
834
957
  useEffect3(() => {
835
958
  if (isMobile && qrUri && deepLinkBase) {
836
959
  tryOpenDeepLink(qrUri, deepLinkBase);
@@ -861,28 +984,12 @@ var MetaMaskView = /* @__PURE__ */ __name(({ qrUri, hasExtension, logoUrl }) =>
861
984
  }
862
985
  return /* @__PURE__ */ React.createElement("div", {
863
986
  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", {
987
+ }, /* @__PURE__ */ React.createElement(QRFrame, {
988
+ qrUri,
989
+ logoUrl
990
+ }), /* @__PURE__ */ React.createElement(CopyLinkButton, {
991
+ qrUri
992
+ }), downloadUrl && /* @__PURE__ */ React.createElement("div", {
886
993
  className: "ck-download-card"
887
994
  }, /* @__PURE__ */ React.createElement("div", {
888
995
  className: "ck-download-card__text"
@@ -897,8 +1004,7 @@ var MetaMaskView = /* @__PURE__ */ __name(({ qrUri, hasExtension, logoUrl }) =>
897
1004
  }, "MetaMaskView");
898
1005
 
899
1006
  // src/views/WalletConnectView.tsx
900
- import { useMemo } from "react";
901
- import { QRCodeSVG as QRCodeSVG3 } from "qrcode.react";
1007
+ import { useMemo as useMemo3 } from "react";
902
1008
 
903
1009
  // assets/deeplink.png
904
1010
  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 +1021,14 @@ var WalletConnectView = /* @__PURE__ */ __name((props) => {
915
1021
  }, "WalletConnectView");
916
1022
  var WCQRView = /* @__PURE__ */ __name(({ qrUri, logoUrl, walletList, onShowList }) => /* @__PURE__ */ React.createElement("div", {
917
1023
  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", {
1024
+ }, /* @__PURE__ */ React.createElement(QRFrame, {
1025
+ qrUri,
1026
+ logoUrl
1027
+ }), /* @__PURE__ */ React.createElement("p", {
934
1028
  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", {
1029
+ }, "Scan this QR Code with your phone"), /* @__PURE__ */ React.createElement(CopyLinkButton, {
1030
+ qrUri
1031
+ }), /* @__PURE__ */ React.createElement("button", {
942
1032
  type: "button",
943
1033
  className: "ck-all-wallets-btn",
944
1034
  onClick: onShowList
@@ -950,10 +1040,10 @@ var WCQRView = /* @__PURE__ */ __name(({ qrUri, logoUrl, walletList, onShowList
950
1040
  }, "All Wallets"), walletList.length > 0 && /* @__PURE__ */ React.createElement("span", {
951
1041
  className: "ck-all-wallets-btn__count"
952
1042
  }, walletList.length, "+"))), "WCQRView");
953
- var CREDIT_WALLET_NAME = "Credit Wallet";
1043
+ var CREDIT_WALLET_NAME = CONNECTOR_META.CREDIT_WALLET.label;
954
1044
  var WalletListView = /* @__PURE__ */ __name(({ walletList, walletListLoading, walletListSearch, walletListFilterActive, logoUrl, qrUri, onSelectWallet, onSearchChange, onFilterToggle }) => {
955
- const isMobile = isMobileDevice();
956
- const filtered = useMemo(() => {
1045
+ const isMobile = useMemo3(() => isMobileDevice(), []);
1046
+ const filtered = useMemo3(() => {
957
1047
  const q = walletListSearch.trim().toLowerCase();
958
1048
  let list = walletList;
959
1049
  if (walletListFilterActive) {
@@ -975,11 +1065,10 @@ var WalletListView = /* @__PURE__ */ __name(({ walletList, walletListLoading, wa
975
1065
  walletListFilterActive
976
1066
  ]);
977
1067
  const handleClickWallet = /* @__PURE__ */ __name((wallet) => {
978
- const uri = qrUri;
979
- if (isMobile && uri) {
1068
+ if (isMobile && qrUri) {
980
1069
  const target = wallet.mobileNative || wallet.mobileUniversal;
981
1070
  if (target) {
982
- tryOpenDeepLink(uri, target);
1071
+ tryOpenDeepLink(qrUri, target);
983
1072
  return;
984
1073
  }
985
1074
  }
@@ -1058,32 +1147,14 @@ var WalletQRView = /* @__PURE__ */ __name(({ wallet, qrUri }) => {
1058
1147
  const logoSrc = wallet.imageUrl;
1059
1148
  return /* @__PURE__ */ React.createElement("div", {
1060
1149
  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", {
1150
+ }, /* @__PURE__ */ React.createElement(QRFrame, {
1151
+ qrUri,
1152
+ logoUrl: logoSrc
1153
+ }), /* @__PURE__ */ React.createElement("p", {
1079
1154
  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", {
1155
+ }, "Scan this QR Code with your phone"), /* @__PURE__ */ React.createElement(CopyLinkButton, {
1156
+ qrUri
1157
+ }), downloadUrl2 && /* @__PURE__ */ React.createElement("div", {
1087
1158
  className: "ck-download-card"
1088
1159
  }, /* @__PURE__ */ React.createElement("div", {
1089
1160
  className: "ck-download-card__text"
@@ -1112,39 +1183,6 @@ var writeRecentConnector = /* @__PURE__ */ __name((id) => {
1112
1183
  } catch {
1113
1184
  }
1114
1185
  }, "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");
1148
1186
  var SelectorPane = /* @__PURE__ */ __name(({ connectors, selected, recentConnector, onSelect, onClose }) => {
1149
1187
  const hasRecent = recentConnector !== null && connectors.includes(recentConnector);
1150
1188
  const recentConnectors = hasRecent ? [
@@ -1210,8 +1248,8 @@ var ConnectorItem = /* @__PURE__ */ __name(({ id, isSelected, isRecent, onSelect
1210
1248
  className: "ck-connector-item__badge"
1211
1249
  }, "Recent"));
1212
1250
  }, "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);
1251
+ var DetailPane = /* @__PURE__ */ __name(({ selectedConnector, qrUri, hasMetaMaskExtension, connectorLogoMap, wc, onBack, onClose }) => {
1252
+ const title = getDetailTitle(selectedConnector, hasMetaMaskExtension, wc.subView, wc.selectedWallet);
1215
1253
  const showBack = selectedConnector !== null;
1216
1254
  return /* @__PURE__ */ React.createElement("div", {
1217
1255
  className: "ck-pane ck-pane--detail"
@@ -1239,18 +1277,18 @@ var DetailPane = /* @__PURE__ */ __name(({ selectedConnector, qrUri, hasMetaMask
1239
1277
  hasExtension: hasMetaMaskExtension,
1240
1278
  logoUrl: connectorLogoMap.METAMASK
1241
1279
  }), selectedConnector === "WALLET_CONNECT" && /* @__PURE__ */ React.createElement(WalletConnectView, {
1242
- subView: wcSubView,
1280
+ subView: wc.subView,
1243
1281
  qrUri,
1244
1282
  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
1283
+ walletList: wc.walletList,
1284
+ walletListLoading: wc.walletListLoading,
1285
+ walletListSearch: wc.walletListSearch,
1286
+ walletListFilterActive: wc.filterActive,
1287
+ selectedWallet: wc.selectedWallet,
1288
+ onShowList: wc.onShowList,
1289
+ onSelectWallet: wc.onSelectWallet,
1290
+ onSearchChange: wc.onSearchChange,
1291
+ onFilterToggle: wc.onFilterToggle
1254
1292
  })));
1255
1293
  }, "DetailPane");
1256
1294
  var getDetailTitle = /* @__PURE__ */ __name((connector, hasMetaMaskExtension, wcSubView, wcSelectedWallet) => {
@@ -1263,28 +1301,38 @@ var getDetailTitle = /* @__PURE__ */ __name((connector, hasMetaMaskExtension, wc
1263
1301
  if (connector === "METAMASK" && hasMetaMaskExtension) return "MetaMask";
1264
1302
  return CONNECTOR_META[connector].detailTitle;
1265
1303
  }, "getDetailTitle");
1304
+ var resolveConnectorsFromConfig = /* @__PURE__ */ __name((connectorsConfig) => {
1305
+ if (!connectorsConfig) return [];
1306
+ const connectors = [];
1307
+ if (connectorsConfig.creditWallet === "walletConnect") connectors.push("CREDIT_WALLET");
1308
+ if (connectorsConfig.creditWallet === "creditConnect") connectors.push("CREDIT_CONNECT");
1309
+ if (connectorsConfig.metamask) connectors.push("METAMASK");
1310
+ if (connectorsConfig.walletConnect) connectors.push("WALLET_CONNECT");
1311
+ return connectors;
1312
+ }, "resolveConnectorsFromConfig");
1266
1313
  var ConnectModal = /* @__PURE__ */ __name((props) => {
1267
- if (props.connectors.includes("CREDIT_WALLET") && props.connectors.includes("CREDIT_CONNECT")) {
1314
+ if (!props.open) return null;
1315
+ const resolvedConnectors = resolveConnectorsFromConfig(props.connectors);
1316
+ if (resolvedConnectors.includes("CREDIT_WALLET") && resolvedConnectors.includes("CREDIT_CONNECT")) {
1268
1317
  throw new Error("CREDIT_WALLET and CREDIT_CONNECT cannot be used together");
1269
1318
  }
1270
- if (!props.open) return null;
1271
- return /* @__PURE__ */ React.createElement(ConnectModalInner, props);
1319
+ if (resolvedConnectors.length === 0) {
1320
+ throw new Error("At least one connector must be configured");
1321
+ }
1322
+ return /* @__PURE__ */ React.createElement(ConnectModalInner, {
1323
+ ...props,
1324
+ connectors: resolvedConnectors
1325
+ });
1272
1326
  }, "ConnectModal");
1273
1327
  var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, onClose, onLog, wcProjectId }) => {
1274
1328
  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) => {
1329
+ const [selectedConnector, setSelectedConnector] = useState2(null);
1330
+ const [qrUriMap, setQrUriMap] = useState2({});
1331
+ const pendingQrConnectorRef = useRef3(null);
1332
+ const [recentConnector, setRecentConnector] = useState2(null);
1333
+ const [hasMetaMaskExtension, setHasMetaMaskExtension] = useState2(false);
1334
+ const wc = useWCState();
1335
+ const handleQrUri = useCallback3((uri) => {
1288
1336
  if (uri) {
1289
1337
  const id = pendingQrConnectorRef.current;
1290
1338
  if (id) setQrUriMap((prev) => ({
@@ -1293,14 +1341,14 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1293
1341
  }));
1294
1342
  }
1295
1343
  }, []);
1296
- const handleConnect = useCallback2((result) => {
1344
+ const handleConnect = useCallback3((result) => {
1297
1345
  onConnect(result);
1298
1346
  onClose();
1299
1347
  }, [
1300
1348
  onConnect,
1301
1349
  onClose
1302
1350
  ]);
1303
- const handleError = useCallback2((error, connectorId) => {
1351
+ const handleError = useCallback3((error, connectorId) => {
1304
1352
  onLog == null ? void 0 : onLog(`[connect-kit] connection failed (${connectorId}): ${error.message}`, error);
1305
1353
  setSelectedConnector(null);
1306
1354
  setQrUriMap((prev) => {
@@ -1310,10 +1358,10 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1310
1358
  delete next[connectorId];
1311
1359
  return next;
1312
1360
  });
1313
- setWcSubView("qr");
1314
- setWcSelectedWallet(null);
1361
+ wc.resetView();
1315
1362
  }, [
1316
- onLog
1363
+ onLog,
1364
+ wc.resetView
1317
1365
  ]);
1318
1366
  const { triggerConnect, cancelConnect } = useWagmiConnect({
1319
1367
  onConnect: handleConnect,
@@ -1321,10 +1369,16 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1321
1369
  onQrUri: handleQrUri
1322
1370
  });
1323
1371
  const wagmiConfig = useConfig2();
1324
- const connectorLogoMap = useMemo2(() => {
1372
+ const connectorLogoMap = useMemo4(() => {
1325
1373
  const map = {};
1326
- for (const [connectorId, wagmiId] of Object.entries(WAGMI_CONNECTOR_ID)) {
1327
- const wagmiConnector = wagmiConfig.connectors.find((c) => c.id === wagmiId);
1374
+ const connectorIds = [
1375
+ "CREDIT_CONNECT",
1376
+ "CREDIT_WALLET",
1377
+ "METAMASK",
1378
+ "WALLET_CONNECT"
1379
+ ];
1380
+ for (const connectorId of connectorIds) {
1381
+ const wagmiConnector = resolveWagmiConnector(wagmiConfig.connectors, connectorId);
1328
1382
  if (wagmiConnector == null ? void 0 : wagmiConnector.icon) map[connectorId] = wagmiConnector.icon;
1329
1383
  }
1330
1384
  return map;
@@ -1340,39 +1394,23 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1340
1394
  setSelectedConnector(null);
1341
1395
  setQrUriMap({});
1342
1396
  pendingQrConnectorRef.current = null;
1343
- setWcSubView("qr");
1344
- setWcWalletListSearch("");
1345
- setWcFilterActive(false);
1346
- setWcSelectedWallet(null);
1397
+ wc.reset();
1347
1398
  cancelConnect();
1348
1399
  }
1349
1400
  }, [
1350
1401
  open,
1351
- cancelConnect
1402
+ cancelConnect,
1403
+ wc.reset
1352
1404
  ]);
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) => {
1405
+ const handleSelectConnector = useCallback3((id) => {
1367
1406
  if (id === selectedConnector) return;
1368
1407
  pendingQrConnectorRef.current = id;
1369
1408
  setSelectedConnector(id);
1370
- setWcSubView("qr");
1371
- setWcSelectedWallet(null);
1409
+ wc.resetView();
1372
1410
  writeRecentConnector(id);
1373
1411
  setRecentConnector(id);
1374
1412
  if (id === "WALLET_CONNECT" && wcProjectId) {
1375
- loadWCWalletList(wcProjectId);
1413
+ wc.loadWalletList(wcProjectId);
1376
1414
  }
1377
1415
  cancelConnect();
1378
1416
  triggerConnect(id);
@@ -1381,36 +1419,17 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1381
1419
  triggerConnect,
1382
1420
  cancelConnect,
1383
1421
  wcProjectId,
1384
- loadWCWalletList
1422
+ wc.resetView,
1423
+ wc.loadWalletList
1385
1424
  ]);
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
- }
1407
- }
1425
+ const handleBack = useCallback3(() => {
1426
+ if (selectedConnector === "WALLET_CONNECT" && wc.handleBack()) return;
1408
1427
  pendingQrConnectorRef.current = null;
1409
1428
  setSelectedConnector(null);
1410
1429
  cancelConnect();
1411
1430
  }, [
1412
1431
  selectedConnector,
1413
- wcSubView,
1432
+ wc.handleBack,
1414
1433
  cancelConnect
1415
1434
  ]);
1416
1435
  return /* @__PURE__ */ React.createElement("div", {
@@ -1434,32 +1453,20 @@ var ConnectModalInner = /* @__PURE__ */ __name(({ open, connectors, onConnect, o
1434
1453
  qrUri: selectedConnector ? (_a = qrUriMap[selectedConnector]) != null ? _a : null : null,
1435
1454
  hasMetaMaskExtension,
1436
1455
  connectorLogoMap,
1437
- wcSubView,
1438
- wcWalletList,
1439
- wcWalletListLoading,
1440
- wcWalletListSearch,
1441
- wcFilterActive,
1442
- wcSelectedWallet,
1456
+ wc,
1443
1457
  onBack: handleBack,
1444
- onClose,
1445
- onWCShowList: handleWCShowList,
1446
- onWCSelectWallet: handleWCSelectWallet,
1447
- onWCSearchChange: setWcWalletListSearch,
1448
- onWCFilterToggle: handleWCFilterToggle
1458
+ onClose
1449
1459
  })));
1450
1460
  }, "ConnectModalInner");
1451
1461
 
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");
1457
-
1458
1462
  // src/creditConnectConnector.ts
1463
+ import { createConnector } from "@wagmi/core";
1464
+ import { getAddress } from "viem";
1459
1465
  import { DappSessionManager } from "@gluwa/credit-connect-sdk/dapp";
1460
1466
  var CONNECTOR_ID = "credit-connect";
1461
1467
  var CONNECTOR_NAME = "Credit Wallet";
1462
1468
  var CONNECTOR_TYPE = "credit-connect";
1469
+ var castConnectResult = /* @__PURE__ */ __name((value) => value, "castConnectResult");
1463
1470
  var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1464
1471
  let manager = null;
1465
1472
  let selectedChainId = null;
@@ -1565,10 +1572,19 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1565
1572
  const chainId2 = Number.parseInt(getEvmAddressInfo(session2)[0].networkIdentifier, 10);
1566
1573
  if (!Number.isFinite(chainId2)) throw new Error(`Invalid chainId: ${chainId2}`);
1567
1574
  selectedChainId = chainId2;
1568
- return {
1575
+ if ((parameters == null ? void 0 : parameters.withCapabilities) === true) {
1576
+ return castConnectResult({
1577
+ accounts: accounts2.map((address) => ({
1578
+ address,
1579
+ capabilities: {}
1580
+ })),
1581
+ chainId: chainId2
1582
+ });
1583
+ }
1584
+ return castConnectResult({
1569
1585
  accounts: accounts2,
1570
1586
  chainId: chainId2
1571
- };
1587
+ });
1572
1588
  }
1573
1589
  if (m.state.status === "CONNECTING" && m.state.connectingPayload) {
1574
1590
  (_a = options.onDisplayUri) == null ? void 0 : _a.call(options, m.state.connectingPayload);
@@ -1604,10 +1620,19 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1604
1620
  const chainId = Number.parseInt(getEvmAddressInfo(session)[0].networkIdentifier, 10);
1605
1621
  if (!Number.isFinite(chainId)) throw new Error(`Invalid chainId: ${chainId}`);
1606
1622
  selectedChainId = chainId;
1607
- return {
1623
+ if ((parameters == null ? void 0 : parameters.withCapabilities) === true) {
1624
+ return castConnectResult({
1625
+ accounts: accounts.map((address) => ({
1626
+ address,
1627
+ capabilities: {}
1628
+ })),
1629
+ chainId
1630
+ });
1631
+ }
1632
+ return castConnectResult({
1608
1633
  accounts,
1609
1634
  chainId
1610
- };
1635
+ });
1611
1636
  } catch (error) {
1612
1637
  resetState();
1613
1638
  throw error;
@@ -1669,9 +1694,14 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1669
1694
  async getProvider() {
1670
1695
  if (provider) return provider;
1671
1696
  await ensureManagerInitialized();
1672
- provider = {
1697
+ const createdProvider = {
1673
1698
  request: /* @__PURE__ */ __name(async (args) => {
1674
- const { method, params } = args;
1699
+ const { method, params: rawParams } = args;
1700
+ const params = Array.isArray(rawParams) ? [
1701
+ ...rawParams
1702
+ ] : rawParams === void 0 ? [] : [
1703
+ rawParams
1704
+ ];
1675
1705
  const session = getCurrentSession();
1676
1706
  const getSelectedAddressInfo = /* @__PURE__ */ __name((address) => {
1677
1707
  if (!session) throw new Error("No active session");
@@ -1778,16 +1808,21 @@ var creditConnectConnector = /* @__PURE__ */ __name((options) => {
1778
1808
  throw new Error(`Unsupported provider method: ${method}`);
1779
1809
  }, "request"),
1780
1810
  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;
1811
+ let listeners = providerListeners.get(event);
1812
+ if (!listeners) {
1813
+ listeners = /* @__PURE__ */ new Set();
1814
+ providerListeners.set(event, listeners);
1815
+ }
1816
+ listeners.add(listener);
1817
+ return createdProvider;
1784
1818
  }, "on"),
1785
1819
  removeListener: /* @__PURE__ */ __name((event, listener) => {
1786
1820
  var _a;
1787
1821
  (_a = providerListeners.get(event)) == null ? void 0 : _a.delete(listener);
1788
- return provider;
1822
+ return createdProvider;
1789
1823
  }, "removeListener")
1790
1824
  };
1825
+ provider = createdProvider;
1791
1826
  return provider;
1792
1827
  },
1793
1828
  onAccountsChanged(accounts) {