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.
- 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/react/web/wallets/shared/WalletConnectConnection.js +7 -33
- package/dist/cjs/react/web/wallets/shared/WalletConnectConnection.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/utils/web/isMobile.js +0 -2
- package/dist/cjs/utils/web/isMobile.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/create-wallet.js +21 -4
- package/dist/cjs/wallets/create-wallet.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/cjs/wallets/wallet-connect/controller.js +27 -25
- package/dist/cjs/wallets/wallet-connect/controller.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/react/web/wallets/shared/WalletConnectConnection.js +8 -34
- package/dist/esm/react/web/wallets/shared/WalletConnectConnection.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/utils/web/isMobile.js +2 -2
- package/dist/esm/utils/web/isMobile.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/create-wallet.js +21 -4
- package/dist/esm/wallets/create-wallet.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/esm/wallets/wallet-connect/controller.js +27 -25
- package/dist/esm/wallets/wallet-connect/controller.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/react/web/wallets/shared/WalletConnectConnection.d.ts.map +1 -1
- package/dist/types/transaction/actions/estimate-gas.d.ts.map +1 -1
- package/dist/types/utils/web/isMobile.d.ts +0 -8
- package/dist/types/utils/web/isMobile.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/create-wallet.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/dist/types/wallets/wallet-connect/controller.d.ts.map +1 -1
- package/package.json +3 -3
- 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/react/web/wallets/shared/WalletConnectConnection.tsx +11 -46
- package/src/transaction/actions/estimate-gas.ts +14 -42
- package/src/utils/web/isMobile.ts +2 -2
- package/src/version.ts +1 -1
- package/src/wallets/coinbase/coinbase-web.ts +66 -0
- package/src/wallets/create-wallet.ts +53 -31
- 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/src/wallets/wallet-connect/controller.ts +28 -25
- 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
|
@@ -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:
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
});
|