thirdweb 5.105.6 → 5.105.7-nightly-4c6a421d64336d7c18956a4128fea40866b9c9b1-20250706232018
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/cjs/react/web/ui/Bridge/BuyWidget.js +1 -0
- package/dist/cjs/react/web/ui/Bridge/BuyWidget.js.map +1 -1
- package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js +1 -0
- package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js.map +1 -1
- package/dist/cjs/react/web/ui/Bridge/TransactionWidget.js +1 -0
- package/dist/cjs/react/web/ui/Bridge/TransactionWidget.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- package/dist/cjs/wallets/create-wallet.js +9 -1
- package/dist/cjs/wallets/create-wallet.js.map +1 -1
- package/dist/cjs/wallets/native/create-wallet.js +9 -1
- package/dist/cjs/wallets/native/create-wallet.js.map +1 -1
- package/dist/cjs/wallets/wallet-connect/controller.js +62 -103
- package/dist/cjs/wallets/wallet-connect/controller.js.map +1 -1
- package/dist/esm/react/web/ui/Bridge/BuyWidget.js +1 -0
- package/dist/esm/react/web/ui/Bridge/BuyWidget.js.map +1 -1
- package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js +1 -0
- package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js.map +1 -1
- package/dist/esm/react/web/ui/Bridge/TransactionWidget.js +1 -0
- package/dist/esm/react/web/ui/Bridge/TransactionWidget.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/esm/wallets/create-wallet.js +9 -1
- package/dist/esm/wallets/create-wallet.js.map +1 -1
- package/dist/esm/wallets/native/create-wallet.js +9 -1
- package/dist/esm/wallets/native/create-wallet.js.map +1 -1
- package/dist/esm/wallets/wallet-connect/controller.js +63 -104
- package/dist/esm/wallets/wallet-connect/controller.js.map +1 -1
- package/dist/types/react/web/ui/Bridge/BuyWidget.d.ts.map +1 -1
- package/dist/types/react/web/ui/Bridge/CheckoutWidget.d.ts.map +1 -1
- package/dist/types/react/web/ui/Bridge/TransactionWidget.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/version.d.ts.map +1 -1
- package/dist/types/wallets/create-wallet.d.ts.map +1 -1
- package/dist/types/wallets/native/create-wallet.d.ts.map +1 -1
- package/dist/types/wallets/wallet-connect/controller.d.ts +2 -2
- package/dist/types/wallets/wallet-connect/controller.d.ts.map +1 -1
- package/dist/types/wallets/wallet-connect/types.d.ts +12 -3
- package/dist/types/wallets/wallet-connect/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/react/web/ui/Bridge/BuyWidget.tsx +1 -0
- package/src/react/web/ui/Bridge/CheckoutWidget.tsx +1 -0
- package/src/react/web/ui/Bridge/TransactionWidget.tsx +1 -0
- package/src/version.ts +1 -1
- package/src/wallets/create-wallet.ts +8 -1
- package/src/wallets/native/create-wallet.ts +8 -1
- package/src/wallets/wallet-connect/controller.ts +101 -164
- package/src/wallets/wallet-connect/types.ts +12 -16
@@ -1,4 +1,4 @@
|
|
1
|
-
import type {
|
1
|
+
import type { UniversalProvider } from "@walletconnect/universal-provider";
|
2
2
|
import type { Chain } from "../../chains/types.js";
|
3
3
|
import type { ThirdwebClient } from "../../client/client.js";
|
4
4
|
import type { AsyncStorage } from "../../utils/storage/AsyncStorage.js";
|
@@ -8,7 +8,7 @@ import type { DisconnectFn, SwitchChainFn } from "../types.js";
|
|
8
8
|
import type { WalletEmitter } from "../wallet-emitter.js";
|
9
9
|
import type { WalletId } from "../wallet-types.js";
|
10
10
|
import type { WCAutoConnectOptions, WCConnectOptions } from "./types.js";
|
11
|
-
type WCProvider = InstanceType<typeof
|
11
|
+
type WCProvider = InstanceType<typeof UniversalProvider>;
|
12
12
|
/**
|
13
13
|
* Checks if the provided wallet is a Wallet Connect wallet.
|
14
14
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/wallets/wallet-connect/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/wallets/wallet-connect/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAY3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAU7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAOxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EACV,OAAO,EAEP,MAAM,EACP,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEzE,KAAK,UAAU,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAezD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,GACvB,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,CAEnC;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,aAAa,CAAC,oBAAoB,CAAC,EAC5C,QAAQ,EAAE,oBAAoB,GAAG,eAAe,EAChD,OAAO,EAAE,YAAY,EACrB,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CA6GvC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,aAAa,CAAC,oBAAoB,CAAC,EAC5C,QAAQ,EAAE,oBAAoB,GAAG,eAAe,EAChD,OAAO,EAAE,YAAY,EACrB,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAyCvC;AAwKD,iBAAS,SAAS,CAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,aAAa,CAAC,oBAAoB,CAAC,EAC5C,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,cAAc,GACrB,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,CAAC,CAkD/C"}
|
@@ -1,10 +1,19 @@
|
|
1
|
-
import type { EthereumProvider } from "@walletconnect/ethereum-provider";
|
2
1
|
import type { Chain } from "../../chains/types.js";
|
3
2
|
import type { ThirdwebClient } from "../../client/client.js";
|
4
3
|
import type { Prettify } from "../../utils/type-utils.js";
|
5
4
|
import type { AppMetadata } from "../types.js";
|
6
|
-
type
|
7
|
-
|
5
|
+
type WalletConnectQRCodeModalOptions = {
|
6
|
+
themeMode?: "light" | "dark";
|
7
|
+
themeVariables?: Record<string, string>;
|
8
|
+
desktopWallets?: Record<string, unknown>[];
|
9
|
+
enableExplorer?: boolean;
|
10
|
+
explorerRecommendedWalletIds?: string[];
|
11
|
+
explorerExcludedWalletIds?: string[];
|
12
|
+
mobileWallets?: Record<string, unknown>[];
|
13
|
+
privacyPolicyUrl?: string;
|
14
|
+
termsOfServiceUrl?: string;
|
15
|
+
walletImages?: Record<string, string>;
|
16
|
+
};
|
8
17
|
export type WalletConnectConfig = {
|
9
18
|
/**
|
10
19
|
* Your project’s unique identifier that can be obtained at https://cloud.walletconnect.com/
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/wallets/wallet-connect/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/wallets/wallet-connect/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,KAAK,+BAA+B,GAAG;IACrC,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;IACxC,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;;;OAeG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,cAAc,CAAC;IAEvB,aAAa,CAAC,EAAE,QAAQ,CACtB,mBAAmB,GAAG;QACpB;;;;;;;;;;;;;;;;;;;;;;;;;WAyBG;QACH,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC;QACzB;;;;;;;;;;;;;;;;;WAiBG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB;;WAEG;QACH,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB;;;WAGG;QACH,cAAc,CAAC,EAAE,+BAA+B,CAAC;QACjD;;;;;;;;;;;;;WAaG;QACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;KACvC,CACF,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,cAAc,CAAC;IAEvB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAExC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC"}
|
package/package.json
CHANGED
@@ -23,8 +23,8 @@
|
|
23
23
|
"@radix-ui/react-tooltip": "1.2.7",
|
24
24
|
"@storybook/react": "9.0.15",
|
25
25
|
"@tanstack/react-query": "5.81.5",
|
26
|
-
"@walletconnect/ethereum-provider": "2.20.1",
|
27
26
|
"@walletconnect/sign-client": "2.20.1",
|
27
|
+
"@walletconnect/universal-provider": "2.21.4",
|
28
28
|
"abitype": "1.0.8",
|
29
29
|
"cross-spawn": "7.0.6",
|
30
30
|
"fuse.js": "7.1.0",
|
@@ -375,7 +375,7 @@
|
|
375
375
|
}
|
376
376
|
},
|
377
377
|
"typings": "./dist/types/exports/thirdweb.d.ts",
|
378
|
-
"version": "5.105.
|
378
|
+
"version": "5.105.7-nightly-4c6a421d64336d7c18956a4128fea40866b9c9b1-20250706232018",
|
379
379
|
"scripts": {
|
380
380
|
"bench": "vitest -c ./test/vitest.config.ts bench",
|
381
381
|
"bench:compare": "bun run ./benchmarks/run.ts",
|
package/src/version.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export const version = "5.105.
|
1
|
+
export const version = "5.105.7-nightly-4c6a421d64336d7c18956a4128fea40866b9c9b1-20250706232018";
|
@@ -399,7 +399,14 @@ export function createWallet<const ID extends WalletId>(
|
|
399
399
|
getConfig: () => args[1],
|
400
400
|
id,
|
401
401
|
subscribe: emitter.subscribe,
|
402
|
-
switchChain: (c) =>
|
402
|
+
switchChain: async (c) => {
|
403
|
+
try {
|
404
|
+
await handleSwitchChain(c);
|
405
|
+
chain = c;
|
406
|
+
} catch (e) {
|
407
|
+
console.error("Error switching chain", e);
|
408
|
+
}
|
409
|
+
},
|
403
410
|
};
|
404
411
|
return wallet;
|
405
412
|
}
|
@@ -230,7 +230,14 @@ export function createWallet<const ID extends WalletId>(
|
|
230
230
|
getConfig: () => args[1],
|
231
231
|
id,
|
232
232
|
subscribe: emitter.subscribe,
|
233
|
-
switchChain: (c) =>
|
233
|
+
switchChain: async (c) => {
|
234
|
+
try {
|
235
|
+
await handleSwitchChain(c);
|
236
|
+
chain = c;
|
237
|
+
} catch (e) {
|
238
|
+
console.error("Error switching chain", e);
|
239
|
+
}
|
240
|
+
},
|
234
241
|
};
|
235
242
|
return wallet;
|
236
243
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type {
|
1
|
+
import type { UniversalProvider } from "@walletconnect/universal-provider";
|
2
2
|
import type { Address } from "abitype";
|
3
3
|
import {
|
4
4
|
getTypesForEIP712Domain,
|
@@ -11,11 +11,7 @@ import {
|
|
11
11
|
} from "viem";
|
12
12
|
import { trackTransaction } from "../../analytics/track/transaction.js";
|
13
13
|
import type { Chain } from "../../chains/types.js";
|
14
|
-
import {
|
15
|
-
getCachedChain,
|
16
|
-
getChainMetadata,
|
17
|
-
getRpcUrlForChain,
|
18
|
-
} from "../../chains/utils.js";
|
14
|
+
import { getCachedChain, getRpcUrlForChain } from "../../chains/utils.js";
|
19
15
|
import type { ThirdwebClient } from "../../client/client.js";
|
20
16
|
import { getAddress } from "../../utils/address.js";
|
21
17
|
import {
|
@@ -40,7 +36,6 @@ import type {
|
|
40
36
|
Wallet,
|
41
37
|
} from "../interfaces/wallet.js";
|
42
38
|
import type { DisconnectFn, SwitchChainFn } from "../types.js";
|
43
|
-
import { getValidPublicRPCUrl } from "../utils/chains.js";
|
44
39
|
import { getDefaultAppMetadata } from "../utils/defaultDappMetadata.js";
|
45
40
|
import { normalizeChainId } from "../utils/normalizeChainId.js";
|
46
41
|
import type { WalletEmitter } from "../wallet-emitter.js";
|
@@ -48,7 +43,9 @@ import type { WalletId } from "../wallet-types.js";
|
|
48
43
|
import { DEFAULT_PROJECT_ID, NAMESPACE } from "./constants.js";
|
49
44
|
import type { WCAutoConnectOptions, WCConnectOptions } from "./types.js";
|
50
45
|
|
51
|
-
type WCProvider = InstanceType<typeof
|
46
|
+
type WCProvider = InstanceType<typeof UniversalProvider>;
|
47
|
+
|
48
|
+
let cachedProvider: WCProvider | null = null;
|
52
49
|
|
53
50
|
type SavedConnectParams = {
|
54
51
|
optionalChains?: Chain[];
|
@@ -56,10 +53,6 @@ type SavedConnectParams = {
|
|
56
53
|
pairingTopic?: string;
|
57
54
|
};
|
58
55
|
|
59
|
-
const ADD_ETH_CHAIN_METHOD = "wallet_addEthereumChain";
|
60
|
-
|
61
|
-
const defaultShowQrModal = true;
|
62
|
-
|
63
56
|
const storageKeys = {
|
64
57
|
lastUsedChainId: "tw.wc.lastUsedChainId",
|
65
58
|
requestedChains: "tw.wc.requestedChains",
|
@@ -123,37 +116,56 @@ export async function connectWC(
|
|
123
116
|
}
|
124
117
|
}
|
125
118
|
|
126
|
-
|
127
|
-
|
128
|
-
requiredChain,
|
129
|
-
optionalChains: chainsToRequest,
|
130
|
-
} = getChainsToRequest({
|
119
|
+
// For UniversalProvider, we still need chain configuration for session management
|
120
|
+
const { chains: chainsToRequest, rpcMap } = getChainsToRequest({
|
131
121
|
chain: chainToRequest,
|
132
122
|
client: options.client,
|
133
123
|
optionalChains: optionalChains,
|
134
124
|
});
|
135
125
|
|
136
|
-
if (provider.session) {
|
126
|
+
if (!provider.session) {
|
127
|
+
// For UniversalProvider, we need to connect with namespaces
|
137
128
|
await provider.connect({
|
138
129
|
...(wcOptions?.pairingTopic
|
139
130
|
? { pairingTopic: wcOptions?.pairingTopic }
|
140
131
|
: {}),
|
141
|
-
|
142
|
-
|
143
|
-
|
132
|
+
namespaces: {
|
133
|
+
[NAMESPACE]: {
|
134
|
+
chains: chainsToRequest,
|
135
|
+
events: ["chainChanged", "accountsChanged"],
|
136
|
+
methods: [
|
137
|
+
"eth_sendTransaction",
|
138
|
+
"eth_signTransaction",
|
139
|
+
"eth_sign",
|
140
|
+
"personal_sign",
|
141
|
+
"eth_signTypedData",
|
142
|
+
"wallet_switchEthereumChain",
|
143
|
+
"wallet_addEthereumChain",
|
144
|
+
],
|
145
|
+
rpcMap,
|
146
|
+
},
|
147
|
+
},
|
144
148
|
});
|
145
149
|
}
|
146
150
|
|
147
|
-
setRequestedChainsIds(
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
+
setRequestedChainsIds(
|
152
|
+
chainsToRequest.map((x) => Number(x.split(":")[1])),
|
153
|
+
storage,
|
154
|
+
);
|
155
|
+
const currentChainId = chainsToRequest[0]?.split(":")[1] || 1;
|
156
|
+
const providerChainId = normalizeChainId(currentChainId);
|
157
|
+
const accounts: string[] = await provider.request(
|
158
|
+
{
|
159
|
+
method: "eth_requestAccounts",
|
160
|
+
params: [],
|
161
|
+
},
|
162
|
+
`eip155:${providerChainId}`,
|
163
|
+
);
|
164
|
+
const address = accounts[0];
|
151
165
|
if (!address) {
|
152
166
|
throw new Error("No accounts found on provider.");
|
153
167
|
}
|
154
168
|
|
155
|
-
const providerChainId = normalizeChainId(provider.chainId);
|
156
|
-
|
157
169
|
const chain =
|
158
170
|
options.chain && options.chain.id === providerChainId
|
159
171
|
? options.chain
|
@@ -209,16 +221,19 @@ export async function autoConnectWC(
|
|
209
221
|
},
|
210
222
|
walletId,
|
211
223
|
sessionHandler,
|
212
|
-
true, // is auto connect
|
213
224
|
);
|
214
225
|
|
215
|
-
|
226
|
+
// For UniversalProvider, get accounts from enable() method
|
227
|
+
const addresses = await provider.enable();
|
228
|
+
const address = addresses[0];
|
216
229
|
|
217
230
|
if (!address) {
|
218
231
|
throw new Error("No accounts found on provider.");
|
219
232
|
}
|
220
233
|
|
221
|
-
|
234
|
+
// For UniversalProvider, get chainId from the session namespaces or use default
|
235
|
+
const currentChainId = options.chain?.id || 1;
|
236
|
+
const providerChainId = normalizeChainId(currentChainId);
|
222
237
|
|
223
238
|
const chain =
|
224
239
|
options.chain && options.chain.id === providerChainId
|
@@ -234,12 +249,15 @@ async function initProvider(
|
|
234
249
|
options: WCConnectOptions,
|
235
250
|
walletId: WCSupportedWalletIds | "walletConnect",
|
236
251
|
sessionRequestHandler?: (uri: string) => void | Promise<void>,
|
237
|
-
isAutoConnect = false,
|
238
252
|
) {
|
253
|
+
if (cachedProvider) {
|
254
|
+
return cachedProvider;
|
255
|
+
}
|
256
|
+
|
239
257
|
const walletInfo = await getWalletInfo(walletId);
|
240
258
|
const wcOptions = options.walletConnect;
|
241
|
-
const {
|
242
|
-
"@walletconnect/
|
259
|
+
const { UniversalProvider } = await import(
|
260
|
+
"@walletconnect/universal-provider"
|
243
261
|
);
|
244
262
|
|
245
263
|
let optionalChains: Chain[] | undefined = wcOptions?.optionalChains;
|
@@ -253,19 +271,7 @@ async function initProvider(
|
|
253
271
|
}
|
254
272
|
}
|
255
273
|
|
256
|
-
const {
|
257
|
-
rpcMap,
|
258
|
-
requiredChain,
|
259
|
-
optionalChains: chainsToRequest,
|
260
|
-
} = getChainsToRequest({
|
261
|
-
chain: chainToRequest,
|
262
|
-
client: options.client,
|
263
|
-
optionalChains: optionalChains,
|
264
|
-
});
|
265
|
-
|
266
|
-
const provider = await EthereumProvider.init({
|
267
|
-
chains: requiredChain ? [requiredChain.id] : undefined,
|
268
|
-
disableProviderPing: true,
|
274
|
+
const provider = await UniversalProvider.init({
|
269
275
|
metadata: {
|
270
276
|
description:
|
271
277
|
wcOptions?.appMetadata?.description ||
|
@@ -276,31 +282,11 @@ async function initProvider(
|
|
276
282
|
name: wcOptions?.appMetadata?.name || getDefaultAppMetadata().name,
|
277
283
|
url: wcOptions?.appMetadata?.url || getDefaultAppMetadata().url,
|
278
284
|
},
|
279
|
-
optionalChains: chainsToRequest,
|
280
|
-
optionalEvents: OPTIONAL_EVENTS,
|
281
|
-
optionalMethods: OPTIONAL_METHODS,
|
282
285
|
projectId: wcOptions?.projectId || DEFAULT_PROJECT_ID,
|
283
|
-
qrModalOptions: wcOptions?.qrModalOptions,
|
284
|
-
rpcMap: rpcMap,
|
285
|
-
showQrModal:
|
286
|
-
wcOptions?.showQrModal === undefined
|
287
|
-
? sessionRequestHandler
|
288
|
-
? false
|
289
|
-
: defaultShowQrModal
|
290
|
-
: wcOptions.showQrModal,
|
291
286
|
});
|
292
287
|
|
293
288
|
provider.events.setMaxListeners(Number.POSITIVE_INFINITY);
|
294
289
|
|
295
|
-
// disconnect the provider if chains are stale when (if not auto connecting)
|
296
|
-
if (!isAutoConnect) {
|
297
|
-
// const isStale = await isChainsStale(provider, chainsToRequest);
|
298
|
-
|
299
|
-
if (provider.session) {
|
300
|
-
await provider.disconnect();
|
301
|
-
}
|
302
|
-
}
|
303
|
-
|
304
290
|
if (walletId !== "walletConnect") {
|
305
291
|
async function handleSessionRequest() {
|
306
292
|
const walletLinkToOpen =
|
@@ -314,12 +300,16 @@ async function initProvider(
|
|
314
300
|
}
|
315
301
|
}
|
316
302
|
|
317
|
-
|
303
|
+
// For UniversalProvider, use different event handling
|
304
|
+
provider.on("session_request_sent", handleSessionRequest);
|
318
305
|
provider.events.addListener("disconnect", () => {
|
319
|
-
provider.
|
306
|
+
provider.off("session_request_sent", handleSessionRequest);
|
307
|
+
cachedProvider = null;
|
320
308
|
});
|
321
309
|
}
|
322
310
|
|
311
|
+
cachedProvider = provider;
|
312
|
+
|
323
313
|
return provider;
|
324
314
|
}
|
325
315
|
|
@@ -327,26 +317,31 @@ function createAccount({
|
|
327
317
|
provider,
|
328
318
|
address,
|
329
319
|
client,
|
320
|
+
chain,
|
330
321
|
}: {
|
331
322
|
provider: WCProvider;
|
332
323
|
address: string;
|
333
324
|
client: ThirdwebClient;
|
325
|
+
chain: Chain;
|
334
326
|
}) {
|
335
327
|
const account: Account = {
|
336
328
|
address: getAddress(address),
|
337
329
|
async sendTransaction(tx: SendTransactionOption) {
|
338
|
-
const transactionHash = (await provider.request(
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
330
|
+
const transactionHash = (await provider.request(
|
331
|
+
{
|
332
|
+
method: "eth_sendTransaction",
|
333
|
+
params: [
|
334
|
+
{
|
335
|
+
data: tx.data,
|
336
|
+
from: getAddress(address),
|
337
|
+
gas: tx.gas ? numberToHex(tx.gas) : undefined,
|
338
|
+
to: tx.to as Address,
|
339
|
+
value: tx.value ? numberToHex(tx.value) : undefined,
|
340
|
+
},
|
341
|
+
],
|
342
|
+
},
|
343
|
+
`eip155:${tx.chainId}`,
|
344
|
+
)) as Hex;
|
350
345
|
|
351
346
|
trackTransaction({
|
352
347
|
chainId: tx.chainId,
|
@@ -372,10 +367,13 @@ function createAccount({
|
|
372
367
|
}
|
373
368
|
return message.raw;
|
374
369
|
})();
|
375
|
-
return provider.request(
|
376
|
-
|
377
|
-
|
378
|
-
|
370
|
+
return provider.request(
|
371
|
+
{
|
372
|
+
method: "personal_sign",
|
373
|
+
params: [messageToSign, this.address],
|
374
|
+
},
|
375
|
+
`eip155:${chain.id}`,
|
376
|
+
);
|
379
377
|
},
|
380
378
|
async signTypedData(_data) {
|
381
379
|
const data = parseTypedData(_data);
|
@@ -398,10 +396,13 @@ function createAccount({
|
|
398
396
|
types,
|
399
397
|
});
|
400
398
|
|
401
|
-
return await provider.request(
|
402
|
-
|
403
|
-
|
404
|
-
|
399
|
+
return await provider.request(
|
400
|
+
{
|
401
|
+
method: "eth_signTypedData_v4",
|
402
|
+
params: [this.address, typedData],
|
403
|
+
},
|
404
|
+
`eip155:${chain.id}`,
|
405
|
+
);
|
405
406
|
},
|
406
407
|
};
|
407
408
|
|
@@ -416,13 +417,14 @@ function onConnect(
|
|
416
417
|
storage: AsyncStorage,
|
417
418
|
client: ThirdwebClient,
|
418
419
|
): [Account, Chain, DisconnectFn, SwitchChainFn] {
|
419
|
-
const account = createAccount({ address, client, provider });
|
420
|
+
const account = createAccount({ address, chain, client, provider });
|
420
421
|
|
421
422
|
async function disconnect() {
|
422
423
|
provider.removeListener("accountsChanged", onAccountsChanged);
|
423
424
|
provider.removeListener("chainChanged", onChainChanged);
|
424
425
|
provider.removeListener("disconnect", onDisconnect);
|
425
426
|
await provider.disconnect();
|
427
|
+
cachedProvider = null;
|
426
428
|
}
|
427
429
|
|
428
430
|
function onDisconnect() {
|
@@ -436,6 +438,7 @@ function onConnect(
|
|
436
438
|
if (accounts[0]) {
|
437
439
|
const newAccount = createAccount({
|
438
440
|
address: getAddress(accounts[0]),
|
441
|
+
chain,
|
439
442
|
client,
|
440
443
|
provider,
|
441
444
|
});
|
@@ -461,66 +464,14 @@ function onConnect(
|
|
461
464
|
account,
|
462
465
|
chain,
|
463
466
|
disconnect,
|
464
|
-
(newChain) => switchChainWC(provider, newChain
|
467
|
+
(newChain) => switchChainWC(provider, newChain),
|
465
468
|
];
|
466
469
|
}
|
467
470
|
|
468
|
-
|
469
|
-
|
470
|
-
function getNamespaceMethods(provider: WCProvider) {
|
471
|
-
return provider.session?.namespaces[NAMESPACE]?.methods || [];
|
472
|
-
}
|
473
|
-
|
474
|
-
function getNamespaceChainsIds(provider: WCProvider): number[] {
|
475
|
-
const chainIds = provider.session?.namespaces[NAMESPACE]?.chains?.map(
|
476
|
-
(chain) => Number.parseInt(chain.split(":")[1] || ""),
|
477
|
-
);
|
478
|
-
|
479
|
-
return chainIds ?? [];
|
480
|
-
}
|
481
|
-
|
482
|
-
async function switchChainWC(
|
483
|
-
provider: WCProvider,
|
484
|
-
chain: Chain,
|
485
|
-
storage: AsyncStorage,
|
486
|
-
) {
|
471
|
+
async function switchChainWC(provider: WCProvider, chain: Chain) {
|
487
472
|
const chainId = chain.id;
|
488
473
|
try {
|
489
|
-
|
490
|
-
const namespaceMethods = getNamespaceMethods(provider);
|
491
|
-
const isChainApproved = namespaceChains.includes(chainId);
|
492
|
-
|
493
|
-
if (!isChainApproved && namespaceMethods.includes(ADD_ETH_CHAIN_METHOD)) {
|
494
|
-
const apiChain = await getChainMetadata(chain);
|
495
|
-
|
496
|
-
const blockExplorerUrls = [
|
497
|
-
...new Set([
|
498
|
-
...(chain.blockExplorers?.map((x) => x.url) || []),
|
499
|
-
...(apiChain.explorers?.map((x) => x.url) || []),
|
500
|
-
]),
|
501
|
-
];
|
502
|
-
|
503
|
-
await provider.request({
|
504
|
-
method: ADD_ETH_CHAIN_METHOD,
|
505
|
-
params: [
|
506
|
-
{
|
507
|
-
blockExplorerUrls:
|
508
|
-
blockExplorerUrls.length > 0 ? blockExplorerUrls : undefined,
|
509
|
-
chainId: numberToHex(apiChain.chainId),
|
510
|
-
chainName: apiChain.name,
|
511
|
-
nativeCurrency: apiChain.nativeCurrency, // no clientId on purpose
|
512
|
-
rpcUrls: getValidPublicRPCUrl(apiChain),
|
513
|
-
},
|
514
|
-
],
|
515
|
-
});
|
516
|
-
const requestedChains = await getRequestedChainsIds(storage);
|
517
|
-
requestedChains.push(chainId);
|
518
|
-
setRequestedChainsIds(requestedChains, storage);
|
519
|
-
}
|
520
|
-
await provider.request({
|
521
|
-
method: "wallet_switchEthereumChain",
|
522
|
-
params: [{ chainId: numberToHex(chainId) }],
|
523
|
-
});
|
474
|
+
provider.setDefaultChain(`eip155:${chainId}`);
|
524
475
|
} catch (error) {
|
525
476
|
const message =
|
526
477
|
typeof error === "string" ? error : (error as ProviderRpcError)?.message;
|
@@ -543,35 +494,23 @@ function setRequestedChainsIds(
|
|
543
494
|
storage?.setItem(storageKeys.requestedChains, stringify(chains));
|
544
495
|
}
|
545
496
|
|
546
|
-
/**
|
547
|
-
* Get the last requested chains from the storage.
|
548
|
-
* @internal
|
549
|
-
*/
|
550
|
-
async function getRequestedChainsIds(storage: AsyncStorage): Promise<number[]> {
|
551
|
-
const data = await storage.getItem(storageKeys.requestedChains);
|
552
|
-
return data ? JSON.parse(data) : [];
|
553
|
-
}
|
554
|
-
|
555
|
-
type ArrayOneOrMore<T> = {
|
556
|
-
0: T;
|
557
|
-
} & Array<T>;
|
558
|
-
|
559
497
|
function getChainsToRequest(options: {
|
560
498
|
chain?: Chain;
|
561
499
|
optionalChains?: Chain[];
|
562
500
|
client: ThirdwebClient;
|
563
501
|
}): {
|
564
502
|
rpcMap: Record<number, string>;
|
565
|
-
|
566
|
-
optionalChains: ArrayOneOrMore<number>;
|
503
|
+
chains: string[];
|
567
504
|
} {
|
568
505
|
const rpcMap: Record<number, string> = {};
|
506
|
+
const chainIds: number[] = [];
|
569
507
|
|
570
508
|
if (options.chain) {
|
571
509
|
rpcMap[options.chain.id] = getRpcUrlForChain({
|
572
510
|
chain: options.chain,
|
573
511
|
client: options.client,
|
574
512
|
});
|
513
|
+
chainIds.push(options.chain.id);
|
575
514
|
}
|
576
515
|
|
577
516
|
// limit optional chains to 10
|
@@ -582,18 +521,16 @@ function getChainsToRequest(options: {
|
|
582
521
|
chain: chain,
|
583
522
|
client: options.client,
|
584
523
|
});
|
524
|
+
chainIds.push(chain.id);
|
585
525
|
}
|
586
526
|
|
587
527
|
if (!options.chain && optionalChains.length === 0) {
|
588
528
|
rpcMap[1] = getCachedChain(1).rpc;
|
529
|
+
chainIds.push(1);
|
589
530
|
}
|
590
531
|
|
591
532
|
return {
|
592
|
-
|
593
|
-
optionalChains.length > 0
|
594
|
-
? (optionalChains.map((x) => x.id) as ArrayOneOrMore<number>)
|
595
|
-
: [1],
|
596
|
-
requiredChain: options.chain ? options.chain : undefined,
|
533
|
+
chains: chainIds.map((x) => `eip155:${x}`),
|
597
534
|
rpcMap,
|
598
535
|
};
|
599
536
|
}
|
@@ -1,24 +1,20 @@
|
|
1
|
-
import type { EthereumProvider } from "@walletconnect/ethereum-provider";
|
2
1
|
import type { Chain } from "../../chains/types.js";
|
3
2
|
import type { ThirdwebClient } from "../../client/client.js";
|
4
3
|
import type { Prettify } from "../../utils/type-utils.js";
|
5
4
|
import type { AppMetadata } from "../types.js";
|
6
5
|
|
7
|
-
type
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
| "termsOfServiceUrl"
|
20
|
-
| "walletImages"
|
21
|
-
>;
|
6
|
+
type WalletConnectQRCodeModalOptions = {
|
7
|
+
themeMode?: "light" | "dark";
|
8
|
+
themeVariables?: Record<string, string>;
|
9
|
+
desktopWallets?: Record<string, unknown>[];
|
10
|
+
enableExplorer?: boolean;
|
11
|
+
explorerRecommendedWalletIds?: string[];
|
12
|
+
explorerExcludedWalletIds?: string[];
|
13
|
+
mobileWallets?: Record<string, unknown>[];
|
14
|
+
privacyPolicyUrl?: string;
|
15
|
+
termsOfServiceUrl?: string;
|
16
|
+
walletImages?: Record<string, string>;
|
17
|
+
};
|
22
18
|
|
23
19
|
export type WalletConnectConfig = {
|
24
20
|
/**
|