@account-kit/infra 4.46.1 → 4.48.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.
- package/dist/esm/client/smartAccountClient.d.ts +3 -8
- package/dist/esm/client/smartAccountClient.js.map +1 -1
- package/dist/esm/errors/invalidSignedPermit.d.ts +5 -0
- package/dist/esm/errors/invalidSignedPermit.js +15 -0
- package/dist/esm/errors/invalidSignedPermit.js.map +1 -0
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/middleware/gasManager.d.ts +11 -8
- package/dist/esm/middleware/gasManager.js +65 -30
- package/dist/esm/middleware/gasManager.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/types/client/smartAccountClient.d.ts +3 -8
- package/dist/types/client/smartAccountClient.d.ts.map +1 -1
- package/dist/types/errors/invalidSignedPermit.d.ts +6 -0
- package/dist/types/errors/invalidSignedPermit.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/middleware/gasManager.d.ts +11 -8
- package/dist/types/middleware/gasManager.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +4 -4
- package/src/client/smartAccountClient.ts +3 -8
- package/src/errors/invalidSignedPermit.ts +11 -0
- package/src/index.ts +1 -0
- package/src/middleware/gasManager.ts +109 -57
- package/src/version.ts +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type Prettify, type SmartAccountClient, type SmartAccountClientActions, type SmartAccountClientConfig, type SmartAccountClientRpcSchema, type SmartContractAccount, type SmartContractAccountWithSigner, type UserOperationContext } from "@aa-sdk/core";
|
|
2
|
-
import { type
|
|
2
|
+
import { type Chain } from "viem";
|
|
3
3
|
import { type AlchemyTransport } from "../alchemyTransport.js";
|
|
4
4
|
import { type AlchemySmartAccountClientActions } from "./decorators/smartAccount.js";
|
|
5
5
|
import type { AlchemyRpcSchema } from "./types.js";
|
|
6
|
+
import type { PolicyToken } from "../middleware/gasManager.js";
|
|
6
7
|
export declare function getSignerTypeHeader<TAccount extends SmartContractAccountWithSigner>(account: TAccount): {
|
|
7
8
|
"Alchemy-Aa-Sdk-Signer": string;
|
|
8
9
|
};
|
|
@@ -10,13 +11,7 @@ export type AlchemySmartAccountClientConfig<chain extends Chain | undefined = Ch
|
|
|
10
11
|
account?: account;
|
|
11
12
|
useSimulation?: boolean;
|
|
12
13
|
policyId?: string | string[];
|
|
13
|
-
policyToken?:
|
|
14
|
-
address: Address;
|
|
15
|
-
maxTokenAmount: bigint;
|
|
16
|
-
approvalMode?: "NONE" | "PERMIT";
|
|
17
|
-
erc20Name?: string;
|
|
18
|
-
version?: string;
|
|
19
|
-
};
|
|
14
|
+
policyToken?: PolicyToken;
|
|
20
15
|
} & Pick<SmartAccountClientConfig<AlchemyTransport, chain, account, context>, "customMiddleware" | "feeEstimator" | "gasEstimator" | "signUserOperation" | "transport" | "chain" | "opts">;
|
|
21
16
|
export type BaseAlchemyActions<chain extends Chain | undefined = Chain | undefined, account extends SmartContractAccount | undefined = SmartContractAccount | undefined, context extends UserOperationContext | undefined = UserOperationContext | undefined> = SmartAccountClientActions<chain, account, context> & AlchemySmartAccountClientActions<account, context>;
|
|
22
17
|
export type AlchemySmartAccountClient_Base<chain extends Chain | undefined = Chain | undefined, account extends SmartContractAccount | undefined = SmartContractAccount | undefined, actions extends Record<string, unknown> = Record<string, unknown>, context extends UserOperationContext | undefined = UserOperationContext | undefined> = Prettify<SmartAccountClient<AlchemyTransport, chain, account, actions & BaseAlchemyActions<chain, account, context>, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smartAccountClient.js","sourceRoot":"","sources":["../../../src/client/smartAccountClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,GASzB,MAAM,cAAc,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"smartAccountClient.js","sourceRoot":"","sources":["../../../src/client/smartAccountClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChainNotFoundError,\n clientHeaderTrack,\n createSmartAccountClient,\n isSmartAccountWithSigner,\n type Prettify,\n type SmartAccountClient,\n type SmartAccountClientActions,\n type SmartAccountClientConfig,\n type SmartAccountClientRpcSchema,\n type SmartContractAccount,\n type SmartContractAccountWithSigner,\n type UserOperationContext,\n} from \"@aa-sdk/core\";\nimport { type Chain } from \"viem\";\nimport {\n alchemy,\n convertHeadersToObject,\n type AlchemyTransport,\n} from \"../alchemyTransport.js\";\nimport { getDefaultUserOperationFeeOptions } from \"../defaults.js\";\nimport { alchemyFeeEstimator } from \"../middleware/feeEstimator.js\";\nimport { alchemyGasAndPaymasterAndDataMiddleware } from \"../middleware/gasManager.js\";\nimport { alchemyUserOperationSimulator } from \"../middleware/userOperationSimulator.js\";\nimport {\n alchemyActions,\n type AlchemySmartAccountClientActions,\n} from \"./decorators/smartAccount.js\";\nimport type { AlchemyRpcSchema } from \"./types.js\";\nimport { headersUpdate } from \"../alchemyTrackerHeaders.js\";\nimport type { PolicyToken } from \"../middleware/gasManager.js\";\n\nexport function getSignerTypeHeader<\n TAccount extends SmartContractAccountWithSigner,\n>(account: TAccount) {\n return { \"Alchemy-Aa-Sdk-Signer\": account.getSigner().signerType };\n}\n\n// #region AlchemySmartAccountClientConfig\nexport type AlchemySmartAccountClientConfig<\n chain extends Chain | undefined = Chain | undefined,\n account extends SmartContractAccount | undefined =\n | SmartContractAccount\n | undefined,\n context extends UserOperationContext | undefined =\n | UserOperationContext\n | undefined,\n> = {\n account?: account;\n useSimulation?: boolean;\n policyId?: string | string[];\n policyToken?: PolicyToken;\n} & Pick<\n SmartAccountClientConfig<AlchemyTransport, chain, account, context>,\n | \"customMiddleware\"\n | \"feeEstimator\"\n | \"gasEstimator\"\n | \"signUserOperation\"\n | \"transport\"\n | \"chain\"\n | \"opts\"\n>;\n// #endregion AlchemySmartAccountClientConfig\n\nexport type BaseAlchemyActions<\n chain extends Chain | undefined = Chain | undefined,\n account extends SmartContractAccount | undefined =\n | SmartContractAccount\n | undefined,\n context extends UserOperationContext | undefined =\n | UserOperationContext\n | undefined,\n> = SmartAccountClientActions<chain, account, context> &\n AlchemySmartAccountClientActions<account, context>;\n\nexport type AlchemySmartAccountClient_Base<\n chain extends Chain | undefined = Chain | undefined,\n account extends SmartContractAccount | undefined =\n | SmartContractAccount\n | undefined,\n actions extends Record<string, unknown> = Record<string, unknown>,\n context extends UserOperationContext | undefined =\n | UserOperationContext\n | undefined,\n> = Prettify<\n SmartAccountClient<\n AlchemyTransport,\n chain,\n account,\n actions & BaseAlchemyActions<chain, account, context>,\n [...SmartAccountClientRpcSchema, ...AlchemyRpcSchema],\n context\n >\n>;\n\nexport type AlchemySmartAccountClient<\n chain extends Chain | undefined = Chain | undefined,\n account extends SmartContractAccount | undefined =\n | SmartContractAccount\n | undefined,\n actions extends Record<string, unknown> = Record<string, unknown>,\n context extends UserOperationContext | undefined =\n | UserOperationContext\n | undefined,\n> = Prettify<AlchemySmartAccountClient_Base<chain, account, actions, context>>;\n\nexport function createAlchemySmartAccountClient<\n TChain extends Chain = Chain,\n TAccount extends SmartContractAccount | undefined =\n | SmartContractAccount\n | undefined,\n TContext extends UserOperationContext | undefined =\n | UserOperationContext\n | undefined,\n>(\n params: AlchemySmartAccountClientConfig<TChain, TAccount, TContext>,\n): AlchemySmartAccountClient<TChain, TAccount, Record<string, never>, TContext>;\n\n/**\n * Creates an Alchemy smart account client using the provided configuration options, including account details, gas manager configuration, and custom middleware.\n *\n * @example\n * ```ts\n * import { createAlchemySmartAccountClient, alchemy } from \"@account-kit/infra\";\n * import { sepolia } from \"@account-kit/infra/chain\";\n *\n * const client = createAlchemySmartAccountClient({\n * chain: sepolia,\n * transport: alchemy({ apiKey: \"your-api-key\" }),\n * });\n * ```\n *\n * @param {AlchemySmartAccountClientConfig} config The configuration for creating the Alchemy smart account client\n * @returns {AlchemySmartAccountClient} An instance of `AlchemySmartAccountClient` configured based on the provided options\n */\nexport function createAlchemySmartAccountClient(\n config: AlchemySmartAccountClientConfig,\n): AlchemySmartAccountClient {\n if (!config.chain) {\n throw new ChainNotFoundError();\n }\n\n const feeOptions =\n config.opts?.feeOptions ?? getDefaultUserOperationFeeOptions(config.chain);\n\n const scaClient = createSmartAccountClient({\n account: config.account,\n transport: config.transport,\n chain: config.chain,\n type: \"AlchemySmartAccountClient\",\n opts: {\n ...config.opts,\n feeOptions,\n },\n feeEstimator: config.feeEstimator ?? alchemyFeeEstimator(config.transport),\n gasEstimator: config.gasEstimator,\n customMiddleware: async (struct, args) => {\n if (isSmartAccountWithSigner(args.account)) {\n config.transport.updateHeaders(getSignerTypeHeader(args.account));\n }\n return config.customMiddleware\n ? config.customMiddleware(struct, args)\n : struct;\n },\n ...(config.policyId\n ? alchemyGasAndPaymasterAndDataMiddleware({\n policyId: config.policyId,\n policyToken: config.policyToken,\n transport: config.transport,\n gasEstimatorOverride: config.gasEstimator,\n feeEstimatorOverride: config.feeEstimator,\n })\n : {}),\n userOperationSimulator: config.useSimulation\n ? alchemyUserOperationSimulator(config.transport)\n : undefined,\n signUserOperation: config.signUserOperation,\n addBreadCrumb(breadcrumb: string) {\n const oldConfig = config.transport.config;\n const dynamicFetchOptions = config.transport.dynamicFetchOptions;\n const newTransport = alchemy({ ...oldConfig });\n newTransport.updateHeaders(\n headersUpdate(breadcrumb)(\n convertHeadersToObject(dynamicFetchOptions?.headers),\n ),\n );\n return createAlchemySmartAccountClient({\n ...config,\n transport: newTransport,\n }) as any;\n },\n })\n .extend(alchemyActions)\n .extend((client_) => ({\n addBreadcrumb(breadcrumb: string) {\n return clientHeaderTrack(client_, breadcrumb);\n },\n }));\n\n if (config.account && isSmartAccountWithSigner(config.account)) {\n config.transport.updateHeaders(getSignerTypeHeader(config.account));\n }\n\n return scaClient;\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseError } from "./base.js";
|
|
2
|
+
export class InvalidSignedPermit extends BaseError {
|
|
3
|
+
constructor(reason) {
|
|
4
|
+
super(["Invalid signed permit"].join("\n"), {
|
|
5
|
+
details: [reason, "Please provide a valid signed permit"].join("\n"),
|
|
6
|
+
});
|
|
7
|
+
Object.defineProperty(this, "name", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
configurable: true,
|
|
10
|
+
writable: true,
|
|
11
|
+
value: "InvalidSignedPermit"
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=invalidSignedPermit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidSignedPermit.js","sourceRoot":"","sources":["../../../src/errors/invalidSignedPermit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IAGhD,YAAY,MAAc;QACxB,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1C,OAAO,EAAE,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACrE,CAAC,CAAC;QALI;;;;mBAAO,qBAAqB;WAAC;IAMtC,CAAC;CACF","sourcesContent":["import { BaseError } from \"./base.js\";\n\nexport class InvalidSignedPermit extends BaseError {\n override name = \"InvalidSignedPermit\";\n\n constructor(reason: string) {\n super([\"Invalid signed permit\"].join(\"\\n\"), {\n details: [reason, \"Please provide a valid signed permit\"].join(\"\\n\"),\n });\n }\n}\n"]}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -20,6 +20,6 @@ export { getAlchemyPaymasterAddress } from "./gas-manager.js";
|
|
|
20
20
|
export { alchemyFeeEstimator } from "./middleware/feeEstimator.js";
|
|
21
21
|
export type * from "./middleware/gasManager.js";
|
|
22
22
|
export * from "./alchemyTrackerHeaders.js";
|
|
23
|
-
export { alchemyGasManagerMiddleware, alchemyGasAndPaymasterAndDataMiddleware, } from "./middleware/gasManager.js";
|
|
23
|
+
export { alchemyGasManagerMiddleware, alchemyGasAndPaymasterAndDataMiddleware, type PolicyToken, } from "./middleware/gasManager.js";
|
|
24
24
|
export { alchemyUserOperationSimulator } from "./middleware/userOperationSimulator.js";
|
|
25
25
|
export type * from "./schema.js";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAGzF,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EACL,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,EACf,IAAI,EACJ,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,MAAM,EACN,OAAO,EACP,QAAQ,EACR,cAAc,EACd,eAAe,EACf,OAAO,EACP,WAAW,EACX,aAAa,EACb,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,IAAI,EACJ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,EACV,MAAM,EACN,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAEjF,OAAO,EAAE,iCAAiC,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,2BAA2B,EAC3B,uCAAuC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAGzF,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EACL,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,EACf,IAAI,EACJ,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,MAAM,EACN,OAAO,EACP,QAAQ,EACR,cAAc,EACd,eAAe,EACf,OAAO,EACP,WAAW,EACX,aAAa,EACb,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,IAAI,EACJ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,EACV,MAAM,EACN,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAEjF,OAAO,EAAE,iCAAiC,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,2BAA2B,EAC3B,uCAAuC,GAExC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC","sourcesContent":["export type * from \"./actions/simulateUserOperationChanges.js\";\nexport { simulateUserOperationChanges } from \"./actions/simulateUserOperationChanges.js\";\nexport type * from \"./actions/types.js\";\nexport type * from \"./alchemyTransport.js\";\nexport { alchemy, isAlchemyTransport } from \"./alchemyTransport.js\";\nexport type * from \"./chains.js\";\nexport {\n arbitrum,\n arbitrumGoerli,\n arbitrumNova,\n arbitrumSepolia,\n base,\n baseGoerli,\n baseSepolia,\n defineAlchemyChain,\n fraxtal,\n fraxtalSepolia,\n goerli,\n mainnet,\n optimism,\n optimismGoerli,\n optimismSepolia,\n polygon,\n polygonAmoy,\n polygonMumbai,\n sepolia,\n shape,\n shapeSepolia,\n worldChain,\n worldChainSepolia,\n zora,\n zoraSepolia,\n beraChainBartio,\n opbnbMainnet,\n opbnbTestnet,\n soneiumMinato,\n soneiumMainnet,\n unichainMainnet,\n unichainSepolia,\n inkMainnet,\n inkSepolia,\n mekong,\n monadTestnet,\n openlootSepolia,\n gensynTestnet,\n riseTestnet,\n storyMainnet,\n storyAeneid,\n celoAlfajores,\n celoMainnet,\n teaSepolia,\n} from \"./chains.js\";\nexport type * from \"./client/decorators/alchemyEnhancedApis.js\";\nexport { alchemyEnhancedApiActions } from \"./client/decorators/alchemyEnhancedApis.js\";\nexport type * from \"./client/decorators/smartAccount.js\";\nexport { alchemyActions } from \"./client/decorators/smartAccount.js\";\nexport { isAlchemySmartAccountClient } from \"./client/isAlchemySmartAccountClient.js\";\nexport type * from \"./client/rpcClient.js\";\nexport { createAlchemyPublicRpcClient } from \"./client/rpcClient.js\";\nexport type * from \"./client/smartAccountClient.js\";\nexport { createAlchemySmartAccountClient } from \"./client/smartAccountClient.js\";\nexport type * from \"./client/types.js\";\nexport { getDefaultUserOperationFeeOptions } from \"./defaults.js\";\nexport { getAlchemyPaymasterAddress } from \"./gas-manager.js\";\nexport { alchemyFeeEstimator } from \"./middleware/feeEstimator.js\";\nexport type * from \"./middleware/gasManager.js\";\nexport * from \"./alchemyTrackerHeaders.js\";\nexport {\n alchemyGasManagerMiddleware,\n alchemyGasAndPaymasterAndDataMiddleware,\n type PolicyToken,\n} from \"./middleware/gasManager.js\";\nexport { alchemyUserOperationSimulator } from \"./middleware/userOperationSimulator.js\";\nexport type * from \"./schema.js\";\n"]}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import type { Address, ClientMiddlewareConfig, ClientMiddlewareFn } from "@aa-sdk/core";
|
|
2
2
|
import type { AlchemyTransport } from "../alchemyTransport.js";
|
|
3
|
+
export type PolicyToken = {
|
|
4
|
+
address: Address;
|
|
5
|
+
maxTokenAmount: bigint;
|
|
6
|
+
permit?: {
|
|
7
|
+
paymasterAddress?: Address;
|
|
8
|
+
autoPermitApproveTo: bigint;
|
|
9
|
+
autoPermitBelow: bigint;
|
|
10
|
+
erc20Name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
3
14
|
/**
|
|
4
15
|
* Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring
|
|
5
16
|
* transactions. Adheres to the ERC-7677 standardized communication protocol.
|
|
@@ -28,14 +39,6 @@ interface AlchemyGasAndPaymasterAndDataMiddlewareParams {
|
|
|
28
39
|
gasEstimatorOverride?: ClientMiddlewareFn;
|
|
29
40
|
feeEstimatorOverride?: ClientMiddlewareFn;
|
|
30
41
|
}
|
|
31
|
-
export type PolicyToken = {
|
|
32
|
-
address: Address;
|
|
33
|
-
maxTokenAmount: bigint;
|
|
34
|
-
paymasterAddress?: Address;
|
|
35
|
-
approvalMode?: "NONE" | "PERMIT";
|
|
36
|
-
erc20Name?: string;
|
|
37
|
-
version?: string;
|
|
38
|
-
};
|
|
39
42
|
/**
|
|
40
43
|
* Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring
|
|
41
44
|
* transactions. Uses Alchemy's custom `alchemy_requestGasAndPaymasterAndData`
|
|
@@ -2,6 +2,7 @@ import { bypassPaymasterAndData, ChainNotFoundError, clientHeaderTrack, deepHexl
|
|
|
2
2
|
import { fromHex, isHex, encodeAbiParameters, encodeFunctionData, parseAbi, } from "viem";
|
|
3
3
|
import { alchemyFeeEstimator } from "./feeEstimator.js";
|
|
4
4
|
import { PermitTypes, EIP7597Abis, ERC20Abis, getAlchemyPaymasterAddress, } from "../gas-manager.js";
|
|
5
|
+
import { InvalidSignedPermit } from "../errors/invalidSignedPermit.js";
|
|
5
6
|
/**
|
|
6
7
|
* Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring
|
|
7
8
|
* transactions. Adheres to the ERC-7677 standardized communication protocol.
|
|
@@ -34,8 +35,14 @@ export function alchemyGasManagerMiddleware(policyId, policyToken) {
|
|
|
34
35
|
tokenAddress: policyToken.address,
|
|
35
36
|
maxTokenAmount: policyToken.maxTokenAmount,
|
|
36
37
|
};
|
|
37
|
-
if (policyToken.
|
|
38
|
-
|
|
38
|
+
if (policyToken.permit !== undefined) {
|
|
39
|
+
const permit = await generateSignedPermit(client, account, policyToken);
|
|
40
|
+
if (permit !== undefined) {
|
|
41
|
+
context.erc20Context.permit = permit;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (args.context !== undefined) {
|
|
45
|
+
context.erc20Context.permit = extractSignedPermitFromContext(args.context);
|
|
39
46
|
}
|
|
40
47
|
}
|
|
41
48
|
return context;
|
|
@@ -111,7 +118,7 @@ export function alchemyGasAndPaymasterAndDataMiddleware(params) {
|
|
|
111
118
|
? defaultGasEstimator(args.client)(uo, args)
|
|
112
119
|
: noopMiddleware(uo, args);
|
|
113
120
|
},
|
|
114
|
-
paymasterAndData: async (uo, { account, client: client_, feeOptions, overrides: overrides_ }) => {
|
|
121
|
+
paymasterAndData: async (uo, { account, client: client_, feeOptions, overrides: overrides_, context: uoContext, }) => {
|
|
115
122
|
const client = clientHeaderTrack(client_, "alchemyFeeEstimator");
|
|
116
123
|
if (!client.chain) {
|
|
117
124
|
throw new ChainNotFoundError();
|
|
@@ -136,8 +143,14 @@ export function alchemyGasAndPaymasterAndDataMiddleware(params) {
|
|
|
136
143
|
tokenAddress: policyToken.address,
|
|
137
144
|
maxTokenAmount: policyToken.maxTokenAmount,
|
|
138
145
|
};
|
|
139
|
-
if (policyToken.
|
|
140
|
-
|
|
146
|
+
if (policyToken.permit !== undefined) {
|
|
147
|
+
const permit = await generateSignedPermit(client, account, policyToken);
|
|
148
|
+
if (permit !== undefined) {
|
|
149
|
+
erc20Context.permit = permit;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else if (uoContext !== undefined) {
|
|
153
|
+
erc20Context.permit = extractSignedPermitFromContext(uoContext);
|
|
141
154
|
}
|
|
142
155
|
}
|
|
143
156
|
const result = await client.request({
|
|
@@ -206,27 +219,29 @@ const overrideField = (field, overrides, feeOptions, userOperation) => {
|
|
|
206
219
|
* @param {MiddlewareClient} client - The Alchemy smart account client
|
|
207
220
|
* @param {TAccount} account - The smart account instance
|
|
208
221
|
* @param {PolicyToken} policyToken - The policy token configuration
|
|
209
|
-
* @param {Address} policyToken.address - ERC20 contract addressya
|
|
210
|
-
* @param {bigint} [policyToken.maxTokenAmount] - Optional ERC20 token limit
|
|
211
|
-
* @param {Address} [policyToken.paymasterAddress] - Optional Paymaster Address
|
|
212
|
-
* @param {"NONE" | "PERMIT"} [policyToken.approvalMode] - ERC20 approve mode
|
|
213
|
-
* @param {string} [policyToken.erc20Name] - EIP2612 specified ERC20 contract name
|
|
214
|
-
* @param {string} [policyToken.version] - EIP2612 specified ERC20 contract version
|
|
215
222
|
* @returns {Promise<Hex>} Returns a Promise containing the signed EIP2612 permit
|
|
216
223
|
*/
|
|
217
224
|
const generateSignedPermit = async (client, account, policyToken) => {
|
|
218
225
|
if (!client.chain) {
|
|
219
226
|
throw new ChainNotFoundError();
|
|
220
227
|
}
|
|
221
|
-
if (!policyToken.
|
|
228
|
+
if (!policyToken.permit) {
|
|
229
|
+
throw new Error("permit is missing");
|
|
230
|
+
}
|
|
231
|
+
if (!policyToken.permit?.erc20Name || !policyToken.permit?.version) {
|
|
222
232
|
throw new Error("erc20Name or version is missing");
|
|
223
233
|
}
|
|
224
|
-
|
|
234
|
+
const paymasterAddress = policyToken.permit.paymasterAddress ??
|
|
235
|
+
getAlchemyPaymasterAddress(client.chain, account.getEntryPoint().version);
|
|
236
|
+
if (paymasterAddress === undefined || paymasterAddress === "0x") {
|
|
237
|
+
throw new Error("no paymaster contract address available");
|
|
238
|
+
}
|
|
239
|
+
let allowanceFuture = client.call({
|
|
225
240
|
to: policyToken.address,
|
|
226
241
|
data: encodeFunctionData({
|
|
227
242
|
abi: parseAbi(ERC20Abis),
|
|
228
|
-
functionName: "
|
|
229
|
-
args: [],
|
|
243
|
+
functionName: "allowance",
|
|
244
|
+
args: [account.address, paymasterAddress],
|
|
230
245
|
}),
|
|
231
246
|
});
|
|
232
247
|
let nonceFuture = client.call({
|
|
@@ -237,43 +252,63 @@ const generateSignedPermit = async (client, account, policyToken) => {
|
|
|
237
252
|
args: [account.address],
|
|
238
253
|
}),
|
|
239
254
|
});
|
|
240
|
-
const [
|
|
241
|
-
|
|
255
|
+
const [allowanceResponse, nonceResponse] = await Promise.all([
|
|
256
|
+
allowanceFuture,
|
|
242
257
|
nonceFuture,
|
|
243
258
|
]);
|
|
244
|
-
if (!
|
|
245
|
-
throw new Error("No
|
|
259
|
+
if (!allowanceResponse.data) {
|
|
260
|
+
throw new Error("No allowance returned from erc20 contract call");
|
|
246
261
|
}
|
|
247
262
|
if (!nonceResponse.data) {
|
|
248
263
|
throw new Error("No nonces returned from erc20 contract call");
|
|
249
264
|
}
|
|
250
|
-
const
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
if (paymasterAddress === undefined || paymasterAddress === "0x") {
|
|
256
|
-
throw new Error("no paymaster contract address available");
|
|
265
|
+
const permitLimit = policyToken.permit.autoPermitApproveTo;
|
|
266
|
+
const currentAllowance = BigInt(allowanceResponse.data);
|
|
267
|
+
if (currentAllowance > policyToken.permit.autoPermitBelow) {
|
|
268
|
+
// no need to generate permit
|
|
269
|
+
return undefined;
|
|
257
270
|
}
|
|
271
|
+
const nonce = BigInt(nonceResponse.data);
|
|
258
272
|
const deadline = BigInt(Math.floor(Date.now() / 1000) + 60 * 10);
|
|
259
273
|
const typedPermitData = {
|
|
260
274
|
types: PermitTypes,
|
|
261
275
|
primaryType: "Permit",
|
|
262
276
|
domain: {
|
|
263
|
-
name: policyToken.erc20Name ?? "",
|
|
264
|
-
version: policyToken.version ?? "",
|
|
277
|
+
name: policyToken.permit.erc20Name ?? "",
|
|
278
|
+
version: policyToken.permit.version ?? "",
|
|
265
279
|
chainId: BigInt(client.chain.id),
|
|
266
280
|
verifyingContract: policyToken.address,
|
|
267
281
|
},
|
|
268
282
|
message: {
|
|
269
283
|
owner: account.address,
|
|
270
284
|
spender: paymasterAddress,
|
|
271
|
-
value:
|
|
285
|
+
value: permitLimit,
|
|
272
286
|
nonce: nonce,
|
|
273
287
|
deadline,
|
|
274
288
|
},
|
|
275
289
|
};
|
|
276
290
|
const signedPermit = await account.signTypedData(typedPermitData);
|
|
277
|
-
return
|
|
291
|
+
return encodeSignedPermit(permitLimit, deadline, signedPermit);
|
|
278
292
|
};
|
|
293
|
+
function extractSignedPermitFromContext(context) {
|
|
294
|
+
if (context.signedPermit === undefined) {
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
if (typeof context.signedPermit !== "object") {
|
|
298
|
+
throw new InvalidSignedPermit("signedPermit is not an object");
|
|
299
|
+
}
|
|
300
|
+
if (typeof context.signedPermit.value !== "bigint") {
|
|
301
|
+
throw new InvalidSignedPermit("signedPermit.value is not a bigint");
|
|
302
|
+
}
|
|
303
|
+
if (typeof context.signedPermit.deadline !== "bigint") {
|
|
304
|
+
throw new InvalidSignedPermit("signedPermit.deadline is not a bigint");
|
|
305
|
+
}
|
|
306
|
+
if (!isHex(context.signedPermit.signature)) {
|
|
307
|
+
throw new InvalidSignedPermit("signedPermit.signature is not a hex string");
|
|
308
|
+
}
|
|
309
|
+
return encodeSignedPermit(context.signedPermit.value, context.signedPermit.deadline, context.signedPermit.signature);
|
|
310
|
+
}
|
|
311
|
+
function encodeSignedPermit(value, deadline, signedPermit) {
|
|
312
|
+
return encodeAbiParameters([{ type: "uint256" }, { type: "uint256" }, { type: "bytes" }], [value, deadline, signedPermit]);
|
|
313
|
+
}
|
|
279
314
|
//# sourceMappingURL=gasManager.js.map
|
|
@@ -1 +1 @@
|
|
|
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 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 type Hex,\n encodeAbiParameters,\n encodeFunctionData,\n parseAbi,\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 {\n PermitTypes,\n EIP7597Abis,\n ERC20Abis,\n getAlchemyPaymasterAddress,\n} 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 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 context.erc20Context = {\n tokenAddress: policyToken.address,\n maxTokenAmount: policyToken.maxTokenAmount,\n };\n\n if (policyToken.approvalMode === \"PERMIT\") {\n context.erc20Context.permit = await generateSignedPermit(\n client as AlchemySmartAccountClient,\n account,\n policyToken,\n );\n }\n }\n\n return context;\n };\n return {\n dummyPaymasterAndData: async (uo, args) => {\n const context = await buildContext(args);\n const baseMiddleware = erc7677Middleware({ context });\n return baseMiddleware.dummyPaymasterAndData(uo, args);\n },\n\n paymasterAndData: async (uo, args) => {\n const context = await buildContext(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 paymasterAddress?: Address;\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 maxTokenAmount: policyToken.maxTokenAmount,\n };\n if (policyToken.approvalMode === \"PERMIT\") {\n erc20Context.permit = await generateSignedPermit(\n client,\n account,\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 {MiddlewareClient} client - The Alchemy smart account client\n * @param {TAccount} account - The smart account instance\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 {Address} [policyToken.paymasterAddress] - Optional Paymaster Address\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 <TAccount extends SmartContractAccount>(\n client: MiddlewareClient,\n account: TAccount,\n policyToken: {\n address: Address;\n maxTokenAmount: bigint;\n paymasterAddress?: Address;\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 decimalsFuture = client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(ERC20Abis),\n functionName: \"decimals\",\n args: [],\n }),\n });\n\n let nonceFuture = client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(EIP7597Abis),\n functionName: \"nonces\",\n args: [account.address],\n }),\n });\n\n const [decimalsResponse, nonceResponse] = await Promise.all([\n decimalsFuture,\n nonceFuture,\n ]);\n if (!decimalsResponse.data) {\n throw new Error(\"No decimals returned from erc20 contract call\");\n }\n if (!nonceResponse.data) {\n throw new Error(\"No nonces returned from erc20 contract call\");\n }\n\n const decimals =\n 10n ** (decimalsResponse.data ? BigInt(decimalsResponse.data) : 18n);\n const maxAmountToken = policyToken.maxTokenAmount * decimals;\n const nonce = BigInt(nonceResponse.data);\n\n const paymasterAddress =\n policyToken.paymasterAddress ??\n getAlchemyPaymasterAddress(client.chain, account.getEntryPoint().version);\n\n if (paymasterAddress === undefined || paymasterAddress === \"0x\") {\n throw new Error(\"no paymaster contract address available\");\n }\n\n const deadline = BigInt(Math.floor(Date.now() / 1000) + 60 * 10);\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: nonce,\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 Multiplier,\n SmartContractAccount,\n UserOperationContext,\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 type Hex,\n encodeAbiParameters,\n encodeFunctionData,\n parseAbi,\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\";\n\nimport {\n PermitTypes,\n EIP7597Abis,\n ERC20Abis,\n getAlchemyPaymasterAddress,\n} from \"../gas-manager.js\";\nimport type { PermitMessage, PermitDomain } from \"../gas-manager.js\";\nimport type { MiddlewareClient } from \"../../../../aa-sdk/core/dist/types/middleware/actions.js\";\nimport { InvalidSignedPermit } from \"../errors/invalidSignedPermit.js\";\n\ntype Context = {\n policyId: string | string[];\n erc20Context?: {\n tokenAddress: Address;\n maxTokenAmount?: bigint;\n permit?: Hex;\n };\n};\n\nexport type PolicyToken = {\n address: Address;\n maxTokenAmount: bigint;\n permit?: {\n paymasterAddress?: Address;\n autoPermitApproveTo: bigint;\n autoPermitBelow: bigint;\n erc20Name: string;\n version: string;\n };\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 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 context.erc20Context = {\n tokenAddress: policyToken.address,\n maxTokenAmount: policyToken.maxTokenAmount,\n };\n\n if (policyToken.permit !== undefined) {\n const permit = await generateSignedPermit(client, account, policyToken);\n if (permit !== undefined) {\n context.erc20Context.permit = permit;\n }\n } else if (args.context !== undefined) {\n context.erc20Context.permit = extractSignedPermitFromContext(\n args.context,\n );\n }\n }\n\n return context;\n };\n return {\n dummyPaymasterAndData: async (uo, args) => {\n const context = await buildContext(args);\n const baseMiddleware = erc7677Middleware({ context });\n return baseMiddleware.dummyPaymasterAndData(uo, args);\n },\n\n paymasterAndData: async (uo, args) => {\n const context = await buildContext(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\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 {\n account,\n client: client_,\n feeOptions,\n overrides: overrides_,\n context: uoContext,\n },\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 maxTokenAmount: policyToken.maxTokenAmount,\n };\n if (policyToken.permit !== undefined) {\n const permit = await generateSignedPermit(\n client,\n account,\n policyToken,\n );\n if (permit !== undefined) {\n erc20Context.permit = permit;\n }\n } else if (uoContext !== undefined) {\n erc20Context.permit = extractSignedPermitFromContext(uoContext);\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 {MiddlewareClient} client - The Alchemy smart account client\n * @param {TAccount} account - The smart account instance\n * @param {PolicyToken} policyToken - The policy token configuration\n * @returns {Promise<Hex>} Returns a Promise containing the signed EIP2612 permit\n */\nconst generateSignedPermit = async <TAccount extends SmartContractAccount>(\n client: MiddlewareClient,\n account: TAccount,\n policyToken: PolicyToken,\n): Promise<Hex | undefined> => {\n if (!client.chain) {\n throw new ChainNotFoundError();\n }\n if (!policyToken.permit) {\n throw new Error(\"permit is missing\");\n }\n\n if (!policyToken.permit?.erc20Name || !policyToken.permit?.version) {\n throw new Error(\"erc20Name or version is missing\");\n }\n\n const paymasterAddress =\n policyToken.permit.paymasterAddress ??\n getAlchemyPaymasterAddress(client.chain, account.getEntryPoint().version);\n\n if (paymasterAddress === undefined || paymasterAddress === \"0x\") {\n throw new Error(\"no paymaster contract address available\");\n }\n\n let allowanceFuture = client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(ERC20Abis),\n functionName: \"allowance\",\n args: [account.address, paymasterAddress],\n }),\n });\n\n let nonceFuture = client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(EIP7597Abis),\n functionName: \"nonces\",\n args: [account.address],\n }),\n });\n\n const [allowanceResponse, nonceResponse] = await Promise.all([\n allowanceFuture,\n nonceFuture,\n ]);\n\n if (!allowanceResponse.data) {\n throw new Error(\"No allowance returned from erc20 contract call\");\n }\n\n if (!nonceResponse.data) {\n throw new Error(\"No nonces returned from erc20 contract call\");\n }\n\n const permitLimit = policyToken.permit.autoPermitApproveTo;\n const currentAllowance: bigint = BigInt(allowanceResponse.data);\n if (currentAllowance > policyToken.permit.autoPermitBelow) {\n // no need to generate permit\n return undefined;\n }\n\n const nonce = BigInt(nonceResponse.data);\n\n const deadline = BigInt(Math.floor(Date.now() / 1000) + 60 * 10);\n\n const typedPermitData = {\n types: PermitTypes,\n primaryType: \"Permit\" as const,\n domain: {\n name: policyToken.permit.erc20Name ?? \"\",\n version: policyToken.permit.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: permitLimit as bigint,\n nonce: nonce,\n deadline,\n } satisfies PermitMessage,\n } as const;\n\n const signedPermit = await account.signTypedData(typedPermitData);\n return encodeSignedPermit(permitLimit, deadline, signedPermit);\n};\n\nfunction extractSignedPermitFromContext(\n context: UserOperationContext,\n): Hex | undefined {\n if (context.signedPermit === undefined) {\n return undefined;\n }\n\n if (typeof context.signedPermit !== \"object\") {\n throw new InvalidSignedPermit(\"signedPermit is not an object\");\n }\n if (typeof context.signedPermit.value !== \"bigint\") {\n throw new InvalidSignedPermit(\"signedPermit.value is not a bigint\");\n }\n if (typeof context.signedPermit.deadline !== \"bigint\") {\n throw new InvalidSignedPermit(\"signedPermit.deadline is not a bigint\");\n }\n if (!isHex(context.signedPermit.signature)) {\n throw new InvalidSignedPermit(\"signedPermit.signature is not a hex string\");\n }\n return encodeSignedPermit(\n context.signedPermit.value,\n context.signedPermit.deadline,\n context.signedPermit.signature,\n );\n}\n\nfunction encodeSignedPermit(\n value: bigint,\n deadline: bigint,\n signedPermit: Hex,\n) {\n return encodeAbiParameters(\n [{ type: \"uint256\" }, { type: \"uint256\" }, { type: \"bytes\" }],\n [value, deadline, signedPermit],\n );\n}\n"]}
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "4.
|
|
1
|
+
export declare const VERSION = "4.48.0";
|
package/dist/esm/version.js
CHANGED
package/dist/esm/version.js.map
CHANGED
|
@@ -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.
|
|
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.48.0\";\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type Prettify, type SmartAccountClient, type SmartAccountClientActions, type SmartAccountClientConfig, type SmartAccountClientRpcSchema, type SmartContractAccount, type SmartContractAccountWithSigner, type UserOperationContext } from "@aa-sdk/core";
|
|
2
|
-
import { type
|
|
2
|
+
import { type Chain } from "viem";
|
|
3
3
|
import { type AlchemyTransport } from "../alchemyTransport.js";
|
|
4
4
|
import { type AlchemySmartAccountClientActions } from "./decorators/smartAccount.js";
|
|
5
5
|
import type { AlchemyRpcSchema } from "./types.js";
|
|
6
|
+
import type { PolicyToken } from "../middleware/gasManager.js";
|
|
6
7
|
export declare function getSignerTypeHeader<TAccount extends SmartContractAccountWithSigner>(account: TAccount): {
|
|
7
8
|
"Alchemy-Aa-Sdk-Signer": string;
|
|
8
9
|
};
|
|
@@ -10,13 +11,7 @@ export type AlchemySmartAccountClientConfig<chain extends Chain | undefined = Ch
|
|
|
10
11
|
account?: account;
|
|
11
12
|
useSimulation?: boolean;
|
|
12
13
|
policyId?: string | string[];
|
|
13
|
-
policyToken?:
|
|
14
|
-
address: Address;
|
|
15
|
-
maxTokenAmount: bigint;
|
|
16
|
-
approvalMode?: "NONE" | "PERMIT";
|
|
17
|
-
erc20Name?: string;
|
|
18
|
-
version?: string;
|
|
19
|
-
};
|
|
14
|
+
policyToken?: PolicyToken;
|
|
20
15
|
} & Pick<SmartAccountClientConfig<AlchemyTransport, chain, account, context>, "customMiddleware" | "feeEstimator" | "gasEstimator" | "signUserOperation" | "transport" | "chain" | "opts">;
|
|
21
16
|
export type BaseAlchemyActions<chain extends Chain | undefined = Chain | undefined, account extends SmartContractAccount | undefined = SmartContractAccount | undefined, context extends UserOperationContext | undefined = UserOperationContext | undefined> = SmartAccountClientActions<chain, account, context> & AlchemySmartAccountClientActions<account, context>;
|
|
22
17
|
export type AlchemySmartAccountClient_Base<chain extends Chain | undefined = Chain | undefined, account extends SmartContractAccount | undefined = SmartContractAccount | undefined, actions extends Record<string, unknown> = Record<string, unknown>, context extends UserOperationContext | undefined = UserOperationContext | undefined> = Prettify<SmartAccountClient<AlchemyTransport, chain, account, actions & BaseAlchemyActions<chain, account, context>, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smartAccountClient.d.ts","sourceRoot":"","sources":["../../../src/client/smartAccountClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"smartAccountClient.d.ts","sourceRoot":"","sources":["../../../src/client/smartAccountClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidSignedPermit.d.ts","sourceRoot":"","sources":["../../../src/errors/invalidSignedPermit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,qBAAa,mBAAoB,SAAQ,SAAS;IACvC,IAAI,SAAyB;gBAE1B,MAAM,EAAE,MAAM;CAK3B"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export { getAlchemyPaymasterAddress } from "./gas-manager.js";
|
|
|
20
20
|
export { alchemyFeeEstimator } from "./middleware/feeEstimator.js";
|
|
21
21
|
export type * from "./middleware/gasManager.js";
|
|
22
22
|
export * from "./alchemyTrackerHeaders.js";
|
|
23
|
-
export { alchemyGasManagerMiddleware, alchemyGasAndPaymasterAndDataMiddleware, } from "./middleware/gasManager.js";
|
|
23
|
+
export { alchemyGasManagerMiddleware, alchemyGasAndPaymasterAndDataMiddleware, type PolicyToken, } from "./middleware/gasManager.js";
|
|
24
24
|
export { alchemyUserOperationSimulator } from "./middleware/userOperationSimulator.js";
|
|
25
25
|
export type * from "./schema.js";
|
|
26
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,2CAA2C,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AACzF,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,uBAAuB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACpE,mBAAmB,aAAa,CAAC;AACjC,OAAO,EACL,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,EACf,IAAI,EACJ,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,MAAM,EACN,OAAO,EACP,QAAQ,EACR,cAAc,EACd,eAAe,EACf,OAAO,EACP,WAAW,EACX,aAAa,EACb,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,IAAI,EACJ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,EACV,MAAM,EACN,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,mBAAmB,4CAA4C,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,mBAAmB,qCAAqC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AACtF,mBAAmB,uBAAuB,CAAC;AAC3C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,mBAAmB,gCAAgC,CAAC;AACpD,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,mBAAmB,mBAAmB,CAAC;AACvC,OAAO,EAAE,iCAAiC,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,mBAAmB,4BAA4B,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,2BAA2B,EAC3B,uCAAuC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,2CAA2C,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AACzF,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,uBAAuB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACpE,mBAAmB,aAAa,CAAC;AACjC,OAAO,EACL,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,EACf,IAAI,EACJ,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,MAAM,EACN,OAAO,EACP,QAAQ,EACR,cAAc,EACd,eAAe,EACf,OAAO,EACP,WAAW,EACX,aAAa,EACb,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,IAAI,EACJ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,EACV,MAAM,EACN,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,mBAAmB,4CAA4C,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,mBAAmB,qCAAqC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AACtF,mBAAmB,uBAAuB,CAAC;AAC3C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,mBAAmB,gCAAgC,CAAC;AACpD,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,mBAAmB,mBAAmB,CAAC;AACvC,OAAO,EAAE,iCAAiC,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,mBAAmB,4BAA4B,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,2BAA2B,EAC3B,uCAAuC,EACvC,KAAK,WAAW,GACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,mBAAmB,aAAa,CAAC"}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import type { Address, ClientMiddlewareConfig, ClientMiddlewareFn } from "@aa-sdk/core";
|
|
2
2
|
import type { AlchemyTransport } from "../alchemyTransport.js";
|
|
3
|
+
export type PolicyToken = {
|
|
4
|
+
address: Address;
|
|
5
|
+
maxTokenAmount: bigint;
|
|
6
|
+
permit?: {
|
|
7
|
+
paymasterAddress?: Address;
|
|
8
|
+
autoPermitApproveTo: bigint;
|
|
9
|
+
autoPermitBelow: bigint;
|
|
10
|
+
erc20Name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
3
14
|
/**
|
|
4
15
|
* Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring
|
|
5
16
|
* transactions. Adheres to the ERC-7677 standardized communication protocol.
|
|
@@ -28,14 +39,6 @@ interface AlchemyGasAndPaymasterAndDataMiddlewareParams {
|
|
|
28
39
|
gasEstimatorOverride?: ClientMiddlewareFn;
|
|
29
40
|
feeEstimatorOverride?: ClientMiddlewareFn;
|
|
30
41
|
}
|
|
31
|
-
export type PolicyToken = {
|
|
32
|
-
address: Address;
|
|
33
|
-
maxTokenAmount: bigint;
|
|
34
|
-
paymasterAddress?: Address;
|
|
35
|
-
approvalMode?: "NONE" | "PERMIT";
|
|
36
|
-
erc20Name?: string;
|
|
37
|
-
version?: string;
|
|
38
|
-
};
|
|
39
42
|
/**
|
|
40
43
|
* Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring
|
|
41
44
|
* transactions. Uses Alchemy's custom `alchemy_requestGasAndPaymasterAndData`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gasManager.d.ts","sourceRoot":"","sources":["../../../src/middleware/gasManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,sBAAsB,EACtB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"gasManager.d.ts","sourceRoot":"","sources":["../../../src/middleware/gasManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,sBAAsB,EACtB,kBAAkB,EAQnB,MAAM,cAAc,CAAC;AAuBtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAuB/D,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE;QACP,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,WAAW,CAAC,EAAE,WAAW,GACxB,QAAQ,CACT,IAAI,CAAC,sBAAsB,EAAE,uBAAuB,GAAG,kBAAkB,CAAC,CAC3E,CA4CA;AAED,UAAU,6CAA6C;IACrD,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAC1C,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,uCAAuC,CACrD,MAAM,EAAE,6CAA6C,GACpD,IAAI,CACL,sBAAsB,EACtB,uBAAuB,GAAG,cAAc,GAAG,cAAc,GAAG,kBAAkB,CAC/E,CAuJA"}
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "4.
|
|
1
|
+
export declare const VERSION = "4.48.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.
|
|
3
|
+
"version": "4.48.0",
|
|
4
4
|
"description": "adapters for @aa-sdk/core for interacting with alchemy services",
|
|
5
5
|
"author": "Alchemy",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"typescript-template": "*"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@aa-sdk/core": "^4.
|
|
47
|
-
"@account-kit/logging": "^4.
|
|
46
|
+
"@aa-sdk/core": "^4.48.0",
|
|
47
|
+
"@account-kit/logging": "^4.48.0",
|
|
48
48
|
"eventemitter3": "^5.0.1",
|
|
49
49
|
"zod": "^3.22.4"
|
|
50
50
|
},
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"url": "https://github.com/alchemyplatform/aa-sdk/issues"
|
|
64
64
|
},
|
|
65
65
|
"homepage": "https://github.com/alchemyplatform/aa-sdk#readme",
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "ec382c2927bf7b2e82cd9c867903f82267d2edcd",
|
|
67
67
|
"optionalDependencies": {
|
|
68
68
|
"alchemy-sdk": "^3.0.0"
|
|
69
69
|
}
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
type SmartContractAccountWithSigner,
|
|
13
13
|
type UserOperationContext,
|
|
14
14
|
} from "@aa-sdk/core";
|
|
15
|
-
import { type
|
|
15
|
+
import { type Chain } from "viem";
|
|
16
16
|
import {
|
|
17
17
|
alchemy,
|
|
18
18
|
convertHeadersToObject,
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
} from "./decorators/smartAccount.js";
|
|
29
29
|
import type { AlchemyRpcSchema } from "./types.js";
|
|
30
30
|
import { headersUpdate } from "../alchemyTrackerHeaders.js";
|
|
31
|
+
import type { PolicyToken } from "../middleware/gasManager.js";
|
|
31
32
|
|
|
32
33
|
export function getSignerTypeHeader<
|
|
33
34
|
TAccount extends SmartContractAccountWithSigner,
|
|
@@ -48,13 +49,7 @@ export type AlchemySmartAccountClientConfig<
|
|
|
48
49
|
account?: account;
|
|
49
50
|
useSimulation?: boolean;
|
|
50
51
|
policyId?: string | string[];
|
|
51
|
-
policyToken?:
|
|
52
|
-
address: Address;
|
|
53
|
-
maxTokenAmount: bigint;
|
|
54
|
-
approvalMode?: "NONE" | "PERMIT";
|
|
55
|
-
erc20Name?: string;
|
|
56
|
-
version?: string;
|
|
57
|
-
};
|
|
52
|
+
policyToken?: PolicyToken;
|
|
58
53
|
} & Pick<
|
|
59
54
|
SmartAccountClientConfig<AlchemyTransport, chain, account, context>,
|
|
60
55
|
| "customMiddleware"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseError } from "./base.js";
|
|
2
|
+
|
|
3
|
+
export class InvalidSignedPermit extends BaseError {
|
|
4
|
+
override name = "InvalidSignedPermit";
|
|
5
|
+
|
|
6
|
+
constructor(reason: string) {
|
|
7
|
+
super(["Invalid signed permit"].join("\n"), {
|
|
8
|
+
details: [reason, "Please provide a valid signed permit"].join("\n"),
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -68,6 +68,7 @@ export * from "./alchemyTrackerHeaders.js";
|
|
|
68
68
|
export {
|
|
69
69
|
alchemyGasManagerMiddleware,
|
|
70
70
|
alchemyGasAndPaymasterAndDataMiddleware,
|
|
71
|
+
type PolicyToken,
|
|
71
72
|
} from "./middleware/gasManager.js";
|
|
72
73
|
export { alchemyUserOperationSimulator } from "./middleware/userOperationSimulator.js";
|
|
73
74
|
export type * from "./schema.js";
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
EntryPointVersion,
|
|
6
6
|
Multiplier,
|
|
7
7
|
SmartContractAccount,
|
|
8
|
+
UserOperationContext,
|
|
8
9
|
UserOperationFeeOptions,
|
|
9
10
|
UserOperationOverrides,
|
|
10
11
|
UserOperationRequest,
|
|
@@ -34,6 +35,7 @@ import type { AlchemySmartAccountClient } from "../client/smartAccountClient.js"
|
|
|
34
35
|
import type { AlchemyTransport } from "../alchemyTransport.js";
|
|
35
36
|
import { alchemyFeeEstimator } from "./feeEstimator.js";
|
|
36
37
|
import type { RequestGasAndPaymasterAndDataRequest } from "../actions/types.js";
|
|
38
|
+
|
|
37
39
|
import {
|
|
38
40
|
PermitTypes,
|
|
39
41
|
EIP7597Abis,
|
|
@@ -42,15 +44,29 @@ import {
|
|
|
42
44
|
} from "../gas-manager.js";
|
|
43
45
|
import type { PermitMessage, PermitDomain } from "../gas-manager.js";
|
|
44
46
|
import type { MiddlewareClient } from "../../../../aa-sdk/core/dist/types/middleware/actions.js";
|
|
47
|
+
import { InvalidSignedPermit } from "../errors/invalidSignedPermit.js";
|
|
45
48
|
|
|
46
49
|
type Context = {
|
|
47
50
|
policyId: string | string[];
|
|
48
51
|
erc20Context?: {
|
|
49
52
|
tokenAddress: Address;
|
|
50
|
-
maxTokenAmount?:
|
|
53
|
+
maxTokenAmount?: bigint;
|
|
51
54
|
permit?: Hex;
|
|
52
55
|
};
|
|
53
56
|
};
|
|
57
|
+
|
|
58
|
+
export type PolicyToken = {
|
|
59
|
+
address: Address;
|
|
60
|
+
maxTokenAmount: bigint;
|
|
61
|
+
permit?: {
|
|
62
|
+
paymasterAddress?: Address;
|
|
63
|
+
autoPermitApproveTo: bigint;
|
|
64
|
+
autoPermitBelow: bigint;
|
|
65
|
+
erc20Name: string;
|
|
66
|
+
version: string;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
54
70
|
/**
|
|
55
71
|
* Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring
|
|
56
72
|
* transactions. Adheres to the ERC-7677 standardized communication protocol.
|
|
@@ -93,11 +109,14 @@ export function alchemyGasManagerMiddleware(
|
|
|
93
109
|
maxTokenAmount: policyToken.maxTokenAmount,
|
|
94
110
|
};
|
|
95
111
|
|
|
96
|
-
if (policyToken.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
112
|
+
if (policyToken.permit !== undefined) {
|
|
113
|
+
const permit = await generateSignedPermit(client, account, policyToken);
|
|
114
|
+
if (permit !== undefined) {
|
|
115
|
+
context.erc20Context.permit = permit;
|
|
116
|
+
}
|
|
117
|
+
} else if (args.context !== undefined) {
|
|
118
|
+
context.erc20Context.permit = extractSignedPermitFromContext(
|
|
119
|
+
args.context,
|
|
101
120
|
);
|
|
102
121
|
}
|
|
103
122
|
}
|
|
@@ -127,15 +146,6 @@ interface AlchemyGasAndPaymasterAndDataMiddlewareParams {
|
|
|
127
146
|
feeEstimatorOverride?: ClientMiddlewareFn;
|
|
128
147
|
}
|
|
129
148
|
|
|
130
|
-
export type PolicyToken = {
|
|
131
|
-
address: Address;
|
|
132
|
-
maxTokenAmount: bigint;
|
|
133
|
-
paymasterAddress?: Address;
|
|
134
|
-
approvalMode?: "NONE" | "PERMIT";
|
|
135
|
-
erc20Name?: string;
|
|
136
|
-
version?: string;
|
|
137
|
-
};
|
|
138
|
-
|
|
139
149
|
/**
|
|
140
150
|
* Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring
|
|
141
151
|
* transactions. Uses Alchemy's custom `alchemy_requestGasAndPaymasterAndData`
|
|
@@ -212,7 +222,13 @@ export function alchemyGasAndPaymasterAndDataMiddleware(
|
|
|
212
222
|
},
|
|
213
223
|
paymasterAndData: async (
|
|
214
224
|
uo,
|
|
215
|
-
{
|
|
225
|
+
{
|
|
226
|
+
account,
|
|
227
|
+
client: client_,
|
|
228
|
+
feeOptions,
|
|
229
|
+
overrides: overrides_,
|
|
230
|
+
context: uoContext,
|
|
231
|
+
},
|
|
216
232
|
) => {
|
|
217
233
|
const client = clientHeaderTrack(client_, "alchemyFeeEstimator");
|
|
218
234
|
if (!client.chain) {
|
|
@@ -277,12 +293,17 @@ export function alchemyGasAndPaymasterAndDataMiddleware(
|
|
|
277
293
|
tokenAddress: policyToken.address,
|
|
278
294
|
maxTokenAmount: policyToken.maxTokenAmount,
|
|
279
295
|
};
|
|
280
|
-
if (policyToken.
|
|
281
|
-
|
|
296
|
+
if (policyToken.permit !== undefined) {
|
|
297
|
+
const permit = await generateSignedPermit(
|
|
282
298
|
client,
|
|
283
299
|
account,
|
|
284
300
|
policyToken,
|
|
285
301
|
);
|
|
302
|
+
if (permit !== undefined) {
|
|
303
|
+
erc20Context.permit = permit;
|
|
304
|
+
}
|
|
305
|
+
} else if (uoContext !== undefined) {
|
|
306
|
+
erc20Context.permit = extractSignedPermitFromContext(uoContext);
|
|
286
307
|
}
|
|
287
308
|
}
|
|
288
309
|
|
|
@@ -366,39 +387,38 @@ const overrideField = <
|
|
|
366
387
|
* @param {MiddlewareClient} client - The Alchemy smart account client
|
|
367
388
|
* @param {TAccount} account - The smart account instance
|
|
368
389
|
* @param {PolicyToken} policyToken - The policy token configuration
|
|
369
|
-
* @param {Address} policyToken.address - ERC20 contract addressya
|
|
370
|
-
* @param {bigint} [policyToken.maxTokenAmount] - Optional ERC20 token limit
|
|
371
|
-
* @param {Address} [policyToken.paymasterAddress] - Optional Paymaster Address
|
|
372
|
-
* @param {"NONE" | "PERMIT"} [policyToken.approvalMode] - ERC20 approve mode
|
|
373
|
-
* @param {string} [policyToken.erc20Name] - EIP2612 specified ERC20 contract name
|
|
374
|
-
* @param {string} [policyToken.version] - EIP2612 specified ERC20 contract version
|
|
375
390
|
* @returns {Promise<Hex>} Returns a Promise containing the signed EIP2612 permit
|
|
376
391
|
*/
|
|
377
392
|
const generateSignedPermit = async <TAccount extends SmartContractAccount>(
|
|
378
393
|
client: MiddlewareClient,
|
|
379
394
|
account: TAccount,
|
|
380
|
-
policyToken:
|
|
381
|
-
|
|
382
|
-
maxTokenAmount: bigint;
|
|
383
|
-
paymasterAddress?: Address;
|
|
384
|
-
approvalMode?: "NONE" | "PERMIT";
|
|
385
|
-
erc20Name?: string;
|
|
386
|
-
version?: string;
|
|
387
|
-
},
|
|
388
|
-
): Promise<Hex> => {
|
|
395
|
+
policyToken: PolicyToken,
|
|
396
|
+
): Promise<Hex | undefined> => {
|
|
389
397
|
if (!client.chain) {
|
|
390
398
|
throw new ChainNotFoundError();
|
|
391
399
|
}
|
|
392
|
-
if (!policyToken.
|
|
400
|
+
if (!policyToken.permit) {
|
|
401
|
+
throw new Error("permit is missing");
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
if (!policyToken.permit?.erc20Name || !policyToken.permit?.version) {
|
|
393
405
|
throw new Error("erc20Name or version is missing");
|
|
394
406
|
}
|
|
395
407
|
|
|
396
|
-
|
|
408
|
+
const paymasterAddress =
|
|
409
|
+
policyToken.permit.paymasterAddress ??
|
|
410
|
+
getAlchemyPaymasterAddress(client.chain, account.getEntryPoint().version);
|
|
411
|
+
|
|
412
|
+
if (paymasterAddress === undefined || paymasterAddress === "0x") {
|
|
413
|
+
throw new Error("no paymaster contract address available");
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
let allowanceFuture = client.call({
|
|
397
417
|
to: policyToken.address,
|
|
398
418
|
data: encodeFunctionData({
|
|
399
419
|
abi: parseAbi(ERC20Abis),
|
|
400
|
-
functionName: "
|
|
401
|
-
args: [],
|
|
420
|
+
functionName: "allowance",
|
|
421
|
+
args: [account.address, paymasterAddress],
|
|
402
422
|
}),
|
|
403
423
|
});
|
|
404
424
|
|
|
@@ -411,53 +431,85 @@ const generateSignedPermit = async <TAccount extends SmartContractAccount>(
|
|
|
411
431
|
}),
|
|
412
432
|
});
|
|
413
433
|
|
|
414
|
-
const [
|
|
415
|
-
|
|
434
|
+
const [allowanceResponse, nonceResponse] = await Promise.all([
|
|
435
|
+
allowanceFuture,
|
|
416
436
|
nonceFuture,
|
|
417
437
|
]);
|
|
418
|
-
|
|
419
|
-
|
|
438
|
+
|
|
439
|
+
if (!allowanceResponse.data) {
|
|
440
|
+
throw new Error("No allowance returned from erc20 contract call");
|
|
420
441
|
}
|
|
442
|
+
|
|
421
443
|
if (!nonceResponse.data) {
|
|
422
444
|
throw new Error("No nonces returned from erc20 contract call");
|
|
423
445
|
}
|
|
424
446
|
|
|
425
|
-
const
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
const paymasterAddress =
|
|
431
|
-
policyToken.paymasterAddress ??
|
|
432
|
-
getAlchemyPaymasterAddress(client.chain, account.getEntryPoint().version);
|
|
433
|
-
|
|
434
|
-
if (paymasterAddress === undefined || paymasterAddress === "0x") {
|
|
435
|
-
throw new Error("no paymaster contract address available");
|
|
447
|
+
const permitLimit = policyToken.permit.autoPermitApproveTo;
|
|
448
|
+
const currentAllowance: bigint = BigInt(allowanceResponse.data);
|
|
449
|
+
if (currentAllowance > policyToken.permit.autoPermitBelow) {
|
|
450
|
+
// no need to generate permit
|
|
451
|
+
return undefined;
|
|
436
452
|
}
|
|
437
453
|
|
|
454
|
+
const nonce = BigInt(nonceResponse.data);
|
|
455
|
+
|
|
438
456
|
const deadline = BigInt(Math.floor(Date.now() / 1000) + 60 * 10);
|
|
439
457
|
|
|
440
458
|
const typedPermitData = {
|
|
441
459
|
types: PermitTypes,
|
|
442
460
|
primaryType: "Permit" as const,
|
|
443
461
|
domain: {
|
|
444
|
-
name: policyToken.erc20Name ?? "",
|
|
445
|
-
version: policyToken.version ?? "",
|
|
462
|
+
name: policyToken.permit.erc20Name ?? "",
|
|
463
|
+
version: policyToken.permit.version ?? "",
|
|
446
464
|
chainId: BigInt(client.chain.id),
|
|
447
465
|
verifyingContract: policyToken.address,
|
|
448
466
|
} satisfies PermitDomain,
|
|
449
467
|
message: {
|
|
450
468
|
owner: account.address,
|
|
451
469
|
spender: paymasterAddress,
|
|
452
|
-
value:
|
|
470
|
+
value: permitLimit as bigint,
|
|
453
471
|
nonce: nonce,
|
|
454
472
|
deadline,
|
|
455
473
|
} satisfies PermitMessage,
|
|
456
474
|
} as const;
|
|
457
475
|
|
|
458
476
|
const signedPermit = await account.signTypedData(typedPermitData);
|
|
477
|
+
return encodeSignedPermit(permitLimit, deadline, signedPermit);
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
function extractSignedPermitFromContext(
|
|
481
|
+
context: UserOperationContext,
|
|
482
|
+
): Hex | undefined {
|
|
483
|
+
if (context.signedPermit === undefined) {
|
|
484
|
+
return undefined;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
if (typeof context.signedPermit !== "object") {
|
|
488
|
+
throw new InvalidSignedPermit("signedPermit is not an object");
|
|
489
|
+
}
|
|
490
|
+
if (typeof context.signedPermit.value !== "bigint") {
|
|
491
|
+
throw new InvalidSignedPermit("signedPermit.value is not a bigint");
|
|
492
|
+
}
|
|
493
|
+
if (typeof context.signedPermit.deadline !== "bigint") {
|
|
494
|
+
throw new InvalidSignedPermit("signedPermit.deadline is not a bigint");
|
|
495
|
+
}
|
|
496
|
+
if (!isHex(context.signedPermit.signature)) {
|
|
497
|
+
throw new InvalidSignedPermit("signedPermit.signature is not a hex string");
|
|
498
|
+
}
|
|
499
|
+
return encodeSignedPermit(
|
|
500
|
+
context.signedPermit.value,
|
|
501
|
+
context.signedPermit.deadline,
|
|
502
|
+
context.signedPermit.signature,
|
|
503
|
+
);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
function encodeSignedPermit(
|
|
507
|
+
value: bigint,
|
|
508
|
+
deadline: bigint,
|
|
509
|
+
signedPermit: Hex,
|
|
510
|
+
) {
|
|
459
511
|
return encodeAbiParameters(
|
|
460
512
|
[{ type: "uint256" }, { type: "uint256" }, { type: "bytes" }],
|
|
461
|
-
[
|
|
513
|
+
[value, deadline, signedPermit],
|
|
462
514
|
);
|
|
463
|
-
}
|
|
515
|
+
}
|
package/src/version.ts
CHANGED