Skip to content

Commit cf7b6fc

Browse files
feat: createWalletAdapter for interop with other libraries (#2997)
Co-authored-by: Manan Tank <manantankm@gmail.com>
1 parent 523cd1e commit cf7b6fc

File tree

6 files changed

+71
-2
lines changed

6 files changed

+71
-2
lines changed

.changeset/three-news-melt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"thirdweb": minor
3+
---
4+
5+
added `createWalletAdapter` helper for interop with diff libraries
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import type { Chain } from "../chains/types.js";
2+
import type { ThirdwebClient } from "../client/client.js";
3+
import type { Account, Wallet } from "../wallets/interfaces/wallet.js";
4+
import { createWalletEmitter } from "../wallets/wallet-emitter.js";
5+
6+
export type AdapterWalletOptions = {
7+
client: ThirdwebClient;
8+
adaptedAccount: Account;
9+
chain: Chain;
10+
onDisconnect: () => Promise<void> | void;
11+
switchChain: (chain: Chain) => Promise<void> | void;
12+
};
13+
14+
export function createWalletAdapter(
15+
options: AdapterWalletOptions,
16+
): Wallet<"adapter"> {
17+
const emitter = createWalletEmitter<"adapter">();
18+
let _chain = options.chain;
19+
return {
20+
id: "adapter",
21+
subscribe: emitter.subscribe,
22+
connect: async () => {
23+
emitter.emit("onConnect", options);
24+
return options.adaptedAccount;
25+
},
26+
autoConnect: async () => {
27+
emitter.emit("onConnect", options);
28+
return options.adaptedAccount;
29+
},
30+
disconnect: async () => {
31+
await options.onDisconnect();
32+
emitter.emit("disconnect", undefined);
33+
},
34+
getAccount() {
35+
return options.adaptedAccount;
36+
},
37+
getChain() {
38+
return _chain;
39+
},
40+
getConfig() {
41+
return options;
42+
},
43+
switchChain: async (chain) => {
44+
await options.switchChain(chain);
45+
_chain = chain;
46+
emitter.emit("chainChanged", chain);
47+
},
48+
};
49+
}

packages/thirdweb/src/exports/wallets.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,5 @@ export type {
9696

9797
export { getAllWalletsList } from "../wallets/getAllWalletsList.js";
9898
export { getWalletInfo } from "../wallets/__generated__/getWalletInfo.js";
99+
100+
export { createWalletAdapter } from "../adapters/wallet-adapter.js";

packages/thirdweb/src/react/web/ui/ConnectWallet/icons/dataUris.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,6 @@ export const smartWalletIcon =
1212

1313
export const genericTokenIcon =
1414
"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzQwNDhfNDIzMSkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTcuNTg0IDQuODU1NjZDNy43MTA2OSA0Ljc4MjUyIDcuODU0MzkgNC43NDQwMiA4LjAwMDY3IDQuNzQ0MDJDOC4xNDY5NSA0Ljc0NDAyIDguMjkwNjUgNC43ODI1MiA4LjQxNzM0IDQuODU1NjZMMTAuNTE1MyA2LjA2NjY2QzEwLjY0MiA2LjEzOTggMTAuNzQ3MiA2LjI0NSAxMC44MjA0IDYuMzcxNjhDMTAuODkzNSA2LjQ5ODM1IDEwLjkzMiA2LjY0MjA1IDEwLjkzMiA2Ljc4ODMzVjkuMjExQzEwLjkzMiA5LjM1NzI3IDEwLjg5MzUgOS41MDA5NyAxMC44MjA0IDkuNjI3NjVDMTAuNzQ3MiA5Ljc1NDMzIDEwLjY0MiA5Ljg1OTUzIDEwLjUxNTMgOS45MzI2Nkw4LjQxNzM0IDExLjE0NEM4LjI5MDY1IDExLjIxNzEgOC4xNDY5NSAxMS4yNTU2IDguMDAwNjcgMTEuMjU1NkM3Ljg1NDM5IDExLjI1NTYgNy43MTA2OSAxMS4yMTcxIDcuNTg0IDExLjE0NEw1LjQ4NiA5LjkzMjY2QzUuMzU5MzIgOS44NTk1MyA1LjI1NDEzIDkuNzU0MzMgNS4xODA5OSA5LjYyNzY1QzUuMTA3ODUgOS41MDA5NyA1LjA2OTM0IDkuMzU3MjcgNS4wNjkzNCA5LjIxMVY2Ljc4ODY2QzUuMDY5MjggNi42NDIzMyA1LjEwNzc2IDYuNDk4NTYgNS4xODA5IDYuMzcxODJDNS4yNTQwNSA2LjI0NTA4IDUuMzU5MjcgNi4xMzk4MyA1LjQ4NiA2LjA2NjY2TDcuNTg0IDQuODU1NjZaTTguMDg0IDUuNDMzQzguMDU4NjcgNS40MTgzNyA4LjAyOTkzIDUuNDEwNjcgOC4wMDA2NyA1LjQxMDY3QzcuOTcxNDEgNS40MTA2NyA3Ljk0MjY3IDUuNDE4MzcgNy45MTczNCA1LjQzM0w1LjgxOTM0IDYuNjQ0MzNDNS43OTQgNi42NTg5NiA1Ljc3Mjk2IDYuNjggNS43NTgzMyA2LjcwNTMzQzUuNzQzNyA2LjczMDY3IDUuNzM2IDYuNzU5NDEgNS43MzYgNi43ODg2NlY5LjIxMTMzQzUuNzM2IDkuMjQwNTkgNS43NDM3IDkuMjY5MzMgNS43NTgzMyA5LjI5NDY2QzUuNzcyOTYgOS4zMiA1Ljc5NCA5LjM0MTA0IDUuODE5MzQgOS4zNTU2Nkw3LjkxNzM0IDEwLjU2NjdDNy45NDI2NyAxMC41ODEzIDcuOTcxNDEgMTAuNTg5IDguMDAwNjcgMTAuNTg5QzguMDI5OTMgMTAuNTg5IDguMDU4NjcgMTAuNTgxMyA4LjA4NCAxMC41NjY3TDEwLjE4MiA5LjM1NTMzQzEwLjIwNzMgOS4zNDA3IDEwLjIyODQgOS4zMTk2NiAxMC4yNDMgOS4yOTQzM0MxMC4yNTc2IDkuMjY4OTkgMTAuMjY1MyA5LjI0MDI1IDEwLjI2NTMgOS4yMTFWNi43ODg2NkMxMC4yNjUzIDYuNzU5NDEgMTAuMjU3NiA2LjczMDY3IDEwLjI0MyA2LjcwNTMzQzEwLjIyODQgNi42OCAxMC4yMDczIDYuNjU4OTYgMTAuMTgyIDYuNjQ0MzNMOC4wODQgNS40MzNaIiBmaWxsPSIjNUM1QzVDIi8+CjwvZz4KPGNpcmNsZSBjeD0iOCIgY3k9IjgiIHI9IjcuNjkyMzEiIHN0cm9rZT0iIzVDNUM1QyIgc3Ryb2tlLXdpZHRoPSIwLjYxNTM4NSIvPgo8Y2lyY2xlIGN4PSI3Ljk5OTU1IiBjeT0iOC4wMDAwNCIgcj0iNS44NDYxNSIgc3Ryb2tlPSIjNUM1QzVDIiBzdHJva2Utd2lkdGg9IjAuNjE1Mzg1Ii8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQwNDhfNDIzMSI+CjxyZWN0IHdpZHRoPSI4IiBoZWlnaHQ9IjgiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0IDQpIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==";
15+
16+
export const genericWalletIcon =
17+
"data:image/svg+xml;base64,PHN2ZwogICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgIGZpbGw9Im5vbmUiCiAgICAgIHZpZXdCb3g9IjAgMCAxOCAxOCIKICAgICAgd2lkdGg9IjIwIgogICAgICBoZWlnaHQ9IjIwIgogICAgICByb2xlPSJwcmVzZW50YXRpb24iCiAgICA+CiAgICAgIDxwYXRoCiAgICAgICAgZmlsbD0iI2FhYSIKICAgICAgICBkPSJNMTUuNiA0LjZIMS44NXYtLjU1bDEyLjEtLjk2OHYuOTY4aDEuNjVWMi40YzAtMS4yMS0uOTgtMi4wNTktMi4xNzctMS44ODhMMi4zNzggMi4wODlDMS4xOCAyLjI2LjIgMy4zOS4yIDQuNnYxMWEyLjIgMi4yIDAgMDAyLjIgMi4yaDEzLjJhMi4yIDIuMiAwIDAwMi4yLTIuMlY2LjhhMi4yIDIuMiAwIDAwLTIuMi0yLjJ6bS0xLjY1IDcuNzA3YTEuNjUgMS42NSAwIDAxLS42My0zLjE3NiAxLjY1IDEuNjUgMCAxMS42MyAzLjE3NnoiCiAgICAgIC8+CiAgICA8L3N2Zz4=";

packages/thirdweb/src/react/web/ui/components/WalletImage.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import type { WalletId } from "../../../../wallets/wallet-types.js";
77
import { useActiveWallet } from "../../../core/hooks/wallets/wallet-hooks.js";
88
import { getStorage } from "../../../core/storage.js";
99
import { getLastAuthProvider } from "../../wallets/in-app/storage.js";
10-
import { emailIcon, phoneIcon } from "../ConnectWallet/icons/dataUris.js";
10+
import {
11+
emailIcon,
12+
genericWalletIcon,
13+
phoneIcon,
14+
} from "../ConnectWallet/icons/dataUris.js";
1115
import {
1216
appleIconUri,
1317
facebookIconUri,
@@ -81,6 +85,7 @@ export function WalletImage(props: {
8185
return (
8286
<Img
8387
src={image}
88+
fallbackImage={genericWalletIcon}
8489
width={props.size}
8590
height={props.size}
8691
loading="eager"
@@ -108,6 +113,7 @@ function WalletImageQuery(props: {
108113
<Img
109114
client={props.client}
110115
src={walletImage.data}
116+
fallbackImage={genericWalletIcon}
111117
width={props.size}
112118
height={props.size}
113119
loading="eager"

packages/thirdweb/src/wallets/wallet-types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { AdapterWalletOptions } from "../adapters/wallet-adapter.js";
12
import type { Chain } from "../chains/types.js";
23
import type { ThirdwebClient } from "../client/client.js";
34
import type {
@@ -28,6 +29,7 @@ export type WalletId =
2829
| "inApp"
2930
| "embedded" // deprecated
3031
| "smart"
32+
| "adapter"
3133
| WCSupportedWalletIds
3234
| InjectedSupportedWalletIds;
3335

@@ -116,7 +118,9 @@ export type WalletCreationOptions<T extends WalletId> = T extends "smart"
116118
? InAppWalletCreationOptions
117119
: T extends typeof COINBASE
118120
? CoinbaseWalletCreationOptions
119-
: undefined;
121+
: T extends "adapter"
122+
? AdapterWalletOptions
123+
: undefined;
120124

121125
/**
122126
* Generic type for getting the tuple type of arguments that the `createWallet` function takes.

0 commit comments

Comments
 (0)