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.
Files changed (48) hide show
  1. package/dist/cjs/react/web/ui/Bridge/BuyWidget.js +1 -0
  2. package/dist/cjs/react/web/ui/Bridge/BuyWidget.js.map +1 -1
  3. package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js +1 -0
  4. package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js.map +1 -1
  5. package/dist/cjs/react/web/ui/Bridge/TransactionWidget.js +1 -0
  6. package/dist/cjs/react/web/ui/Bridge/TransactionWidget.js.map +1 -1
  7. package/dist/cjs/version.js +1 -1
  8. package/dist/cjs/version.js.map +1 -1
  9. package/dist/cjs/wallets/create-wallet.js +9 -1
  10. package/dist/cjs/wallets/create-wallet.js.map +1 -1
  11. package/dist/cjs/wallets/native/create-wallet.js +9 -1
  12. package/dist/cjs/wallets/native/create-wallet.js.map +1 -1
  13. package/dist/cjs/wallets/wallet-connect/controller.js +62 -103
  14. package/dist/cjs/wallets/wallet-connect/controller.js.map +1 -1
  15. package/dist/esm/react/web/ui/Bridge/BuyWidget.js +1 -0
  16. package/dist/esm/react/web/ui/Bridge/BuyWidget.js.map +1 -1
  17. package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js +1 -0
  18. package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js.map +1 -1
  19. package/dist/esm/react/web/ui/Bridge/TransactionWidget.js +1 -0
  20. package/dist/esm/react/web/ui/Bridge/TransactionWidget.js.map +1 -1
  21. package/dist/esm/version.js +1 -1
  22. package/dist/esm/version.js.map +1 -1
  23. package/dist/esm/wallets/create-wallet.js +9 -1
  24. package/dist/esm/wallets/create-wallet.js.map +1 -1
  25. package/dist/esm/wallets/native/create-wallet.js +9 -1
  26. package/dist/esm/wallets/native/create-wallet.js.map +1 -1
  27. package/dist/esm/wallets/wallet-connect/controller.js +63 -104
  28. package/dist/esm/wallets/wallet-connect/controller.js.map +1 -1
  29. package/dist/types/react/web/ui/Bridge/BuyWidget.d.ts.map +1 -1
  30. package/dist/types/react/web/ui/Bridge/CheckoutWidget.d.ts.map +1 -1
  31. package/dist/types/react/web/ui/Bridge/TransactionWidget.d.ts.map +1 -1
  32. package/dist/types/version.d.ts +1 -1
  33. package/dist/types/version.d.ts.map +1 -1
  34. package/dist/types/wallets/create-wallet.d.ts.map +1 -1
  35. package/dist/types/wallets/native/create-wallet.d.ts.map +1 -1
  36. package/dist/types/wallets/wallet-connect/controller.d.ts +2 -2
  37. package/dist/types/wallets/wallet-connect/controller.d.ts.map +1 -1
  38. package/dist/types/wallets/wallet-connect/types.d.ts +12 -3
  39. package/dist/types/wallets/wallet-connect/types.d.ts.map +1 -1
  40. package/package.json +2 -2
  41. package/src/react/web/ui/Bridge/BuyWidget.tsx +1 -0
  42. package/src/react/web/ui/Bridge/CheckoutWidget.tsx +1 -0
  43. package/src/react/web/ui/Bridge/TransactionWidget.tsx +1 -0
  44. package/src/version.ts +1 -1
  45. package/src/wallets/create-wallet.ts +8 -1
  46. package/src/wallets/native/create-wallet.ts +8 -1
  47. package/src/wallets/wallet-connect/controller.ts +101 -164
  48. package/src/wallets/wallet-connect/types.ts +12 -16
@@ -1,4 +1,4 @@
1
- import type { EthereumProvider } from "@walletconnect/ethereum-provider";
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 EthereumProvider>;
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,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAYzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAMnD,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;AAI/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,gBAAgB,CAAC,CAAC;AAiBxD;;;;;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,CA0FvC;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,CAsCvC;AAsLD,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,CAgD/C"}
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 EthereumProviderOptions = Parameters<(typeof EthereumProvider)["init"]>[0];
7
- type WalletConnectQRCodeModalOptions = Pick<NonNullable<EthereumProviderOptions["qrModalOptions"]>, "themeMode" | "themeVariables" | "desktopWallets" | "enableExplorer" | "explorerRecommendedWalletIds" | "explorerExcludedWalletIds" | "mobileWallets" | "privacyPolicyUrl" | "termsOfServiceUrl" | "walletImages">;
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,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,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,uBAAuB,GAAG,UAAU,CAAC,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhF,KAAK,+BAA+B,GAAG,IAAI,CACzC,WAAW,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC,EACpD,WAAW,GACX,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,8BAA8B,GAC9B,2BAA2B,GAC3B,eAAe,GACf,kBAAkB,GAClB,mBAAmB,GACnB,cAAc,CACjB,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"}
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.6",
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",
@@ -282,6 +282,7 @@ export function BuyWidget(props: BuyWidgetProps) {
282
282
  toChainId: props.chain.id,
283
283
  toToken: props.tokenAddress,
284
284
  });
285
+ return true;
285
286
  },
286
287
  queryKey: ["buy_widget:render"],
287
288
  });
@@ -265,6 +265,7 @@ export function CheckoutWidget(props: CheckoutWidgetProps) {
265
265
  toChainId: props.chain.id,
266
266
  toToken: props.tokenAddress,
267
267
  });
268
+ return true;
268
269
  },
269
270
  queryKey: ["checkout_widget:render"],
270
271
  });
@@ -292,6 +292,7 @@ export function TransactionWidget(props: TransactionWidgetProps) {
292
292
  event: "ub:ui:transaction_widget:render",
293
293
  toToken: props.tokenAddress,
294
294
  });
295
+ return true;
295
296
  },
296
297
  queryKey: ["transaction_widget:render"],
297
298
  });
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "5.105.6";
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) => handleSwitchChain(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) => handleSwitchChain(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 { EthereumProvider } from "@walletconnect/ethereum-provider";
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 EthereumProvider>;
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
- const {
127
- rpcMap,
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
- chains: requiredChain ? [requiredChain.id] : undefined,
142
- optionalChains: chainsToRequest,
143
- rpcMap: rpcMap,
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(chainsToRequest, storage);
148
- // If session exists and chains are authorized, enable provider for required chain
149
- const addresses = await provider.enable();
150
- const address = addresses[0];
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
- const address = provider.accounts[0];
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
- const providerChainId = normalizeChainId(provider.chainId);
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 { EthereumProvider, OPTIONAL_EVENTS, OPTIONAL_METHODS } = await import(
242
- "@walletconnect/ethereum-provider"
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
- provider.signer.client.on("session_request_sent", handleSessionRequest);
303
+ // For UniversalProvider, use different event handling
304
+ provider.on("session_request_sent", handleSessionRequest);
318
305
  provider.events.addListener("disconnect", () => {
319
- provider.signer.client.off("session_request_sent", handleSessionRequest);
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
- method: "eth_sendTransaction",
340
- params: [
341
- {
342
- data: tx.data,
343
- from: getAddress(address),
344
- gas: tx.gas ? numberToHex(tx.gas) : undefined,
345
- to: tx.to as Address,
346
- value: tx.value ? numberToHex(tx.value) : undefined,
347
- },
348
- ],
349
- })) as Hex;
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
- method: "personal_sign",
377
- params: [messageToSign, this.address],
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
- method: "eth_signTypedData_v4",
403
- params: [this.address, typedData],
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, storage),
467
+ (newChain) => switchChainWC(provider, newChain),
465
468
  ];
466
469
  }
467
470
 
468
- // Storage utils -----------------------------------------------------------------------------------------------
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
- const namespaceChains = getNamespaceChainsIds(provider);
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
- requiredChain: Chain | undefined;
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
- optionalChains:
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 EthereumProviderOptions = Parameters<(typeof EthereumProvider)["init"]>[0];
8
-
9
- type WalletConnectQRCodeModalOptions = Pick<
10
- NonNullable<EthereumProviderOptions["qrModalOptions"]>,
11
- | "themeMode"
12
- | "themeVariables"
13
- | "desktopWallets"
14
- | "enableExplorer"
15
- | "explorerRecommendedWalletIds"
16
- | "explorerExcludedWalletIds"
17
- | "mobileWallets"
18
- | "privacyPolicyUrl"
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
  /**