thirdweb 5.105.21 → 5.105.23

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 (145) hide show
  1. package/dist/cjs/extensions/erc1155/read/getOwnedNFTs.js +1 -0
  2. package/dist/cjs/extensions/erc1155/read/getOwnedNFTs.js.map +1 -1
  3. package/dist/cjs/extensions/erc721/read/getOwnedNFTs.js +1 -0
  4. package/dist/cjs/extensions/erc721/read/getOwnedNFTs.js.map +1 -1
  5. package/dist/cjs/insight/get-nfts.js +3 -3
  6. package/dist/cjs/insight/get-nfts.js.map +1 -1
  7. package/dist/cjs/insight/get-tokens.js +3 -2
  8. package/dist/cjs/insight/get-tokens.js.map +1 -1
  9. package/dist/cjs/react/web/wallets/shared/WalletConnectConnection.js +7 -33
  10. package/dist/cjs/react/web/wallets/shared/WalletConnectConnection.js.map +1 -1
  11. package/dist/cjs/transaction/actions/estimate-gas.js +3 -24
  12. package/dist/cjs/transaction/actions/estimate-gas.js.map +1 -1
  13. package/dist/cjs/utils/web/isMobile.js +0 -2
  14. package/dist/cjs/utils/web/isMobile.js.map +1 -1
  15. package/dist/cjs/version.js +1 -1
  16. package/dist/cjs/wallets/coinbase/coinbase-web.js +56 -0
  17. package/dist/cjs/wallets/coinbase/coinbase-web.js.map +1 -1
  18. package/dist/cjs/wallets/create-wallet.js +21 -4
  19. package/dist/cjs/wallets/create-wallet.js.map +1 -1
  20. package/dist/cjs/wallets/eip5792/get-calls-status.js +40 -63
  21. package/dist/cjs/wallets/eip5792/get-calls-status.js.map +1 -1
  22. package/dist/cjs/wallets/eip5792/get-capabilities.js +14 -49
  23. package/dist/cjs/wallets/eip5792/get-capabilities.js.map +1 -1
  24. package/dist/cjs/wallets/eip5792/send-calls.js +34 -48
  25. package/dist/cjs/wallets/eip5792/send-calls.js.map +1 -1
  26. package/dist/cjs/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.js +1 -5
  27. package/dist/cjs/wallets/in-app/core/eip5792/in-app-wallet-calls.js.map +1 -0
  28. package/dist/cjs/wallets/in-app/core/eip7702/minimal-account.js +650 -5
  29. package/dist/cjs/wallets/in-app/core/eip7702/minimal-account.js.map +1 -1
  30. package/dist/cjs/wallets/in-app/core/wallet/enclave-wallet.js +32 -1
  31. package/dist/cjs/wallets/in-app/core/wallet/enclave-wallet.js.map +1 -1
  32. package/dist/cjs/wallets/injected/index.js +55 -0
  33. package/dist/cjs/wallets/injected/index.js.map +1 -1
  34. package/dist/cjs/wallets/smart/index.js +61 -0
  35. package/dist/cjs/wallets/smart/index.js.map +1 -1
  36. package/dist/cjs/wallets/wallet-connect/controller.js +27 -25
  37. package/dist/cjs/wallets/wallet-connect/controller.js.map +1 -1
  38. package/dist/esm/extensions/erc1155/read/getOwnedNFTs.js +1 -0
  39. package/dist/esm/extensions/erc1155/read/getOwnedNFTs.js.map +1 -1
  40. package/dist/esm/extensions/erc721/read/getOwnedNFTs.js +1 -0
  41. package/dist/esm/extensions/erc721/read/getOwnedNFTs.js.map +1 -1
  42. package/dist/esm/insight/get-nfts.js +3 -3
  43. package/dist/esm/insight/get-nfts.js.map +1 -1
  44. package/dist/esm/insight/get-tokens.js +3 -2
  45. package/dist/esm/insight/get-tokens.js.map +1 -1
  46. package/dist/esm/react/web/wallets/shared/WalletConnectConnection.js +8 -34
  47. package/dist/esm/react/web/wallets/shared/WalletConnectConnection.js.map +1 -1
  48. package/dist/esm/transaction/actions/estimate-gas.js +3 -24
  49. package/dist/esm/transaction/actions/estimate-gas.js.map +1 -1
  50. package/dist/esm/utils/web/isMobile.js +2 -2
  51. package/dist/esm/utils/web/isMobile.js.map +1 -1
  52. package/dist/esm/version.js +1 -1
  53. package/dist/esm/wallets/coinbase/coinbase-web.js +56 -0
  54. package/dist/esm/wallets/coinbase/coinbase-web.js.map +1 -1
  55. package/dist/esm/wallets/create-wallet.js +21 -4
  56. package/dist/esm/wallets/create-wallet.js.map +1 -1
  57. package/dist/esm/wallets/eip5792/get-calls-status.js +39 -63
  58. package/dist/esm/wallets/eip5792/get-calls-status.js.map +1 -1
  59. package/dist/esm/wallets/eip5792/get-capabilities.js +13 -49
  60. package/dist/esm/wallets/eip5792/get-capabilities.js.map +1 -1
  61. package/dist/esm/wallets/eip5792/send-calls.js +33 -48
  62. package/dist/esm/wallets/eip5792/send-calls.js.map +1 -1
  63. package/dist/esm/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.js +1 -5
  64. package/dist/esm/wallets/in-app/core/eip5792/in-app-wallet-calls.js.map +1 -0
  65. package/dist/esm/wallets/in-app/core/eip7702/minimal-account.js +650 -5
  66. package/dist/esm/wallets/in-app/core/eip7702/minimal-account.js.map +1 -1
  67. package/dist/esm/wallets/in-app/core/wallet/enclave-wallet.js +32 -1
  68. package/dist/esm/wallets/in-app/core/wallet/enclave-wallet.js.map +1 -1
  69. package/dist/esm/wallets/injected/index.js +56 -1
  70. package/dist/esm/wallets/injected/index.js.map +1 -1
  71. package/dist/esm/wallets/smart/index.js +61 -0
  72. package/dist/esm/wallets/smart/index.js.map +1 -1
  73. package/dist/esm/wallets/wallet-connect/controller.js +27 -25
  74. package/dist/esm/wallets/wallet-connect/controller.js.map +1 -1
  75. package/dist/types/bridge/Webhook.d.ts +2 -2
  76. package/dist/types/insight/get-nfts.d.ts +1 -0
  77. package/dist/types/insight/get-nfts.d.ts.map +1 -1
  78. package/dist/types/insight/get-tokens.d.ts +1 -0
  79. package/dist/types/insight/get-tokens.d.ts.map +1 -1
  80. package/dist/types/react/core/hooks/wallets/useWaitForCallsReceipt.d.ts +1 -1
  81. package/dist/types/react/core/utils/storage.d.ts +1 -1
  82. package/dist/types/react/web/utils/storage.d.ts +1 -1
  83. package/dist/types/react/web/wallets/shared/WalletConnectConnection.d.ts.map +1 -1
  84. package/dist/types/transaction/actions/estimate-gas.d.ts.map +1 -1
  85. package/dist/types/utils/web/isMobile.d.ts +0 -8
  86. package/dist/types/utils/web/isMobile.d.ts.map +1 -1
  87. package/dist/types/version.d.ts +1 -1
  88. package/dist/types/wallets/coinbase/coinbase-web.d.ts.map +1 -1
  89. package/dist/types/wallets/create-wallet.d.ts.map +1 -1
  90. package/dist/types/wallets/eip5792/get-calls-status.d.ts +2 -1
  91. package/dist/types/wallets/eip5792/get-calls-status.d.ts.map +1 -1
  92. package/dist/types/wallets/eip5792/get-capabilities.d.ts +1 -0
  93. package/dist/types/wallets/eip5792/get-capabilities.d.ts.map +1 -1
  94. package/dist/types/wallets/eip5792/send-calls.d.ts +6 -1
  95. package/dist/types/wallets/eip5792/send-calls.d.ts.map +1 -1
  96. package/dist/types/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.d.ts +3 -2
  97. package/dist/types/wallets/in-app/core/eip5792/in-app-wallet-calls.d.ts.map +1 -0
  98. package/dist/types/wallets/in-app/core/eip7702/minimal-account.d.ts.map +1 -1
  99. package/dist/types/wallets/in-app/core/wallet/enclave-wallet.d.ts.map +1 -1
  100. package/dist/types/wallets/injected/index.d.ts.map +1 -1
  101. package/dist/types/wallets/interfaces/wallet.d.ts +22 -0
  102. package/dist/types/wallets/interfaces/wallet.d.ts.map +1 -1
  103. package/dist/types/wallets/smart/index.d.ts.map +1 -1
  104. package/dist/types/wallets/wallet-connect/controller.d.ts.map +1 -1
  105. package/package.json +3 -3
  106. package/src/extensions/erc1155/read/getOwnedNFTs.ts +1 -0
  107. package/src/extensions/erc721/read/getOwnedNFTs.ts +1 -0
  108. package/src/insight/get-nfts.ts +4 -3
  109. package/src/insight/get-tokens.ts +4 -2
  110. package/src/react/web/wallets/shared/WalletConnectConnection.tsx +11 -46
  111. package/src/transaction/actions/estimate-gas.ts +14 -42
  112. package/src/utils/web/isMobile.ts +2 -2
  113. package/src/version.ts +1 -1
  114. package/src/wallets/coinbase/coinbase-web.ts +66 -0
  115. package/src/wallets/create-wallet.ts +53 -31
  116. package/src/wallets/eip5792/get-calls-status.test.ts +156 -146
  117. package/src/wallets/eip5792/get-calls-status.ts +44 -73
  118. package/src/wallets/eip5792/get-capabilities.test.ts +216 -205
  119. package/src/wallets/eip5792/get-capabilities.ts +23 -64
  120. package/src/wallets/eip5792/send-calls.test.ts +183 -189
  121. package/src/wallets/eip5792/send-calls.ts +53 -71
  122. package/src/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.ts +4 -8
  123. package/src/wallets/in-app/core/eip7702/minimal-account.ts +666 -5
  124. package/src/wallets/in-app/core/wallet/enclave-wallet.ts +36 -1
  125. package/src/wallets/injected/index.ts +63 -0
  126. package/src/wallets/interfaces/wallet.ts +31 -0
  127. package/src/wallets/smart/index.ts +69 -1
  128. package/src/wallets/wallet-connect/controller.ts +28 -25
  129. package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-calls.js.map +0 -1
  130. package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js +0 -41
  131. package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js.map +0 -1
  132. package/dist/cjs/wallets/smart/lib/smart-wallet-capabilities.js +0 -30
  133. package/dist/cjs/wallets/smart/lib/smart-wallet-capabilities.js.map +0 -1
  134. package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-calls.js.map +0 -1
  135. package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js +0 -38
  136. package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js.map +0 -1
  137. package/dist/esm/wallets/smart/lib/smart-wallet-capabilities.js +0 -27
  138. package/dist/esm/wallets/smart/lib/smart-wallet-capabilities.js.map +0 -1
  139. package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-calls.d.ts.map +0 -1
  140. package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-capabilities.d.ts +0 -20
  141. package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-capabilities.d.ts.map +0 -1
  142. package/dist/types/wallets/smart/lib/smart-wallet-capabilities.d.ts +0 -20
  143. package/dist/types/wallets/smart/lib/smart-wallet-capabilities.d.ts.map +0 -1
  144. package/src/wallets/in-app/core/eip5972/in-app-wallet-capabilities.ts +0 -47
  145. package/src/wallets/smart/lib/smart-wallet-capabilities.ts +0 -32
@@ -14,8 +14,16 @@ import {
14
14
  stringToHex,
15
15
  uint8ArrayToHex,
16
16
  } from "../../utils/encoding/hex.js";
17
+ import { stringify } from "../../utils/json.js";
17
18
  import { parseTypedData } from "../../utils/signatures/helpers/parse-typed-data.js";
18
19
  import { COINBASE } from "../constants.js";
20
+ import { toGetCallsStatusResponse } from "../eip5792/get-calls-status.js";
21
+ import { toGetCapabilitiesResult } from "../eip5792/get-capabilities.js";
22
+ import { toProviderCallParams } from "../eip5792/send-calls.js";
23
+ import type {
24
+ GetCallsStatusRawResponse,
25
+ WalletCapabilities,
26
+ } from "../eip5792/types.js";
19
27
  import type {
20
28
  Account,
21
29
  SendTransactionOption,
@@ -269,6 +277,64 @@ function createAccount({
269
277
  }
270
278
  return res;
271
279
  },
280
+ sendCalls: async (options) => {
281
+ try {
282
+ const { callParams, chain } = await toProviderCallParams(
283
+ options,
284
+ account,
285
+ );
286
+ const callId = await provider.request({
287
+ method: "wallet_sendCalls",
288
+ params: callParams,
289
+ });
290
+ if (callId && typeof callId === "object" && "id" in callId) {
291
+ return { chain, client, id: callId.id as string };
292
+ }
293
+ return { chain, client, id: callId as string };
294
+ } catch (error) {
295
+ if (/unsupport|not support/i.test((error as Error).message)) {
296
+ throw new Error(
297
+ `${COINBASE} errored calling wallet_sendCalls, with error: ${error instanceof Error ? error.message : stringify(error)}`,
298
+ );
299
+ }
300
+ throw error;
301
+ }
302
+ },
303
+ async getCallsStatus(options) {
304
+ try {
305
+ const rawResponse = (await provider.request({
306
+ method: "wallet_getCallsStatus",
307
+ params: [options.id],
308
+ })) as GetCallsStatusRawResponse;
309
+ return toGetCallsStatusResponse(rawResponse);
310
+ } catch (error) {
311
+ if (/unsupport|not support/i.test((error as Error).message)) {
312
+ throw new Error(
313
+ `${COINBASE} does not support wallet_getCallsStatus, reach out to them directly to request EIP-5792 support.`,
314
+ );
315
+ }
316
+ throw error;
317
+ }
318
+ },
319
+ async getCapabilities(options) {
320
+ const chainId = options.chainId;
321
+ try {
322
+ const result = (await provider.request({
323
+ method: "wallet_getCapabilities",
324
+ params: [getAddress(account.address)],
325
+ })) as Record<string, WalletCapabilities>;
326
+ return toGetCapabilitiesResult(result, chainId);
327
+ } catch (error: unknown) {
328
+ if (
329
+ /unsupport|not support|not available/i.test((error as Error).message)
330
+ ) {
331
+ return {
332
+ message: `${COINBASE} does not support wallet_getCapabilities, reach out to them directly to request EIP-5792 support.`,
333
+ };
334
+ }
335
+ throw error;
336
+ }
337
+ },
272
338
  };
273
339
 
274
340
  return account;
@@ -2,8 +2,10 @@ import { trackConnect } from "../analytics/track/connect.js";
2
2
  import type { Chain } from "../chains/types.js";
3
3
  import { getCachedChainIfExists } from "../chains/utils.js";
4
4
  import { webLocalStorage } from "../utils/storage/webStorage.js";
5
+ import { formatWalletConnectUrl } from "../utils/url.js";
5
6
  import { isMobile } from "../utils/web/isMobile.js";
6
7
  import { openWindow } from "../utils/web/openWindow.js";
8
+ import { getWalletInfo } from "./__generated__/getWalletInfo.js";
7
9
  import type {
8
10
  InjectedSupportedWalletIds,
9
11
  WCSupportedWalletIds,
@@ -313,43 +315,63 @@ export function createWallet<const ID extends WalletId>(
313
315
  ...wcOptions,
314
316
  walletConnect: {
315
317
  ...wcOptions.walletConnect,
316
- onDisplayUri: wcOptions.walletConnect?.showQrModal
317
- ? async (uri) => {
318
- // Check if we're in a browser environment
319
- if (
320
- typeof window !== "undefined" &&
321
- typeof document !== "undefined"
322
- ) {
323
- try {
324
- const { createQROverlay } = await import(
325
- "./wallet-connect/qr-overlay.js"
318
+ onDisplayUri:
319
+ wcOptions.walletConnect?.onDisplayUri ||
320
+ (async (uri) => {
321
+ // Check if we're in a browser environment
322
+ if (
323
+ typeof window !== "undefined" &&
324
+ typeof document !== "undefined"
325
+ ) {
326
+ // on mobile, open the wallet app via deeplink
327
+ if (isMobile()) {
328
+ const walletInfo = await getWalletInfo(id);
329
+
330
+ const mobileAppLink =
331
+ walletInfo.mobile.native ||
332
+ walletInfo.mobile.universal;
333
+ if (mobileAppLink) {
334
+ openWindow(
335
+ formatWalletConnectUrl(mobileAppLink, uri)
336
+ .redirect,
326
337
  );
338
+ } else {
339
+ // on android, wc:// links show the app picker
340
+ openWindow(uri);
341
+ }
342
+ return;
343
+ }
327
344
 
328
- // Clean up any existing overlay
329
- if (qrOverlay) {
330
- qrOverlay.destroy();
331
- }
345
+ try {
346
+ // on desktop, create a QR overlay
347
+ const { createQROverlay } = await import(
348
+ "./wallet-connect/qr-overlay.js"
349
+ );
332
350
 
333
- // Create new QR overlay
334
- qrOverlay = createQROverlay(uri, {
335
- theme:
336
- wcOptions.walletConnect?.qrModalOptions
337
- ?.themeMode ?? "dark",
338
- qrSize: 280,
339
- showCloseButton: true,
340
- onCancel: () => {
341
- wcOptions.walletConnect?.onCancel?.();
342
- },
343
- });
344
- } catch (error) {
345
- console.error(
346
- "Failed to create QR overlay:",
347
- error,
348
- );
351
+ // Clean up any existing overlay
352
+ if (qrOverlay) {
353
+ qrOverlay.destroy();
349
354
  }
355
+
356
+ // Create new QR overlay
357
+ qrOverlay = createQROverlay(uri, {
358
+ theme:
359
+ wcOptions.walletConnect?.qrModalOptions
360
+ ?.themeMode ?? "dark",
361
+ qrSize: 280,
362
+ showCloseButton: true,
363
+ onCancel: () => {
364
+ wcOptions.walletConnect?.onCancel?.();
365
+ },
366
+ });
367
+ } catch (error) {
368
+ console.error(
369
+ "Failed to create QR overlay:",
370
+ error,
371
+ );
350
372
  }
351
373
  }
352
- : undefined,
374
+ }),
353
375
  },
354
376
  },
355
377
  emitter,
@@ -6,77 +6,12 @@ import { METAMASK } from "../constants.js";
6
6
  import { createWallet } from "../create-wallet.js";
7
7
  import type { Wallet } from "../interfaces/wallet.js";
8
8
  import { getCallsStatus } from "./get-calls-status.js";
9
- import { type SendCallsOptions, sendCalls } from "./send-calls.js";
10
-
11
- const RAW_UNSUPPORTED_ERROR = {
12
- code: -32601,
13
- message: "some nonsense the wallet sends us about not supporting",
14
- };
15
-
16
- const SEND_CALLS_OPTIONS: Omit<SendCallsOptions, "wallet"> = {
17
- calls: [
18
- {
19
- chain: ANVIL_CHAIN,
20
- client: TEST_CLIENT,
21
- data: "0xabcdef",
22
- to: "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
23
- },
24
- {
25
- chain: ANVIL_CHAIN,
26
- client: TEST_CLIENT,
27
- to: "0xa922b54716264130634d6ff183747a8ead91a40b",
28
- value: 123n,
29
- },
30
- ],
31
- };
32
9
 
33
10
  const mocks = vi.hoisted(() => ({
34
- getTransactionReceipt: vi.fn(),
35
- injectedRequest: vi.fn(),
11
+ getCallsStatus: vi.fn(),
36
12
  }));
37
13
 
38
- vi.mock("../injected/index.js", () => {
39
- return {
40
- getInjectedProvider: vi.fn().mockReturnValue({
41
- request: mocks.injectedRequest,
42
- }),
43
- };
44
- });
45
-
46
- vi.mock("../../rpc/actions/eth_getTransactionReceipt.js", () => {
47
- return {
48
- eth_getTransactionReceipt: mocks.getTransactionReceipt.mockResolvedValue({
49
- blockHash:
50
- "0xf19bbafd9fd0124ec110b848e8de4ab4f62bf60c189524e54213285e7f540d4a",
51
- blockNumber: 12345n,
52
- gasUsed: 12345n,
53
- logs: [],
54
- status: "success",
55
- transactionHash:
56
- "0x9b7bb827c2e5e3c1a0a44dc53e573aa0b3af3bd1f9f5ed03071b100bb039eaff",
57
- }),
58
- };
59
- });
60
-
61
- vi.mock("../../transaction/actions/send-and-confirm-transaction.js", () => {
62
- return {
63
- sendAndConfirmTransaction: vi.fn().mockResolvedValue({
64
- transactionHash:
65
- "0x9b7bb827c2e5e3c1a0a44dc53e573aa0b3af3bd1f9f5ed03071b100bb039eaff",
66
- }),
67
- };
68
- });
69
-
70
- vi.mock("../../transaction/actions/send-batch-transaction.js", () => {
71
- return {
72
- sendBatchTransaction: vi.fn().mockResolvedValue({
73
- transactionHash:
74
- "0x9b7bb827c2e5e3c1a0a44dc53e573aa0b3af3bd1f9f5ed03071b100bb039eaff",
75
- }),
76
- };
77
- });
78
-
79
- describe.sequential("injected wallet", async () => {
14
+ describe.sequential("getCallsStatus general", () => {
80
15
  const wallet: Wallet = createWallet(METAMASK);
81
16
 
82
17
  afterEach(() => {
@@ -85,6 +20,7 @@ describe.sequential("injected wallet", async () => {
85
20
 
86
21
  test("with no account should fail", async () => {
87
22
  wallet.getAccount = vi.fn().mockReturnValue(undefined);
23
+ wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
88
24
 
89
25
  const promise = getCallsStatus({
90
26
  client: TEST_CLIENT,
@@ -93,42 +29,31 @@ describe.sequential("injected wallet", async () => {
93
29
  });
94
30
 
95
31
  await expect(promise).rejects.toMatchInlineSnapshot(
96
- `[Error: Failed to get call status, no account found for wallet ${wallet.id}]`,
32
+ "[Error: Failed to get call status, no account found for wallet io.metamask]",
97
33
  );
98
34
  });
99
35
 
100
- test("should successfully make request", async () => {
36
+ test("with no chain should fail", async () => {
101
37
  wallet.getAccount = vi.fn().mockReturnValue(TEST_ACCOUNT_A);
102
- mocks.injectedRequest.mockResolvedValue({
103
- receipts: [],
104
- status: "CONFIRMED",
105
- });
38
+ wallet.getChain = vi.fn().mockReturnValue(undefined);
106
39
 
107
- const result = await getCallsStatus({
40
+ const promise = getCallsStatus({
108
41
  client: TEST_CLIENT,
109
42
  id: "test",
110
43
  wallet: wallet,
111
44
  });
112
45
 
113
- expect(mocks.injectedRequest).toHaveBeenCalledWith({
114
- method: "wallet_getCallsStatus",
115
- params: ["test"],
116
- });
117
- expect(result).toMatchInlineSnapshot(`
118
- {
119
- "atomic": false,
120
- "chainId": undefined,
121
- "receipts": [],
122
- "status": "success",
123
- "statusCode": 200,
124
- "version": "2.0.0",
125
- }
126
- `);
46
+ await expect(promise).rejects.toMatchInlineSnapshot(
47
+ "[Error: Failed to get call status, no chain found for wallet io.metamask]",
48
+ );
127
49
  });
128
50
 
129
- test("without support should fail", async () => {
130
- mocks.injectedRequest.mockRejectedValue(RAW_UNSUPPORTED_ERROR);
131
- wallet.getAccount = vi.fn().mockReturnValue(TEST_ACCOUNT_A);
51
+ test("without getCallsStatus support should fail", async () => {
52
+ wallet.getAccount = vi.fn().mockReturnValue({
53
+ ...TEST_ACCOUNT_A,
54
+ // no getCallsStatus method
55
+ });
56
+ wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
132
57
 
133
58
  const promise = getCallsStatus({
134
59
  client: TEST_CLIENT,
@@ -137,103 +62,188 @@ describe.sequential("injected wallet", async () => {
137
62
  });
138
63
 
139
64
  await expect(promise).rejects.toMatchInlineSnapshot(
140
- "[Error: io.metamask does not support wallet_getCallsStatus, reach out to them directly to request EIP-5792 support.]",
65
+ "[Error: Failed to get call status, wallet io.metamask does not support EIP-5792]",
141
66
  );
142
67
  });
143
- });
144
-
145
- describe.sequential("in-app wallet", async () => {
146
- const sendTransaction = vi.fn();
147
- const sendBatchTransaction = vi.fn();
148
- let wallet: Wallet = createWallet("inApp");
149
68
 
150
- afterEach(() => {
151
- vi.clearAllMocks();
152
- });
69
+ test("should delegate to account.getCallsStatus", async () => {
70
+ const mockResponse = {
71
+ status: "success" as const,
72
+ statusCode: 200,
73
+ receipts: [],
74
+ };
153
75
 
154
- test("default", async () => {
155
- wallet.getAccount = vi.fn().mockReturnValue({
76
+ const mockAccount = {
156
77
  ...TEST_ACCOUNT_A,
157
- sendTransaction,
158
- });
78
+ getCallsStatus: mocks.getCallsStatus.mockResolvedValue(mockResponse),
79
+ };
80
+
81
+ wallet.getAccount = vi.fn().mockReturnValue(mockAccount);
159
82
  wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
160
83
 
161
- const callResult = await sendCalls({
84
+ const result = await getCallsStatus({
85
+ client: TEST_CLIENT,
86
+ id: "test-bundle-id",
162
87
  wallet: wallet,
163
- ...SEND_CALLS_OPTIONS,
164
88
  });
165
89
 
166
- const result = await getCallsStatus(callResult);
167
-
168
- expect(result.status).toEqual("success");
169
- expect(result.receipts?.length).toEqual(2);
90
+ expect(result).toEqual(mockResponse);
91
+ expect(mocks.getCallsStatus).toHaveBeenCalledWith({
92
+ id: "test-bundle-id",
93
+ chain: ANVIL_CHAIN,
94
+ client: TEST_CLIENT,
95
+ });
170
96
  });
97
+ });
171
98
 
172
- test("with smart account", async () => {
173
- wallet = createWallet("inApp", {
174
- smartAccount: { chain: ANVIL_CHAIN, sponsorGas: true },
175
- });
176
- wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
177
- wallet.getAccount = vi.fn().mockReturnValue({
99
+ describe.sequential("injected wallet account.getCallsStatus", () => {
100
+ // These tests verify the behavior of the getCallsStatus method on injected wallet accounts
101
+ // The actual implementation would be in packages/thirdweb/src/wallets/injected/index.ts
102
+
103
+ test("should handle successful getCallsStatus", async () => {
104
+ const mockProvider = {
105
+ request: vi.fn().mockResolvedValue({
106
+ receipts: [],
107
+ status: "CONFIRMED",
108
+ }),
109
+ };
110
+
111
+ // Mock what an injected account with getCallsStatus would look like
112
+ const injectedAccount = {
178
113
  ...TEST_ACCOUNT_A,
179
- sendBatchTransaction,
180
- });
114
+ getCallsStatus: async (options: any) => {
115
+ // This mimics the implementation in injected/index.ts
116
+ const response = await mockProvider.request({
117
+ method: "wallet_getCallsStatus",
118
+ params: [options.id],
119
+ });
120
+ return {
121
+ ...response,
122
+ status: "success" as const,
123
+ statusCode: 200,
124
+ };
125
+ },
126
+ };
127
+
128
+ const wallet: Wallet = createWallet(METAMASK);
129
+ wallet.getAccount = vi.fn().mockReturnValue(injectedAccount);
130
+ wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
181
131
 
182
- const callResult = await sendCalls({
132
+ const result = await getCallsStatus({
133
+ client: TEST_CLIENT,
134
+ id: "test",
183
135
  wallet: wallet,
184
- ...SEND_CALLS_OPTIONS,
185
136
  });
186
137
 
187
- const result = await getCallsStatus(callResult);
188
-
189
138
  expect(result.status).toEqual("success");
190
- expect(result.receipts?.length).toEqual(1);
139
+ expect(result.statusCode).toEqual(200);
140
+ expect(mockProvider.request).toHaveBeenCalledWith({
141
+ method: "wallet_getCallsStatus",
142
+ params: ["test"],
143
+ });
191
144
  });
192
145
 
193
- test("with pending transaction", async () => {
194
- mocks.getTransactionReceipt.mockRejectedValue(null);
146
+ test("should handle provider errors", async () => {
147
+ const mockProvider = {
148
+ request: vi.fn().mockRejectedValue({
149
+ code: -32601,
150
+ message: "some nonsense the wallet sends us about not supporting",
151
+ }),
152
+ };
195
153
 
196
- wallet = createWallet("inApp");
197
- wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
198
- wallet.getAccount = vi.fn().mockReturnValue({
154
+ const injectedAccount = {
199
155
  ...TEST_ACCOUNT_A,
200
- sendTransaction,
201
- });
156
+ getCallsStatus: async (options: any) => {
157
+ try {
158
+ return await mockProvider.request({
159
+ method: "wallet_getCallsStatus",
160
+ params: [options.id],
161
+ });
162
+ } catch (error) {
163
+ throw new Error(
164
+ `io.metamask does not support wallet_getCallsStatus, reach out to them directly to request EIP-5792 support.`,
165
+ );
166
+ }
167
+ },
168
+ };
169
+
170
+ const wallet: Wallet = createWallet(METAMASK);
171
+ wallet.getAccount = vi.fn().mockReturnValue(injectedAccount);
172
+ wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
202
173
 
203
- const callResult = await sendCalls({
174
+ const promise = getCallsStatus({
175
+ client: TEST_CLIENT,
176
+ id: "test",
204
177
  wallet: wallet,
205
- ...SEND_CALLS_OPTIONS,
206
178
  });
207
179
 
208
- const result = await getCallsStatus(callResult);
180
+ await expect(promise).rejects.toMatchInlineSnapshot(
181
+ "[Error: io.metamask does not support wallet_getCallsStatus, reach out to them directly to request EIP-5792 support.]",
182
+ );
183
+ });
184
+ });
209
185
 
210
- expect(result.status).toEqual("pending");
211
- expect(result.receipts?.length).toEqual(0);
186
+ describe.sequential("in-app wallet", () => {
187
+ const wallet: Wallet = createWallet("inApp");
188
+
189
+ afterEach(() => {
190
+ vi.clearAllMocks();
212
191
  });
213
192
 
214
- test("unknown bundle id should fail", async () => {
215
- const promise = getCallsStatus({
193
+ test("should delegate to in-app wallet getCallsStatus implementation", async () => {
194
+ const mockResponse = {
195
+ status: "success" as const,
196
+ statusCode: 200,
197
+ receipts: [
198
+ {
199
+ blockNumber: 12345n,
200
+ gasUsed: 21000n,
201
+ status: "success" as const,
202
+ transactionHash:
203
+ "0x9b7bb827c2e5e3c1a0a44dc53e573aa0b3af3bd1f9f5ed03071b100bb039eaff",
204
+ },
205
+ ],
206
+ };
207
+
208
+ const inAppAccount = {
209
+ ...TEST_ACCOUNT_A,
210
+ getCallsStatus: async (options: any) => {
211
+ // This would be the actual in-app wallet implementation
212
+ return mockResponse;
213
+ },
214
+ };
215
+
216
+ wallet.getAccount = vi.fn().mockReturnValue(inAppAccount);
217
+ wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
218
+
219
+ const result = await getCallsStatus({
216
220
  client: TEST_CLIENT,
217
- id: "unknown",
221
+ id: "test-bundle-id",
218
222
  wallet: wallet,
219
223
  });
220
224
 
221
- await expect(promise).rejects.toMatchInlineSnapshot(
222
- "[Error: Failed to get calls status, unknown bundle id]",
223
- );
225
+ expect(result).toEqual(mockResponse);
224
226
  });
225
227
 
226
- test("without chain should fail", async () => {
227
- wallet.getChain = vi.fn().mockReturnValue(undefined);
228
+ test("should handle unknown bundle id error", async () => {
229
+ const inAppAccount = {
230
+ ...TEST_ACCOUNT_A,
231
+ getCallsStatus: async (options: any) => {
232
+ throw new Error("Failed to get calls status, unknown bundle id");
233
+ },
234
+ };
235
+
236
+ wallet.getAccount = vi.fn().mockReturnValue(inAppAccount);
237
+ wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
228
238
 
229
239
  const promise = getCallsStatus({
230
240
  client: TEST_CLIENT,
231
- id: "test",
241
+ id: "unknown",
232
242
  wallet: wallet,
233
243
  });
234
244
 
235
245
  await expect(promise).rejects.toMatchInlineSnapshot(
236
- "[Error: Failed to get calls status, no active chain found]",
246
+ "[Error: Failed to get calls status, unknown bundle id]",
237
247
  );
238
248
  });
239
249
  });