Skip to content

Commit 6d63920

Browse files
authored
feat: add walletConnect, Fix WC connection issues (#2591)
1 parent 3ef3786 commit 6d63920

File tree

28 files changed

+631
-209
lines changed

28 files changed

+631
-209
lines changed

.changeset/poor-eyes-clap.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"thirdweb": patch
3+
---
4+
5+
Add `walletConnect`, fix WC connection issues

packages/thirdweb/scripts/wallets/generate.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,21 @@ const walletInfos = allSupportedWallets.map((wallet) => {
8989
return { id: wallet.id, name: wallet.name };
9090
});
9191

92+
const customWalletInfos = [
93+
{
94+
id: "smart",
95+
name: "Smart Wallet",
96+
},
97+
{
98+
id: "embedded",
99+
name: "Embedded Wallet",
100+
},
101+
{
102+
id: "walletConnect",
103+
name: "WalletConnect",
104+
},
105+
];
106+
92107
// clean the __geneated__ folder within `src/wallets/` directory
93108
const OUT_PATH = join(__dirname, "../../src/wallets/__generated__");
94109

@@ -141,7 +156,7 @@ export type MinimalWalletInfo = {
141156
/**
142157
* @internal
143158
*/
144-
const ALL_MINIMAL_WALLET_INFOS = <const>${JSON.stringify(walletInfos, null, 2)} satisfies MinimalWalletInfo[];
159+
const ALL_MINIMAL_WALLET_INFOS = <const>${JSON.stringify([...walletInfos, ...customWalletInfos], null, 2)} satisfies MinimalWalletInfo[];
145160
146161
export default ALL_MINIMAL_WALLET_INFOS;
147162
`,
@@ -222,6 +237,19 @@ const walletImports = allSupportedWallets
222237
)
223238
.join("\n");
224239

240+
const customWalletImports = ["smart", "embedded", "walletConnect"]
241+
.map(
242+
(walletId) =>
243+
`case "${walletId}": {
244+
return (
245+
image
246+
? import("../custom/${walletId}/image.js").then((img) => img.default)
247+
: import("../custom/${walletId}/index.js").then((w) => w.wallet)
248+
) as Promise<[TImage] extends [true] ? string : any>;
249+
}`,
250+
)
251+
.join("\n");
252+
225253
await writeFile(
226254
join(OUT_PATH, "getWalletInfo.ts"),
227255
await format(
@@ -238,6 +266,7 @@ import type { WalletId } from "../wallet-types.js";
238266
*/
239267
export async function getWalletInfo<TImage extends boolean>(id: WalletId, image?: TImage): Promise<[TImage] extends [true] ? string : WalletInfo> {
240268
switch (id) {
269+
${customWalletImports}
241270
${walletImports}
242271
default: {
243272
throw new Error(\`Wallet with id \${id} not found\`);

packages/thirdweb/src/exports/wallets.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export {
22
createWallet,
33
smartWallet,
44
embeddedWallet,
5+
walletConnect,
56
} from "../wallets/create-wallet.js";
67

78
export type { Wallet, Account } from "../wallets/interfaces/wallet.js";

packages/thirdweb/src/react/core/hooks/connection/useAutoConnect.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ import type {
1717
Wallet,
1818
// WalletWithPersonalAccount,
1919
} from "../../../../wallets/interfaces/wallet.js";
20-
import { asyncLocalStorage } from "../../utils/asyncLocalStorage.js";
2120
import type { ThirdwebClient } from "../../../../client/client.js";
2221
import type { AppMetadata } from "../../../../wallets/types.js";
2322
import { timeoutPromise } from "../../utils/timeoutPromise.js";
2423
import type { SmartWalletOptions } from "../../../../wallets/smart/types.js";
2524
import { createWallet } from "../../../../wallets/create-wallet.js";
2625
import { getSavedConnectParamsFromStorage } from "../../../../wallets/storage/walletStorage.js";
26+
import { asyncLocalStorage } from "../../../../wallets/storage/asyncLocalStorage.js";
2727

2828
let autoConnectAttempted = false;
2929

packages/thirdweb/src/react/core/storage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { AsyncStorage } from "../../wallets/storage/AsyncStorage.js";
2-
import { asyncLocalStorage } from "./utils/asyncLocalStorage.js";
2+
import { asyncLocalStorage } from "../../wallets/storage/asyncLocalStorage.js";
33

44
let storage: AsyncStorage;
55

packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import type { InjectedWalletLocale } from "../../../wallets/injected/locale/type
1212
import { getInjectedWalletLocale } from "../../../wallets/injected/locale/getInjectedWalletLocale.js";
1313
import { useWalletConnectionCtx } from "../../../../core/hooks/others/useWalletConnectionCtx.js";
1414
import { GetStartedScreen } from "../../../wallets/shared/GetStartedScreen.js";
15-
import { WalletConnectConnection } from "../../../wallets/shared/WalletConnectConnection.js";
15+
import {
16+
WalletConnectConnection,
17+
WalletConnectStandaloneConnection,
18+
} from "../../../wallets/shared/WalletConnectConnection.js";
1619

1720
const CoinbaseSDKWalletConnectUI = /* @__PURE__ */ lazy(
1821
() => import("../../../wallets/shared/CoinbaseSDKConnection.js"),
@@ -28,6 +31,7 @@ export function AnyWalletConnectUI(props: {
2831
wallet: Wallet;
2932
done: () => void;
3033
onBack?: () => void;
34+
setModalVisibility: (value: boolean) => void;
3135
}) {
3236
const [screen, setScreen] = useState<"main" | "get-started">("main");
3337
const walletInfo = useWalletInfo(props.wallet.id);
@@ -114,6 +118,20 @@ export function AnyWalletConnectUI(props: {
114118
);
115119
}
116120

121+
// wallet connect
122+
if (props.wallet.id === "walletConnect") {
123+
return (
124+
<WalletConnectStandaloneConnection
125+
locale={locale}
126+
onBack={props.onBack}
127+
done={props.done}
128+
wallet={props.wallet as Wallet<"walletConnect">}
129+
walletInfo={walletInfo.data}
130+
setModalVisibility={props.setModalVisibility}
131+
/>
132+
);
133+
}
134+
117135
if (props.wallet.id === "embedded") {
118136
return (
119137
<Suspense fallback={<LoadingScreen />}>

packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/ConnectEmbed.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -430,10 +430,7 @@ const ConnectEmbedContent = (
430430
onClose={() => {
431431
setScreen(initialScreen);
432432
}}
433-
onHide={() => {
434-
// no op
435-
}}
436-
onShow={() => {
433+
setModalVisibility={() => {
437434
// no op
438435
}}
439436
/>

packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/ConnectModal.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ const ConnectModal = () => {
7474
}
7575
}, [isWalletModalOpen, setIsWalletModalOpen, screen]);
7676

77-
const onHide = useCallback(() => setHideModal(true), []);
78-
const onShow = useCallback(() => setHideModal(false), []);
77+
const setModalVisibility = useCallback(
78+
(value: boolean) => setHideModal(!value),
79+
[],
80+
);
7981

8082
// if wallet is suddenly disconnected when showing the sign in screen, close the modal and reset the screen
8183
useEffect(() => {
@@ -122,8 +124,7 @@ const ConnectModal = () => {
122124
>
123125
<ConnectModalContent
124126
screenSetup={screenSetup}
125-
onHide={onHide}
126-
onShow={onShow}
127+
setModalVisibility={setModalVisibility}
127128
isOpen={isWalletModalOpen}
128129
onClose={closeModal}
129130
/>

packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/ConnectModalContent.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ const AllWalletsUI = /* @__PURE__ */ lazy(() => import("./AllWalletsUI.js"));
2222
*/
2323
export const ConnectModalContent = (props: {
2424
screenSetup: ScreenSetup;
25-
onHide: () => void;
26-
onShow: () => void;
27-
isOpen: boolean;
2825
onClose: () => void;
26+
isOpen: boolean;
27+
setModalVisibility: (value: boolean) => void;
2928
}) => {
30-
const { onShow, onClose } = props;
29+
const { setModalVisibility, onClose } = props;
3130
const { screen, setScreen, initialScreen } = props.screenSetup;
3231
const { wallets, accountAbstraction } = useWalletConnectionCtx();
3332
// const disconnect = useDisconnect();
3433
const modalConfig = useContext(ModalConfigCtx);
34+
3535
// const setModalConfig = useContext(SetModalConfigCtx);
3636
// const activeWalletConnectionStatus = useActiveWalletConnectionStatus();
3737
// const activeWallet = useActiveWallet();
@@ -59,7 +59,7 @@ export const ConnectModalContent = (props: {
5959
// : !!authConfig?.authUrl && !user?.address;
6060

6161
onModalUnmount(() => {
62-
onShow();
62+
setModalVisibility(true);
6363
});
6464

6565
// show sign in screen if required
@@ -77,7 +77,7 @@ export const ConnectModalContent = (props: {
7777
// authConfig?.authUrl,
7878
// user?.address,
7979
setScreen,
80-
onShow,
80+
setModalVisibility,
8181
onClose,
8282
onConnect,
8383
connect,
@@ -138,6 +138,7 @@ export const ConnectModalContent = (props: {
138138
}}
139139
personalWallet={wallet}
140140
onBack={goBack}
141+
setModalVisibility={props.setModalVisibility}
141142
/>
142143
);
143144
}
@@ -150,6 +151,7 @@ export const ConnectModalContent = (props: {
150151
done={() => {
151152
handleConnected(wallet);
152153
}}
154+
setModalVisibility={props.setModalVisibility}
153155
/>
154156
);
155157
};

packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/ConnectModalInline.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,13 @@ function ConnectModalInlineContent(props: {
9090
<>
9191
<ConnectModalContent
9292
screenSetup={screenSetup}
93-
onHide={() => {
94-
// no op
93+
setModalVisibility={() => {
94+
// noop
9595
}}
9696
isOpen={true}
9797
onClose={() => {
9898
// no op
9999
}}
100-
onShow={() => {
101-
// no op
102-
}}
103100
/>
104101

105102
{/* close icon */}

packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/SmartWalletConnectUI.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { createWallet } from "../../../../../wallets/create-wallet.js";
1818
import { useWalletInfo } from "../../hooks/useWalletInfo.js";
1919
import type { WalletInfo } from "../../../../../wallets/wallet-info.js";
2020
import { saveConnectParamsToStorage } from "../../../../../wallets/storage/walletStorage.js";
21-
import { asyncLocalStorage } from "../../../../core/utils/asyncLocalStorage.js";
21+
import { asyncLocalStorage } from "../../../../../wallets/storage/asyncLocalStorage.js";
2222

2323
/**
2424
* @internal
@@ -28,6 +28,7 @@ export function SmartConnectUI(props: {
2828
done: (smartWallet: Wallet) => void;
2929
onBack?: () => void;
3030
accountAbstraction: SmartWalletOptions;
31+
setModalVisibility: (value: boolean) => void;
3132
}) {
3233
const personalWalletInfo = useWalletInfo(props.personalWallet.id);
3334
const [keyConnected, setKeyConnected] = useState(false);
@@ -45,6 +46,7 @@ export function SmartConnectUI(props: {
4546
setKeyConnected(true);
4647
}}
4748
onBack={props.onBack}
49+
setModalVisibility={props.setModalVisibility}
4850
/>
4951
);
5052
}

packages/thirdweb/src/react/web/ui/hooks/useWalletInfo.ts

Lines changed: 2 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -10,98 +10,7 @@ export function useWalletInfo(id: WalletId) {
1010
return useQuery<WalletInfo>({
1111
queryKey: ["wallet-info", id],
1212
queryFn: () => {
13-
switch (id) {
14-
// case "local": {
15-
// return {
16-
// id: "local",
17-
// name: "Local Wallet",
18-
// homepage: "https://thirdweb.com",
19-
// app: {
20-
// browser: null,
21-
// ios: null,
22-
// android: null,
23-
// mac: null,
24-
// windows: null,
25-
// linux: null,
26-
// chrome: null,
27-
// firefox: null,
28-
// safari: null,
29-
// edge: null,
30-
// opera: null,
31-
// },
32-
// rdns: null,
33-
// mobile: {
34-
// native: null,
35-
// universal: null,
36-
// },
37-
// desktop: {
38-
// native: null,
39-
// universal: null,
40-
// },
41-
// } as WalletInfo;
42-
// }
43-
case "embedded": {
44-
return {
45-
id: "embedded",
46-
name: "Social Login",
47-
homepage: "https://thirdweb.com",
48-
app: {
49-
browser: null,
50-
ios: null,
51-
android: null,
52-
mac: null,
53-
windows: null,
54-
linux: null,
55-
chrome: null,
56-
firefox: null,
57-
safari: null,
58-
edge: null,
59-
opera: null,
60-
},
61-
rdns: null,
62-
mobile: {
63-
native: null,
64-
universal: null,
65-
},
66-
desktop: {
67-
native: null,
68-
universal: null,
69-
},
70-
} as WalletInfo;
71-
}
72-
case "smart": {
73-
return {
74-
id: "smart",
75-
name: "SmartWallet",
76-
homepage: "https://thirdweb.com",
77-
app: {
78-
browser: null,
79-
ios: null,
80-
android: null,
81-
mac: null,
82-
windows: null,
83-
linux: null,
84-
chrome: null,
85-
firefox: null,
86-
safari: null,
87-
edge: null,
88-
opera: null,
89-
},
90-
rdns: null,
91-
mobile: {
92-
native: null,
93-
universal: null,
94-
},
95-
desktop: {
96-
native: null,
97-
universal: null,
98-
},
99-
} as WalletInfo;
100-
}
101-
default: {
102-
return getWalletInfo(id, false);
103-
}
104-
}
13+
return getWalletInfo(id, false);
10514
},
10615
retry: false,
10716
});
@@ -114,20 +23,7 @@ export function useWalletImage(id: WalletId) {
11423
return useQuery({
11524
queryKey: ["wallet-image", id],
11625
queryFn: () => {
117-
switch (id) {
118-
// case "local": {
119-
// return "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiByeD0iMTIiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8xXzY0KSIvPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMV82NCkiPgo8cGF0aCBkPSJNNTguNzUgMTkuMTY2N0gyMS4yNUMxOC45NTgzIDE5LjE2NjcgMTcuMDgzMyAyMS4wNDE3IDE3LjA4MzMgMjMuMzMzNFY0OC4zMzM0QzE3LjA4MzMgNTAuNjI1IDE4Ljk1ODMgNTIuNSAyMS4yNSA1Mi41SDM1LjgzMzNMMzEuNjY2NyA1OC43NVY2MC44MzM0SDQ4LjMzMzNWNTguNzVMNDQuMTY2NyA1Mi41SDU4Ljc1QzYxLjA0MTcgNTIuNSA2Mi45MTY3IDUwLjYyNSA2Mi45MTY3IDQ4LjMzMzRWMjMuMzMzNEM2Mi45MTY3IDIxLjA0MTcgNjEuMDQxNyAxOS4xNjY3IDU4Ljc1IDE5LjE2NjdaTTU4Ljc1IDQ0LjE2NjdIMjEuMjVWMjMuMzMzNEg1OC43NVY0NC4xNjY3WiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzFfNjQiIHgxPSI0MCIgeTE9IjAiIHgyPSI0MCIgeTI9IjgwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDRTExQUIiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOTAwQkI1Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMV82NCI+CjxyZWN0IHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1IDE1KSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=";
120-
// }
121-
case "embedded": {
122-
return "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzM1ODlfODY0OSkiPgo8cmVjdCB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHJ4PSI4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMzU4OV84NjQ5KSIvPgo8cmVjdCB4PSItMSIgeT0iLTEiIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgcng9IjkuOCIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzM1ODlfODY0OSkiLz4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAxXzM1ODlfODY0OSkiPgo8cGF0aCBkPSJNMjQgMTQuMjVDMTguNjE3MiAxNC4yNSAxNC4yNSAxOC42MTcyIDE0LjI1IDI0QzE0LjI1IDI5LjM4MjggMTguNjE3MiAzMy43NSAyNCAzMy43NUMyNC44OTg4IDMzLjc1IDI1LjYyNSAzNC40NzYyIDI1LjYyNSAzNS4zNzVDMjUuNjI1IDM2LjI3MzggMjQuODk4OCAzNyAyNCAzN0MxNi44MTk1IDM3IDExIDMxLjE4MDUgMTEgMjRDMTEgMTYuODE5NSAxNi44MTk1IDExIDI0IDExQzMxLjE4MDUgMTEgMzcgMTYuODE5NSAzNyAyNFYyNS42MjVDMzcgMjguMzE2NCAzNC44MTY0IDMwLjUgMzIuMTI1IDMwLjVDMzAuNjM3MSAzMC41IDI5LjMwMTYgMjkuODI5NyAyOC40MDc4IDI4Ljc3ODVDMjcuMjUgMjkuODQ0OSAyNS43MDEyIDMwLjUgMjQgMzAuNUMyMC40MDk4IDMwLjUgMTcuNSAyNy41OTAyIDE3LjUgMjRDMTcuNSAyMC40MDk4IDIwLjQwOTggMTcuNSAyNCAxNy41QzI1LjQxNjggMTcuNSAyNi43MjcgMTcuOTUyIDI3Ljc5MzQgMTguNzIzOEMyOC4wODI4IDE4LjQ2OTkgMjguNDU4NiAxOC4zMTI1IDI4Ljg3NSAxOC4zMTI1QzI5Ljc3MzggMTguMzEyNSAzMC41IDE5LjAzODcgMzAuNSAxOS45Mzc1VjI1LjYyNUMzMC41IDI2LjUyMzggMzEuMjI2MiAyNy4yNSAzMi4xMjUgMjcuMjVDMzMuMDIzOCAyNy4yNSAzMy43NSAyNi41MjM4IDMzLjc1IDI1LjYyNVYyNEMzMy43NSAxOC42MTcyIDI5LjM4MjggMTQuMjUgMjQgMTQuMjVaTTI3LjI1IDI0QzI3LjI1IDIzLjEzOCAyNi45MDc2IDIyLjMxMTQgMjYuMjk4MSAyMS43MDE5QzI1LjY4ODYgMjEuMDkyNCAyNC44NjIgMjAuNzUgMjQgMjAuNzVDMjMuMTM4IDIwLjc1IDIyLjMxMTQgMjEuMDkyNCAyMS43MDE5IDIxLjcwMTlDMjEuMDkyNCAyMi4zMTE0IDIwLjc1IDIzLjEzOCAyMC43NSAyNEMyMC43NSAyNC44NjIgMjEuMDkyNCAyNS42ODg2IDIxLjcwMTkgMjYuMjk4MUMyMi4zMTE0IDI2LjkwNzYgMjMuMTM4IDI3LjI1IDI0IDI3LjI1QzI0Ljg2MiAyNy4yNSAyNS42ODg2IDI2LjkwNzYgMjYuMjk4MSAyNi4yOTgxQzI2LjkwNzYgMjUuNjg4NiAyNy4yNSAyNC44NjIgMjcuMjUgMjRaIiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8zNTg5Xzg2NDkiIHgxPSIyNS41IiB5MT0iLTYuMjk1NzJlLTA2IiB4Mj0iMzAuMjAxNiIgeTI9IjQ3LjUzNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjODM1OEJBIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdCMUNGNyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMzU4OV84NjQ5IiB4MT0iMjUuNTYyNSIgeTE9Ii0xLjAwMDAxIiB4Mj0iMzAuNDYiIHkyPSI0OC41MTU2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiM4MzU4QkEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjN0IxQ0Y3Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMzU4OV84NjQ5Ij4KPHJlY3Qgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiByeD0iOCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPGNsaXBQYXRoIGlkPSJjbGlwMV8zNTg5Xzg2NDkiPgo8cmVjdCB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMSAxMSkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K";
123-
}
124-
case "smart": {
125-
return "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiByeD0iMTIiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8xXzkxKSIvPgo8cGF0aCBkPSJNMzkuOTk2OSAxOEw0MC4yMzMzIDE4LjAxNTZMNDAuMzUxMyAxOC4wMzMzTDQwLjQ3MzYgMTguMDYyMkw0MC42OTU4IDE4LjEzNzhDNDAuODQ5NCAxOC4yMDA2IDQwLjk5NTQgMTguMjg0MiA0MS4xMzA1IDE4LjM4NjdMNDEuMzM4NyAxOC41Njg5TDQxLjg0OTMgMTkuMDUzM0M0NS44ODkxIDIyLjc3NjggNTAuOTk0NyAyNC43NzYyIDU2LjI0NTggMjQuNjkxMUw1Ni45MzA3IDI0LjY2ODlDNTcuMzc4MyAyNC42NDYyIDU3LjgyIDI0Ljc5MDkgNTguMTg0OSAyNS4wNzk4QzU4LjU0OTggMjUuMzY4NyA1OC44MTY3IDI1Ljc4NSA1OC45NDMxIDI2LjI2MjJDNTkuOTI3MSAyOS45NzY5IDYwLjIyODMgMzMuODczMSA1OS44Mjg3IDM3LjcxOTRDNTkuNDI4OSA0MS41NjU4IDU4LjMzNjcgNDUuMjgzNiA1Ni42MTY1IDQ4LjY1MjNDNTQuODk2NSA1Mi4wMjA3IDUyLjU4MzYgNTQuOTcxNCA0OS44MTU2IDU3LjMyODVDNDcuMDQ3NiA1OS42ODU2IDQzLjg4MDkgNjEuNDAxMiA0MC41MDM2IDYyLjM3MzRDNDAuMTc0IDYyLjQ2ODMgMzkuODI4IDYyLjQ2ODMgMzkuNDk4MiA2Mi4zNzM0QzM2LjEyMDkgNjEuNDAxNCAzMi45NTM4IDU5LjY4NiAzMC4xODU2IDU3LjMyODlDMjcuNDE3NiA1NC45NzE4IDI1LjEwNDUgNTIuMDIxNCAyMy4zODQyIDQ4LjY1MjlDMjEuNjYzOCA0NS4yODQzIDIwLjU3MTMgNDEuNTY2MiAyMC4xNzE1IDM3LjcxOThDMTkuNzcxNyAzMy44NzM0IDIwLjA3MjcgMjkuOTc2OSAyMS4wNTY3IDI2LjI2MjJDMjEuMTgzMSAyNS43ODUgMjEuNDUwMSAyNS4zNjg3IDIxLjgxNSAyNS4wNzk4QzIyLjE3OTkgMjQuNzkwOSAyMi42MjE1IDI0LjY0NjIgMjMuMDY5MyAyNC42Njg5QzI4LjU1MTMgMjQuOTQ3IDMzLjkyOTMgMjIuOTQ0NCAzOC4xNTA3IDE5LjA1MzNMMzguNjc3MyAxOC41NTMzTDM4Ljg2OTYgMTguMzg2N0MzOS4wMDQ3IDE4LjI4NDIgMzkuMTUwNSAxOC4yMDA2IDM5LjMwNCAxOC4xMzc4TDM5LjUyODIgMTguMDYyMkMzOS42MDY5IDE4LjA0MTIgMzkuNjg2NSAxOC4wMjU2IDM5Ljc2NjcgMTguMDE1NkwzOS45OTY5IDE4Wk00MC4wMDA5IDMzLjU1NTZDMzguOTkwNSAzMy41NTUxIDM4LjAxNzMgMzMuOTc4NyAzNy4yNzY1IDM0Ljc0MTFDMzYuNTM1NiAzNS41MDM2IDM2LjA4MTYgMzYuNTQ4NSAzNi4wMDU4IDM3LjY2NjdMMzUuOTk1OCAzOEwzNi4wMDU4IDM4LjMzMzRDMzYuMDU1MSAzOS4wNTQ3IDM2LjI2MjUgMzkuNzUxOCAzNi42MDk4IDQwLjM2NEMzNi45NTY5IDQwLjk3NjIgMzcuNDMzNiA0MS40ODUxIDM3Ljk5ODUgNDEuODQ2N1Y0NS43Nzc4TDM4LjAxMjUgNDYuMDM3OEMzOC4wNzI3IDQ2LjYwMDMgMzguMzI0MiA0Ny4xMTU4IDM4LjcxNTYgNDcuNDc5NEMzOS4xMDcxIDQ3Ljg0MjkgMzkuNjA4NyA0OC4wMjY5IDQwLjExODIgNDcuOTkzOEM0MC42Mjc4IDQ3Ljk2MDUgNDEuMTA2NyA0Ny43MTI3IDQxLjQ1NzEgNDcuMzAwOUM0MS44MDc2IDQ2Ljg4ODkgNDIuMDAyOSA0Ni4zNDQzIDQyLjAwMzYgNDUuNzc3OEw0Mi4wMDU2IDQxLjg0ODlDNDIuNzY5MSA0MS4zNTk2IDQzLjM2NiA0MC42MDQyIDQzLjcwMzQgMzkuNzAwMkM0NC4wNDA3IDM4Ljc5NiA0NC4wOTk2IDM3Ljc5MzggNDMuODcxMSAzNi44NDg3QzQzLjY0MjcgMzUuOTAzNiA0My4xMzk2IDM1LjA2ODUgNDIuNDM5OCAzNC40NzMxQzQxLjc0IDMzLjg3NzYgNDAuODgyNyAzMy41NTUxIDQwLjAwMDkgMzMuNTU1NloiIGZpbGw9InVybCgjcGFpbnQxX2xpbmVhcl8xXzkxKSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzFfOTEiIHgxPSI0MCIgeTE9IjAiIHgyPSI0MCIgeTI9IjgwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiM4MzU2QkQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjN0MyMEY0Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8xXzkxIiB4MT0iNDAiIHkxPSIxOCIgeDI9IjQwIiB5Mj0iNjIuNDQ0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFMUQ4RkIiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K";
126-
}
127-
default: {
128-
return getWalletInfo(id, true);
129-
}
130-
}
26+
return getWalletInfo(id, true);
13127
},
13228
retry: false,
13329
});

0 commit comments

Comments
 (0)