thirdweb 5.105.21 → 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.
- package/dist/cjs/extensions/erc1155/read/getOwnedNFTs.js +1 -0
- package/dist/cjs/extensions/erc1155/read/getOwnedNFTs.js.map +1 -1
- package/dist/cjs/extensions/erc721/read/getOwnedNFTs.js +1 -0
- package/dist/cjs/extensions/erc721/read/getOwnedNFTs.js.map +1 -1
- package/dist/cjs/insight/get-nfts.js +3 -3
- package/dist/cjs/insight/get-nfts.js.map +1 -1
- package/dist/cjs/insight/get-tokens.js +3 -2
- package/dist/cjs/insight/get-tokens.js.map +1 -1
- package/dist/cjs/transaction/actions/estimate-gas.js +3 -24
- package/dist/cjs/transaction/actions/estimate-gas.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/wallets/coinbase/coinbase-web.js +56 -0
- package/dist/cjs/wallets/coinbase/coinbase-web.js.map +1 -1
- package/dist/cjs/wallets/eip5792/get-calls-status.js +40 -63
- package/dist/cjs/wallets/eip5792/get-calls-status.js.map +1 -1
- package/dist/cjs/wallets/eip5792/get-capabilities.js +14 -49
- package/dist/cjs/wallets/eip5792/get-capabilities.js.map +1 -1
- package/dist/cjs/wallets/eip5792/send-calls.js +34 -48
- package/dist/cjs/wallets/eip5792/send-calls.js.map +1 -1
- package/dist/cjs/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.js +1 -5
- package/dist/cjs/wallets/in-app/core/eip5792/in-app-wallet-calls.js.map +1 -0
- package/dist/cjs/wallets/in-app/core/eip7702/minimal-account.js +650 -5
- package/dist/cjs/wallets/in-app/core/eip7702/minimal-account.js.map +1 -1
- package/dist/cjs/wallets/in-app/core/wallet/enclave-wallet.js +32 -1
- package/dist/cjs/wallets/in-app/core/wallet/enclave-wallet.js.map +1 -1
- package/dist/cjs/wallets/injected/index.js +55 -0
- package/dist/cjs/wallets/injected/index.js.map +1 -1
- package/dist/cjs/wallets/smart/index.js +61 -0
- package/dist/cjs/wallets/smart/index.js.map +1 -1
- package/dist/esm/extensions/erc1155/read/getOwnedNFTs.js +1 -0
- package/dist/esm/extensions/erc1155/read/getOwnedNFTs.js.map +1 -1
- package/dist/esm/extensions/erc721/read/getOwnedNFTs.js +1 -0
- package/dist/esm/extensions/erc721/read/getOwnedNFTs.js.map +1 -1
- package/dist/esm/insight/get-nfts.js +3 -3
- package/dist/esm/insight/get-nfts.js.map +1 -1
- package/dist/esm/insight/get-tokens.js +3 -2
- package/dist/esm/insight/get-tokens.js.map +1 -1
- package/dist/esm/transaction/actions/estimate-gas.js +3 -24
- package/dist/esm/transaction/actions/estimate-gas.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/wallets/coinbase/coinbase-web.js +56 -0
- package/dist/esm/wallets/coinbase/coinbase-web.js.map +1 -1
- package/dist/esm/wallets/eip5792/get-calls-status.js +39 -63
- package/dist/esm/wallets/eip5792/get-calls-status.js.map +1 -1
- package/dist/esm/wallets/eip5792/get-capabilities.js +13 -49
- package/dist/esm/wallets/eip5792/get-capabilities.js.map +1 -1
- package/dist/esm/wallets/eip5792/send-calls.js +33 -48
- package/dist/esm/wallets/eip5792/send-calls.js.map +1 -1
- package/dist/esm/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.js +1 -5
- package/dist/esm/wallets/in-app/core/eip5792/in-app-wallet-calls.js.map +1 -0
- package/dist/esm/wallets/in-app/core/eip7702/minimal-account.js +650 -5
- package/dist/esm/wallets/in-app/core/eip7702/minimal-account.js.map +1 -1
- package/dist/esm/wallets/in-app/core/wallet/enclave-wallet.js +32 -1
- package/dist/esm/wallets/in-app/core/wallet/enclave-wallet.js.map +1 -1
- package/dist/esm/wallets/injected/index.js +56 -1
- package/dist/esm/wallets/injected/index.js.map +1 -1
- package/dist/esm/wallets/smart/index.js +61 -0
- package/dist/esm/wallets/smart/index.js.map +1 -1
- package/dist/types/bridge/Webhook.d.ts +2 -2
- package/dist/types/insight/get-nfts.d.ts +1 -0
- package/dist/types/insight/get-nfts.d.ts.map +1 -1
- package/dist/types/insight/get-tokens.d.ts +1 -0
- package/dist/types/insight/get-tokens.d.ts.map +1 -1
- package/dist/types/react/core/hooks/wallets/useWaitForCallsReceipt.d.ts +1 -1
- package/dist/types/react/core/utils/storage.d.ts +1 -1
- package/dist/types/react/web/utils/storage.d.ts +1 -1
- package/dist/types/transaction/actions/estimate-gas.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/wallets/coinbase/coinbase-web.d.ts.map +1 -1
- package/dist/types/wallets/eip5792/get-calls-status.d.ts +2 -1
- package/dist/types/wallets/eip5792/get-calls-status.d.ts.map +1 -1
- package/dist/types/wallets/eip5792/get-capabilities.d.ts +1 -0
- package/dist/types/wallets/eip5792/get-capabilities.d.ts.map +1 -1
- package/dist/types/wallets/eip5792/send-calls.d.ts +6 -1
- package/dist/types/wallets/eip5792/send-calls.d.ts.map +1 -1
- package/dist/types/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.d.ts +3 -2
- package/dist/types/wallets/in-app/core/eip5792/in-app-wallet-calls.d.ts.map +1 -0
- package/dist/types/wallets/in-app/core/eip7702/minimal-account.d.ts.map +1 -1
- package/dist/types/wallets/in-app/core/wallet/enclave-wallet.d.ts.map +1 -1
- package/dist/types/wallets/injected/index.d.ts.map +1 -1
- package/dist/types/wallets/interfaces/wallet.d.ts +22 -0
- package/dist/types/wallets/interfaces/wallet.d.ts.map +1 -1
- package/dist/types/wallets/smart/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/extensions/erc1155/read/getOwnedNFTs.ts +1 -0
- package/src/extensions/erc721/read/getOwnedNFTs.ts +1 -0
- package/src/insight/get-nfts.ts +4 -3
- package/src/insight/get-tokens.ts +4 -2
- package/src/transaction/actions/estimate-gas.ts +14 -42
- package/src/version.ts +1 -1
- package/src/wallets/coinbase/coinbase-web.ts +66 -0
- package/src/wallets/eip5792/get-calls-status.test.ts +156 -146
- package/src/wallets/eip5792/get-calls-status.ts +44 -73
- package/src/wallets/eip5792/get-capabilities.test.ts +216 -205
- package/src/wallets/eip5792/get-capabilities.ts +23 -64
- package/src/wallets/eip5792/send-calls.test.ts +183 -189
- package/src/wallets/eip5792/send-calls.ts +53 -71
- package/src/wallets/in-app/core/{eip5972 → eip5792}/in-app-wallet-calls.ts +4 -8
- package/src/wallets/in-app/core/eip7702/minimal-account.ts +666 -5
- package/src/wallets/in-app/core/wallet/enclave-wallet.ts +36 -1
- package/src/wallets/injected/index.ts +63 -0
- package/src/wallets/interfaces/wallet.ts +31 -0
- package/src/wallets/smart/index.ts +69 -1
- package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-calls.js.map +0 -1
- package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js +0 -41
- package/dist/cjs/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js.map +0 -1
- package/dist/cjs/wallets/smart/lib/smart-wallet-capabilities.js +0 -30
- package/dist/cjs/wallets/smart/lib/smart-wallet-capabilities.js.map +0 -1
- package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-calls.js.map +0 -1
- package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js +0 -38
- package/dist/esm/wallets/in-app/core/eip5972/in-app-wallet-capabilities.js.map +0 -1
- package/dist/esm/wallets/smart/lib/smart-wallet-capabilities.js +0 -27
- package/dist/esm/wallets/smart/lib/smart-wallet-capabilities.js.map +0 -1
- package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-calls.d.ts.map +0 -1
- package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-capabilities.d.ts +0 -20
- package/dist/types/wallets/in-app/core/eip5972/in-app-wallet-capabilities.d.ts.map +0 -1
- package/dist/types/wallets/smart/lib/smart-wallet-capabilities.d.ts +0 -20
- package/dist/types/wallets/smart/lib/smart-wallet-capabilities.d.ts.map +0 -1
- package/src/wallets/in-app/core/eip5972/in-app-wallet-capabilities.ts +0 -47
- 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
|
-
|
|
35
|
-
injectedRequest: vi.fn(),
|
|
11
|
+
getCallsStatus: vi.fn(),
|
|
36
12
|
}));
|
|
37
13
|
|
|
38
|
-
|
|
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
|
-
|
|
32
|
+
"[Error: Failed to get call status, no account found for wallet io.metamask]",
|
|
97
33
|
);
|
|
98
34
|
});
|
|
99
35
|
|
|
100
|
-
test("
|
|
36
|
+
test("with no chain should fail", async () => {
|
|
101
37
|
wallet.getAccount = vi.fn().mockReturnValue(TEST_ACCOUNT_A);
|
|
102
|
-
|
|
103
|
-
receipts: [],
|
|
104
|
-
status: "CONFIRMED",
|
|
105
|
-
});
|
|
38
|
+
wallet.getChain = vi.fn().mockReturnValue(undefined);
|
|
106
39
|
|
|
107
|
-
const
|
|
40
|
+
const promise = getCallsStatus({
|
|
108
41
|
client: TEST_CLIENT,
|
|
109
42
|
id: "test",
|
|
110
43
|
wallet: wallet,
|
|
111
44
|
});
|
|
112
45
|
|
|
113
|
-
expect(
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
131
|
-
|
|
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:
|
|
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
|
-
|
|
151
|
-
|
|
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
|
-
|
|
155
|
-
wallet.getAccount = vi.fn().mockReturnValue({
|
|
76
|
+
const mockAccount = {
|
|
156
77
|
...TEST_ACCOUNT_A,
|
|
157
|
-
|
|
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
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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("
|
|
194
|
-
|
|
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
|
-
|
|
197
|
-
wallet.getChain = vi.fn().mockReturnValue(ANVIL_CHAIN);
|
|
198
|
-
wallet.getAccount = vi.fn().mockReturnValue({
|
|
154
|
+
const injectedAccount = {
|
|
199
155
|
...TEST_ACCOUNT_A,
|
|
200
|
-
|
|
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
|
|
174
|
+
const promise = getCallsStatus({
|
|
175
|
+
client: TEST_CLIENT,
|
|
176
|
+
id: "test",
|
|
204
177
|
wallet: wallet,
|
|
205
|
-
...SEND_CALLS_OPTIONS,
|
|
206
178
|
});
|
|
207
179
|
|
|
208
|
-
|
|
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
|
-
|
|
211
|
-
|
|
186
|
+
describe.sequential("in-app wallet", () => {
|
|
187
|
+
const wallet: Wallet = createWallet("inApp");
|
|
188
|
+
|
|
189
|
+
afterEach(() => {
|
|
190
|
+
vi.clearAllMocks();
|
|
212
191
|
});
|
|
213
192
|
|
|
214
|
-
test("
|
|
215
|
-
const
|
|
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: "
|
|
221
|
+
id: "test-bundle-id",
|
|
218
222
|
wallet: wallet,
|
|
219
223
|
});
|
|
220
224
|
|
|
221
|
-
|
|
222
|
-
"[Error: Failed to get calls status, unknown bundle id]",
|
|
223
|
-
);
|
|
225
|
+
expect(result).toEqual(mockResponse);
|
|
224
226
|
});
|
|
225
227
|
|
|
226
|
-
test("
|
|
227
|
-
|
|
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: "
|
|
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,
|
|
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
|
-
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
75
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
+
}
|