@account-kit/wallet-client 4.82.1 → 4.83.0

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.
@@ -4,6 +4,7 @@ import { signPreparedCalls } from "./signPreparedCalls.js";
4
4
  import { sendPreparedCalls, } from "./sendPreparedCalls.js";
5
5
  import { signSignatureRequest } from "./signSignatureRequest.js";
6
6
  import { isWebAuthnSigner } from "../../utils.js";
7
+ import { extractCapabilitiesForSending } from "../../internal/capabilities.js";
7
8
  /**
8
9
  * Prepares, signs, and submits calls. This function internally calls `prepareCalls`, `signPreparedCalls`, and `sendPreparedCalls`.
9
10
  *
@@ -56,12 +57,10 @@ export async function sendCalls(client, signer, params) {
56
57
  calls = await prepareCalls(client, secondCallParams);
57
58
  }
58
59
  const signedCalls = await signPreparedCalls(signer, calls);
60
+ const capabilities = extractCapabilitiesForSending(params.capabilities);
59
61
  return await sendPreparedCalls(client, {
60
62
  ...signedCalls,
61
- // The only capability that is supported in sendPreparedCalls is permissions.
62
- ...(params.capabilities?.permissions != null
63
- ? { capabilities: { permissions: params.capabilities.permissions } }
64
- : {}),
63
+ ...(capabilities != null ? { capabilities } : {}),
65
64
  });
66
65
  }
67
66
  //# sourceMappingURL=sendCalls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sendCalls.js","sourceRoot":"","sources":["../../../../src/client/actions/sendCalls.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAA2B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,iBAAiB,GAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAQlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAG7B,MAA4B,EAC5B,MAAyB,EACzB,MAAiC;IAEjC,OAAO,CAAC,UAAU,CAAC;QACjB,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/C,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACtC,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAC1C,MAAM,EACN,KAAK,CAAC,gBAAgB,CACvB,CAAC;QAEF,MAAM,gBAAgB,GAAG;YACvB,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC,IAAI;YAChC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,KAAK;YAClC,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,YAAY;YAChD,wBAAwB,EAAE,SAAS;SACpC,CAAC;QAEF,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE3D,OAAO,MAAM,iBAAiB,CAAC,MAAM,EAAE;QACrC,GAAG,WAAW;QACd,6EAA6E;QAC7E,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,IAAI,IAAI;YAC1C,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;YACpE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Address } from \"viem\";\nimport type { InnerWalletApiClient } from \"../../types.js\";\nimport { prepareCalls, type PrepareCallsParams } from \"./prepareCalls.js\";\nimport { metrics } from \"../../metrics.js\";\nimport { signPreparedCalls } from \"./signPreparedCalls.js\";\nimport {\n sendPreparedCalls,\n type SendPreparedCallsResult,\n} from \"./sendPreparedCalls.js\";\nimport { signSignatureRequest } from \"./signSignatureRequest.js\";\nimport type { SmartWalletSigner } from \"../index.js\";\nimport { isWebAuthnSigner } from \"../../utils.js\";\n\nexport type SendCallsParams<\n TAccount extends Address | undefined = Address | undefined,\n> = PrepareCallsParams<TAccount>;\n\nexport type SendCallsResult = SendPreparedCallsResult;\n\n/**\n * Prepares, signs, and submits calls. This function internally calls `prepareCalls`, `signPreparedCalls`, and `sendPreparedCalls`.\n *\n * <Note>\n * If using this action with an ERC-20 paymaster in pre-operation mode with `autoPermit`, the contents of the permit will be hidden\n * from the user. It is recommended to use the `prepareCalls` action instead to manually handle the permit signature.\n * </Note>\n *\n * @param {InnerWalletApiClient} client - The wallet API client to use for the request\n * @param {SmartAccountSigner | WebAuthnSigner} signer - The signer to use\n * @param {PrepareCallsParams<TAccount>} params - Parameters for sending calls\n * @param {Array<{to: Address, data?: Hex, value?: Hex}>} params.calls - Array of contract calls to execute\n * @param {Address} [params.from] - The address to execute the calls from (required if the client wasn't initialized with an account)\n * @param {object} [params.capabilities] - Optional capabilities to include with the request. See [API documentation](/wallets/api-reference/smart-wallets/wallet-api-endpoints/wallet-api-endpoints/wallet-prepare-calls#request.body.prepareCallsRequest.capabilities) for details.\n * @returns {Promise<SendPreparedCallsResult>} A Promise that resolves to the result containing the prepared call IDs.\n *\n * @example\n * ```ts\n * const result = await client.sendCalls({\n * calls: [{\n * to: \"0x1234...\",\n * data: \"0xabcdef...\",\n * value: \"0x0\"\n * }],\n * capabilities: {\n * paymasterService: { policyId: \"your-policy-id\" }\n * }\n * });\n *\n * // The result contains the prepared call IDs\n * console.log(result.preparedCallIds);\n * ```\n */\nexport async function sendCalls<\n TAccount extends Address | undefined = Address | undefined,\n>(\n client: InnerWalletApiClient,\n signer: SmartWalletSigner,\n params: SendCallsParams<TAccount>,\n): Promise<SendCallsResult> {\n metrics.trackEvent({\n name: \"send_calls\",\n });\n\n let calls = await prepareCalls(client, params);\n\n if (calls.type === \"paymaster-permit\") {\n if (isWebAuthnSigner(signer)) {\n throw new Error(\n \"WebAuthn signer is not currently supported for signing paymaster permit signatures\",\n );\n }\n const signature = await signSignatureRequest(\n signer,\n calls.signatureRequest,\n );\n\n const secondCallParams = {\n from: calls.modifiedRequest.from,\n calls: calls.modifiedRequest.calls,\n capabilities: calls.modifiedRequest.capabilities,\n paymasterPermitSignature: signature,\n };\n\n calls = await prepareCalls(client, secondCallParams);\n }\n\n const signedCalls = await signPreparedCalls(signer, calls);\n\n return await sendPreparedCalls(client, {\n ...signedCalls,\n // The only capability that is supported in sendPreparedCalls is permissions.\n ...(params.capabilities?.permissions != null\n ? { capabilities: { permissions: params.capabilities.permissions } }\n : {}),\n });\n}\n"]}
1
+ {"version":3,"file":"sendCalls.js","sourceRoot":"","sources":["../../../../src/client/actions/sendCalls.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAA2B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,iBAAiB,GAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAQ/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAG7B,MAA4B,EAC5B,MAAyB,EACzB,MAAiC;IAEjC,OAAO,CAAC,UAAU,CAAC;QACjB,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/C,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACtC,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAC1C,MAAM,EACN,KAAK,CAAC,gBAAgB,CACvB,CAAC;QAEF,MAAM,gBAAgB,GAAG;YACvB,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC,IAAI;YAChC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,KAAK;YAClC,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,YAAY;YAChD,wBAAwB,EAAE,SAAS;SACpC,CAAC;QAEF,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE3D,MAAM,YAAY,GAAG,6BAA6B,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAExE,OAAO,MAAM,iBAAiB,CAAC,MAAM,EAAE;QACrC,GAAG,WAAW;QACd,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Address } from \"viem\";\nimport type { InnerWalletApiClient } from \"../../types.js\";\nimport { prepareCalls, type PrepareCallsParams } from \"./prepareCalls.js\";\nimport { metrics } from \"../../metrics.js\";\nimport { signPreparedCalls } from \"./signPreparedCalls.js\";\nimport {\n sendPreparedCalls,\n type SendPreparedCallsResult,\n} from \"./sendPreparedCalls.js\";\nimport { signSignatureRequest } from \"./signSignatureRequest.js\";\nimport type { SmartWalletSigner } from \"../index.js\";\nimport { isWebAuthnSigner } from \"../../utils.js\";\nimport { extractCapabilitiesForSending } from \"../../internal/capabilities.js\";\n\nexport type SendCallsParams<\n TAccount extends Address | undefined = Address | undefined,\n> = PrepareCallsParams<TAccount>;\n\nexport type SendCallsResult = SendPreparedCallsResult;\n\n/**\n * Prepares, signs, and submits calls. This function internally calls `prepareCalls`, `signPreparedCalls`, and `sendPreparedCalls`.\n *\n * <Note>\n * If using this action with an ERC-20 paymaster in pre-operation mode with `autoPermit`, the contents of the permit will be hidden\n * from the user. It is recommended to use the `prepareCalls` action instead to manually handle the permit signature.\n * </Note>\n *\n * @param {InnerWalletApiClient} client - The wallet API client to use for the request\n * @param {SmartAccountSigner | WebAuthnSigner} signer - The signer to use\n * @param {PrepareCallsParams<TAccount>} params - Parameters for sending calls\n * @param {Array<{to: Address, data?: Hex, value?: Hex}>} params.calls - Array of contract calls to execute\n * @param {Address} [params.from] - The address to execute the calls from (required if the client wasn't initialized with an account)\n * @param {object} [params.capabilities] - Optional capabilities to include with the request. See [API documentation](/wallets/api-reference/smart-wallets/wallet-api-endpoints/wallet-api-endpoints/wallet-prepare-calls#request.body.prepareCallsRequest.capabilities) for details.\n * @returns {Promise<SendPreparedCallsResult>} A Promise that resolves to the result containing the prepared call IDs.\n *\n * @example\n * ```ts\n * const result = await client.sendCalls({\n * calls: [{\n * to: \"0x1234...\",\n * data: \"0xabcdef...\",\n * value: \"0x0\"\n * }],\n * capabilities: {\n * paymasterService: { policyId: \"your-policy-id\" }\n * }\n * });\n *\n * // The result contains the prepared call IDs\n * console.log(result.preparedCallIds);\n * ```\n */\nexport async function sendCalls<\n TAccount extends Address | undefined = Address | undefined,\n>(\n client: InnerWalletApiClient,\n signer: SmartWalletSigner,\n params: SendCallsParams<TAccount>,\n): Promise<SendCallsResult> {\n metrics.trackEvent({\n name: \"send_calls\",\n });\n\n let calls = await prepareCalls(client, params);\n\n if (calls.type === \"paymaster-permit\") {\n if (isWebAuthnSigner(signer)) {\n throw new Error(\n \"WebAuthn signer is not currently supported for signing paymaster permit signatures\",\n );\n }\n const signature = await signSignatureRequest(\n signer,\n calls.signatureRequest,\n );\n\n const secondCallParams = {\n from: calls.modifiedRequest.from,\n calls: calls.modifiedRequest.calls,\n capabilities: calls.modifiedRequest.capabilities,\n paymasterPermitSignature: signature,\n };\n\n calls = await prepareCalls(client, secondCallParams);\n }\n\n const signedCalls = await signPreparedCalls(signer, calls);\n\n const capabilities = extractCapabilitiesForSending(params.capabilities);\n\n return await sendPreparedCalls(client, {\n ...signedCalls,\n ...(capabilities != null ? { capabilities } : {}),\n });\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { toHex } from "viem";
2
2
  import { metrics } from "../../metrics.js";
3
+ import { mergeClientCapabilities } from "../../internal/capabilities.js";
3
4
  /**
4
5
  * Sends prepared calls by submitting a signed user operation.
5
6
  * This method is used after signing the signature request returned from prepareCalls.
@@ -38,6 +39,7 @@ export async function sendPreparedCalls(client, params) {
38
39
  type: params.type,
39
40
  },
40
41
  });
42
+ params.capabilities = mergeClientCapabilities(client, params.capabilities);
41
43
  return client.request({
42
44
  method: "wallet_sendPreparedCalls",
43
45
  params: [
@@ -1 +1 @@
1
- {"version":3,"file":"sendPreparedCalls.js","sourceRoot":"","sources":["../../../../src/client/actions/sendPreparedCalls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAG7B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAiB3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA4B,EAC5B,MAA+B;IAE/B,OAAO,CAAC,UAAU,CAAC;QACjB,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC;QACpB,MAAM,EAAE,0BAA0B;QAClC,MAAM,EAAE;YACN,MAAM,CAAC,IAAI,KAAK,OAAO;gBACrB,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC;oBACE,GAAG,MAAM;oBACT,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;iBAChC;SACN;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { toHex } from \"viem\";\nimport type { WalletServerRpcSchemaType } from \"@alchemy/wallet-api-types/rpc\";\nimport type { InnerWalletApiClient, WithoutChainId } from \"../../types.ts\";\nimport { metrics } from \"../../metrics.js\";\n\ntype RpcSchema = Extract<\n WalletServerRpcSchemaType,\n {\n Request: {\n method: \"wallet_sendPreparedCalls\";\n };\n }\n>;\n\nexport type SendPreparedCallsParams = WithoutChainId<\n RpcSchema[\"Request\"][\"params\"][0]\n>;\n\nexport type SendPreparedCallsResult = RpcSchema[\"ReturnType\"];\n\n/**\n * Sends prepared calls by submitting a signed user operation.\n * This method is used after signing the signature request returned from prepareCalls.\n *\n * @param {InnerWalletApiClient} client - The wallet API client to use for the request\n * @param {SendPreparedCallsParams} params - Parameters for sending prepared calls\n * @returns {Promise<SendPreparedCallsResult>} A Promise that resolves to the result containing the prepared call IDs\n *\n * @example\n * ```ts\n * // First prepare the calls\n * const preparedCalls = await client.prepareCalls({\n * calls: [{\n * to: \"0x1234...\",\n * data: \"0xabcdef...\",\n * value: \"0x0\"\n * }],\n * capabilities: {\n * paymasterService: { policyId: \"your-policy-id\" }\n * }\n * });\n *\n * // Then sign the calls\n * const signedCalls = await client.signPreparedCalls(preparedCalls);\n *\n * // Then send the prepared calls with the signature\n * const result = await client.sendPreparedCalls({\n * signedCalls,\n * });\n * ```\n */\nexport async function sendPreparedCalls(\n client: InnerWalletApiClient,\n params: SendPreparedCallsParams,\n): Promise<SendPreparedCallsResult> {\n metrics.trackEvent({\n name: \"send_prepared_calls\",\n data: {\n type: params.type,\n },\n });\n\n return client.request({\n method: \"wallet_sendPreparedCalls\",\n params: [\n params.type === \"array\"\n ? params\n : {\n ...params,\n chainId: toHex(client.chain.id),\n },\n ],\n });\n}\n"]}
1
+ {"version":3,"file":"sendPreparedCalls.js","sourceRoot":"","sources":["../../../../src/client/actions/sendPreparedCalls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAG7B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAiBzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA4B,EAC5B,MAA+B;IAE/B,OAAO,CAAC,UAAU,CAAC;QACjB,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,GAAG,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAE3E,OAAO,MAAM,CAAC,OAAO,CAAC;QACpB,MAAM,EAAE,0BAA0B;QAClC,MAAM,EAAE;YACN,MAAM,CAAC,IAAI,KAAK,OAAO;gBACrB,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC;oBACE,GAAG,MAAM;oBACT,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;iBAChC;SACN;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { toHex } from \"viem\";\nimport type { WalletServerRpcSchemaType } from \"@alchemy/wallet-api-types/rpc\";\nimport type { InnerWalletApiClient, WithoutChainId } from \"../../types.ts\";\nimport { metrics } from \"../../metrics.js\";\nimport { mergeClientCapabilities } from \"../../internal/capabilities.js\";\n\ntype RpcSchema = Extract<\n WalletServerRpcSchemaType,\n {\n Request: {\n method: \"wallet_sendPreparedCalls\";\n };\n }\n>;\n\nexport type SendPreparedCallsParams = WithoutChainId<\n RpcSchema[\"Request\"][\"params\"][0]\n>;\n\nexport type SendPreparedCallsResult = RpcSchema[\"ReturnType\"];\n\n/**\n * Sends prepared calls by submitting a signed user operation.\n * This method is used after signing the signature request returned from prepareCalls.\n *\n * @param {InnerWalletApiClient} client - The wallet API client to use for the request\n * @param {SendPreparedCallsParams} params - Parameters for sending prepared calls\n * @returns {Promise<SendPreparedCallsResult>} A Promise that resolves to the result containing the prepared call IDs\n *\n * @example\n * ```ts\n * // First prepare the calls\n * const preparedCalls = await client.prepareCalls({\n * calls: [{\n * to: \"0x1234...\",\n * data: \"0xabcdef...\",\n * value: \"0x0\"\n * }],\n * capabilities: {\n * paymasterService: { policyId: \"your-policy-id\" }\n * }\n * });\n *\n * // Then sign the calls\n * const signedCalls = await client.signPreparedCalls(preparedCalls);\n *\n * // Then send the prepared calls with the signature\n * const result = await client.sendPreparedCalls({\n * signedCalls,\n * });\n * ```\n */\nexport async function sendPreparedCalls(\n client: InnerWalletApiClient,\n params: SendPreparedCallsParams,\n): Promise<SendPreparedCallsResult> {\n metrics.trackEvent({\n name: \"send_prepared_calls\",\n data: {\n type: params.type,\n },\n });\n\n params.capabilities = mergeClientCapabilities(client, params.capabilities);\n\n return client.request({\n method: \"wallet_sendPreparedCalls\",\n params: [\n params.type === \"array\"\n ? params\n : {\n ...params,\n chainId: toHex(client.chain.id),\n },\n ],\n });\n}\n"]}
@@ -21,8 +21,8 @@ export declare function waitForCallsStatus(client: InnerWalletApiClient, params:
21
21
  } | {
22
22
  [x: string]: any;
23
23
  } | undefined;
24
- atomic: boolean;
25
24
  id: string;
25
+ atomic: boolean;
26
26
  receipts?: import("viem").WalletCallReceipt<bigint, "success" | "reverted">[] | undefined;
27
27
  statusCode: number;
28
28
  status: "pending" | "success" | "failure" | undefined;
@@ -1,10 +1,19 @@
1
- import type { Capabilities } from "@alchemy/wallet-api-types/capabilities";
1
+ import type { PrepareCallsCapabilities, SendPreparedCallsCapabilities } from "@alchemy/wallet-api-types/capabilities";
2
2
  import type { InnerWalletApiClientBase } from "../types.js";
3
3
  /**
4
4
  * Merges client capabilities with capabilities from the request.
5
+ * Uses policyId (singular) when there's one policy, policyIds (array) when multiple.
5
6
  *
6
7
  * @param {InnerWalletApiClientBase} client - The inner wallet API client (potentially including global capabilities like policy IDs)
7
- * @param {Capabilities | undefined} capabilities - Request capabilities to merge with, if any
8
- * @returns {Capabilities | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client
8
+ * @param {T | undefined} capabilities - Request capabilities to merge with, if any
9
+ * @returns {T | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client
9
10
  */
10
- export declare const mergeClientCapabilities: (client: InnerWalletApiClientBase, capabilities: Capabilities | undefined) => Capabilities | undefined;
11
+ export declare const mergeClientCapabilities: <T extends PrepareCallsCapabilities | SendPreparedCallsCapabilities>(client: InnerWalletApiClientBase, capabilities: T | undefined) => T | undefined;
12
+ /**
13
+ * Extracts capabilities from prepareCalls that are usable for sendPreparedCalls.
14
+ * Only permissions and paymasterService (policyId/policyIds & webhookData) are supported.
15
+ *
16
+ * @param {PrepareCallsCapabilities | undefined} capabilities - The prepareCalls capabilities
17
+ * @returns {SendPreparedCallsCapabilities | undefined} The sendPreparedCalls capabilities, or undefined if no relevant capabilities exist
18
+ */
19
+ export declare const extractCapabilitiesForSending: (capabilities: PrepareCallsCapabilities | undefined) => SendPreparedCallsCapabilities | undefined;
@@ -1,19 +1,45 @@
1
1
  /**
2
2
  * Merges client capabilities with capabilities from the request.
3
+ * Uses policyId (singular) when there's one policy, policyIds (array) when multiple.
3
4
  *
4
5
  * @param {InnerWalletApiClientBase} client - The inner wallet API client (potentially including global capabilities like policy IDs)
5
- * @param {Capabilities | undefined} capabilities - Request capabilities to merge with, if any
6
- * @returns {Capabilities | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client
6
+ * @param {T | undefined} capabilities - Request capabilities to merge with, if any
7
+ * @returns {T | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client
7
8
  */
8
9
  export const mergeClientCapabilities = (client, capabilities) => {
9
- return client.policyIds?.length
10
- ? {
11
- ...capabilities,
12
- paymasterService: {
13
- policyIds: client.policyIds,
14
- ...capabilities?.paymasterService,
15
- },
16
- }
17
- : capabilities;
10
+ if (!client.policyIds?.length || capabilities?.paymasterService) {
11
+ return capabilities;
12
+ }
13
+ return {
14
+ ...capabilities,
15
+ paymasterService: client.policyIds.length === 1
16
+ ? { policyId: client.policyIds[0] }
17
+ : { policyIds: client.policyIds },
18
+ };
19
+ };
20
+ /**
21
+ * Extracts capabilities from prepareCalls that are usable for sendPreparedCalls.
22
+ * Only permissions and paymasterService (policyId/policyIds & webhookData) are supported.
23
+ *
24
+ * @param {PrepareCallsCapabilities | undefined} capabilities - The prepareCalls capabilities
25
+ * @returns {SendPreparedCallsCapabilities | undefined} The sendPreparedCalls capabilities, or undefined if no relevant capabilities exist
26
+ */
27
+ export const extractCapabilitiesForSending = (capabilities) => {
28
+ if (capabilities?.permissions == null &&
29
+ capabilities?.paymasterService == null) {
30
+ return undefined;
31
+ }
32
+ const paymasterService = capabilities.paymasterService;
33
+ return {
34
+ permissions: capabilities.permissions,
35
+ paymasterService: paymasterService != null
36
+ ? {
37
+ ...("policyId" in paymasterService
38
+ ? { policyId: paymasterService.policyId }
39
+ : { policyIds: paymasterService.policyIds }),
40
+ webhookData: paymasterService.webhookData,
41
+ }
42
+ : undefined,
43
+ };
18
44
  };
19
45
  //# sourceMappingURL=capabilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/internal/capabilities.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,MAAgC,EAChC,YAAsC,EACZ,EAAE;IAC5B,OAAO,MAAM,CAAC,SAAS,EAAE,MAAM;QAC7B,CAAC,CAAC;YACE,GAAG,YAAY;YACf,gBAAgB,EAAE;gBAChB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG,YAAY,EAAE,gBAAgB;aAClC;SACF;QACH,CAAC,CAAC,YAAY,CAAC;AACnB,CAAC,CAAC","sourcesContent":["import type { Capabilities } from \"@alchemy/wallet-api-types/capabilities\";\nimport type { InnerWalletApiClientBase } from \"../types.js\";\n\n/**\n * Merges client capabilities with capabilities from the request.\n *\n * @param {InnerWalletApiClientBase} client - The inner wallet API client (potentially including global capabilities like policy IDs)\n * @param {Capabilities | undefined} capabilities - Request capabilities to merge with, if any\n * @returns {Capabilities | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client\n */\nexport const mergeClientCapabilities = (\n client: InnerWalletApiClientBase,\n capabilities: Capabilities | undefined,\n): Capabilities | undefined => {\n return client.policyIds?.length\n ? {\n ...capabilities,\n paymasterService: {\n policyIds: client.policyIds,\n ...capabilities?.paymasterService,\n },\n }\n : capabilities;\n};\n"]}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/internal/capabilities.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAGrC,MAAgC,EAChC,YAA2B,EACZ,EAAE;IACjB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,YAAY,EAAE,gBAAgB,EAAE,CAAC;QAChE,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO;QACL,GAAG,YAAY;QACf,gBAAgB,EACd,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAC3B,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YACnC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;KACjC,CAAC;AACT,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,YAAkD,EACP,EAAE;IAC7C,IACE,YAAY,EAAE,WAAW,IAAI,IAAI;QACjC,YAAY,EAAE,gBAAgB,IAAI,IAAI,EACtC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,gBAAgB,CAAC;IAEvD,OAAO;QACL,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,gBAAgB,EACd,gBAAgB,IAAI,IAAI;YACtB,CAAC,CAAC;gBACE,GAAG,CAAC,UAAU,IAAI,gBAAgB;oBAChC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE;oBACzC,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAC;gBAC9C,WAAW,EAAE,gBAAgB,CAAC,WAAW;aAC1C;YACH,CAAC,CAAC,SAAS;KAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type {\n PrepareCallsCapabilities,\n SendPreparedCallsCapabilities,\n} from \"@alchemy/wallet-api-types/capabilities\";\n\nimport type { InnerWalletApiClientBase } from \"../types.js\";\n\n/**\n * Merges client capabilities with capabilities from the request.\n * Uses policyId (singular) when there's one policy, policyIds (array) when multiple.\n *\n * @param {InnerWalletApiClientBase} client - The inner wallet API client (potentially including global capabilities like policy IDs)\n * @param {T | undefined} capabilities - Request capabilities to merge with, if any\n * @returns {T | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client\n */\nexport const mergeClientCapabilities = <\n T extends PrepareCallsCapabilities | SendPreparedCallsCapabilities,\n>(\n client: InnerWalletApiClientBase,\n capabilities: T | undefined,\n): T | undefined => {\n if (!client.policyIds?.length || capabilities?.paymasterService) {\n return capabilities;\n }\n\n return {\n ...capabilities,\n paymasterService:\n client.policyIds.length === 1\n ? { policyId: client.policyIds[0] }\n : { policyIds: client.policyIds },\n } as T;\n};\n\n/**\n * Extracts capabilities from prepareCalls that are usable for sendPreparedCalls.\n * Only permissions and paymasterService (policyId/policyIds & webhookData) are supported.\n *\n * @param {PrepareCallsCapabilities | undefined} capabilities - The prepareCalls capabilities\n * @returns {SendPreparedCallsCapabilities | undefined} The sendPreparedCalls capabilities, or undefined if no relevant capabilities exist\n */\nexport const extractCapabilitiesForSending = (\n capabilities: PrepareCallsCapabilities | undefined,\n): SendPreparedCallsCapabilities | undefined => {\n if (\n capabilities?.permissions == null &&\n capabilities?.paymasterService == null\n ) {\n return undefined;\n }\n\n const paymasterService = capabilities.paymasterService;\n\n return {\n permissions: capabilities.permissions,\n paymasterService:\n paymasterService != null\n ? {\n ...(\"policyId\" in paymasterService\n ? { policyId: paymasterService.policyId }\n : { policyIds: paymasterService.policyIds }),\n webhookData: paymasterService.webhookData,\n }\n : undefined,\n };\n};\n"]}
@@ -1 +1 @@
1
- export declare const VERSION = "4.82.1";
1
+ export declare const VERSION = "4.83.0";
@@ -1,4 +1,4 @@
1
1
  // This file is autogenerated by inject-version.ts. Any changes will be
2
2
  // overwritten on commit!
3
- export const VERSION = "4.82.1";
3
+ export const VERSION = "4.83.0";
4
4
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yBAAyB;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// This file is autogenerated by inject-version.ts. Any changes will be\n// overwritten on commit!\nexport const VERSION = \"4.82.1\";\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yBAAyB;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// This file is autogenerated by inject-version.ts. Any changes will be\n// overwritten on commit!\nexport const VERSION = \"4.83.0\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sendCalls.d.ts","sourceRoot":"","sources":["../../../../src/client/actions/sendCalls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,MAAM,eAAe,CACzB,QAAQ,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,IACxD,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAEjC,MAAM,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,EAE1D,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC,CAqC1B"}
1
+ {"version":3,"file":"sendCalls.d.ts","sourceRoot":"","sources":["../../../../src/client/actions/sendCalls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,MAAM,MAAM,eAAe,CACzB,QAAQ,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,IACxD,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAEjC,MAAM,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,EAE1D,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC,CAoC1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"sendPreparedCalls.d.ts","sourceRoot":"","sources":["../../../../src/client/actions/sendPreparedCalls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG3E,KAAK,SAAS,GAAG,OAAO,CACtB,yBAAyB,EACzB;IACE,OAAO,EAAE;QACP,MAAM,EAAE,0BAA0B,CAAC;KACpC,CAAC;CACH,CACF,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAClD,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAmBlC"}
1
+ {"version":3,"file":"sendPreparedCalls.d.ts","sourceRoot":"","sources":["../../../../src/client/actions/sendPreparedCalls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAI3E,KAAK,SAAS,GAAG,OAAO,CACtB,yBAAyB,EACzB;IACE,OAAO,EAAE;QACP,MAAM,EAAE,0BAA0B,CAAC;KACpC,CAAC;CACH,CACF,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAClD,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAqBlC"}
@@ -21,8 +21,8 @@ export declare function waitForCallsStatus(client: InnerWalletApiClient, params:
21
21
  } | {
22
22
  [x: string]: any;
23
23
  } | undefined;
24
- atomic: boolean;
25
24
  id: string;
25
+ atomic: boolean;
26
26
  receipts?: import("viem").WalletCallReceipt<bigint, "success" | "reverted">[] | undefined;
27
27
  statusCode: number;
28
28
  status: "pending" | "success" | "failure" | undefined;
@@ -1,11 +1,20 @@
1
- import type { Capabilities } from "@alchemy/wallet-api-types/capabilities";
1
+ import type { PrepareCallsCapabilities, SendPreparedCallsCapabilities } from "@alchemy/wallet-api-types/capabilities";
2
2
  import type { InnerWalletApiClientBase } from "../types.js";
3
3
  /**
4
4
  * Merges client capabilities with capabilities from the request.
5
+ * Uses policyId (singular) when there's one policy, policyIds (array) when multiple.
5
6
  *
6
7
  * @param {InnerWalletApiClientBase} client - The inner wallet API client (potentially including global capabilities like policy IDs)
7
- * @param {Capabilities | undefined} capabilities - Request capabilities to merge with, if any
8
- * @returns {Capabilities | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client
8
+ * @param {T | undefined} capabilities - Request capabilities to merge with, if any
9
+ * @returns {T | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client
9
10
  */
10
- export declare const mergeClientCapabilities: (client: InnerWalletApiClientBase, capabilities: Capabilities | undefined) => Capabilities | undefined;
11
+ export declare const mergeClientCapabilities: <T extends PrepareCallsCapabilities | SendPreparedCallsCapabilities>(client: InnerWalletApiClientBase, capabilities: T | undefined) => T | undefined;
12
+ /**
13
+ * Extracts capabilities from prepareCalls that are usable for sendPreparedCalls.
14
+ * Only permissions and paymasterService (policyId/policyIds & webhookData) are supported.
15
+ *
16
+ * @param {PrepareCallsCapabilities | undefined} capabilities - The prepareCalls capabilities
17
+ * @returns {SendPreparedCallsCapabilities | undefined} The sendPreparedCalls capabilities, or undefined if no relevant capabilities exist
18
+ */
19
+ export declare const extractCapabilitiesForSending: (capabilities: PrepareCallsCapabilities | undefined) => SendPreparedCallsCapabilities | undefined;
11
20
  //# sourceMappingURL=capabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/internal/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,wBAAwB,EAChC,cAAc,YAAY,GAAG,SAAS,KACrC,YAAY,GAAG,SAUjB,CAAC"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/internal/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,6BAA6B,EAC9B,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,CAAC,SAAS,wBAAwB,GAAG,6BAA6B,EAElE,QAAQ,wBAAwB,EAChC,cAAc,CAAC,GAAG,SAAS,KAC1B,CAAC,GAAG,SAYN,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,GACxC,cAAc,wBAAwB,GAAG,SAAS,KACjD,6BAA6B,GAAG,SAsBlC,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "4.82.1";
1
+ export declare const VERSION = "4.83.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@account-kit/wallet-client",
3
- "version": "4.82.1",
3
+ "version": "4.83.0",
4
4
  "description": "Wallet Client for Alchemy Account Kit",
5
5
  "author": "Alchemy",
6
6
  "license": "MIT",
@@ -44,10 +44,10 @@
44
44
  "test:e2e": "bun test ./src/**/*.e2e.test.*"
45
45
  },
46
46
  "dependencies": {
47
- "@aa-sdk/core": "^4.82.1",
48
- "@account-kit/infra": "^4.82.1",
49
- "@account-kit/smart-contracts": "^4.82.1",
50
- "@alchemy/wallet-api-types": "0.1.0-alpha.18",
47
+ "@aa-sdk/core": "^4.83.0",
48
+ "@account-kit/infra": "^4.83.0",
49
+ "@account-kit/smart-contracts": "^4.83.0",
50
+ "@alchemy/wallet-api-types": "0.1.0-alpha.22",
51
51
  "deep-equal": "^2.2.3",
52
52
  "ox": "^0.6.12"
53
53
  },
@@ -72,5 +72,5 @@
72
72
  "url": "https://github.com/alchemyplatform/aa-sdk/issues"
73
73
  },
74
74
  "homepage": "https://github.com/alchemyplatform/aa-sdk#readme",
75
- "gitHead": "0c12e83e2190438e73e58bf9af906d57bb2e10bd"
75
+ "gitHead": "1fc91f7ed58341f07ae6d828aa258e2e03589765"
76
76
  }
@@ -10,6 +10,7 @@ import {
10
10
  import { signSignatureRequest } from "./signSignatureRequest.js";
11
11
  import type { SmartWalletSigner } from "../index.js";
12
12
  import { isWebAuthnSigner } from "../../utils.js";
13
+ import { extractCapabilitiesForSending } from "../../internal/capabilities.js";
13
14
 
14
15
  export type SendCallsParams<
15
16
  TAccount extends Address | undefined = Address | undefined,
@@ -86,11 +87,10 @@ export async function sendCalls<
86
87
 
87
88
  const signedCalls = await signPreparedCalls(signer, calls);
88
89
 
90
+ const capabilities = extractCapabilitiesForSending(params.capabilities);
91
+
89
92
  return await sendPreparedCalls(client, {
90
93
  ...signedCalls,
91
- // The only capability that is supported in sendPreparedCalls is permissions.
92
- ...(params.capabilities?.permissions != null
93
- ? { capabilities: { permissions: params.capabilities.permissions } }
94
- : {}),
94
+ ...(capabilities != null ? { capabilities } : {}),
95
95
  });
96
96
  }
@@ -2,6 +2,7 @@ import { toHex } from "viem";
2
2
  import type { WalletServerRpcSchemaType } from "@alchemy/wallet-api-types/rpc";
3
3
  import type { InnerWalletApiClient, WithoutChainId } from "../../types.ts";
4
4
  import { metrics } from "../../metrics.js";
5
+ import { mergeClientCapabilities } from "../../internal/capabilities.js";
5
6
 
6
7
  type RpcSchema = Extract<
7
8
  WalletServerRpcSchemaType,
@@ -60,6 +61,8 @@ export async function sendPreparedCalls(
60
61
  },
61
62
  });
62
63
 
64
+ params.capabilities = mergeClientCapabilities(client, params.capabilities);
65
+
63
66
  return client.request({
64
67
  method: "wallet_sendPreparedCalls",
65
68
  params: [
@@ -1,24 +1,66 @@
1
- import type { Capabilities } from "@alchemy/wallet-api-types/capabilities";
1
+ import type {
2
+ PrepareCallsCapabilities,
3
+ SendPreparedCallsCapabilities,
4
+ } from "@alchemy/wallet-api-types/capabilities";
5
+
2
6
  import type { InnerWalletApiClientBase } from "../types.js";
3
7
 
4
8
  /**
5
9
  * Merges client capabilities with capabilities from the request.
10
+ * Uses policyId (singular) when there's one policy, policyIds (array) when multiple.
6
11
  *
7
12
  * @param {InnerWalletApiClientBase} client - The inner wallet API client (potentially including global capabilities like policy IDs)
8
- * @param {Capabilities | undefined} capabilities - Request capabilities to merge with, if any
9
- * @returns {Capabilities | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client
13
+ * @param {T | undefined} capabilities - Request capabilities to merge with, if any
14
+ * @returns {T | undefined} The merged capabilities object, or original capabilities if no capability configuration exists on the client
10
15
  */
11
- export const mergeClientCapabilities = (
16
+ export const mergeClientCapabilities = <
17
+ T extends PrepareCallsCapabilities | SendPreparedCallsCapabilities,
18
+ >(
12
19
  client: InnerWalletApiClientBase,
13
- capabilities: Capabilities | undefined,
14
- ): Capabilities | undefined => {
15
- return client.policyIds?.length
16
- ? {
17
- ...capabilities,
18
- paymasterService: {
19
- policyIds: client.policyIds,
20
- ...capabilities?.paymasterService,
21
- },
22
- }
23
- : capabilities;
20
+ capabilities: T | undefined,
21
+ ): T | undefined => {
22
+ if (!client.policyIds?.length || capabilities?.paymasterService) {
23
+ return capabilities;
24
+ }
25
+
26
+ return {
27
+ ...capabilities,
28
+ paymasterService:
29
+ client.policyIds.length === 1
30
+ ? { policyId: client.policyIds[0] }
31
+ : { policyIds: client.policyIds },
32
+ } as T;
33
+ };
34
+
35
+ /**
36
+ * Extracts capabilities from prepareCalls that are usable for sendPreparedCalls.
37
+ * Only permissions and paymasterService (policyId/policyIds & webhookData) are supported.
38
+ *
39
+ * @param {PrepareCallsCapabilities | undefined} capabilities - The prepareCalls capabilities
40
+ * @returns {SendPreparedCallsCapabilities | undefined} The sendPreparedCalls capabilities, or undefined if no relevant capabilities exist
41
+ */
42
+ export const extractCapabilitiesForSending = (
43
+ capabilities: PrepareCallsCapabilities | undefined,
44
+ ): SendPreparedCallsCapabilities | undefined => {
45
+ if (
46
+ capabilities?.permissions == null &&
47
+ capabilities?.paymasterService == null
48
+ ) {
49
+ return undefined;
50
+ }
51
+
52
+ const paymasterService = capabilities.paymasterService;
53
+
54
+ return {
55
+ permissions: capabilities.permissions,
56
+ paymasterService:
57
+ paymasterService != null
58
+ ? {
59
+ ...("policyId" in paymasterService
60
+ ? { policyId: paymasterService.policyId }
61
+ : { policyIds: paymasterService.policyIds }),
62
+ webhookData: paymasterService.webhookData,
63
+ }
64
+ : undefined,
65
+ };
24
66
  };
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  // This file is autogenerated by inject-version.ts. Any changes will be
2
2
  // overwritten on commit!
3
- export const VERSION = "4.82.1";
3
+ export const VERSION = "4.83.0";