thirdweb 5.105.20 → 5.105.22

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 (160) 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/core/hooks/wallets/useConnect.js +10 -1
  10. package/dist/cjs/react/core/hooks/wallets/useConnect.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/version.js +1 -1
  14. package/dist/cjs/wallets/coinbase/coinbase-web.js +56 -0
  15. package/dist/cjs/wallets/coinbase/coinbase-web.js.map +1 -1
  16. package/dist/cjs/wallets/create-wallet.js +62 -13
  17. package/dist/cjs/wallets/create-wallet.js.map +1 -1
  18. package/dist/cjs/wallets/eip5792/get-calls-status.js +40 -63
  19. package/dist/cjs/wallets/eip5792/get-calls-status.js.map +1 -1
  20. package/dist/cjs/wallets/eip5792/get-capabilities.js +14 -49
  21. package/dist/cjs/wallets/eip5792/get-capabilities.js.map +1 -1
  22. package/dist/cjs/wallets/eip5792/send-calls.js +34 -48
  23. package/dist/cjs/wallets/eip5792/send-calls.js.map +1 -1
  24. package/dist/cjs/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.js +1 -5
  25. package/dist/cjs/wallets/in-app/core/eip5792/in-app-wallet-calls.js.map +1 -0
  26. package/dist/cjs/wallets/in-app/core/eip7702/minimal-account.js +650 -5
  27. package/dist/cjs/wallets/in-app/core/eip7702/minimal-account.js.map +1 -1
  28. package/dist/cjs/wallets/in-app/core/wallet/enclave-wallet.js +32 -1
  29. package/dist/cjs/wallets/in-app/core/wallet/enclave-wallet.js.map +1 -1
  30. package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js +3 -3
  31. package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
  32. package/dist/cjs/wallets/in-app/web/in-app.js +18 -0
  33. package/dist/cjs/wallets/in-app/web/in-app.js.map +1 -1
  34. package/dist/cjs/wallets/injected/index.js +55 -0
  35. package/dist/cjs/wallets/injected/index.js.map +1 -1
  36. package/dist/cjs/wallets/smart/index.js +63 -2
  37. package/dist/cjs/wallets/smart/index.js.map +1 -1
  38. package/dist/cjs/wallets/smart/smart-wallet.js +1 -1
  39. package/dist/cjs/wallets/smart/smart-wallet.js.map +1 -1
  40. package/dist/cjs/wallets/wallet-connect/qr-overlay.js +231 -0
  41. package/dist/cjs/wallets/wallet-connect/qr-overlay.js.map +1 -0
  42. package/dist/esm/extensions/erc1155/read/getOwnedNFTs.js +1 -0
  43. package/dist/esm/extensions/erc1155/read/getOwnedNFTs.js.map +1 -1
  44. package/dist/esm/extensions/erc721/read/getOwnedNFTs.js +1 -0
  45. package/dist/esm/extensions/erc721/read/getOwnedNFTs.js.map +1 -1
  46. package/dist/esm/insight/get-nfts.js +3 -3
  47. package/dist/esm/insight/get-nfts.js.map +1 -1
  48. package/dist/esm/insight/get-tokens.js +3 -2
  49. package/dist/esm/insight/get-tokens.js.map +1 -1
  50. package/dist/esm/react/core/hooks/wallets/useConnect.js +10 -1
  51. package/dist/esm/react/core/hooks/wallets/useConnect.js.map +1 -1
  52. package/dist/esm/transaction/actions/estimate-gas.js +3 -24
  53. package/dist/esm/transaction/actions/estimate-gas.js.map +1 -1
  54. package/dist/esm/version.js +1 -1
  55. package/dist/esm/wallets/coinbase/coinbase-web.js +56 -0
  56. package/dist/esm/wallets/coinbase/coinbase-web.js.map +1 -1
  57. package/dist/esm/wallets/create-wallet.js +62 -13
  58. package/dist/esm/wallets/create-wallet.js.map +1 -1
  59. package/dist/esm/wallets/eip5792/get-calls-status.js +39 -63
  60. package/dist/esm/wallets/eip5792/get-calls-status.js.map +1 -1
  61. package/dist/esm/wallets/eip5792/get-capabilities.js +13 -49
  62. package/dist/esm/wallets/eip5792/get-capabilities.js.map +1 -1
  63. package/dist/esm/wallets/eip5792/send-calls.js +33 -48
  64. package/dist/esm/wallets/eip5792/send-calls.js.map +1 -1
  65. package/dist/esm/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.js +1 -5
  66. package/dist/esm/wallets/in-app/core/eip5792/in-app-wallet-calls.js.map +1 -0
  67. package/dist/esm/wallets/in-app/core/eip7702/minimal-account.js +650 -5
  68. package/dist/esm/wallets/in-app/core/eip7702/minimal-account.js.map +1 -1
  69. package/dist/esm/wallets/in-app/core/wallet/enclave-wallet.js +32 -1
  70. package/dist/esm/wallets/in-app/core/wallet/enclave-wallet.js.map +1 -1
  71. package/dist/esm/wallets/in-app/core/wallet/in-app-core.js +3 -3
  72. package/dist/esm/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
  73. package/dist/esm/wallets/in-app/web/in-app.js +18 -0
  74. package/dist/esm/wallets/in-app/web/in-app.js.map +1 -1
  75. package/dist/esm/wallets/injected/index.js +56 -1
  76. package/dist/esm/wallets/injected/index.js.map +1 -1
  77. package/dist/esm/wallets/smart/index.js +63 -2
  78. package/dist/esm/wallets/smart/index.js.map +1 -1
  79. package/dist/esm/wallets/smart/smart-wallet.js +1 -1
  80. package/dist/esm/wallets/smart/smart-wallet.js.map +1 -1
  81. package/dist/esm/wallets/wallet-connect/qr-overlay.js +228 -0
  82. package/dist/esm/wallets/wallet-connect/qr-overlay.js.map +1 -0
  83. package/dist/types/bridge/Webhook.d.ts +2 -2
  84. package/dist/types/insight/get-nfts.d.ts +1 -0
  85. package/dist/types/insight/get-nfts.d.ts.map +1 -1
  86. package/dist/types/insight/get-tokens.d.ts +1 -0
  87. package/dist/types/insight/get-tokens.d.ts.map +1 -1
  88. package/dist/types/react/core/hooks/wallets/useConnect.d.ts +1 -0
  89. package/dist/types/react/core/hooks/wallets/useConnect.d.ts.map +1 -1
  90. package/dist/types/react/core/hooks/wallets/useWaitForCallsReceipt.d.ts +1 -1
  91. package/dist/types/react/core/utils/storage.d.ts +1 -1
  92. package/dist/types/react/web/utils/storage.d.ts +1 -1
  93. package/dist/types/transaction/actions/estimate-gas.d.ts.map +1 -1
  94. package/dist/types/version.d.ts +1 -1
  95. package/dist/types/wallets/coinbase/coinbase-web.d.ts.map +1 -1
  96. package/dist/types/wallets/create-wallet.d.ts.map +1 -1
  97. package/dist/types/wallets/eip5792/get-calls-status.d.ts +2 -1
  98. package/dist/types/wallets/eip5792/get-calls-status.d.ts.map +1 -1
  99. package/dist/types/wallets/eip5792/get-capabilities.d.ts +1 -0
  100. package/dist/types/wallets/eip5792/get-capabilities.d.ts.map +1 -1
  101. package/dist/types/wallets/eip5792/send-calls.d.ts +6 -1
  102. package/dist/types/wallets/eip5792/send-calls.d.ts.map +1 -1
  103. package/dist/types/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.d.ts +3 -2
  104. package/dist/types/wallets/in-app/core/eip5792/in-app-wallet-calls.d.ts.map +1 -0
  105. package/dist/types/wallets/in-app/core/eip7702/minimal-account.d.ts.map +1 -1
  106. package/dist/types/wallets/in-app/core/wallet/enclave-wallet.d.ts.map +1 -1
  107. package/dist/types/wallets/in-app/web/in-app.d.ts +18 -0
  108. package/dist/types/wallets/in-app/web/in-app.d.ts.map +1 -1
  109. package/dist/types/wallets/injected/index.d.ts.map +1 -1
  110. package/dist/types/wallets/interfaces/wallet.d.ts +22 -0
  111. package/dist/types/wallets/interfaces/wallet.d.ts.map +1 -1
  112. package/dist/types/wallets/smart/index.d.ts.map +1 -1
  113. package/dist/types/wallets/wallet-connect/qr-overlay.d.ts +58 -0
  114. package/dist/types/wallets/wallet-connect/qr-overlay.d.ts.map +1 -0
  115. package/dist/types/wallets/wallet-connect/types.d.ts +13 -0
  116. package/dist/types/wallets/wallet-connect/types.d.ts.map +1 -1
  117. package/package.json +4 -2
  118. package/src/extensions/erc1155/read/getOwnedNFTs.ts +1 -0
  119. package/src/extensions/erc721/read/getOwnedNFTs.ts +1 -0
  120. package/src/insight/get-nfts.ts +4 -3
  121. package/src/insight/get-tokens.ts +4 -2
  122. package/src/react/core/hooks/wallets/useConnect.ts +11 -1
  123. package/src/transaction/actions/estimate-gas.ts +14 -42
  124. package/src/version.ts +1 -1
  125. package/src/wallets/coinbase/coinbase-web.ts +66 -0
  126. package/src/wallets/create-wallet.ts +85 -24
  127. package/src/wallets/eip5792/get-calls-status.test.ts +156 -146
  128. package/src/wallets/eip5792/get-calls-status.ts +44 -73
  129. package/src/wallets/eip5792/get-capabilities.test.ts +216 -205
  130. package/src/wallets/eip5792/get-capabilities.ts +23 -64
  131. package/src/wallets/eip5792/send-calls.test.ts +183 -189
  132. package/src/wallets/eip5792/send-calls.ts +53 -71
  133. package/src/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.ts +4 -8
  134. package/src/wallets/in-app/core/eip7702/minimal-account.ts +666 -5
  135. package/src/wallets/in-app/core/wallet/enclave-wallet.ts +36 -1
  136. package/src/wallets/in-app/core/wallet/in-app-core.ts +4 -4
  137. package/src/wallets/in-app/web/in-app.ts +18 -0
  138. package/src/wallets/injected/index.ts +63 -0
  139. package/src/wallets/interfaces/wallet.ts +31 -0
  140. package/src/wallets/smart/index.ts +71 -3
  141. package/src/wallets/smart/smart-wallet.ts +1 -1
  142. package/src/wallets/wallet-connect/qr-overlay.ts +322 -0
  143. package/src/wallets/wallet-connect/types.ts +13 -0
  144. package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-calls.js.map +0 -1
  145. package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js +0 -41
  146. package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js.map +0 -1
  147. package/dist/cjs/wallets/smart/lib/smart-wallet-capabilities.js +0 -30
  148. package/dist/cjs/wallets/smart/lib/smart-wallet-capabilities.js.map +0 -1
  149. package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-calls.js.map +0 -1
  150. package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js +0 -38
  151. package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js.map +0 -1
  152. package/dist/esm/wallets/smart/lib/smart-wallet-capabilities.js +0 -27
  153. package/dist/esm/wallets/smart/lib/smart-wallet-capabilities.js.map +0 -1
  154. package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-calls.d.ts.map +0 -1
  155. package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-capabilities.d.ts +0 -20
  156. package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-capabilities.d.ts.map +0 -1
  157. package/dist/types/wallets/smart/lib/smart-wallet-capabilities.d.ts +0 -20
  158. package/dist/types/wallets/smart/lib/smart-wallet-capabilities.d.ts.map +0 -1
  159. package/src/wallets/in-app/core/eip5972/in-app-wallet-capabilities.ts +0 -47
  160. package/src/wallets/smart/lib/smart-wallet-capabilities.ts +0 -32
@@ -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
  });
@@ -1,12 +1,6 @@
1
1
  import type { ThirdwebClient } from "../../client/client.js";
2
2
  import { hexToBigInt, hexToNumber } from "../../utils/encoding/hex.js";
3
- import { isCoinbaseSDKWallet } from "../coinbase/coinbase-web.js";
4
- import { isInAppWallet } from "../in-app/core/wallet/index.js";
5
- import { getInjectedProvider } from "../injected/index.js";
6
- import type { Ethereum } from "../interfaces/ethereum.js";
7
3
  import type { Wallet } from "../interfaces/wallet.js";
8
- import { isSmartWallet } from "../smart/index.js";
9
- import { isWalletConnect } from "../wallet-connect/controller.js";
10
4
  import type {
11
5
  GetCallsStatusRawResponse,
12
6
  GetCallsStatusResponse,
@@ -59,81 +53,58 @@ export async function getCallsStatus({
59
53
  );
60
54
  }
61
55
 
62
- // These conveniently operate the same
63
- if (isSmartWallet(wallet) || isInAppWallet(wallet)) {
64
- const { inAppWalletGetCallsStatus } = await import(
65
- "../in-app/core/eip5972/in-app-wallet-calls.js"
56
+ const chain = wallet.getChain();
57
+ if (!chain) {
58
+ throw new Error(
59
+ `Failed to get call status, no chain found for wallet ${wallet.id}`,
66
60
  );
67
- return inAppWalletGetCallsStatus({ client, id, wallet });
68
- }
69
-
70
- if (isWalletConnect(wallet)) {
71
- throw new Error("getCallsStatus is not yet supported for Wallet Connect");
72
61
  }
73
62
 
74
- let provider: Ethereum;
75
- if (isCoinbaseSDKWallet(wallet)) {
76
- const { getCoinbaseWebProvider } = await import(
77
- "../coinbase/coinbase-web.js"
78
- );
79
- const config = wallet.getConfig();
80
- provider = (await getCoinbaseWebProvider(config)) as Ethereum;
81
- } else {
82
- provider = getInjectedProvider(wallet.id);
63
+ if (account.getCallsStatus) {
64
+ return account.getCallsStatus({ id, chain, client });
83
65
  }
84
66
 
85
- try {
86
- const {
87
- atomic = false,
88
- chainId,
89
- receipts,
90
- version = "2.0.0",
91
- ...response
92
- } = (await provider.request({
93
- method: "wallet_getCallsStatus",
94
- params: [id],
95
- })) as GetCallsStatusRawResponse;
96
- const [status, statusCode] = (() => {
97
- const statusCode = response.status;
98
- if (statusCode >= 100 && statusCode < 200)
99
- return ["pending", statusCode] as const;
100
- if (statusCode >= 200 && statusCode < 300)
101
- return ["success", statusCode] as const;
102
- if (statusCode >= 300 && statusCode < 700)
103
- return ["failure", statusCode] as const;
104
- // @ts-expect-error: for backwards compatibility
105
- if (statusCode === "CONFIRMED") return ["success", 200] as const;
106
- // @ts-expect-error: for backwards compatibility
107
- if (statusCode === "PENDING") return ["pending", 100] as const;
108
- return [undefined, statusCode];
109
- })();
110
- return {
111
- ...response,
112
- atomic,
113
- // @ts-expect-error: for backwards compatibility
114
- chainId: chainId ? hexToNumber(chainId) : undefined,
115
- receipts:
116
- receipts?.map((receipt) => ({
117
- ...receipt,
118
- blockNumber: hexToBigInt(receipt.blockNumber),
119
- gasUsed: hexToBigInt(receipt.gasUsed),
120
- status: receiptStatuses[receipt.status as "0x0" | "0x1"],
121
- })) ?? [],
122
- status,
123
- statusCode,
124
- version,
125
- };
126
- } catch (error) {
127
- if (/unsupport|not support/i.test((error as Error).message)) {
128
- throw new Error(
129
- `${wallet.id} does not support wallet_getCallsStatus, reach out to them directly to request EIP-5792 support.`,
130
- );
131
- }
132
- throw error;
133
- }
67
+ throw new Error(
68
+ `Failed to get call status, wallet ${wallet.id} does not support EIP-5792`,
69
+ );
134
70
  }
135
71
 
136
72
  const receiptStatuses = {
137
73
  "0x0": "reverted",
138
74
  "0x1": "success",
139
75
  } as const;
76
+
77
+ export function toGetCallsStatusResponse(
78
+ response: GetCallsStatusRawResponse,
79
+ ): GetCallsStatusResponse {
80
+ const [status, statusCode] = (() => {
81
+ const statusCode = response.status;
82
+ if (statusCode >= 100 && statusCode < 200)
83
+ return ["pending", statusCode] as const;
84
+ if (statusCode >= 200 && statusCode < 300)
85
+ return ["success", statusCode] as const;
86
+ if (statusCode >= 300 && statusCode < 700)
87
+ return ["failure", statusCode] as const;
88
+ // @ts-expect-error: for backwards compatibility
89
+ if (statusCode === "CONFIRMED") return ["success", 200] as const;
90
+ // @ts-expect-error: for backwards compatibility
91
+ if (statusCode === "PENDING") return ["pending", 100] as const;
92
+ return [undefined, statusCode];
93
+ })();
94
+ return {
95
+ ...response,
96
+ atomic: response.atomic,
97
+ // @ts-expect-error: for backwards compatibility
98
+ chainId: response.chainId ? hexToNumber(response.chainId) : undefined,
99
+ receipts:
100
+ response.receipts?.map((receipt) => ({
101
+ ...receipt,
102
+ blockNumber: hexToBigInt(receipt.blockNumber),
103
+ gasUsed: hexToBigInt(receipt.gasUsed),
104
+ status: receiptStatuses[receipt.status as "0x0" | "0x1"],
105
+ })) ?? [],
106
+ status,
107
+ statusCode,
108
+ version: response.version,
109
+ };
110
+ }