@account-kit/infra 4.31.1 → 4.32.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,11 +4,12 @@ import type { AlchemyRpcSchema } from "./client/types.js";
4
4
  type Never<T> = T extends object ? {
5
5
  [K in keyof T]?: never;
6
6
  } : never;
7
+ type AlchemyConnectionConfig = ConnectionConfig;
7
8
  type SplitTransportConfig = {
8
- alchemyConnection: ConnectionConfig;
9
+ alchemyConnection: AlchemyConnectionConfig;
9
10
  nodeRpcUrl: string;
10
11
  };
11
- export type AlchemyTransportConfig = ((ConnectionConfig & Never<SplitTransportConfig>) | (SplitTransportConfig & Never<ConnectionConfig>)) & {
12
+ export type AlchemyTransportConfig = ((AlchemyConnectionConfig & Never<SplitTransportConfig>) | (SplitTransportConfig & Never<AlchemyConnectionConfig>)) & {
12
13
  /** The max number of times to retry. */
13
14
  retryCount?: TransportConfig["retryCount"] | undefined;
14
15
  /** The base delay (in ms) between retries. */
@@ -106,7 +106,7 @@ export function alchemy(config) {
106
106
  : connectionConfig.rpcUrl;
107
107
  const chainAgnosticRpcUrl = connectionConfig.rpcUrl == null
108
108
  ? "https://api.g.alchemy.com/v2/"
109
- : connectionConfig.rpcUrl;
109
+ : connectionConfig.chainAgnosticUrl ?? connectionConfig.rpcUrl;
110
110
  const innerTransport = (() => {
111
111
  mutateRemoveTrackingHeaders(config?.fetchOptions?.headers);
112
112
  if (config.alchemyConnection && config.nodeRpcUrl) {
@@ -1 +1 @@
1
- {"version":3,"file":"alchemyTransport.js","sourceRoot":"","sources":["../../src/alchemyTransport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChainNotFoundError,\n ConnectionConfigSchema,\n split,\n type ConnectionConfig,\n type NoUndefined,\n} from \"@aa-sdk/core\";\nimport {\n createTransport,\n http,\n type Chain,\n type EIP1193RequestFn,\n type HttpTransportConfig,\n type PublicRpcSchema,\n type Transport,\n type TransportConfig,\n} from \"viem\";\nimport { mutateRemoveTrackingHeaders } from \"./alchemyTrackerHeaders.js\";\nimport type { AlchemyRpcSchema } from \"./client/types.js\";\nimport { AlchemyChainSchema } from \"./schema.js\";\nimport { VERSION } from \"./version.js\";\n\ntype Never<T> = T extends object\n ? {\n [K in keyof T]?: never;\n }\n : never;\n\ntype SplitTransportConfig = {\n alchemyConnection: ConnectionConfig;\n nodeRpcUrl: string;\n};\n\nconst alchemyMethods = [\n \"eth_sendUserOperation\",\n \"eth_estimateUserOperationGas\",\n \"eth_getUserOperationReceipt\",\n \"eth_getUserOperationByHash\",\n \"eth_supportedEntryPoints\",\n \"rundler_maxPriorityFeePerGas\",\n \"pm_getPaymasterData\",\n \"pm_getPaymasterStubData\",\n \"alchemy_requestGasAndPaymasterAndData\",\n];\n\nconst chainAgnosticMethods = [\n \"wallet_prepareCalls\",\n \"wallet_sendPreparedCalls\",\n \"wallet_requestAccount\",\n \"wallet_createAccount\",\n \"wallet_listAccounts\",\n \"wallet_createSession\",\n \"wallet_getCallsStatus\",\n];\n\nexport type AlchemyTransportConfig = (\n | (ConnectionConfig & Never<SplitTransportConfig>)\n | (SplitTransportConfig & Never<ConnectionConfig>)\n) & {\n /** The max number of times to retry. */\n retryCount?: TransportConfig[\"retryCount\"] | undefined;\n /** The base delay (in ms) between retries. */\n retryDelay?: TransportConfig[\"retryDelay\"] | undefined;\n fetchOptions?: NoUndefined<HttpTransportConfig[\"fetchOptions\"]>;\n};\n\ntype AlchemyTransportBase = Transport<\n \"alchemy\",\n {\n alchemyRpcUrl: string;\n fetchOptions?: AlchemyTransportConfig[\"fetchOptions\"];\n },\n EIP1193RequestFn<[...PublicRpcSchema, ...AlchemyRpcSchema]>\n>;\n\nexport type AlchemyTransport = AlchemyTransportBase & {\n updateHeaders(newHeaders: HeadersInit): void;\n config: AlchemyTransportConfig;\n dynamicFetchOptions: AlchemyTransportConfig[\"fetchOptions\"];\n};\n\n/**\n * A type guard for the transport to determine if it is an Alchemy transport.\n * Used in cases where we would like to do switching depending on the transport, where there used\n * to be two clients for a alchemy and a non alchemy, and with this switch we don't need the two seperate clients. *\n *\n * @param {Transport} transport The transport to check\n * @param {Chain} chain Chain for the transport to run its function to return the transport config\n * @returns {boolean} `true` if the transport is an Alchemy transport, otherwise `false`\n */\nexport function isAlchemyTransport(\n transport: Transport,\n chain: Chain\n): transport is AlchemyTransport {\n return transport({ chain }).config.type === \"alchemy\";\n}\n\n/**\n * Creates an Alchemy transport with the specified configuration options.\n * When sending all traffic to Alchemy, you must pass in one of rpcUrl, apiKey, or jwt.\n * If you want to send Bundler and Paymaster traffic to Alchemy and Node traffic to a different RPC, you must pass in alchemyConnection and nodeRpcUrl.\n *\n * @example\n * ### Basic Example\n * If the chain you're using is supported for both Bundler and Node RPCs, then you can do the following:\n * ```ts\n * import { alchemy } from \"@account-kit/infra\";\n *\n * const transport = alchemy({\n * // NOTE: you can also pass in an rpcUrl or jwt here or rpcUrl and jwt\n * apiKey: \"your-api-key\",\n * });\n * ```\n *\n * ### AA Only Chains\n * For AA-only chains, you need to specify the alchemyConnection and nodeRpcUrl since Alchemy only\n * handles the Bundler and Paymaster RPCs for these chains.\n * ```ts\n * import { alchemy } from \"@account-kit/infra\";\n *\n * const transport = alchemy({\n * alchemyConnection: {\n * apiKey: \"your-api-key\",\n * },\n * nodeRpcUrl: \"https://zora.rpc.url\",\n * });\n * ```\n *\n * @param {AlchemyTransportConfig} config The configuration object for the Alchemy transport.\n * @param {number} config.retryDelay Optional The delay between retries, in milliseconds.\n * @param {number} config.retryCount Optional The number of retry attempts.\n * @param {string} [config.alchemyConnection] Optional Alchemy connection configuration (if this is passed in, nodeRpcUrl is required).\n * @param {string} [config.fetchOptions] Optional fetch options for HTTP requests.\n * @param {string} [config.nodeRpcUrl] Optional RPC URL for node (if this is passed in, alchemyConnection is required).\n * @param {string} [config.rpcUrl] Optional RPC URL.\n * @param {string} [config.apiKey] Optional API key for Alchemy.\n * @param {string} [config.jwt] Optional JSON Web Token for authorization.\n * @returns {AlchemyTransport} The configured Alchemy transport object.\n */\nexport function alchemy(config: AlchemyTransportConfig): AlchemyTransport {\n const { retryDelay, retryCount } = config;\n // we create a copy here in case we create a split transport down below\n // we don't want to add alchemy headers to 3rd party nodes\n const fetchOptions = { ...config.fetchOptions };\n\n const connectionConfig = ConnectionConfigSchema.parse(\n config.alchemyConnection ?? config\n );\n\n const headersAsObject = convertHeadersToObject(fetchOptions.headers);\n\n // TODO: we probably should just log these headers during telemetry logging instead of doing this mutable header stuff\n fetchOptions.headers = {\n ...headersAsObject,\n \"Alchemy-AA-Sdk-Version\": VERSION,\n };\n\n if (connectionConfig.jwt != null || connectionConfig.apiKey != null) {\n fetchOptions.headers = {\n ...fetchOptions.headers,\n Authorization: `Bearer ${\n connectionConfig.jwt ?? connectionConfig.apiKey\n }`,\n };\n }\n\n const transport: AlchemyTransportBase = (opts) => {\n const { chain: chain_ } = opts;\n if (!chain_) {\n throw new ChainNotFoundError();\n }\n const chain = AlchemyChainSchema.parse(chain_);\n\n const rpcUrl =\n connectionConfig.rpcUrl == null\n ? `${chain.rpcUrls.alchemy.http[0]}/`\n : connectionConfig.rpcUrl;\n\n const chainAgnosticRpcUrl =\n connectionConfig.rpcUrl == null\n ? \"https://api.g.alchemy.com/v2/\"\n : connectionConfig.rpcUrl;\n\n const innerTransport = (() => {\n mutateRemoveTrackingHeaders(config?.fetchOptions?.headers);\n if (config.alchemyConnection && config.nodeRpcUrl) {\n return split({\n overrides: [\n {\n methods: alchemyMethods,\n transport: http(rpcUrl, { fetchOptions }),\n },\n {\n methods: chainAgnosticMethods,\n transport: http(chainAgnosticRpcUrl, { fetchOptions }),\n },\n ],\n fallback: http(config.nodeRpcUrl, {\n fetchOptions: config.fetchOptions,\n }),\n });\n }\n\n return split({\n overrides: [\n {\n methods: chainAgnosticMethods,\n transport: http(chainAgnosticRpcUrl, { fetchOptions }),\n },\n ],\n fallback: http(rpcUrl, { fetchOptions }),\n });\n })();\n\n return createTransport(\n {\n key: \"alchemy\",\n name: \"Alchemy Transport\",\n request: innerTransport(opts).request,\n retryCount: retryCount ?? opts?.retryCount,\n retryDelay,\n type: \"alchemy\",\n },\n { alchemyRpcUrl: rpcUrl, fetchOptions }\n );\n };\n\n return Object.assign(transport, {\n dynamicFetchOptions: fetchOptions,\n updateHeaders(newHeaders_: HeadersInit) {\n const newHeaders = convertHeadersToObject(newHeaders_);\n\n fetchOptions.headers = {\n ...fetchOptions.headers,\n ...newHeaders,\n };\n },\n config,\n });\n}\n\nexport const convertHeadersToObject = (\n headers?: HeadersInit\n): Record<string, string> => {\n if (!headers) {\n return {};\n }\n\n if (headers instanceof Headers) {\n const headersObject = {} as Record<string, string>;\n headers.forEach((value, key) => {\n headersObject[key] = value;\n });\n return headersObject;\n }\n\n if (Array.isArray(headers)) {\n return headers.reduce((acc, header) => {\n acc[header[0]] = header[1];\n return acc;\n }, {} as Record<string, string>);\n }\n\n return headers;\n};\n"]}
1
+ {"version":3,"file":"alchemyTransport.js","sourceRoot":"","sources":["../../src/alchemyTransport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChainNotFoundError,\n ConnectionConfigSchema,\n split,\n type ConnectionConfig,\n type NoUndefined,\n} from \"@aa-sdk/core\";\nimport {\n createTransport,\n http,\n type Chain,\n type EIP1193RequestFn,\n type HttpTransportConfig,\n type PublicRpcSchema,\n type Transport,\n type TransportConfig,\n} from \"viem\";\nimport { mutateRemoveTrackingHeaders } from \"./alchemyTrackerHeaders.js\";\nimport type { AlchemyRpcSchema } from \"./client/types.js\";\nimport { AlchemyChainSchema } from \"./schema.js\";\nimport { VERSION } from \"./version.js\";\n\ntype Never<T> = T extends object\n ? {\n [K in keyof T]?: never;\n }\n : never;\n\ntype AlchemyConnectionConfig = ConnectionConfig;\n\ntype SplitTransportConfig = {\n alchemyConnection: AlchemyConnectionConfig;\n nodeRpcUrl: string;\n};\n\nconst alchemyMethods = [\n \"eth_sendUserOperation\",\n \"eth_estimateUserOperationGas\",\n \"eth_getUserOperationReceipt\",\n \"eth_getUserOperationByHash\",\n \"eth_supportedEntryPoints\",\n \"rundler_maxPriorityFeePerGas\",\n \"pm_getPaymasterData\",\n \"pm_getPaymasterStubData\",\n \"alchemy_requestGasAndPaymasterAndData\",\n];\n\nconst chainAgnosticMethods = [\n \"wallet_prepareCalls\",\n \"wallet_sendPreparedCalls\",\n \"wallet_requestAccount\",\n \"wallet_createAccount\",\n \"wallet_listAccounts\",\n \"wallet_createSession\",\n \"wallet_getCallsStatus\",\n];\n\nexport type AlchemyTransportConfig = (\n | (AlchemyConnectionConfig & Never<SplitTransportConfig>)\n | (SplitTransportConfig & Never<AlchemyConnectionConfig>)\n) & {\n /** The max number of times to retry. */\n retryCount?: TransportConfig[\"retryCount\"] | undefined;\n /** The base delay (in ms) between retries. */\n retryDelay?: TransportConfig[\"retryDelay\"] | undefined;\n fetchOptions?: NoUndefined<HttpTransportConfig[\"fetchOptions\"]>;\n};\n\ntype AlchemyTransportBase = Transport<\n \"alchemy\",\n {\n alchemyRpcUrl: string;\n fetchOptions?: AlchemyTransportConfig[\"fetchOptions\"];\n },\n EIP1193RequestFn<[...PublicRpcSchema, ...AlchemyRpcSchema]>\n>;\n\nexport type AlchemyTransport = AlchemyTransportBase & {\n updateHeaders(newHeaders: HeadersInit): void;\n config: AlchemyTransportConfig;\n dynamicFetchOptions: AlchemyTransportConfig[\"fetchOptions\"];\n};\n\n/**\n * A type guard for the transport to determine if it is an Alchemy transport.\n * Used in cases where we would like to do switching depending on the transport, where there used\n * to be two clients for a alchemy and a non alchemy, and with this switch we don't need the two seperate clients. *\n *\n * @param {Transport} transport The transport to check\n * @param {Chain} chain Chain for the transport to run its function to return the transport config\n * @returns {boolean} `true` if the transport is an Alchemy transport, otherwise `false`\n */\nexport function isAlchemyTransport(\n transport: Transport,\n chain: Chain\n): transport is AlchemyTransport {\n return transport({ chain }).config.type === \"alchemy\";\n}\n\n/**\n * Creates an Alchemy transport with the specified configuration options.\n * When sending all traffic to Alchemy, you must pass in one of rpcUrl, apiKey, or jwt.\n * If you want to send Bundler and Paymaster traffic to Alchemy and Node traffic to a different RPC, you must pass in alchemyConnection and nodeRpcUrl.\n *\n * @example\n * ### Basic Example\n * If the chain you're using is supported for both Bundler and Node RPCs, then you can do the following:\n * ```ts\n * import { alchemy } from \"@account-kit/infra\";\n *\n * const transport = alchemy({\n * // NOTE: you can also pass in an rpcUrl or jwt here or rpcUrl and jwt\n * apiKey: \"your-api-key\",\n * });\n * ```\n *\n * ### AA Only Chains\n * For AA-only chains, you need to specify the alchemyConnection and nodeRpcUrl since Alchemy only\n * handles the Bundler and Paymaster RPCs for these chains.\n * ```ts\n * import { alchemy } from \"@account-kit/infra\";\n *\n * const transport = alchemy({\n * alchemyConnection: {\n * apiKey: \"your-api-key\",\n * },\n * nodeRpcUrl: \"https://zora.rpc.url\",\n * });\n * ```\n *\n * @param {AlchemyTransportConfig} config The configuration object for the Alchemy transport.\n * @param {number} config.retryDelay Optional The delay between retries, in milliseconds.\n * @param {number} config.retryCount Optional The number of retry attempts.\n * @param {string} [config.alchemyConnection] Optional Alchemy connection configuration (if this is passed in, nodeRpcUrl is required).\n * @param {string} [config.fetchOptions] Optional fetch options for HTTP requests.\n * @param {string} [config.nodeRpcUrl] Optional RPC URL for node (if this is passed in, alchemyConnection is required).\n * @param {string} [config.rpcUrl] Optional RPC URL.\n * @param {string} [config.apiKey] Optional API key for Alchemy.\n * @param {string} [config.jwt] Optional JSON Web Token for authorization.\n * @returns {AlchemyTransport} The configured Alchemy transport object.\n */\nexport function alchemy(config: AlchemyTransportConfig): AlchemyTransport {\n const { retryDelay, retryCount } = config;\n // we create a copy here in case we create a split transport down below\n // we don't want to add alchemy headers to 3rd party nodes\n const fetchOptions = { ...config.fetchOptions };\n\n const connectionConfig = ConnectionConfigSchema.parse(\n config.alchemyConnection ?? config\n );\n\n const headersAsObject = convertHeadersToObject(fetchOptions.headers);\n\n // TODO: we probably should just log these headers during telemetry logging instead of doing this mutable header stuff\n fetchOptions.headers = {\n ...headersAsObject,\n \"Alchemy-AA-Sdk-Version\": VERSION,\n };\n\n if (connectionConfig.jwt != null || connectionConfig.apiKey != null) {\n fetchOptions.headers = {\n ...fetchOptions.headers,\n Authorization: `Bearer ${\n connectionConfig.jwt ?? connectionConfig.apiKey\n }`,\n };\n }\n\n const transport: AlchemyTransportBase = (opts) => {\n const { chain: chain_ } = opts;\n if (!chain_) {\n throw new ChainNotFoundError();\n }\n const chain = AlchemyChainSchema.parse(chain_);\n\n const rpcUrl =\n connectionConfig.rpcUrl == null\n ? `${chain.rpcUrls.alchemy.http[0]}/`\n : connectionConfig.rpcUrl;\n\n const chainAgnosticRpcUrl =\n connectionConfig.rpcUrl == null\n ? \"https://api.g.alchemy.com/v2/\"\n : connectionConfig.chainAgnosticUrl ?? connectionConfig.rpcUrl;\n\n const innerTransport = (() => {\n mutateRemoveTrackingHeaders(config?.fetchOptions?.headers);\n if (config.alchemyConnection && config.nodeRpcUrl) {\n return split({\n overrides: [\n {\n methods: alchemyMethods,\n transport: http(rpcUrl, { fetchOptions }),\n },\n {\n methods: chainAgnosticMethods,\n transport: http(chainAgnosticRpcUrl, { fetchOptions }),\n },\n ],\n fallback: http(config.nodeRpcUrl, {\n fetchOptions: config.fetchOptions,\n }),\n });\n }\n\n return split({\n overrides: [\n {\n methods: chainAgnosticMethods,\n transport: http(chainAgnosticRpcUrl, { fetchOptions }),\n },\n ],\n fallback: http(rpcUrl, { fetchOptions }),\n });\n })();\n\n return createTransport(\n {\n key: \"alchemy\",\n name: \"Alchemy Transport\",\n request: innerTransport(opts).request,\n retryCount: retryCount ?? opts?.retryCount,\n retryDelay,\n type: \"alchemy\",\n },\n { alchemyRpcUrl: rpcUrl, fetchOptions }\n );\n };\n\n return Object.assign(transport, {\n dynamicFetchOptions: fetchOptions,\n updateHeaders(newHeaders_: HeadersInit) {\n const newHeaders = convertHeadersToObject(newHeaders_);\n\n fetchOptions.headers = {\n ...fetchOptions.headers,\n ...newHeaders,\n };\n },\n config,\n });\n}\n\nexport const convertHeadersToObject = (\n headers?: HeadersInit\n): Record<string, string> => {\n if (!headers) {\n return {};\n }\n\n if (headers instanceof Headers) {\n const headersObject = {} as Record<string, string>;\n headers.forEach((value, key) => {\n headersObject[key] = value;\n });\n return headersObject;\n }\n\n if (Array.isArray(headers)) {\n return headers.reduce((acc, header) => {\n acc[header[0]] = header[1];\n return acc;\n }, {} as Record<string, string>);\n }\n\n return headers;\n};\n"]}
@@ -50,7 +50,7 @@ export declare const PermitTypes: {
50
50
  readonly type: "uint256";
51
51
  }];
52
52
  };
53
- export declare const EIP712NoncesAbi: readonly ["function nonces(address owner) external view returns (uint)"];
53
+ export declare const EIP712NoncesAbi: readonly ["function nonces(address owner) external view returns (uint)", "function decimals() public view returns (uint8)"];
54
54
  export type PermitMessage = {
55
55
  owner: Hex;
56
56
  spender: Hex;
@@ -60,5 +60,6 @@ export const PermitTypes = {
60
60
  };
61
61
  export const EIP712NoncesAbi = [
62
62
  "function nonces(address owner) external view returns (uint)",
63
+ "function decimals() public view returns (uint8)",
63
64
  ];
64
65
  //# sourceMappingURL=gas-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gas-manager.js","sourceRoot":"","sources":["../../src/gas-manager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,eAAe,EACf,IAAI,EACJ,WAAW,EACX,OAAO,EACP,cAAc,EACd,OAAO,EACP,QAAQ,EACR,eAAe,EACf,OAAO,EACP,WAAW,EACX,aAAa,EACb,OAAO,EACP,IAAI,EACJ,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,yBAAyB,GACpC,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GACpC,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,0BAA0B,GACrC,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GACpC,4CAA4C,CAAC;AAE/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAY,EAAW,EAAE;IAClE,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;QACjB,KAAK,WAAW,CAAC,EAAE,CAAC;QACpB,KAAK,eAAe,CAAC,EAAE,CAAC;QACxB,KAAK,WAAW,CAAC,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,EAAE,CAAC;QACb,KAAK,WAAW,CAAC,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,EAAE,CAAC;QAChB,KAAK,cAAc,CAAC,EAAE;YACpB,OAAO,yBAAyB,CAAC;QACnC,KAAK,OAAO,CAAC,EAAE,CAAC;QAChB,KAAK,QAAQ,CAAC,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,EAAE;YACV,OAAO,yBAAyB,CAAC;QACnC,KAAK,eAAe,CAAC,EAAE;YACrB,OAAO,0BAA0B,CAAC;QACpC,KAAK,OAAO,CAAC,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,EAAE;YACnB,OAAO,yBAAyB,CAAC;QACnC;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY,EAAE;QACZ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;QACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;KAC/C;IACD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;QAClC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;QAClC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;QAClC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;KACtC;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,6DAA6D;CACrD,CAAC","sourcesContent":["import type { Address, Chain, Hex } from \"viem\";\nimport {\n arbitrum,\n arbitrumSepolia,\n base,\n baseSepolia,\n fraxtal,\n fraxtalSepolia,\n mainnet,\n optimism,\n optimismSepolia,\n polygon,\n polygonAmoy,\n polygonMumbai,\n sepolia,\n zora,\n zoraSepolia,\n} from \"./chains.js\";\n\nexport const AlchemyPaymasterAddressV3 =\n \"0x4f84a207A80c39E9e8BaE717c1F25bA7AD1fB08F\";\nexport const AlchemyPaymasterAddressV2 =\n \"0x4Fd9098af9ddcB41DA48A1d78F91F1398965addc\";\nexport const ArbSepoliaPaymasterAddress =\n \"0x0804Afe6EEFb73ce7F93CD0d5e7079a5a8068592\";\nexport const AlchemyPaymasterAddressV1 =\n \"0xc03aac639bb21233e0139381970328db8bceeb67\";\n\n/**\n * Retrieves the Alchemy paymaster address for the given chain. Returns different addresses based on the chain ID.\n *\n * @example\n * ```ts\n * import { sepolia, getAlchemyPaymasterAddress } from \"@account-kit/infra\";\n *\n * const paymasterAddress = getAlchemyPaymasterAddress(sepolia);\n * ```\n *\n * @param {Chain} chain The chain for which the paymaster address is required\n * @returns {Address} The Alchemy paymaster address corresponding to the specified chain\n *\n * @deprecated This chain list in this function is no longer maintained since the ERC-7677 middleware is typically used to resolve the paymaster address\n */\nexport const getAlchemyPaymasterAddress = (chain: Chain): Address => {\n switch (chain.id) {\n case polygonAmoy.id:\n case optimismSepolia.id:\n case baseSepolia.id:\n case zora.id:\n case zoraSepolia.id:\n case fraxtal.id:\n case fraxtalSepolia.id:\n return AlchemyPaymasterAddressV3;\n case mainnet.id:\n case arbitrum.id:\n case optimism.id:\n case polygon.id:\n case base.id:\n return AlchemyPaymasterAddressV2;\n case arbitrumSepolia.id:\n return ArbSepoliaPaymasterAddress;\n case sepolia.id:\n case polygonMumbai.id:\n return AlchemyPaymasterAddressV1;\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n};\n\nexport const PermitTypes = {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\nexport const EIP712NoncesAbi = [\n \"function nonces(address owner) external view returns (uint)\",\n] as const;\n\nexport type PermitMessage = {\n owner: Hex;\n spender: Hex;\n value: bigint;\n nonce: bigint;\n deadline: bigint;\n};\n\nexport type PermitDomain = {\n name: string;\n version: string;\n chainId: bigint;\n verifyingContract: Hex;\n};\n"]}
1
+ {"version":3,"file":"gas-manager.js","sourceRoot":"","sources":["../../src/gas-manager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,eAAe,EACf,IAAI,EACJ,WAAW,EACX,OAAO,EACP,cAAc,EACd,OAAO,EACP,QAAQ,EACR,eAAe,EACf,OAAO,EACP,WAAW,EACX,aAAa,EACb,OAAO,EACP,IAAI,EACJ,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,yBAAyB,GACpC,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GACpC,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,0BAA0B,GACrC,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GACpC,4CAA4C,CAAC;AAE/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAY,EAAW,EAAE;IAClE,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;QACjB,KAAK,WAAW,CAAC,EAAE,CAAC;QACpB,KAAK,eAAe,CAAC,EAAE,CAAC;QACxB,KAAK,WAAW,CAAC,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,EAAE,CAAC;QACb,KAAK,WAAW,CAAC,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,EAAE,CAAC;QAChB,KAAK,cAAc,CAAC,EAAE;YACpB,OAAO,yBAAyB,CAAC;QACnC,KAAK,OAAO,CAAC,EAAE,CAAC;QAChB,KAAK,QAAQ,CAAC,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,EAAE;YACV,OAAO,yBAAyB,CAAC;QACnC,KAAK,eAAe,CAAC,EAAE;YACrB,OAAO,0BAA0B,CAAC;QACpC,KAAK,OAAO,CAAC,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,EAAE;YACnB,OAAO,yBAAyB,CAAC;QACnC;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY,EAAE;QACZ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;QACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;KAC/C;IACD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;QAClC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;QAClC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;QAClC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;KACtC;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,6DAA6D;IAC7D,iDAAiD;CACzC,CAAC","sourcesContent":["import type { Address, Chain, Hex } from \"viem\";\nimport {\n arbitrum,\n arbitrumSepolia,\n base,\n baseSepolia,\n fraxtal,\n fraxtalSepolia,\n mainnet,\n optimism,\n optimismSepolia,\n polygon,\n polygonAmoy,\n polygonMumbai,\n sepolia,\n zora,\n zoraSepolia,\n} from \"./chains.js\";\n\nexport const AlchemyPaymasterAddressV3 =\n \"0x4f84a207A80c39E9e8BaE717c1F25bA7AD1fB08F\";\nexport const AlchemyPaymasterAddressV2 =\n \"0x4Fd9098af9ddcB41DA48A1d78F91F1398965addc\";\nexport const ArbSepoliaPaymasterAddress =\n \"0x0804Afe6EEFb73ce7F93CD0d5e7079a5a8068592\";\nexport const AlchemyPaymasterAddressV1 =\n \"0xc03aac639bb21233e0139381970328db8bceeb67\";\n\n/**\n * Retrieves the Alchemy paymaster address for the given chain. Returns different addresses based on the chain ID.\n *\n * @example\n * ```ts\n * import { sepolia, getAlchemyPaymasterAddress } from \"@account-kit/infra\";\n *\n * const paymasterAddress = getAlchemyPaymasterAddress(sepolia);\n * ```\n *\n * @param {Chain} chain The chain for which the paymaster address is required\n * @returns {Address} The Alchemy paymaster address corresponding to the specified chain\n *\n * @deprecated This chain list in this function is no longer maintained since the ERC-7677 middleware is typically used to resolve the paymaster address\n */\nexport const getAlchemyPaymasterAddress = (chain: Chain): Address => {\n switch (chain.id) {\n case polygonAmoy.id:\n case optimismSepolia.id:\n case baseSepolia.id:\n case zora.id:\n case zoraSepolia.id:\n case fraxtal.id:\n case fraxtalSepolia.id:\n return AlchemyPaymasterAddressV3;\n case mainnet.id:\n case arbitrum.id:\n case optimism.id:\n case polygon.id:\n case base.id:\n return AlchemyPaymasterAddressV2;\n case arbitrumSepolia.id:\n return ArbSepoliaPaymasterAddress;\n case sepolia.id:\n case polygonMumbai.id:\n return AlchemyPaymasterAddressV1;\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n};\n\nexport const PermitTypes = {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\nexport const EIP712NoncesAbi = [\n \"function nonces(address owner) external view returns (uint)\",\n \"function decimals() public view returns (uint8)\",\n] as const;\n\nexport type PermitMessage = {\n owner: Hex;\n spender: Hex;\n value: bigint;\n nonce: bigint;\n deadline: bigint;\n};\n\nexport type PermitDomain = {\n name: string;\n version: string;\n chainId: bigint;\n verifyingContract: Hex;\n};\n"]}
@@ -227,8 +227,19 @@ const generateSignedPermit = async (userOp, client, account, policyId, policyTok
227
227
  if (!policyToken.erc20Name || !policyToken.version) {
228
228
  throw new Error("erc20Name or version is missing");
229
229
  }
230
- // get a paymaster address
231
- const maxAmountToken = policyToken.maxTokenAmount || maxUint256;
230
+ let maxAmountToken = maxUint256;
231
+ if (policyToken.maxTokenAmount) {
232
+ let { data } = await client.call({
233
+ to: policyToken.address,
234
+ data: encodeFunctionData({
235
+ abi: parseAbi(EIP712NoncesAbi),
236
+ functionName: "decimals",
237
+ args: [],
238
+ }),
239
+ });
240
+ const decimals = 10n ** (data ? BigInt(data) : 18n);
241
+ maxAmountToken = policyToken.maxTokenAmount * decimals;
242
+ }
232
243
  const paymasterData = await client.request({
233
244
  method: "pm_getPaymasterStubData",
234
245
  params: [
@@ -1 +1 @@
1
- {"version":3,"file":"gasManager.js","sourceRoot":"","sources":["../../../src/middleware/gasManager.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,OAAO,EACP,KAAK,EACL,KAAK,EAEL,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,QAAQ,GACT,MAAM,MAAM,CAAC;AAGd,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAYjE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAA2B,EAC3B,WAAyB;IAIzB,MAAM,YAAY,GAAG,KAAK,EACxB,EAAqC,EACrC,IAAuC,EACrB,EAAE;QACpB,MAAM,OAAO,GAAY,EAAE,QAAQ,EAAE,CAAC;QAEtC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,YAAY,GAAG;gBACrB,YAAY,EAAE,WAAW,CAAC,OAAO;gBACjC,GAAG,CAAC,WAAW,CAAC,cAAc;oBAC5B,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,cAAc,EAAE;oBAChD,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;YAEF,IAAI,WAAW,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAC1C,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,oBAAoB,CACtD,MAAM,EACN,MAAmC,EACnC,OAAO,EACP,QAAQ,EACR,WAAW,CACZ,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,OAAO;QACL,qBAAqB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO,cAAc,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;QAED,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO,cAAc,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,uCAAuC,CACrD,MAAqD;IAKrD,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,oBAAoB,GACrB,GAAG,MAAM,CAAC;IACX,OAAO;QACL,qBAAqB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACxC;YACE,sEAAsE;YACtE,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC;gBACtC,mGAAmG;gBACnG,2FAA2F;gBAC3F,CAAC,CAAC,oBAAoB,IAAI,oBAAoB,CAAC,EAC/C,CAAC;gBACD,OAAO,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;YAED,kEAAkE;YAClE,OAAO,2BAA2B,CAChC,QAAQ,EACR,WAAW,CACZ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;YACzB,OAAO,oBAAoB;gBACzB,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC;gBAChC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC;oBACxC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC;oBAC1C,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;YACzB,OAAO,oBAAoB;gBACzB,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC;gBAChC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC;oBACxC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC;oBAC5C,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,gBAAgB,EAAE,KAAK,EACrB,EAAE,EACF,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,EAC/D,EAAE;YACF,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACjC,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;YAExD,MAAM,SAAS,GAA2B,eAAe,CAAC;gBACxD,YAAY,EAAE,aAAa,CACzB,cAAc,EACd,UAAoC,EACpC,UAAU,EACV,MAAM,CACP;gBACD,oBAAoB,EAAE,aAAa,CACjC,sBAAsB,EACtB,UAAoC,EACpC,UAAU,EACV,MAAM,CACP;gBACD,YAAY,EAAE,aAAa,CACzB,cAAc,EACd,UAAoC,EACpC,UAAU,EACV,MAAM,CACP;gBACD,oBAAoB,EAAE,aAAa,CACjC,sBAAsB,EACtB,UAAoC,EACpC,UAAU,EACV,MAAM,CACP;gBACD,kBAAkB,EAAE,aAAa,CAC/B,oBAAoB,EACpB,UAAoC,EACpC,UAAU,EACV,MAAM,CACP;gBACD,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO,KAAK,OAAO;oBAC7C,CAAC,CAAC;wBACE,6BAA6B,EAAE,aAAa,CAC1C,+BAA+B,EAC/B,UAA6C,EAC7C,UAAU,EACV,MAAM,CACP;wBACD,uBAAuB,EAAE,aAAa,CACpC,yBAAyB,EACzB,UAA6C,EAC7C,UAAU,EACV,MAAM,CACP;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YAEH,IAAI,YAAY,GACd,SAAS,CAAC;YACZ,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,YAAY,GAAG;oBACb,YAAY,EAAE,WAAW,CAAC,OAAO;oBACjC,GAAG,CAAC,WAAW,CAAC,cAAc;wBAC5B,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,cAAc,EAAE;wBAChD,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC;gBACF,IAAI,WAAW,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;oBAC1C,YAAY,CAAC,MAAM,GAAG,MAAM,oBAAoB,CAC9C,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,WAAW,CACZ,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAO,MAAoC,CAAC,OAAO,CAAC;gBACjE,MAAM,EAAE,uCAAuC;gBAC/C,MAAM,EAAE;oBACN;wBACE,QAAQ;wBACR,UAAU,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO;wBAC3C,aAAa,EAAE,MAAM;wBACrB,cAAc,EAAE,MAAM,OAAO,CAAC,iBAAiB,EAAE;wBACjD,SAAS;wBACT,GAAG,CAAC,YAAY;4BACd,CAAC,CAAC;gCACE,YAAY;6BACb;4BACH,CAAC,CAAC,EAAE,CAAC;qBACR;iBACF;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,EAAE;gBACL,GAAG,MAAM;aACV,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,aAAa,GAAG,CAGpB,KAAwD,EACxD,SAAiE,EACjE,UAAmE,EACnE,aAAuD,EACzB,EAAE;IAChC,IAAI,MAAM,GAAG,KAAyD,CAAC;IAEvE,IAAI,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,4BAA4B;QAC5B,IAAI,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,+BAA+B;aAC1B,CAAC;YACJ,OAAO;gBACL,UAAU,EAAE,MAAM,CAAE,SAAS,CAAC,MAAM,CAAgB,CAAC,UAAU,CAAC;aACjE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,UAAU,EAAE,MAAM,CAAE,UAAW,CAAC,KAAK,CAAgB,CAAC,UAAU,CAAC;SAClE,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GACf,aAAa,CAAC,KAAuD,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,WAAkB,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;QACrE,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,oBAAoB,GAAG,KAAK,EAIhC,MAAgD,EAChD,MAAwB,EACxB,OAAiB,EACjB,QAA2B,EAC3B,WAMC,EACa,EAAE;IAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,kBAAkB,EAAE,CAAC;IACjC,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,0BAA0B;IAC1B,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,UAAU,CAAC;IAChE,MAAM,aAAa,GAAG,MAAO,MAAwB,CAAC,OAAO,CAAC;QAC5D,MAAM,EAAE,yBAAyB;QACjC,MAAM,EAAE;YACN,MAAM;YACN,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO;YAC/B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB;gBACE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;aAC3D;SACF;KACF,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS;QAC9C,CAAC,CAAC,aAAa,CAAC,SAAS;QACzB,CAAC,CAAC,aAAa,CAAC,gBAAgB;YAChC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,QAAQ,GAAG,UAAU,CAAC;IAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QACjC,EAAE,EAAE,WAAW,CAAC,OAAO;QACvB,IAAI,EAAE,kBAAkB,CAAC;YACvB,GAAG,EAAE,QAAQ,CAAC,eAAe,CAAC;YAC9B,YAAY,EAAE,QAAQ;YACtB,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SACxB,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,eAAe,GAAG;QACtB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,QAAiB;QAC9B,MAAM,EAAE;YACN,IAAI,EAAE,WAAW,CAAC,SAAS,IAAI,EAAE;YACjC,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,EAAE;YAClC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,iBAAiB,EAAE,WAAW,CAAC,OAAO;SAChB;QACxB,OAAO,EAAE;YACP,KAAK,EAAE,OAAO,CAAC,OAAO;YACtB,OAAO,EAAE,gBAAgB;YACzB,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC;YACnB,QAAQ;SACe;KACjB,CAAC;IAEX,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO,mBAAmB,CACxB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAC7D,CAAC,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,CACzC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type {\n Address,\n ClientMiddlewareConfig,\n ClientMiddlewareFn,\n EntryPointVersion,\n Erc7677Client,\n Multiplier,\n SmartContractAccount,\n UserOperationFeeOptions,\n UserOperationOverrides,\n UserOperationRequest,\n} from \"@aa-sdk/core\";\nimport {\n bypassPaymasterAndData,\n ChainNotFoundError,\n clientHeaderTrack,\n deepHexlify,\n defaultGasEstimator,\n erc7677Middleware,\n filterUndefined,\n isBigNumberish,\n isMultiplier,\n noopMiddleware,\n resolveProperties,\n} from \"@aa-sdk/core\";\nimport {\n fromHex,\n isHex,\n toHex,\n type Hex,\n encodeAbiParameters,\n encodeFunctionData,\n parseAbi,\n maxUint256,\n sliceHex,\n} from \"viem\";\nimport type { AlchemySmartAccountClient } from \"../client/smartAccountClient.js\";\nimport type { AlchemyTransport } from \"../alchemyTransport.js\";\nimport { alchemyFeeEstimator } from \"./feeEstimator.js\";\nimport type { RequestGasAndPaymasterAndDataRequest } from \"../actions/types.js\";\nimport { PermitTypes, EIP712NoncesAbi } from \"../gas-manager.js\";\nimport type { PermitMessage, PermitDomain } from \"../gas-manager.js\";\nimport type { MiddlewareClient } from \"../../../../aa-sdk/core/dist/types/middleware/actions.js\";\n\ntype Context = {\n policyId: string | string[];\n erc20Context?: {\n tokenAddress: Address;\n maxTokenAmount?: BigInt;\n permit?: Hex;\n };\n};\n/**\n * Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring\n * transactions. Adheres to the ERC-7677 standardized communication protocol.\n *\n * @example\n * ```ts\n * import { sepolia, alchemyGasManagerMiddleware } from \"@account-kit/infra\";\n * import { http } from \"viem\";\n *\n * const client = createSmartAccountClient({\n * transport: http(\"rpc-url\"),\n * chain: sepolia,\n * ...alchemyGasManagerMiddleware(\"policyId\")\n * });\n * ```\n *\n * @param {string | string[]} policyId - The policyId (or list of policyIds) for Alchemy's gas manager\n * @param {PolicyToken | undefined} policyToken - The policy token configuration\n * @returns {Pick<ClientMiddlewareConfig, \"dummyPaymasterAndData\" | \"paymasterAndData\">} Partial client middleware configuration containing `dummyPaymasterAndData` and `paymasterAndData`\n */\nexport function alchemyGasManagerMiddleware(\n policyId: string | string[],\n policyToken?: PolicyToken\n): Required<\n Pick<ClientMiddlewareConfig, \"dummyPaymasterAndData\" | \"paymasterAndData\">\n> {\n const buildContext = async (\n uo: Parameters<ClientMiddlewareFn>[0],\n args: Parameters<ClientMiddlewareFn>[1]\n ): Promise<Context> => {\n const context: Context = { policyId };\n\n const { account, client } = args;\n if (!client.chain) {\n throw new ChainNotFoundError();\n }\n\n if (policyToken !== undefined) {\n const userOp = await deepHexlify(await resolveProperties(uo));\n context.erc20Context = {\n tokenAddress: policyToken.address,\n ...(policyToken.maxTokenAmount\n ? { maxTokenAmount: policyToken.maxTokenAmount }\n : {}),\n };\n\n if (policyToken.approvalMode === \"PERMIT\") {\n context.erc20Context.permit = await generateSignedPermit(\n userOp,\n client as AlchemySmartAccountClient,\n account,\n policyId,\n policyToken\n );\n }\n }\n\n return context;\n };\n return {\n dummyPaymasterAndData: async (uo, args) => {\n const context = await buildContext(uo, args);\n const baseMiddleware = erc7677Middleware({ context });\n return baseMiddleware.dummyPaymasterAndData(uo, args);\n },\n\n paymasterAndData: async (uo, args) => {\n const context = await buildContext(uo, args);\n const baseMiddleware = erc7677Middleware({ context });\n return baseMiddleware.paymasterAndData(uo, args);\n },\n };\n}\n\ninterface AlchemyGasAndPaymasterAndDataMiddlewareParams {\n policyId: string | string[];\n policyToken?: PolicyToken;\n transport: AlchemyTransport;\n gasEstimatorOverride?: ClientMiddlewareFn;\n feeEstimatorOverride?: ClientMiddlewareFn;\n}\n\nexport type PolicyToken = {\n address: Address;\n maxTokenAmount?: bigint;\n approvalMode?: \"NONE\" | \"PERMIT\";\n erc20Name?: string;\n version?: string;\n};\n\n/**\n * Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring\n * transactions. Uses Alchemy's custom `alchemy_requestGasAndPaymasterAndData`\n * method instead of conforming to the standard ERC-7677 interface. Note that\n * if you use `createAlchemySmartAccountClient`, this middleware is already\n * used by default and you do not need to manually include it.\n *\n * @example\n * ```ts twoslash\n * import { sepolia, alchemy, alchemyGasAndPaymasterAndDataMiddleware } from \"@account-kit/infra\";\n * import { createSmartAccountClient } from \"@aa-sdk/core\";\n *\n * const client = createSmartAccountClient({\n * transport: alchemy({ apiKey: \"your-api-key\" }),\n * chain: sepolia,\n * ...alchemyGasAndPaymasterAndDataMiddleware({\n * policyId: \"policyId\",\n * transport: alchemy({ apiKey: \"your-api-key\" }),\n * })\n * });\n * ```\n *\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams} params configuration params\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams.policyId} params.policyId the policyId for Alchemy's gas manager\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams.transport} params.transport fallback transport to use for fee estimation when not using the paymaster\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams.gasEstimatorOverride} params.gasEstimatorOverride custom gas estimator middleware\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams.feeEstimatorOverride} params.feeEstimatorOverride custom fee estimator middleware\n * @returns {Pick<ClientMiddlewareConfig, \"dummyPaymasterAndData\" | \"feeEstimator\" | \"gasEstimator\" | \"paymasterAndData\">} partial client middleware configuration containing `dummyPaymasterAndData`, `feeEstimator`, `gasEstimator`, and `paymasterAndData`\n */\nexport function alchemyGasAndPaymasterAndDataMiddleware(\n params: AlchemyGasAndPaymasterAndDataMiddlewareParams\n): Pick<\n ClientMiddlewareConfig,\n \"dummyPaymasterAndData\" | \"feeEstimator\" | \"gasEstimator\" | \"paymasterAndData\"\n> {\n const {\n policyId,\n policyToken,\n transport,\n gasEstimatorOverride,\n feeEstimatorOverride,\n } = params;\n return {\n dummyPaymasterAndData: async (uo, args) => {\n if (\n // No reason to generate dummy data if we are bypassing the paymaster.\n bypassPaymasterAndData(args.overrides) ||\n // When using alchemy_requestGasAndPaymasterAndData, there is generally no reason to generate dummy\n // data. However, if the gas/feeEstimator is overriden, then this option should be enabled.\n !(gasEstimatorOverride || feeEstimatorOverride)\n ) {\n return noopMiddleware(uo, args);\n }\n\n // Fall back to the default 7677 dummyPaymasterAndData middleware.\n return alchemyGasManagerMiddleware(\n policyId,\n policyToken\n ).dummyPaymasterAndData(uo, args);\n },\n feeEstimator: (uo, args) => {\n return feeEstimatorOverride\n ? feeEstimatorOverride(uo, args)\n : bypassPaymasterAndData(args.overrides)\n ? alchemyFeeEstimator(transport)(uo, args)\n : noopMiddleware(uo, args);\n },\n gasEstimator: (uo, args) => {\n return gasEstimatorOverride\n ? gasEstimatorOverride(uo, args)\n : bypassPaymasterAndData(args.overrides)\n ? defaultGasEstimator(args.client)(uo, args)\n : noopMiddleware(uo, args);\n },\n paymasterAndData: async (\n uo,\n { account, client: client_, feeOptions, overrides: overrides_ }\n ) => {\n const client = clientHeaderTrack(client_, \"alchemyFeeEstimator\");\n if (!client.chain) {\n throw new ChainNotFoundError();\n }\n\n const userOp = deepHexlify(await resolveProperties(uo));\n\n const overrides: UserOperationOverrides = filterUndefined({\n maxFeePerGas: overrideField(\n \"maxFeePerGas\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n maxPriorityFeePerGas: overrideField(\n \"maxPriorityFeePerGas\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n callGasLimit: overrideField(\n \"callGasLimit\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n verificationGasLimit: overrideField(\n \"verificationGasLimit\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n preVerificationGas: overrideField(\n \"preVerificationGas\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n ...(account.getEntryPoint().version === \"0.7.0\"\n ? {\n paymasterVerificationGasLimit: overrideField<\"0.7.0\">(\n \"paymasterVerificationGasLimit\",\n overrides_ as UserOperationOverrides<\"0.7.0\">,\n feeOptions,\n userOp\n ),\n paymasterPostOpGasLimit: overrideField<\"0.7.0\">(\n \"paymasterPostOpGasLimit\",\n overrides_ as UserOperationOverrides<\"0.7.0\">,\n feeOptions,\n userOp\n ),\n }\n : {}),\n });\n\n let erc20Context: RequestGasAndPaymasterAndDataRequest[0][\"erc20Context\"] =\n undefined;\n if (policyToken !== undefined) {\n erc20Context = {\n tokenAddress: policyToken.address,\n ...(policyToken.maxTokenAmount\n ? { maxTokenAmount: policyToken.maxTokenAmount }\n : {}),\n };\n if (policyToken.approvalMode === \"PERMIT\") {\n erc20Context.permit = await generateSignedPermit(\n userOp,\n client,\n account,\n policyId,\n policyToken\n );\n }\n }\n\n const result = await (client as AlchemySmartAccountClient).request({\n method: \"alchemy_requestGasAndPaymasterAndData\",\n params: [\n {\n policyId,\n entryPoint: account.getEntryPoint().address,\n userOperation: userOp,\n dummySignature: await account.getDummySignature(),\n overrides,\n ...(erc20Context\n ? {\n erc20Context,\n }\n : {}),\n },\n ],\n });\n\n return {\n ...uo,\n ...result,\n };\n },\n };\n}\n\n/**\n * Utility function to override a field in the user operation request with the overrides or fee options\n *\n * @template {EntryPointVersion} TEntryPointVersion\n * @param {keyof UserOperationFeeOptions<TEntryPointVersion>} field the field to override\n * @param {UserOperationOverrides<TEntryPointVersion> | undefined} overrides the overrides object\n * @param {UserOperationFeeOptions<TEntryPointVersion> | undefined} feeOptions the fee options object from the client\n * @param {UserOperationRequest<TEntryPointVersion>} userOperation the user operation request\n * @returns {Hex | Multiplier | undefined} the overridden field value\n */\nconst overrideField = <\n TEntryPointVersion extends EntryPointVersion = EntryPointVersion\n>(\n field: keyof UserOperationFeeOptions<TEntryPointVersion>,\n overrides: UserOperationOverrides<TEntryPointVersion> | undefined,\n feeOptions: UserOperationFeeOptions<TEntryPointVersion> | undefined,\n userOperation: UserOperationRequest<TEntryPointVersion>\n): Hex | Multiplier | undefined => {\n let _field = field as keyof UserOperationOverrides<TEntryPointVersion>;\n\n if (overrides?.[_field] != null) {\n // one-off absolute override\n if (isBigNumberish(overrides[_field])) {\n return deepHexlify(overrides[_field]);\n }\n // one-off multiplier overrides\n else {\n return {\n multiplier: Number((overrides[_field] as Multiplier).multiplier),\n };\n }\n }\n\n // provider level fee options with multiplier\n if (isMultiplier(feeOptions?.[field])) {\n return {\n multiplier: Number((feeOptions![field] as Multiplier).multiplier),\n };\n }\n\n const userOpField =\n userOperation[field as keyof UserOperationRequest<TEntryPointVersion>];\n if (isHex(userOpField) && fromHex(userOpField as Hex, \"bigint\") > 0n) {\n return userOpField;\n }\n return undefined;\n};\n\n/**\n * Utility function to generate a signed Permit for erc20 transaction\n *\n * @param {UserOperationRequest<TEntryPointVersion>} userOp - The user operation request\n * @param {MiddlewareClient} client - The Alchemy smart account client\n * @param {TAccount} account - The smart account instance\n * @param {string | string[]} policyId - The policy ID or array of policy IDs\n * @param {PolicyToken} policyToken - The policy token configuration\n * @param {Address} policyToken.address - ERC20 contract addressya\n * @param {bigint} [policyToken.maxTokenAmount] - Optional ERC20 token limit\n * @param {\"NONE\" | \"PERMIT\"} [policyToken.approvalMode] - ERC20 approve mode\n * @param {string} [policyToken.erc20Name] - EIP2612 specified ERC20 contract name\n * @param {string} [policyToken.version] - EIP2612 specified ERC20 contract version\n * @returns {Promise<Hex>} Returns a Promise containing the signed EIP2612 permit\n */\nconst generateSignedPermit = async <\n TAccount extends SmartContractAccount,\n TEntryPointVersion extends EntryPointVersion = EntryPointVersion\n>(\n userOp: UserOperationRequest<TEntryPointVersion>,\n client: MiddlewareClient,\n account: TAccount,\n policyId: string | string[],\n policyToken: {\n address: Address;\n maxTokenAmount?: bigint;\n approvalMode?: \"NONE\" | \"PERMIT\";\n erc20Name?: string;\n version?: string;\n }\n): Promise<Hex> => {\n if (!client.chain) {\n throw new ChainNotFoundError();\n }\n if (!policyToken.erc20Name || !policyToken.version) {\n throw new Error(\"erc20Name or version is missing\");\n }\n // get a paymaster address\n const maxAmountToken = policyToken.maxTokenAmount || maxUint256;\n const paymasterData = await (client as Erc7677Client).request({\n method: \"pm_getPaymasterStubData\",\n params: [\n userOp,\n account.getEntryPoint().address,\n toHex(client.chain.id),\n {\n policyId: Array.isArray(policyId) ? policyId[0] : policyId,\n },\n ],\n });\n\n const paymasterAddress = paymasterData.paymaster\n ? paymasterData.paymaster\n : paymasterData.paymasterAndData\n ? sliceHex(paymasterData.paymasterAndData, 0, 20)\n : undefined;\n\n if (paymasterAddress === undefined || paymasterAddress === \"0x\") {\n throw new Error(\"no paymaster contract address available\");\n }\n const deadline = maxUint256;\n const { data } = await client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(EIP712NoncesAbi),\n functionName: \"nonces\",\n args: [account.address],\n }),\n });\n if (!data) {\n throw new Error(\"No nonces returned from erc20 contract call\");\n }\n\n const typedPermitData = {\n types: PermitTypes,\n primaryType: \"Permit\" as const,\n domain: {\n name: policyToken.erc20Name ?? \"\",\n version: policyToken.version ?? \"\",\n chainId: BigInt(client.chain.id),\n verifyingContract: policyToken.address,\n } satisfies PermitDomain,\n message: {\n owner: account.address,\n spender: paymasterAddress,\n value: maxAmountToken,\n nonce: BigInt(data),\n deadline,\n } satisfies PermitMessage,\n } as const;\n\n const signedPermit = await account.signTypedData(typedPermitData);\n return encodeAbiParameters(\n [{ type: \"uint256\" }, { type: \"uint256\" }, { type: \"bytes\" }],\n [maxAmountToken, deadline, signedPermit]\n );\n};\n"]}
1
+ {"version":3,"file":"gasManager.js","sourceRoot":"","sources":["../../../src/middleware/gasManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Address,\n ClientMiddlewareConfig,\n ClientMiddlewareFn,\n EntryPointVersion,\n Erc7677Client,\n Multiplier,\n SmartContractAccount,\n UserOperationFeeOptions,\n UserOperationOverrides,\n UserOperationRequest,\n} from \"@aa-sdk/core\";\nimport {\n bypassPaymasterAndData,\n ChainNotFoundError,\n clientHeaderTrack,\n deepHexlify,\n defaultGasEstimator,\n erc7677Middleware,\n filterUndefined,\n isBigNumberish,\n isMultiplier,\n noopMiddleware,\n resolveProperties,\n} from \"@aa-sdk/core\";\nimport {\n fromHex,\n isHex,\n toHex,\n type Hex,\n encodeAbiParameters,\n encodeFunctionData,\n parseAbi,\n maxUint256,\n sliceHex,\n} from \"viem\";\nimport type { AlchemySmartAccountClient } from \"../client/smartAccountClient.js\";\nimport type { AlchemyTransport } from \"../alchemyTransport.js\";\nimport { alchemyFeeEstimator } from \"./feeEstimator.js\";\nimport type { RequestGasAndPaymasterAndDataRequest } from \"../actions/types.js\";\nimport { PermitTypes, EIP712NoncesAbi } from \"../gas-manager.js\";\nimport type { PermitMessage, PermitDomain } from \"../gas-manager.js\";\nimport type { MiddlewareClient } from \"../../../../aa-sdk/core/dist/types/middleware/actions.js\";\n\ntype Context = {\n policyId: string | string[];\n erc20Context?: {\n tokenAddress: Address;\n maxTokenAmount?: BigInt;\n permit?: Hex;\n };\n};\n/**\n * Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring\n * transactions. Adheres to the ERC-7677 standardized communication protocol.\n *\n * @example\n * ```ts\n * import { sepolia, alchemyGasManagerMiddleware } from \"@account-kit/infra\";\n * import { http } from \"viem\";\n *\n * const client = createSmartAccountClient({\n * transport: http(\"rpc-url\"),\n * chain: sepolia,\n * ...alchemyGasManagerMiddleware(\"policyId\")\n * });\n * ```\n *\n * @param {string | string[]} policyId - The policyId (or list of policyIds) for Alchemy's gas manager\n * @param {PolicyToken | undefined} policyToken - The policy token configuration\n * @returns {Pick<ClientMiddlewareConfig, \"dummyPaymasterAndData\" | \"paymasterAndData\">} Partial client middleware configuration containing `dummyPaymasterAndData` and `paymasterAndData`\n */\nexport function alchemyGasManagerMiddleware(\n policyId: string | string[],\n policyToken?: PolicyToken\n): Required<\n Pick<ClientMiddlewareConfig, \"dummyPaymasterAndData\" | \"paymasterAndData\">\n> {\n const buildContext = async (\n uo: Parameters<ClientMiddlewareFn>[0],\n args: Parameters<ClientMiddlewareFn>[1]\n ): Promise<Context> => {\n const context: Context = { policyId };\n\n const { account, client } = args;\n if (!client.chain) {\n throw new ChainNotFoundError();\n }\n\n if (policyToken !== undefined) {\n const userOp = await deepHexlify(await resolveProperties(uo));\n context.erc20Context = {\n tokenAddress: policyToken.address,\n ...(policyToken.maxTokenAmount\n ? { maxTokenAmount: policyToken.maxTokenAmount }\n : {}),\n };\n\n if (policyToken.approvalMode === \"PERMIT\") {\n context.erc20Context.permit = await generateSignedPermit(\n userOp,\n client as AlchemySmartAccountClient,\n account,\n policyId,\n policyToken\n );\n }\n }\n\n return context;\n };\n return {\n dummyPaymasterAndData: async (uo, args) => {\n const context = await buildContext(uo, args);\n const baseMiddleware = erc7677Middleware({ context });\n return baseMiddleware.dummyPaymasterAndData(uo, args);\n },\n\n paymasterAndData: async (uo, args) => {\n const context = await buildContext(uo, args);\n const baseMiddleware = erc7677Middleware({ context });\n return baseMiddleware.paymasterAndData(uo, args);\n },\n };\n}\n\ninterface AlchemyGasAndPaymasterAndDataMiddlewareParams {\n policyId: string | string[];\n policyToken?: PolicyToken;\n transport: AlchemyTransport;\n gasEstimatorOverride?: ClientMiddlewareFn;\n feeEstimatorOverride?: ClientMiddlewareFn;\n}\n\nexport type PolicyToken = {\n address: Address;\n maxTokenAmount?: bigint;\n approvalMode?: \"NONE\" | \"PERMIT\";\n erc20Name?: string;\n version?: string;\n};\n\n/**\n * Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring\n * transactions. Uses Alchemy's custom `alchemy_requestGasAndPaymasterAndData`\n * method instead of conforming to the standard ERC-7677 interface. Note that\n * if you use `createAlchemySmartAccountClient`, this middleware is already\n * used by default and you do not need to manually include it.\n *\n * @example\n * ```ts twoslash\n * import { sepolia, alchemy, alchemyGasAndPaymasterAndDataMiddleware } from \"@account-kit/infra\";\n * import { createSmartAccountClient } from \"@aa-sdk/core\";\n *\n * const client = createSmartAccountClient({\n * transport: alchemy({ apiKey: \"your-api-key\" }),\n * chain: sepolia,\n * ...alchemyGasAndPaymasterAndDataMiddleware({\n * policyId: \"policyId\",\n * transport: alchemy({ apiKey: \"your-api-key\" }),\n * })\n * });\n * ```\n *\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams} params configuration params\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams.policyId} params.policyId the policyId for Alchemy's gas manager\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams.transport} params.transport fallback transport to use for fee estimation when not using the paymaster\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams.gasEstimatorOverride} params.gasEstimatorOverride custom gas estimator middleware\n * @param {AlchemyGasAndPaymasterAndDataMiddlewareParams.feeEstimatorOverride} params.feeEstimatorOverride custom fee estimator middleware\n * @returns {Pick<ClientMiddlewareConfig, \"dummyPaymasterAndData\" | \"feeEstimator\" | \"gasEstimator\" | \"paymasterAndData\">} partial client middleware configuration containing `dummyPaymasterAndData`, `feeEstimator`, `gasEstimator`, and `paymasterAndData`\n */\nexport function alchemyGasAndPaymasterAndDataMiddleware(\n params: AlchemyGasAndPaymasterAndDataMiddlewareParams\n): Pick<\n ClientMiddlewareConfig,\n \"dummyPaymasterAndData\" | \"feeEstimator\" | \"gasEstimator\" | \"paymasterAndData\"\n> {\n const {\n policyId,\n policyToken,\n transport,\n gasEstimatorOverride,\n feeEstimatorOverride,\n } = params;\n return {\n dummyPaymasterAndData: async (uo, args) => {\n if (\n // No reason to generate dummy data if we are bypassing the paymaster.\n bypassPaymasterAndData(args.overrides) ||\n // When using alchemy_requestGasAndPaymasterAndData, there is generally no reason to generate dummy\n // data. However, if the gas/feeEstimator is overriden, then this option should be enabled.\n !(gasEstimatorOverride || feeEstimatorOverride)\n ) {\n return noopMiddleware(uo, args);\n }\n\n // Fall back to the default 7677 dummyPaymasterAndData middleware.\n return alchemyGasManagerMiddleware(\n policyId,\n policyToken\n ).dummyPaymasterAndData(uo, args);\n },\n feeEstimator: (uo, args) => {\n return feeEstimatorOverride\n ? feeEstimatorOverride(uo, args)\n : bypassPaymasterAndData(args.overrides)\n ? alchemyFeeEstimator(transport)(uo, args)\n : noopMiddleware(uo, args);\n },\n gasEstimator: (uo, args) => {\n return gasEstimatorOverride\n ? gasEstimatorOverride(uo, args)\n : bypassPaymasterAndData(args.overrides)\n ? defaultGasEstimator(args.client)(uo, args)\n : noopMiddleware(uo, args);\n },\n paymasterAndData: async (\n uo,\n { account, client: client_, feeOptions, overrides: overrides_ }\n ) => {\n const client = clientHeaderTrack(client_, \"alchemyFeeEstimator\");\n if (!client.chain) {\n throw new ChainNotFoundError();\n }\n\n const userOp = deepHexlify(await resolveProperties(uo));\n\n const overrides: UserOperationOverrides = filterUndefined({\n maxFeePerGas: overrideField(\n \"maxFeePerGas\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n maxPriorityFeePerGas: overrideField(\n \"maxPriorityFeePerGas\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n callGasLimit: overrideField(\n \"callGasLimit\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n verificationGasLimit: overrideField(\n \"verificationGasLimit\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n preVerificationGas: overrideField(\n \"preVerificationGas\",\n overrides_ as UserOperationOverrides,\n feeOptions,\n userOp\n ),\n ...(account.getEntryPoint().version === \"0.7.0\"\n ? {\n paymasterVerificationGasLimit: overrideField<\"0.7.0\">(\n \"paymasterVerificationGasLimit\",\n overrides_ as UserOperationOverrides<\"0.7.0\">,\n feeOptions,\n userOp\n ),\n paymasterPostOpGasLimit: overrideField<\"0.7.0\">(\n \"paymasterPostOpGasLimit\",\n overrides_ as UserOperationOverrides<\"0.7.0\">,\n feeOptions,\n userOp\n ),\n }\n : {}),\n });\n\n let erc20Context: RequestGasAndPaymasterAndDataRequest[0][\"erc20Context\"] =\n undefined;\n if (policyToken !== undefined) {\n erc20Context = {\n tokenAddress: policyToken.address,\n ...(policyToken.maxTokenAmount\n ? { maxTokenAmount: policyToken.maxTokenAmount }\n : {}),\n };\n if (policyToken.approvalMode === \"PERMIT\") {\n erc20Context.permit = await generateSignedPermit(\n userOp,\n client,\n account,\n policyId,\n policyToken\n );\n }\n }\n\n const result = await (client as AlchemySmartAccountClient).request({\n method: \"alchemy_requestGasAndPaymasterAndData\",\n params: [\n {\n policyId,\n entryPoint: account.getEntryPoint().address,\n userOperation: userOp,\n dummySignature: await account.getDummySignature(),\n overrides,\n ...(erc20Context\n ? {\n erc20Context,\n }\n : {}),\n },\n ],\n });\n\n return {\n ...uo,\n ...result,\n };\n },\n };\n}\n\n/**\n * Utility function to override a field in the user operation request with the overrides or fee options\n *\n * @template {EntryPointVersion} TEntryPointVersion\n * @param {keyof UserOperationFeeOptions<TEntryPointVersion>} field the field to override\n * @param {UserOperationOverrides<TEntryPointVersion> | undefined} overrides the overrides object\n * @param {UserOperationFeeOptions<TEntryPointVersion> | undefined} feeOptions the fee options object from the client\n * @param {UserOperationRequest<TEntryPointVersion>} userOperation the user operation request\n * @returns {Hex | Multiplier | undefined} the overridden field value\n */\nconst overrideField = <\n TEntryPointVersion extends EntryPointVersion = EntryPointVersion\n>(\n field: keyof UserOperationFeeOptions<TEntryPointVersion>,\n overrides: UserOperationOverrides<TEntryPointVersion> | undefined,\n feeOptions: UserOperationFeeOptions<TEntryPointVersion> | undefined,\n userOperation: UserOperationRequest<TEntryPointVersion>\n): Hex | Multiplier | undefined => {\n let _field = field as keyof UserOperationOverrides<TEntryPointVersion>;\n\n if (overrides?.[_field] != null) {\n // one-off absolute override\n if (isBigNumberish(overrides[_field])) {\n return deepHexlify(overrides[_field]);\n }\n // one-off multiplier overrides\n else {\n return {\n multiplier: Number((overrides[_field] as Multiplier).multiplier),\n };\n }\n }\n\n // provider level fee options with multiplier\n if (isMultiplier(feeOptions?.[field])) {\n return {\n multiplier: Number((feeOptions![field] as Multiplier).multiplier),\n };\n }\n\n const userOpField =\n userOperation[field as keyof UserOperationRequest<TEntryPointVersion>];\n if (isHex(userOpField) && fromHex(userOpField as Hex, \"bigint\") > 0n) {\n return userOpField;\n }\n return undefined;\n};\n\n/**\n * Utility function to generate a signed Permit for erc20 transaction\n *\n * @param {UserOperationRequest<TEntryPointVersion>} userOp - The user operation request\n * @param {MiddlewareClient} client - The Alchemy smart account client\n * @param {TAccount} account - The smart account instance\n * @param {string | string[]} policyId - The policy ID or array of policy IDs\n * @param {PolicyToken} policyToken - The policy token configuration\n * @param {Address} policyToken.address - ERC20 contract addressya\n * @param {bigint} [policyToken.maxTokenAmount] - Optional ERC20 token limit\n * @param {\"NONE\" | \"PERMIT\"} [policyToken.approvalMode] - ERC20 approve mode\n * @param {string} [policyToken.erc20Name] - EIP2612 specified ERC20 contract name\n * @param {string} [policyToken.version] - EIP2612 specified ERC20 contract version\n * @returns {Promise<Hex>} Returns a Promise containing the signed EIP2612 permit\n */\nconst generateSignedPermit = async <\n TAccount extends SmartContractAccount,\n TEntryPointVersion extends EntryPointVersion = EntryPointVersion\n>(\n userOp: UserOperationRequest<TEntryPointVersion>,\n client: MiddlewareClient,\n account: TAccount,\n policyId: string | string[],\n policyToken: {\n address: Address;\n maxTokenAmount?: bigint;\n approvalMode?: \"NONE\" | \"PERMIT\";\n erc20Name?: string;\n version?: string;\n }\n): Promise<Hex> => {\n if (!client.chain) {\n throw new ChainNotFoundError();\n }\n if (!policyToken.erc20Name || !policyToken.version) {\n throw new Error(\"erc20Name or version is missing\");\n }\n\n let maxAmountToken = maxUint256;\n\n if (policyToken.maxTokenAmount) {\n let { data } = await client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(EIP712NoncesAbi),\n functionName: \"decimals\",\n args: [],\n }),\n });\n const decimals = 10n ** (data ? BigInt(data) : 18n);\n maxAmountToken = policyToken.maxTokenAmount * decimals;\n }\n const paymasterData = await (client as Erc7677Client).request({\n method: \"pm_getPaymasterStubData\",\n params: [\n userOp,\n account.getEntryPoint().address,\n toHex(client.chain.id),\n {\n policyId: Array.isArray(policyId) ? policyId[0] : policyId,\n },\n ],\n });\n\n const paymasterAddress = paymasterData.paymaster\n ? paymasterData.paymaster\n : paymasterData.paymasterAndData\n ? sliceHex(paymasterData.paymasterAndData, 0, 20)\n : undefined;\n\n if (paymasterAddress === undefined || paymasterAddress === \"0x\") {\n throw new Error(\"no paymaster contract address available\");\n }\n const deadline = maxUint256;\n const { data } = await client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(EIP712NoncesAbi),\n functionName: \"nonces\",\n args: [account.address],\n }),\n });\n if (!data) {\n throw new Error(\"No nonces returned from erc20 contract call\");\n }\n\n const typedPermitData = {\n types: PermitTypes,\n primaryType: \"Permit\" as const,\n domain: {\n name: policyToken.erc20Name ?? \"\",\n version: policyToken.version ?? \"\",\n chainId: BigInt(client.chain.id),\n verifyingContract: policyToken.address,\n } satisfies PermitDomain,\n message: {\n owner: account.address,\n spender: paymasterAddress,\n value: maxAmountToken,\n nonce: BigInt(data),\n deadline,\n } satisfies PermitMessage,\n } as const;\n\n const signedPermit = await account.signTypedData(typedPermitData);\n return encodeAbiParameters(\n [{ type: \"uint256\" }, { type: \"uint256\" }, { type: \"bytes\" }],\n [maxAmountToken, deadline, signedPermit]\n );\n};\n"]}
@@ -4,6 +4,6 @@ import z from "zod";
4
4
  export const AlchemyChainSchema = z.custom((chain) => {
5
5
  const chain_ = ChainSchema.parse(chain);
6
6
  return chain_.rpcUrls.alchemy != null;
7
- }, "chain must include an alchemy rpc url. See `createAlchemyChain` or import a chain from `@account-kit/infra`.");
7
+ }, "chain must include an alchemy rpc url. See `defineAlchemyChain` or import a chain from `@account-kit/infra`.");
8
8
  export const AlchemySdkClientSchema = z.instanceof(Alchemy);
9
9
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAQ,CAAC,KAAK,EAAE,EAAE;IAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAExC,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;AACxC,CAAC,EAAE,8GAA8G,CAAC,CAAC;AAEnH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC","sourcesContent":["import { ChainSchema } from \"@aa-sdk/core\";\nimport { Alchemy } from \"alchemy-sdk\";\nimport type { Chain } from \"viem\";\nimport z from \"zod\";\n\nexport const AlchemyChainSchema = z.custom<Chain>((chain) => {\n const chain_ = ChainSchema.parse(chain);\n\n return chain_.rpcUrls.alchemy != null;\n}, \"chain must include an alchemy rpc url. See `createAlchemyChain` or import a chain from `@account-kit/infra`.\");\n\nexport const AlchemySdkClientSchema = z.instanceof(Alchemy);\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAQ,CAAC,KAAK,EAAE,EAAE;IAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAExC,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;AACxC,CAAC,EAAE,8GAA8G,CAAC,CAAC;AAEnH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC","sourcesContent":["import { ChainSchema } from \"@aa-sdk/core\";\nimport { Alchemy } from \"alchemy-sdk\";\nimport type { Chain } from \"viem\";\nimport z from \"zod\";\n\nexport const AlchemyChainSchema = z.custom<Chain>((chain) => {\n const chain_ = ChainSchema.parse(chain);\n\n return chain_.rpcUrls.alchemy != null;\n}, \"chain must include an alchemy rpc url. See `defineAlchemyChain` or import a chain from `@account-kit/infra`.\");\n\nexport const AlchemySdkClientSchema = z.instanceof(Alchemy);\n"]}
@@ -1 +1 @@
1
- export declare const VERSION = "4.31.1";
1
+ export declare const VERSION = "4.32.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.31.1";
3
+ export const VERSION = "4.32.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.31.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.32.0\";\n"]}
@@ -4,11 +4,12 @@ import type { AlchemyRpcSchema } from "./client/types.js";
4
4
  type Never<T> = T extends object ? {
5
5
  [K in keyof T]?: never;
6
6
  } : never;
7
+ type AlchemyConnectionConfig = ConnectionConfig;
7
8
  type SplitTransportConfig = {
8
- alchemyConnection: ConnectionConfig;
9
+ alchemyConnection: AlchemyConnectionConfig;
9
10
  nodeRpcUrl: string;
10
11
  };
11
- export type AlchemyTransportConfig = ((ConnectionConfig & Never<SplitTransportConfig>) | (SplitTransportConfig & Never<ConnectionConfig>)) & {
12
+ export type AlchemyTransportConfig = ((AlchemyConnectionConfig & Never<SplitTransportConfig>) | (SplitTransportConfig & Never<AlchemyConnectionConfig>)) & {
12
13
  /** The max number of times to retry. */
13
14
  retryCount?: TransportConfig["retryCount"] | undefined;
14
15
  /** The base delay (in ms) between retries. */
@@ -1 +1 @@
1
- {"version":3,"file":"alchemyTransport.d.ts","sourceRoot":"","sources":["../../src/alchemyTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,eAAe,EACrB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC5B;KACG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK;CACvB,GACD,KAAK,CAAC;AAEV,KAAK,oBAAoB,GAAG;IAC1B,iBAAiB,EAAE,gBAAgB,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAwBF,MAAM,MAAM,sBAAsB,GAAG,CACjC,CAAC,gBAAgB,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAChD,CAAC,oBAAoB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CACnD,GAAG;IACF,wCAAwC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACvD,8CAA8C;IAC9C,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACvD,YAAY,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC;CACjE,CAAC;AAEF,KAAK,oBAAoB,GAAG,SAAS,CACnC,SAAS,EACT;IACE,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;CACvD,EACD,gBAAgB,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAC5D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG;IACpD,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,mBAAmB,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;CAC7D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,GACX,SAAS,IAAI,gBAAgB,CAE/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,sBAAsB,GAAG,gBAAgB,CAoGxE;AAED,eAAO,MAAM,sBAAsB,aACvB,WAAW,KACpB,OAAO,MAAM,EAAE,MAAM,CAqBvB,CAAC"}
1
+ {"version":3,"file":"alchemyTransport.d.ts","sourceRoot":"","sources":["../../src/alchemyTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,eAAe,EACrB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC5B;KACG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK;CACvB,GACD,KAAK,CAAC;AAEV,KAAK,uBAAuB,GAAG,gBAAgB,CAAC;AAEhD,KAAK,oBAAoB,GAAG;IAC1B,iBAAiB,EAAE,uBAAuB,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAwBF,MAAM,MAAM,sBAAsB,GAAG,CACjC,CAAC,uBAAuB,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC,GACvD,CAAC,oBAAoB,GAAG,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAC1D,GAAG;IACF,wCAAwC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACvD,8CAA8C;IAC9C,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACvD,YAAY,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC;CACjE,CAAC;AAEF,KAAK,oBAAoB,GAAG,SAAS,CACnC,SAAS,EACT;IACE,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;CACvD,EACD,gBAAgB,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAC5D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG;IACpD,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,mBAAmB,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;CAC7D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,GACX,SAAS,IAAI,gBAAgB,CAE/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,sBAAsB,GAAG,gBAAgB,CAoGxE;AAED,eAAO,MAAM,sBAAsB,aACvB,WAAW,KACpB,OAAO,MAAM,EAAE,MAAM,CAqBvB,CAAC"}
@@ -50,7 +50,7 @@ export declare const PermitTypes: {
50
50
  readonly type: "uint256";
51
51
  }];
52
52
  };
53
- export declare const EIP712NoncesAbi: readonly ["function nonces(address owner) external view returns (uint)"];
53
+ export declare const EIP712NoncesAbi: readonly ["function nonces(address owner) external view returns (uint)", "function decimals() public view returns (uint8)"];
54
54
  export type PermitMessage = {
55
55
  owner: Hex;
56
56
  spender: Hex;
@@ -1 +1 @@
1
- {"version":3,"file":"gas-manager.d.ts","sourceRoot":"","sources":["../../src/gas-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAmBhD,eAAO,MAAM,yBAAyB,+CACQ,CAAC;AAC/C,eAAO,MAAM,yBAAyB,+CACQ,CAAC;AAC/C,eAAO,MAAM,0BAA0B,+CACO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,+CACQ,CAAC;AAE/C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,0BAA0B,UAAW,KAAK,KAAG,OAwBzD,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAcd,CAAC;AAEX,eAAO,MAAM,eAAe,0EAElB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,GAAG,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,GAAG,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"gas-manager.d.ts","sourceRoot":"","sources":["../../src/gas-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAmBhD,eAAO,MAAM,yBAAyB,+CACQ,CAAC;AAC/C,eAAO,MAAM,yBAAyB,+CACQ,CAAC;AAC/C,eAAO,MAAM,0BAA0B,+CACO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,+CACQ,CAAC;AAE/C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,0BAA0B,UAAW,KAAK,KAAG,OAwBzD,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAcd,CAAC;AAEX,eAAO,MAAM,eAAe,6HAGlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,GAAG,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,GAAG,CAAC;CACxB,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "4.31.1";
1
+ export declare const VERSION = "4.32.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@account-kit/infra",
3
- "version": "4.31.1",
3
+ "version": "4.32.0",
4
4
  "description": "adapters for @aa-sdk/core for interacting with alchemy services",
5
5
  "author": "Alchemy",
6
6
  "license": "MIT",
@@ -34,7 +34,6 @@
34
34
  "build": "yarn clean && yarn build:esm && yarn build:types",
35
35
  "build:esm": "tsc --project tsconfig.build.json --outDir ./dist/esm",
36
36
  "build:types": "tsc --project tsconfig.build.json --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap",
37
- "docs:gen": "node ../../doc-gen/dist/esm/cli.js generate --in ./src/index.ts --out ../../site/pages/reference/account-kit/infra",
38
37
  "fern:gen": "node ../../doc-gen/dist/esm/cli.js generate --in ./src/index.ts --out ../../docs/pages/reference/account-kit/infra --fern",
39
38
  "clean": "rm -rf ./dist",
40
39
  "test": "vitest",
@@ -46,8 +45,8 @@
46
45
  "vitest": "^2.0.4"
47
46
  },
48
47
  "dependencies": {
49
- "@aa-sdk/core": "^4.31.1",
50
- "@account-kit/logging": "^4.31.1",
48
+ "@aa-sdk/core": "^4.32.0",
49
+ "@account-kit/logging": "^4.32.0",
51
50
  "eventemitter3": "^5.0.1",
52
51
  "zod": "^3.22.4"
53
52
  },
@@ -66,7 +65,7 @@
66
65
  "url": "https://github.com/alchemyplatform/aa-sdk/issues"
67
66
  },
68
67
  "homepage": "https://github.com/alchemyplatform/aa-sdk#readme",
69
- "gitHead": "0b89a300a2ab7170e99769599000e2e22bcb2b7c",
68
+ "gitHead": "efe1ba2e525ac0fc6ed0007b3d28dc9c8e063d78",
70
69
  "optionalDependencies": {
71
70
  "alchemy-sdk": "^3.0.0"
72
71
  }
@@ -26,8 +26,10 @@ type Never<T> = T extends object
26
26
  }
27
27
  : never;
28
28
 
29
+ type AlchemyConnectionConfig = ConnectionConfig;
30
+
29
31
  type SplitTransportConfig = {
30
- alchemyConnection: ConnectionConfig;
32
+ alchemyConnection: AlchemyConnectionConfig;
31
33
  nodeRpcUrl: string;
32
34
  };
33
35
 
@@ -54,8 +56,8 @@ const chainAgnosticMethods = [
54
56
  ];
55
57
 
56
58
  export type AlchemyTransportConfig = (
57
- | (ConnectionConfig & Never<SplitTransportConfig>)
58
- | (SplitTransportConfig & Never<ConnectionConfig>)
59
+ | (AlchemyConnectionConfig & Never<SplitTransportConfig>)
60
+ | (SplitTransportConfig & Never<AlchemyConnectionConfig>)
59
61
  ) & {
60
62
  /** The max number of times to retry. */
61
63
  retryCount?: TransportConfig["retryCount"] | undefined;
@@ -179,7 +181,7 @@ export function alchemy(config: AlchemyTransportConfig): AlchemyTransport {
179
181
  const chainAgnosticRpcUrl =
180
182
  connectionConfig.rpcUrl == null
181
183
  ? "https://api.g.alchemy.com/v2/"
182
- : connectionConfig.rpcUrl;
184
+ : connectionConfig.chainAgnosticUrl ?? connectionConfig.rpcUrl;
183
185
 
184
186
  const innerTransport = (() => {
185
187
  mutateRemoveTrackingHeaders(config?.fetchOptions?.headers);
@@ -85,6 +85,7 @@ export const PermitTypes = {
85
85
 
86
86
  export const EIP712NoncesAbi = [
87
87
  "function nonces(address owner) external view returns (uint)",
88
+ "function decimals() public view returns (uint8)",
88
89
  ] as const;
89
90
 
90
91
  export type PermitMessage = {
@@ -405,8 +405,21 @@ const generateSignedPermit = async <
405
405
  if (!policyToken.erc20Name || !policyToken.version) {
406
406
  throw new Error("erc20Name or version is missing");
407
407
  }
408
- // get a paymaster address
409
- const maxAmountToken = policyToken.maxTokenAmount || maxUint256;
408
+
409
+ let maxAmountToken = maxUint256;
410
+
411
+ if (policyToken.maxTokenAmount) {
412
+ let { data } = await client.call({
413
+ to: policyToken.address,
414
+ data: encodeFunctionData({
415
+ abi: parseAbi(EIP712NoncesAbi),
416
+ functionName: "decimals",
417
+ args: [],
418
+ }),
419
+ });
420
+ const decimals = 10n ** (data ? BigInt(data) : 18n);
421
+ maxAmountToken = policyToken.maxTokenAmount * decimals;
422
+ }
410
423
  const paymasterData = await (client as Erc7677Client).request({
411
424
  method: "pm_getPaymasterStubData",
412
425
  params: [
package/src/schema.ts CHANGED
@@ -7,6 +7,6 @@ export const AlchemyChainSchema = z.custom<Chain>((chain) => {
7
7
  const chain_ = ChainSchema.parse(chain);
8
8
 
9
9
  return chain_.rpcUrls.alchemy != null;
10
- }, "chain must include an alchemy rpc url. See `createAlchemyChain` or import a chain from `@account-kit/infra`.");
10
+ }, "chain must include an alchemy rpc url. See `defineAlchemyChain` or import a chain from `@account-kit/infra`.");
11
11
 
12
12
  export const AlchemySdkClientSchema = z.instanceof(Alchemy);
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.31.1";
3
+ export const VERSION = "4.32.0";