thirdweb 5.29.3-nightly-9cf3a1d6636fcd56559e889ab2bfe3249d51162a-20240616230326 → 5.29.3-nightly-df84f9c4ce4d3e402c82037230515513380e73d1-20240616231119

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 (55) hide show
  1. package/dist/cjs/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.js +1 -1
  2. package/dist/cjs/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.js.map +1 -1
  3. package/dist/cjs/react/web/ui/ConnectWallet/Modal/ConnectModalContent.js +15 -24
  4. package/dist/cjs/react/web/ui/ConnectWallet/Modal/ConnectModalContent.js.map +1 -1
  5. package/dist/cjs/react/web/ui/components/WalletImage.js +5 -2
  6. package/dist/cjs/react/web/ui/components/WalletImage.js.map +1 -1
  7. package/dist/cjs/react/web/utils/usePreloadWalletProviders.js +37 -36
  8. package/dist/cjs/react/web/utils/usePreloadWalletProviders.js.map +1 -1
  9. package/dist/cjs/transaction/actions/send-transaction.js +3 -0
  10. package/dist/cjs/transaction/actions/send-transaction.js.map +1 -1
  11. package/dist/cjs/version.js +1 -1
  12. package/dist/cjs/wallets/coinbase/coinbase-wallet.js +9 -0
  13. package/dist/cjs/wallets/coinbase/coinbase-wallet.js.map +1 -1
  14. package/dist/cjs/wallets/coinbase/coinbaseSDKWallet.js +11 -1
  15. package/dist/cjs/wallets/coinbase/coinbaseSDKWallet.js.map +1 -1
  16. package/dist/cjs/wallets/smart/index.js +6 -0
  17. package/dist/cjs/wallets/smart/index.js.map +1 -1
  18. package/dist/esm/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.js +1 -1
  19. package/dist/esm/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.js.map +1 -1
  20. package/dist/esm/react/web/ui/ConnectWallet/Modal/ConnectModalContent.js +9 -18
  21. package/dist/esm/react/web/ui/ConnectWallet/Modal/ConnectModalContent.js.map +1 -1
  22. package/dist/esm/react/web/ui/components/WalletImage.js +5 -2
  23. package/dist/esm/react/web/ui/components/WalletImage.js.map +1 -1
  24. package/dist/esm/react/web/utils/usePreloadWalletProviders.js +37 -36
  25. package/dist/esm/react/web/utils/usePreloadWalletProviders.js.map +1 -1
  26. package/dist/esm/transaction/actions/send-transaction.js +3 -0
  27. package/dist/esm/transaction/actions/send-transaction.js.map +1 -1
  28. package/dist/esm/version.js +1 -1
  29. package/dist/esm/wallets/coinbase/coinbase-wallet.js +9 -0
  30. package/dist/esm/wallets/coinbase/coinbase-wallet.js.map +1 -1
  31. package/dist/esm/wallets/coinbase/coinbaseSDKWallet.js +9 -0
  32. package/dist/esm/wallets/coinbase/coinbaseSDKWallet.js.map +1 -1
  33. package/dist/esm/wallets/smart/index.js +6 -0
  34. package/dist/esm/wallets/smart/index.js.map +1 -1
  35. package/dist/types/react/web/ui/ConnectWallet/Modal/ConnectModalContent.d.ts.map +1 -1
  36. package/dist/types/react/web/utils/usePreloadWalletProviders.d.ts +2 -2
  37. package/dist/types/react/web/utils/usePreloadWalletProviders.d.ts.map +1 -1
  38. package/dist/types/transaction/actions/send-transaction.d.ts.map +1 -1
  39. package/dist/types/version.d.ts +1 -1
  40. package/dist/types/wallets/coinbase/coinbase-wallet.d.ts.map +1 -1
  41. package/dist/types/wallets/coinbase/coinbaseSDKWallet.d.ts +1 -0
  42. package/dist/types/wallets/coinbase/coinbaseSDKWallet.d.ts.map +1 -1
  43. package/dist/types/wallets/interfaces/wallet.d.ts +9 -0
  44. package/dist/types/wallets/interfaces/wallet.d.ts.map +1 -1
  45. package/package.json +1 -1
  46. package/src/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.tsx +1 -1
  47. package/src/react/web/ui/ConnectWallet/Modal/ConnectModalContent.tsx +7 -19
  48. package/src/react/web/ui/components/WalletImage.tsx +4 -4
  49. package/src/react/web/utils/usePreloadWalletProviders.ts +43 -42
  50. package/src/transaction/actions/send-transaction.ts +4 -0
  51. package/src/version.ts +1 -1
  52. package/src/wallets/coinbase/coinbase-wallet.ts +11 -0
  53. package/src/wallets/coinbase/coinbaseSDKWallet.ts +10 -0
  54. package/src/wallets/interfaces/wallet.ts +15 -0
  55. package/src/wallets/smart/index.ts +10 -2
@@ -1,48 +1,49 @@
1
- import { useEffect } from "react";
1
+ import { useQueries } from "@tanstack/react-query";
2
2
  import type { ThirdwebClient } from "../../../client/client.js";
3
3
  import { COINBASE } from "../../../wallets/constants.js";
4
4
  import type { Wallet } from "../../../wallets/interfaces/wallet.js";
5
5
 
6
- export const usePreloadWalletProviders = ({
6
+ export function usePreloadWalletProviders({
7
7
  client,
8
8
  wallets,
9
- }: { client: ThirdwebClient; wallets: Wallet[] }) => {
10
- useEffect(() => {
11
- let active = true;
12
-
13
- async function run() {
14
- if (!active) {
15
- return;
16
- }
17
- // preload coinbase wallet provider
18
- // this is to avoid any delay on click when opening the popup window
19
- // which can cause the popup to be blocked by the browser
20
- if (wallets.map((w) => w.id).includes(COINBASE)) {
21
- const { getCoinbaseWebProvider } = await import(
22
- "../../../wallets/coinbase/coinbaseSDKWallet.js"
23
- );
24
- getCoinbaseWebProvider();
25
- }
26
-
27
- // preload inApp wallet iframe connector
28
- if (wallets.map((w) => w.id).includes("inApp")) {
29
- const [{ InAppWebConnector }, { getOrCreateInAppWalletConnector }] =
30
- await Promise.all([
31
- import("../../../wallets/in-app/web/lib/web-connector.js"),
32
- import("../../../wallets/in-app/core/wallet/in-app-core.js"),
33
- ]);
34
- getOrCreateInAppWalletConnector(client, async (client) => {
35
- return new InAppWebConnector({
36
- client,
37
- });
38
- });
39
- }
40
- }
41
- run().catch((error) => {
42
- console.error("failed to preload wallet provider", error);
43
- });
44
- return () => {
45
- active = false;
46
- };
47
- }, [wallets, client]);
48
- };
9
+ }: { client: ThirdwebClient; wallets: Wallet[] }) {
10
+ useQueries({
11
+ queries: wallets
12
+ .filter((w) => w.id === COINBASE || w.id === "inApp")
13
+ .map((w) => ({
14
+ queryKey: ["preload-wallet", w.id],
15
+ queryFn: async () => {
16
+ switch (w.id) {
17
+ case COINBASE: {
18
+ const { getCoinbaseWebProvider } = await import(
19
+ "../../../wallets/coinbase/coinbaseSDKWallet.js"
20
+ );
21
+ await getCoinbaseWebProvider();
22
+ // return _something_
23
+ return true;
24
+ }
25
+ case "inApp": {
26
+ const [
27
+ { InAppWebConnector },
28
+ { getOrCreateInAppWalletConnector },
29
+ ] = await Promise.all([
30
+ import("../../../wallets/in-app/web/lib/web-connector.js"),
31
+ import("../../../wallets/in-app/core/wallet/in-app-core.js"),
32
+ ]);
33
+ await getOrCreateInAppWalletConnector(client, async (client) => {
34
+ return new InAppWebConnector({
35
+ client,
36
+ });
37
+ });
38
+ // return _something_
39
+ return true;
40
+ }
41
+ // potentially add more wallets here
42
+ default: {
43
+ return false;
44
+ }
45
+ }
46
+ },
47
+ })),
48
+ });
49
+ }
@@ -33,6 +33,10 @@ export async function sendTransaction(
33
33
  ): Promise<WaitForReceiptOptions> {
34
34
  const { account, transaction, gasless } = options;
35
35
 
36
+ if (account.onTransactionRequested) {
37
+ await account.onTransactionRequested(transaction);
38
+ }
39
+
36
40
  const serializableTransaction = await toSerializableTransaction({
37
41
  transaction: transaction,
38
42
  from: account.address,
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "5.29.3-nightly-9cf3a1d6636fcd56559e889ab2bfe3249d51162a-20240616230326";
1
+ export const version = "5.29.3-nightly-df84f9c4ce4d3e402c82037230515513380e73d1-20240616231119";
@@ -104,5 +104,16 @@ export function coinbaseWalletSDK(args: {
104
104
  switchChain: async (newChain) => {
105
105
  await handleSwitchChain(newChain);
106
106
  },
107
+ onConnectRequested: async () => {
108
+ // make sure to show the coinbase popup IMMEDIATELY on connection requested
109
+ // otherwise the popup might get blocked in safari
110
+ // TODO these 2 awaits are fast only thanks to preloading that happens in our components
111
+ // these probably need to actually imported / created synchronously to be used headless properly
112
+ const { getCoinbaseWebProvider, showCoinbasePopup } = await import(
113
+ "./coinbaseSDKWallet.js"
114
+ );
115
+ const provider = await getCoinbaseWebProvider(createOptions);
116
+ await showCoinbasePopup(provider);
117
+ },
107
118
  };
108
119
  }
@@ -334,11 +334,21 @@ function createAccount(provider: ProviderInterface, address: string) {
334
334
  params: [account.address, stringifiedData],
335
335
  });
336
336
  },
337
+ onTransactionRequested: async () => {
338
+ // make sure to show the coinbase popup BEFORE doing any transaction preprocessing
339
+ // otherwise the popup might get blocked in safari
340
+ await showCoinbasePopup(provider);
341
+ },
337
342
  };
338
343
 
339
344
  return account;
340
345
  }
341
346
 
347
+ export async function showCoinbasePopup(provider: ProviderInterface) {
348
+ // biome-ignore lint/suspicious/noExplicitAny: based on the latest CB SDK - scary but works
349
+ await (provider as any).communicator?.waitForPopupLoaded();
350
+ }
351
+
342
352
  function onConnect(
343
353
  address: string,
344
354
  chain: Chain,
@@ -123,6 +123,13 @@ export type Wallet<TWalletId extends WalletId = WalletId> = {
123
123
  * ```
124
124
  */
125
125
  getConfig: () => CreateWalletArgs<TWalletId>[1];
126
+
127
+ // OPTIONAL
128
+
129
+ /**
130
+ * Can be used to execute any pre-connection actions like showing a modal, etc.
131
+ */
132
+ onConnectRequested?: () => Promise<void>;
126
133
  };
127
134
 
128
135
  /**
@@ -223,4 +230,12 @@ export type Account = {
223
230
  sendRawTransaction?: (
224
231
  tx: SendRawTransactionOptions,
225
232
  ) => Promise<SendTransactionResult>;
233
+ /**
234
+ * Used to do any pre-transaction actions like showing a confirmation modal, etc.
235
+ * @returns
236
+ */
237
+ onTransactionRequested?: (
238
+ // biome-ignore lint/suspicious/noExplicitAny: any transaction type is allowed here
239
+ transaction: PreparedTransaction<any>,
240
+ ) => Promise<void>;
226
241
  };
@@ -162,7 +162,7 @@ async function createSmartAccount(
162
162
  options: SmartAccountOptions,
163
163
  ): Promise<Account> {
164
164
  const { accountContract } = options;
165
- const account = {
165
+ const account: Account = {
166
166
  address: accountContract.address,
167
167
  async sendTransaction(transaction: SendTransactionOption) {
168
168
  const executeTx = prepareExecute({
@@ -353,6 +353,9 @@ async function createSmartAccount(
353
353
  "Unable to verify signature on smart account, please make sure the smart account is deployed and the signature is valid.",
354
354
  );
355
355
  },
356
+ async onTransactionRequested(transaction) {
357
+ return options.personalAccount.onTransactionRequested?.(transaction);
358
+ },
356
359
  };
357
360
  return account;
358
361
  }
@@ -364,7 +367,7 @@ function createZkSyncAccount(args: {
364
367
  sponsorGas: boolean;
365
368
  }): Account {
366
369
  const { creationOptions, connectionOptions, chain } = args;
367
- const account = {
370
+ const account: Account = {
368
371
  address: connectionOptions.personalAccount.address,
369
372
  async sendTransaction(transaction: SendTransactionOption) {
370
373
  // override passed tx, we have to refetch gas and fees always
@@ -430,6 +433,11 @@ function createZkSyncAccount(args: {
430
433
  const typedData = parseTypedData(_typedData);
431
434
  return connectionOptions.personalAccount.signTypedData(typedData);
432
435
  },
436
+ async onTransactionRequested(transaction) {
437
+ return connectionOptions.personalAccount.onTransactionRequested?.(
438
+ transaction,
439
+ );
440
+ },
433
441
  };
434
442
  return account;
435
443
  }