@account-kit/infra 4.43.1 → 4.45.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/gas-manager.d.ts +13 -6
- package/dist/esm/gas-manager.js +125 -28
- package/dist/esm/gas-manager.js.map +1 -1
- package/dist/esm/middleware/gasManager.d.ts +1 -0
- package/dist/esm/middleware/gasManager.js +14 -31
- 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/gas-manager.d.ts +13 -6
- package/dist/types/gas-manager.d.ts.map +1 -1
- package/dist/types/middleware/gasManager.d.ts +1 -0
- 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/gas-manager.ts +167 -29
- package/src/middleware/gasManager.ts +18 -41
- package/src/version.ts +1 -1
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Address, type Chain, type Hex } from "viem";
|
|
2
|
+
import type { EntryPointVersion } from "@aa-sdk/core";
|
|
3
|
+
export declare const AlchemyPaymasterAddressV06Unify = "0x0000000000ce04e2359130e7d0204A5249958921";
|
|
4
|
+
export declare const AlchemyPaymasterAddressV07Unify = "0x00000000000667F27D4DB42334ec11a25db7EBb4";
|
|
5
|
+
export declare const AlchemyPaymasterAddressV4 = "0xEaf0Cde110a5d503f2dD69B3a49E031e29b3F9D2";
|
|
2
6
|
export declare const AlchemyPaymasterAddressV3 = "0x4f84a207A80c39E9e8BaE717c1F25bA7AD1fB08F";
|
|
3
7
|
export declare const AlchemyPaymasterAddressV2 = "0x4Fd9098af9ddcB41DA48A1d78F91F1398965addc";
|
|
4
8
|
export declare const ArbSepoliaPaymasterAddress = "0x0804Afe6EEFb73ce7F93CD0d5e7079a5a8068592";
|
|
5
9
|
export declare const AlchemyPaymasterAddressV1 = "0xc03aac639bb21233e0139381970328db8bceeb67";
|
|
10
|
+
export declare const AlchemyPaymasterAddressV07V2 = "0x2cc0c7981D846b9F2a16276556f6e8cb52BfB633";
|
|
11
|
+
export declare const AlchemyPaymasterAddressV07V1 = "0xEF725Aa22d43Ea69FB22bE2EBe6ECa205a6BCf5B";
|
|
6
12
|
/**
|
|
7
13
|
* Retrieves the Alchemy paymaster address for the given chain. Returns different addresses based on the chain ID.
|
|
8
14
|
*
|
|
@@ -10,15 +16,14 @@ export declare const AlchemyPaymasterAddressV1 = "0xc03aac639bb21233e01393819703
|
|
|
10
16
|
* ```ts
|
|
11
17
|
* import { sepolia, getAlchemyPaymasterAddress } from "@account-kit/infra";
|
|
12
18
|
*
|
|
13
|
-
* const paymasterAddress = getAlchemyPaymasterAddress(sepolia);
|
|
19
|
+
* const paymasterAddress = getAlchemyPaymasterAddress(sepolia, "0.6.0");
|
|
14
20
|
* ```
|
|
15
21
|
*
|
|
16
22
|
* @param {Chain} chain The chain for which the paymaster address is required
|
|
23
|
+
* @param {EntryPointVersion} version The version of the entry point
|
|
17
24
|
* @returns {Address} The Alchemy paymaster address corresponding to the specified chain
|
|
18
|
-
*
|
|
19
|
-
* @deprecated This chain list in this function is no longer maintained since the ERC-7677 middleware is typically used to resolve the paymaster address
|
|
20
25
|
*/
|
|
21
|
-
export declare const getAlchemyPaymasterAddress: (chain: Chain) => Address;
|
|
26
|
+
export declare const getAlchemyPaymasterAddress: (chain: Chain, version: EntryPointVersion) => Address;
|
|
22
27
|
export declare const PermitTypes: {
|
|
23
28
|
readonly EIP712Domain: readonly [{
|
|
24
29
|
readonly name: "name";
|
|
@@ -50,7 +55,9 @@ export declare const PermitTypes: {
|
|
|
50
55
|
readonly type: "uint256";
|
|
51
56
|
}];
|
|
52
57
|
};
|
|
53
|
-
export declare const
|
|
58
|
+
export declare const ERC20Abis: readonly ["function decimals() public view returns (uint8)", "function balanceOf(address owner) external view returns (uint256)", "function allowance(address owner, address spender) external view returns (uint256)", "function approve(address spender, uint256 amount) external returns (bool)"];
|
|
59
|
+
export declare const EIP7597Abis: readonly ["function nonces(address owner) external view returns (uint)"];
|
|
60
|
+
export declare const approveTokenCallData: (paymasterAddress: Address, allowance: BigInt) => `0x${string}`;
|
|
54
61
|
export type PermitMessage = {
|
|
55
62
|
owner: Hex;
|
|
56
63
|
spender: Hex;
|
package/dist/esm/gas-manager.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { encodeFunctionData } from "viem";
|
|
2
|
+
import { arbitrum, arbitrumSepolia, base, baseSepolia, fraxtal, fraxtalSepolia, mainnet, optimism, optimismSepolia, polygon, polygonAmoy, unichainSepolia, worldChainSepolia, sepolia, zora, zoraSepolia, shapeSepolia, optimismGoerli, arbitrumGoerli, arbitrumNova, baseGoerli, beraChainBartio, celoAlfajores, celoMainnet, gensynTestnet, goerli, inkMainnet, inkSepolia, monadTestnet, opbnbMainnet, opbnbTestnet, openlootSepolia, polygonMumbai, riseTestnet, shape, soneiumMainnet, soneiumMinato, storyAeneid, storyMainnet, teaSepolia, unichainMainnet, worldChain, } from "./chains.js";
|
|
3
|
+
export const AlchemyPaymasterAddressV06Unify = "0x0000000000ce04e2359130e7d0204A5249958921";
|
|
4
|
+
export const AlchemyPaymasterAddressV07Unify = "0x00000000000667F27D4DB42334ec11a25db7EBb4";
|
|
5
|
+
export const AlchemyPaymasterAddressV4 = "0xEaf0Cde110a5d503f2dD69B3a49E031e29b3F9D2";
|
|
2
6
|
export const AlchemyPaymasterAddressV3 = "0x4f84a207A80c39E9e8BaE717c1F25bA7AD1fB08F";
|
|
3
7
|
export const AlchemyPaymasterAddressV2 = "0x4Fd9098af9ddcB41DA48A1d78F91F1398965addc";
|
|
4
8
|
export const ArbSepoliaPaymasterAddress = "0x0804Afe6EEFb73ce7F93CD0d5e7079a5a8068592";
|
|
5
9
|
export const AlchemyPaymasterAddressV1 = "0xc03aac639bb21233e0139381970328db8bceeb67";
|
|
10
|
+
export const AlchemyPaymasterAddressV07V2 = "0x2cc0c7981D846b9F2a16276556f6e8cb52BfB633";
|
|
11
|
+
export const AlchemyPaymasterAddressV07V1 = "0xEF725Aa22d43Ea69FB22bE2EBe6ECa205a6BCf5B";
|
|
6
12
|
/**
|
|
7
13
|
* Retrieves the Alchemy paymaster address for the given chain. Returns different addresses based on the chain ID.
|
|
8
14
|
*
|
|
@@ -10,37 +16,118 @@ export const AlchemyPaymasterAddressV1 = "0xc03aac639bb21233e0139381970328db8bce
|
|
|
10
16
|
* ```ts
|
|
11
17
|
* import { sepolia, getAlchemyPaymasterAddress } from "@account-kit/infra";
|
|
12
18
|
*
|
|
13
|
-
* const paymasterAddress = getAlchemyPaymasterAddress(sepolia);
|
|
19
|
+
* const paymasterAddress = getAlchemyPaymasterAddress(sepolia, "0.6.0");
|
|
14
20
|
* ```
|
|
15
21
|
*
|
|
16
22
|
* @param {Chain} chain The chain for which the paymaster address is required
|
|
23
|
+
* @param {EntryPointVersion} version The version of the entry point
|
|
17
24
|
* @returns {Address} The Alchemy paymaster address corresponding to the specified chain
|
|
18
|
-
*
|
|
19
|
-
* @deprecated This chain list in this function is no longer maintained since the ERC-7677 middleware is typically used to resolve the paymaster address
|
|
20
25
|
*/
|
|
21
|
-
export const getAlchemyPaymasterAddress = (chain) => {
|
|
22
|
-
switch (
|
|
23
|
-
case
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
26
|
+
export const getAlchemyPaymasterAddress = (chain, version) => {
|
|
27
|
+
switch (version) {
|
|
28
|
+
case "0.6.0":
|
|
29
|
+
switch (chain.id) {
|
|
30
|
+
case fraxtalSepolia.id:
|
|
31
|
+
case worldChainSepolia.id:
|
|
32
|
+
case shapeSepolia.id:
|
|
33
|
+
case unichainSepolia.id:
|
|
34
|
+
case opbnbTestnet.id:
|
|
35
|
+
case inkSepolia.id:
|
|
36
|
+
case monadTestnet.id:
|
|
37
|
+
case openlootSepolia.id:
|
|
38
|
+
case gensynTestnet.id:
|
|
39
|
+
case riseTestnet.id:
|
|
40
|
+
case storyAeneid.id:
|
|
41
|
+
case teaSepolia.id:
|
|
42
|
+
case arbitrumGoerli.id:
|
|
43
|
+
case goerli.id:
|
|
44
|
+
case optimismGoerli.id:
|
|
45
|
+
case baseGoerli.id:
|
|
46
|
+
case polygonMumbai.id:
|
|
47
|
+
case worldChain.id:
|
|
48
|
+
case shape.id:
|
|
49
|
+
case unichainMainnet.id:
|
|
50
|
+
case soneiumMinato.id:
|
|
51
|
+
case soneiumMainnet.id:
|
|
52
|
+
case opbnbMainnet.id:
|
|
53
|
+
case beraChainBartio.id:
|
|
54
|
+
case inkMainnet.id:
|
|
55
|
+
case arbitrumNova.id:
|
|
56
|
+
case storyMainnet.id:
|
|
57
|
+
case celoAlfajores.id:
|
|
58
|
+
case celoMainnet.id:
|
|
59
|
+
return AlchemyPaymasterAddressV4;
|
|
60
|
+
case polygonAmoy.id:
|
|
61
|
+
case optimismSepolia.id:
|
|
62
|
+
case baseSepolia.id:
|
|
63
|
+
case zora.id:
|
|
64
|
+
case zoraSepolia.id:
|
|
65
|
+
case fraxtal.id:
|
|
66
|
+
return AlchemyPaymasterAddressV3;
|
|
67
|
+
case mainnet.id:
|
|
68
|
+
case arbitrum.id:
|
|
69
|
+
case optimism.id:
|
|
70
|
+
case polygon.id:
|
|
71
|
+
case base.id:
|
|
72
|
+
return AlchemyPaymasterAddressV2;
|
|
73
|
+
case arbitrumSepolia.id:
|
|
74
|
+
return ArbSepoliaPaymasterAddress;
|
|
75
|
+
case sepolia.id:
|
|
76
|
+
return AlchemyPaymasterAddressV1;
|
|
77
|
+
default:
|
|
78
|
+
return AlchemyPaymasterAddressV06Unify;
|
|
79
|
+
}
|
|
80
|
+
case "0.7.0":
|
|
81
|
+
switch (chain.id) {
|
|
82
|
+
case arbitrumNova.id:
|
|
83
|
+
case celoAlfajores.id:
|
|
84
|
+
case celoMainnet.id:
|
|
85
|
+
case gensynTestnet.id:
|
|
86
|
+
case inkMainnet.id:
|
|
87
|
+
case inkSepolia.id:
|
|
88
|
+
case monadTestnet.id:
|
|
89
|
+
case opbnbMainnet.id:
|
|
90
|
+
case opbnbTestnet.id:
|
|
91
|
+
case openlootSepolia.id:
|
|
92
|
+
case riseTestnet.id:
|
|
93
|
+
case shape.id:
|
|
94
|
+
case shapeSepolia.id:
|
|
95
|
+
case soneiumMainnet.id:
|
|
96
|
+
case soneiumMinato.id:
|
|
97
|
+
case storyAeneid.id:
|
|
98
|
+
case storyMainnet.id:
|
|
99
|
+
case teaSepolia.id:
|
|
100
|
+
case unichainMainnet.id:
|
|
101
|
+
case unichainSepolia.id:
|
|
102
|
+
case worldChain.id:
|
|
103
|
+
case worldChainSepolia.id:
|
|
104
|
+
return AlchemyPaymasterAddressV07V1;
|
|
105
|
+
case arbitrum.id:
|
|
106
|
+
case arbitrumGoerli.id:
|
|
107
|
+
case arbitrumSepolia.id:
|
|
108
|
+
case base.id:
|
|
109
|
+
case baseGoerli.id:
|
|
110
|
+
case baseSepolia.id:
|
|
111
|
+
case beraChainBartio.id:
|
|
112
|
+
case fraxtal.id:
|
|
113
|
+
case fraxtalSepolia.id:
|
|
114
|
+
case goerli.id:
|
|
115
|
+
case mainnet.id:
|
|
116
|
+
case optimism.id:
|
|
117
|
+
case optimismGoerli.id:
|
|
118
|
+
case optimismSepolia.id:
|
|
119
|
+
case polygon.id:
|
|
120
|
+
case polygonAmoy.id:
|
|
121
|
+
case polygonMumbai.id:
|
|
122
|
+
case sepolia.id:
|
|
123
|
+
case zora.id:
|
|
124
|
+
case zoraSepolia.id:
|
|
125
|
+
return AlchemyPaymasterAddressV07V2;
|
|
126
|
+
default:
|
|
127
|
+
return AlchemyPaymasterAddressV07Unify;
|
|
128
|
+
}
|
|
42
129
|
default:
|
|
43
|
-
throw new Error(`Unsupported
|
|
130
|
+
throw new Error(`Unsupported EntryPointVersion: ${version}`);
|
|
44
131
|
}
|
|
45
132
|
};
|
|
46
133
|
export const PermitTypes = {
|
|
@@ -58,10 +145,20 @@ export const PermitTypes = {
|
|
|
58
145
|
{ name: "deadline", type: "uint256" },
|
|
59
146
|
],
|
|
60
147
|
};
|
|
61
|
-
export const
|
|
62
|
-
"function nonces(address owner) external view returns (uint)",
|
|
148
|
+
export const ERC20Abis = [
|
|
63
149
|
"function decimals() public view returns (uint8)",
|
|
64
150
|
"function balanceOf(address owner) external view returns (uint256)",
|
|
65
151
|
"function allowance(address owner, address spender) external view returns (uint256)",
|
|
152
|
+
"function approve(address spender, uint256 amount) external returns (bool)",
|
|
66
153
|
];
|
|
154
|
+
export const EIP7597Abis = [
|
|
155
|
+
"function nonces(address owner) external view returns (uint)",
|
|
156
|
+
];
|
|
157
|
+
export const approveTokenCallData = (paymasterAddress, allowance) => {
|
|
158
|
+
return encodeFunctionData({
|
|
159
|
+
abi: ERC20Abis,
|
|
160
|
+
functionName: "approve",
|
|
161
|
+
args: [paymasterAddress, allowance],
|
|
162
|
+
});
|
|
163
|
+
};
|
|
67
164
|
//# 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;IAC7D,iDAAiD;IACjD,mEAAmE;IACnE,oFAAoF;CAC5E,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 \"function balanceOf(address owner) external view returns (uint256)\",\n \"function allowance(address owner, address spender) external view returns (uint256)\",\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":"AAAA,OAAO,EAAE,kBAAkB,EAAsC,MAAM,MAAM,CAAC;AAC9E,OAAO,EACL,QAAQ,EACR,eAAe,EACf,IAAI,EACJ,WAAW,EACX,OAAO,EACP,cAAc,EACd,OAAO,EACP,QAAQ,EACR,eAAe,EACf,OAAO,EACP,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,MAAM,EACN,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,KAAK,EACL,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,+BAA+B,GAC1C,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,+BAA+B,GAC1C,4CAA4C,CAAC;AAE/C,MAAM,CAAC,MAAM,yBAAyB,GACpC,4CAA4C,CAAC;AAC/C,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,MAAM,CAAC,MAAM,4BAA4B,GACvC,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,4BAA4B,GACvC,4CAA4C,CAAC;AAE/C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,KAAY,EACZ,OAA0B,EACjB,EAAE;IACX,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;gBACjB,KAAK,cAAc,CAAC,EAAE,CAAC;gBACvB,KAAK,iBAAiB,CAAC,EAAE,CAAC;gBAC1B,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtB,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,cAAc,CAAC,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,EAAE,CAAC;gBACf,KAAK,cAAc,CAAC,EAAE,CAAC;gBACvB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,KAAK,CAAC,EAAE,CAAC;gBACd,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtB,KAAK,cAAc,CAAC,EAAE,CAAC;gBACvB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtB,KAAK,WAAW,CAAC,EAAE;oBACjB,OAAO,yBAAyB,CAAC;gBACnC,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,IAAI,CAAC,EAAE,CAAC;gBACb,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,OAAO,CAAC,EAAE;oBACb,OAAO,yBAAyB,CAAC;gBACnC,KAAK,OAAO,CAAC,EAAE,CAAC;gBAChB,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACjB,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACjB,KAAK,OAAO,CAAC,EAAE,CAAC;gBAChB,KAAK,IAAI,CAAC,EAAE;oBACV,OAAO,yBAAyB,CAAC;gBACnC,KAAK,eAAe,CAAC,EAAE;oBACrB,OAAO,0BAA0B,CAAC;gBACpC,KAAK,OAAO,CAAC,EAAE;oBACb,OAAO,yBAAyB,CAAC;gBACnC;oBACE,OAAO,+BAA+B,CAAC;YAC3C,CAAC;QACH,KAAK,OAAO;YACV,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;gBACjB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtB,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,KAAK,CAAC,EAAE,CAAC;gBACd,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,cAAc,CAAC,EAAE,CAAC;gBACvB,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtB,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,iBAAiB,CAAC,EAAE;oBACvB,OAAO,4BAA4B,CAAC;gBACtC,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACjB,KAAK,cAAc,CAAC,EAAE,CAAC;gBACvB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,IAAI,CAAC,EAAE,CAAC;gBACb,KAAK,UAAU,CAAC,EAAE,CAAC;gBACnB,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,OAAO,CAAC,EAAE,CAAC;gBAChB,KAAK,cAAc,CAAC,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,EAAE,CAAC;gBACf,KAAK,OAAO,CAAC,EAAE,CAAC;gBAChB,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACjB,KAAK,cAAc,CAAC,EAAE,CAAC;gBACvB,KAAK,eAAe,CAAC,EAAE,CAAC;gBACxB,KAAK,OAAO,CAAC,EAAE,CAAC;gBAChB,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpB,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtB,KAAK,OAAO,CAAC,EAAE,CAAC;gBAChB,KAAK,IAAI,CAAC,EAAE,CAAC;gBACb,KAAK,WAAW,CAAC,EAAE;oBACjB,OAAO,4BAA4B,CAAC;gBACtC;oBACE,OAAO,+BAA+B,CAAC;YAC3C,CAAC;QACH;YACE,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;IACjE,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,SAAS,GAAG;IACvB,iDAAiD;IACjD,mEAAmE;IACnE,oFAAoF;IACpF,2EAA2E;CACnE,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,6DAA6D;CACrD,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,gBAAyB,EACzB,SAAiB,EACjB,EAAE;IACF,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,SAAS;QACvB,IAAI,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC;KACpC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { encodeFunctionData, type Address, type Chain, type 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 unichainSepolia,\n worldChainSepolia,\n sepolia,\n zora,\n zoraSepolia,\n shapeSepolia,\n optimismGoerli,\n arbitrumGoerli,\n arbitrumNova,\n baseGoerli,\n beraChainBartio,\n celoAlfajores,\n celoMainnet,\n gensynTestnet,\n goerli,\n inkMainnet,\n inkSepolia,\n monadTestnet,\n opbnbMainnet,\n opbnbTestnet,\n openlootSepolia,\n polygonMumbai,\n riseTestnet,\n shape,\n soneiumMainnet,\n soneiumMinato,\n storyAeneid,\n storyMainnet,\n teaSepolia,\n unichainMainnet,\n worldChain,\n} from \"./chains.js\";\nimport type { EntryPointVersion } from \"@aa-sdk/core\";\nexport const AlchemyPaymasterAddressV06Unify =\n \"0x0000000000ce04e2359130e7d0204A5249958921\";\nexport const AlchemyPaymasterAddressV07Unify =\n \"0x00000000000667F27D4DB42334ec11a25db7EBb4\";\n\nexport const AlchemyPaymasterAddressV4 =\n \"0xEaf0Cde110a5d503f2dD69B3a49E031e29b3F9D2\";\nexport const AlchemyPaymasterAddressV3 =\n \"0x4f84a207A80c39E9e8BaE717c1F25bA7AD1fB08F\";\nexport const AlchemyPaymasterAddressV2 =\n \"0x4Fd9098af9ddcB41DA48A1d78F91F1398965addc\";\nexport const ArbSepoliaPaymasterAddress =\n \"0x0804Afe6EEFb73ce7F93CD0d5e7079a5a8068592\";\nexport const AlchemyPaymasterAddressV1 =\n \"0xc03aac639bb21233e0139381970328db8bceeb67\";\n\nexport const AlchemyPaymasterAddressV07V2 =\n \"0x2cc0c7981D846b9F2a16276556f6e8cb52BfB633\";\nexport const AlchemyPaymasterAddressV07V1 =\n \"0xEF725Aa22d43Ea69FB22bE2EBe6ECa205a6BCf5B\";\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, \"0.6.0\");\n * ```\n *\n * @param {Chain} chain The chain for which the paymaster address is required\n * @param {EntryPointVersion} version The version of the entry point\n * @returns {Address} The Alchemy paymaster address corresponding to the specified chain\n */\nexport const getAlchemyPaymasterAddress = (\n chain: Chain,\n version: EntryPointVersion,\n): Address => {\n switch (version) {\n case \"0.6.0\":\n switch (chain.id) {\n case fraxtalSepolia.id:\n case worldChainSepolia.id:\n case shapeSepolia.id:\n case unichainSepolia.id:\n case opbnbTestnet.id:\n case inkSepolia.id:\n case monadTestnet.id:\n case openlootSepolia.id:\n case gensynTestnet.id:\n case riseTestnet.id:\n case storyAeneid.id:\n case teaSepolia.id:\n case arbitrumGoerli.id:\n case goerli.id:\n case optimismGoerli.id:\n case baseGoerli.id:\n case polygonMumbai.id:\n case worldChain.id:\n case shape.id:\n case unichainMainnet.id:\n case soneiumMinato.id:\n case soneiumMainnet.id:\n case opbnbMainnet.id:\n case beraChainBartio.id:\n case inkMainnet.id:\n case arbitrumNova.id:\n case storyMainnet.id:\n case celoAlfajores.id:\n case celoMainnet.id:\n return AlchemyPaymasterAddressV4;\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 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 return AlchemyPaymasterAddressV1;\n default:\n return AlchemyPaymasterAddressV06Unify;\n }\n case \"0.7.0\":\n switch (chain.id) {\n case arbitrumNova.id:\n case celoAlfajores.id:\n case celoMainnet.id:\n case gensynTestnet.id:\n case inkMainnet.id:\n case inkSepolia.id:\n case monadTestnet.id:\n case opbnbMainnet.id:\n case opbnbTestnet.id:\n case openlootSepolia.id:\n case riseTestnet.id:\n case shape.id:\n case shapeSepolia.id:\n case soneiumMainnet.id:\n case soneiumMinato.id:\n case storyAeneid.id:\n case storyMainnet.id:\n case teaSepolia.id:\n case unichainMainnet.id:\n case unichainSepolia.id:\n case worldChain.id:\n case worldChainSepolia.id:\n return AlchemyPaymasterAddressV07V1;\n case arbitrum.id:\n case arbitrumGoerli.id:\n case arbitrumSepolia.id:\n case base.id:\n case baseGoerli.id:\n case baseSepolia.id:\n case beraChainBartio.id:\n case fraxtal.id:\n case fraxtalSepolia.id:\n case goerli.id:\n case mainnet.id:\n case optimism.id:\n case optimismGoerli.id:\n case optimismSepolia.id:\n case polygon.id:\n case polygonAmoy.id:\n case polygonMumbai.id:\n case sepolia.id:\n case zora.id:\n case zoraSepolia.id:\n return AlchemyPaymasterAddressV07V2;\n default:\n return AlchemyPaymasterAddressV07Unify;\n }\n default:\n throw new Error(`Unsupported EntryPointVersion: ${version}`);\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 ERC20Abis = [\n \"function decimals() public view returns (uint8)\",\n \"function balanceOf(address owner) external view returns (uint256)\",\n \"function allowance(address owner, address spender) external view returns (uint256)\",\n \"function approve(address spender, uint256 amount) external returns (bool)\",\n] as const;\n\nexport const EIP7597Abis = [\n \"function nonces(address owner) external view returns (uint)\",\n] as const;\n\nexport const approveTokenCallData = (\n paymasterAddress: Address,\n allowance: BigInt,\n) => {\n return encodeFunctionData({\n abi: ERC20Abis,\n functionName: \"approve\",\n args: [paymasterAddress, allowance],\n });\n};\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,7 +1,7 @@
|
|
|
1
1
|
import { bypassPaymasterAndData, ChainNotFoundError, clientHeaderTrack, deepHexlify, defaultGasEstimator, erc7677Middleware, filterUndefined, isBigNumberish, isMultiplier, noopMiddleware, resolveProperties, } from "@aa-sdk/core";
|
|
2
|
-
import { fromHex, isHex,
|
|
2
|
+
import { fromHex, isHex, encodeAbiParameters, encodeFunctionData, parseAbi, } from "viem";
|
|
3
3
|
import { alchemyFeeEstimator } from "./feeEstimator.js";
|
|
4
|
-
import { PermitTypes,
|
|
4
|
+
import { PermitTypes, EIP7597Abis, ERC20Abis, getAlchemyPaymasterAddress, } from "../gas-manager.js";
|
|
5
5
|
/**
|
|
6
6
|
* Paymaster middleware factory that uses Alchemy's Gas Manager for sponsoring
|
|
7
7
|
* transactions. Adheres to the ERC-7677 standardized communication protocol.
|
|
@@ -23,32 +23,31 @@ import { PermitTypes, EIP712NoncesAbi } from "../gas-manager.js";
|
|
|
23
23
|
* @returns {Pick<ClientMiddlewareConfig, "dummyPaymasterAndData" | "paymasterAndData">} Partial client middleware configuration containing `dummyPaymasterAndData` and `paymasterAndData`
|
|
24
24
|
*/
|
|
25
25
|
export function alchemyGasManagerMiddleware(policyId, policyToken) {
|
|
26
|
-
const buildContext = async (
|
|
26
|
+
const buildContext = async (args) => {
|
|
27
27
|
const context = { policyId };
|
|
28
28
|
const { account, client } = args;
|
|
29
29
|
if (!client.chain) {
|
|
30
30
|
throw new ChainNotFoundError();
|
|
31
31
|
}
|
|
32
32
|
if (policyToken !== undefined) {
|
|
33
|
-
const userOp = await deepHexlify(await resolveProperties(uo));
|
|
34
33
|
context.erc20Context = {
|
|
35
34
|
tokenAddress: policyToken.address,
|
|
36
35
|
maxTokenAmount: policyToken.maxTokenAmount,
|
|
37
36
|
};
|
|
38
37
|
if (policyToken.approvalMode === "PERMIT") {
|
|
39
|
-
context.erc20Context.permit = await generateSignedPermit(
|
|
38
|
+
context.erc20Context.permit = await generateSignedPermit(client, account, policyToken);
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
41
|
return context;
|
|
43
42
|
};
|
|
44
43
|
return {
|
|
45
44
|
dummyPaymasterAndData: async (uo, args) => {
|
|
46
|
-
const context = await buildContext(
|
|
45
|
+
const context = await buildContext(args);
|
|
47
46
|
const baseMiddleware = erc7677Middleware({ context });
|
|
48
47
|
return baseMiddleware.dummyPaymasterAndData(uo, args);
|
|
49
48
|
},
|
|
50
49
|
paymasterAndData: async (uo, args) => {
|
|
51
|
-
const context = await buildContext(
|
|
50
|
+
const context = await buildContext(args);
|
|
52
51
|
const baseMiddleware = erc7677Middleware({ context });
|
|
53
52
|
return baseMiddleware.paymasterAndData(uo, args);
|
|
54
53
|
},
|
|
@@ -138,7 +137,7 @@ export function alchemyGasAndPaymasterAndDataMiddleware(params) {
|
|
|
138
137
|
maxTokenAmount: policyToken.maxTokenAmount,
|
|
139
138
|
};
|
|
140
139
|
if (policyToken.approvalMode === "PERMIT") {
|
|
141
|
-
erc20Context.permit = await generateSignedPermit(
|
|
140
|
+
erc20Context.permit = await generateSignedPermit(client, account, policyToken);
|
|
142
141
|
}
|
|
143
142
|
}
|
|
144
143
|
const result = await client.request({
|
|
@@ -204,19 +203,18 @@ const overrideField = (field, overrides, feeOptions, userOperation) => {
|
|
|
204
203
|
/**
|
|
205
204
|
* Utility function to generate a signed Permit for erc20 transaction
|
|
206
205
|
*
|
|
207
|
-
* @param {UserOperationRequest<TEntryPointVersion>} userOp - The user operation request
|
|
208
206
|
* @param {MiddlewareClient} client - The Alchemy smart account client
|
|
209
207
|
* @param {TAccount} account - The smart account instance
|
|
210
|
-
* @param {string | string[]} policyId - The policy ID or array of policy IDs
|
|
211
208
|
* @param {PolicyToken} policyToken - The policy token configuration
|
|
212
209
|
* @param {Address} policyToken.address - ERC20 contract addressya
|
|
213
210
|
* @param {bigint} [policyToken.maxTokenAmount] - Optional ERC20 token limit
|
|
211
|
+
* @param {Address} [policyToken.paymasterAddress] - Optional Paymaster Address
|
|
214
212
|
* @param {"NONE" | "PERMIT"} [policyToken.approvalMode] - ERC20 approve mode
|
|
215
213
|
* @param {string} [policyToken.erc20Name] - EIP2612 specified ERC20 contract name
|
|
216
214
|
* @param {string} [policyToken.version] - EIP2612 specified ERC20 contract version
|
|
217
215
|
* @returns {Promise<Hex>} Returns a Promise containing the signed EIP2612 permit
|
|
218
216
|
*/
|
|
219
|
-
const generateSignedPermit = async (
|
|
217
|
+
const generateSignedPermit = async (client, account, policyToken) => {
|
|
220
218
|
if (!client.chain) {
|
|
221
219
|
throw new ChainNotFoundError();
|
|
222
220
|
}
|
|
@@ -226,7 +224,7 @@ const generateSignedPermit = async (userOp, client, account, policyId, policyTok
|
|
|
226
224
|
let decimalsFuture = client.call({
|
|
227
225
|
to: policyToken.address,
|
|
228
226
|
data: encodeFunctionData({
|
|
229
|
-
abi: parseAbi(
|
|
227
|
+
abi: parseAbi(ERC20Abis),
|
|
230
228
|
functionName: "decimals",
|
|
231
229
|
args: [],
|
|
232
230
|
}),
|
|
@@ -234,26 +232,14 @@ const generateSignedPermit = async (userOp, client, account, policyId, policyTok
|
|
|
234
232
|
let nonceFuture = client.call({
|
|
235
233
|
to: policyToken.address,
|
|
236
234
|
data: encodeFunctionData({
|
|
237
|
-
abi: parseAbi(
|
|
235
|
+
abi: parseAbi(EIP7597Abis),
|
|
238
236
|
functionName: "nonces",
|
|
239
237
|
args: [account.address],
|
|
240
238
|
}),
|
|
241
239
|
});
|
|
242
|
-
|
|
243
|
-
method: "pm_getPaymasterStubData",
|
|
244
|
-
params: [
|
|
245
|
-
userOp,
|
|
246
|
-
account.getEntryPoint().address,
|
|
247
|
-
toHex(client.chain.id),
|
|
248
|
-
{
|
|
249
|
-
policyId: Array.isArray(policyId) ? policyId[0] : policyId,
|
|
250
|
-
},
|
|
251
|
-
],
|
|
252
|
-
});
|
|
253
|
-
const [decimalsResponse, nonceResponse, paymasterData] = await Promise.all([
|
|
240
|
+
const [decimalsResponse, nonceResponse] = await Promise.all([
|
|
254
241
|
decimalsFuture,
|
|
255
242
|
nonceFuture,
|
|
256
|
-
paymasterDataFuture,
|
|
257
243
|
]);
|
|
258
244
|
if (!decimalsResponse.data) {
|
|
259
245
|
throw new Error("No decimals returned from erc20 contract call");
|
|
@@ -264,11 +250,8 @@ const generateSignedPermit = async (userOp, client, account, policyId, policyTok
|
|
|
264
250
|
const decimals = 10n ** (decimalsResponse.data ? BigInt(decimalsResponse.data) : 18n);
|
|
265
251
|
const maxAmountToken = policyToken.maxTokenAmount * decimals;
|
|
266
252
|
const nonce = BigInt(nonceResponse.data);
|
|
267
|
-
const paymasterAddress =
|
|
268
|
-
|
|
269
|
-
: paymasterData.paymasterAndData
|
|
270
|
-
? sliceHex(paymasterData.paymasterAndData, 0, 20)
|
|
271
|
-
: undefined;
|
|
253
|
+
const paymasterAddress = policyToken.paymasterAddress ??
|
|
254
|
+
getAlchemyPaymasterAddress(client.chain, account.getEntryPoint().version);
|
|
272
255
|
if (paymasterAddress === undefined || paymasterAddress === "0x") {
|
|
273
256
|
throw new Error("no paymaster contract address available");
|
|
274
257
|
}
|
|
@@ -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 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 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 maxTokenAmount: policyToken.maxTokenAmount,\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 maxTokenAmount: policyToken.maxTokenAmount,\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 decimalsFuture = client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(EIP712NoncesAbi),\n functionName: \"decimals\",\n args: [],\n }),\n });\n\n let nonceFuture = client.call({\n to: policyToken.address,\n data: encodeFunctionData({\n abi: parseAbi(EIP712NoncesAbi),\n functionName: \"nonces\",\n args: [account.address],\n }),\n });\n\n let paymasterDataFuture = (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 [decimalsResponse, nonceResponse, paymasterData] = await Promise.all([\n decimalsFuture,\n nonceFuture,\n paymasterDataFuture,\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 = 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\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":"AAWA,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,EAEL,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,GACT,MAAM,MAAM,CAAC;AAGd,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EACL,WAAW,EACX,WAAW,EACX,SAAS,EACT,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAY3B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAA2B,EAC3B,WAAyB;IAIzB,MAAM,YAAY,GAAG,KAAK,EACxB,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,OAAO,CAAC,YAAY,GAAG;gBACrB,YAAY,EAAE,WAAW,CAAC,OAAO;gBACjC,cAAc,EAAE,WAAW,CAAC,cAAc;aAC3C,CAAC;YAEF,IAAI,WAAW,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAC1C,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,oBAAoB,CACtD,MAAmC,EACnC,OAAO,EACP,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,IAAI,CAAC,CAAC;YACzC,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,IAAI,CAAC,CAAC;YACzC,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;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;oBACtC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC;oBAC1C,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjC,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;oBACtC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC;oBAC5C,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjC,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,cAAc,EAAE,WAAW,CAAC,cAAc;iBAC3C,CAAC;gBACF,IAAI,WAAW,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;oBAC1C,YAAY,CAAC,MAAM,GAAG,MAAM,oBAAoB,CAC9C,MAAM,EACN,OAAO,EACP,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;;;;;;;;;;;;;GAaG;AACH,MAAM,oBAAoB,GAAG,KAAK,EAChC,MAAwB,EACxB,OAAiB,EACjB,WAOC,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;IAED,IAAI,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,EAAE,EAAE,WAAW,CAAC,OAAO;QACvB,IAAI,EAAE,kBAAkB,CAAC;YACvB,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC;YACxB,YAAY,EAAE,UAAU;YACxB,IAAI,EAAE,EAAE;SACT,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,EAAE,EAAE,WAAW,CAAC,OAAO;QACvB,IAAI,EAAE,kBAAkB,CAAC;YACvB,GAAG,EAAE,QAAQ,CAAC,WAAW,CAAC;YAC1B,YAAY,EAAE,QAAQ;YACtB,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SACxB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1D,cAAc;QACd,WAAW;KACZ,CAAC,CAAC;IACH,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GACZ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,GAAG,QAAQ,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,gBAAgB,GACpB,WAAW,CAAC,gBAAgB;QAC5B,0BAA0B,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC;IAE5E,IAAI,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAEjE,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,KAAK;YACZ,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 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"]}
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "4.
|
|
1
|
+
export declare const VERSION = "4.45.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.45.0\";\n"]}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Address, type Chain, type Hex } from "viem";
|
|
2
|
+
import type { EntryPointVersion } from "@aa-sdk/core";
|
|
3
|
+
export declare const AlchemyPaymasterAddressV06Unify = "0x0000000000ce04e2359130e7d0204A5249958921";
|
|
4
|
+
export declare const AlchemyPaymasterAddressV07Unify = "0x00000000000667F27D4DB42334ec11a25db7EBb4";
|
|
5
|
+
export declare const AlchemyPaymasterAddressV4 = "0xEaf0Cde110a5d503f2dD69B3a49E031e29b3F9D2";
|
|
2
6
|
export declare const AlchemyPaymasterAddressV3 = "0x4f84a207A80c39E9e8BaE717c1F25bA7AD1fB08F";
|
|
3
7
|
export declare const AlchemyPaymasterAddressV2 = "0x4Fd9098af9ddcB41DA48A1d78F91F1398965addc";
|
|
4
8
|
export declare const ArbSepoliaPaymasterAddress = "0x0804Afe6EEFb73ce7F93CD0d5e7079a5a8068592";
|
|
5
9
|
export declare const AlchemyPaymasterAddressV1 = "0xc03aac639bb21233e0139381970328db8bceeb67";
|
|
10
|
+
export declare const AlchemyPaymasterAddressV07V2 = "0x2cc0c7981D846b9F2a16276556f6e8cb52BfB633";
|
|
11
|
+
export declare const AlchemyPaymasterAddressV07V1 = "0xEF725Aa22d43Ea69FB22bE2EBe6ECa205a6BCf5B";
|
|
6
12
|
/**
|
|
7
13
|
* Retrieves the Alchemy paymaster address for the given chain. Returns different addresses based on the chain ID.
|
|
8
14
|
*
|
|
@@ -10,15 +16,14 @@ export declare const AlchemyPaymasterAddressV1 = "0xc03aac639bb21233e01393819703
|
|
|
10
16
|
* ```ts
|
|
11
17
|
* import { sepolia, getAlchemyPaymasterAddress } from "@account-kit/infra";
|
|
12
18
|
*
|
|
13
|
-
* const paymasterAddress = getAlchemyPaymasterAddress(sepolia);
|
|
19
|
+
* const paymasterAddress = getAlchemyPaymasterAddress(sepolia, "0.6.0");
|
|
14
20
|
* ```
|
|
15
21
|
*
|
|
16
22
|
* @param {Chain} chain The chain for which the paymaster address is required
|
|
23
|
+
* @param {EntryPointVersion} version The version of the entry point
|
|
17
24
|
* @returns {Address} The Alchemy paymaster address corresponding to the specified chain
|
|
18
|
-
*
|
|
19
|
-
* @deprecated This chain list in this function is no longer maintained since the ERC-7677 middleware is typically used to resolve the paymaster address
|
|
20
25
|
*/
|
|
21
|
-
export declare const getAlchemyPaymasterAddress: (chain: Chain) => Address;
|
|
26
|
+
export declare const getAlchemyPaymasterAddress: (chain: Chain, version: EntryPointVersion) => Address;
|
|
22
27
|
export declare const PermitTypes: {
|
|
23
28
|
readonly EIP712Domain: readonly [{
|
|
24
29
|
readonly name: "name";
|
|
@@ -50,7 +55,9 @@ export declare const PermitTypes: {
|
|
|
50
55
|
readonly type: "uint256";
|
|
51
56
|
}];
|
|
52
57
|
};
|
|
53
|
-
export declare const
|
|
58
|
+
export declare const ERC20Abis: readonly ["function decimals() public view returns (uint8)", "function balanceOf(address owner) external view returns (uint256)", "function allowance(address owner, address spender) external view returns (uint256)", "function approve(address spender, uint256 amount) external returns (bool)"];
|
|
59
|
+
export declare const EIP7597Abis: readonly ["function nonces(address owner) external view returns (uint)"];
|
|
60
|
+
export declare const approveTokenCallData: (paymasterAddress: Address, allowance: BigInt) => `0x${string}`;
|
|
54
61
|
export type PermitMessage = {
|
|
55
62
|
owner: Hex;
|
|
56
63
|
spender: Hex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas-manager.d.ts","sourceRoot":"","sources":["../../src/gas-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"gas-manager.d.ts","sourceRoot":"","sources":["../../src/gas-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AA6C9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,eAAO,MAAM,+BAA+B,+CACE,CAAC;AAC/C,eAAO,MAAM,+BAA+B,+CACE,CAAC;AAE/C,eAAO,MAAM,yBAAyB,+CACQ,CAAC;AAC/C,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,eAAO,MAAM,4BAA4B,+CACK,CAAC;AAC/C,eAAO,MAAM,4BAA4B,+CACK,CAAC;AAE/C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B,GACrC,OAAO,KAAK,EACZ,SAAS,iBAAiB,KACzB,OA0GF,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAcd,CAAC;AAEX,eAAO,MAAM,SAAS,sSAKZ,CAAC;AAEX,eAAO,MAAM,WAAW,0EAEd,CAAC;AAEX,eAAO,MAAM,oBAAoB,GAC/B,kBAAkB,OAAO,EACzB,WAAW,MAAM,kBAOlB,CAAC;AAEF,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 +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,EAOnB,MAAM,cAAc,CAAC;AAuBtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAoB/D;;;;;;;;;;;;;;;;;;;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,CAyCA;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,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,uCAAuC,CACrD,MAAM,EAAE,6CAA6C,GACpD,IAAI,CACL,sBAAsB,EACtB,uBAAuB,GAAG,cAAc,GAAG,cAAc,GAAG,kBAAkB,CAC/E,CA4IA"}
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "4.
|
|
1
|
+
export declare const VERSION = "4.45.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.45.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.45.0",
|
|
47
|
+
"@account-kit/logging": "^4.45.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": "00073ad37479818c37646a7f2600ddf3d0fcb91f",
|
|
67
67
|
"optionalDependencies": {
|
|
68
68
|
"alchemy-sdk": "^3.0.0"
|
|
69
69
|
}
|
package/src/gas-manager.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { encodeFunctionData, type Address, type Chain, type Hex } from "viem";
|
|
2
2
|
import {
|
|
3
3
|
arbitrum,
|
|
4
4
|
arbitrumSepolia,
|
|
@@ -11,12 +11,46 @@ import {
|
|
|
11
11
|
optimismSepolia,
|
|
12
12
|
polygon,
|
|
13
13
|
polygonAmoy,
|
|
14
|
-
|
|
14
|
+
unichainSepolia,
|
|
15
|
+
worldChainSepolia,
|
|
15
16
|
sepolia,
|
|
16
17
|
zora,
|
|
17
18
|
zoraSepolia,
|
|
19
|
+
shapeSepolia,
|
|
20
|
+
optimismGoerli,
|
|
21
|
+
arbitrumGoerli,
|
|
22
|
+
arbitrumNova,
|
|
23
|
+
baseGoerli,
|
|
24
|
+
beraChainBartio,
|
|
25
|
+
celoAlfajores,
|
|
26
|
+
celoMainnet,
|
|
27
|
+
gensynTestnet,
|
|
28
|
+
goerli,
|
|
29
|
+
inkMainnet,
|
|
30
|
+
inkSepolia,
|
|
31
|
+
monadTestnet,
|
|
32
|
+
opbnbMainnet,
|
|
33
|
+
opbnbTestnet,
|
|
34
|
+
openlootSepolia,
|
|
35
|
+
polygonMumbai,
|
|
36
|
+
riseTestnet,
|
|
37
|
+
shape,
|
|
38
|
+
soneiumMainnet,
|
|
39
|
+
soneiumMinato,
|
|
40
|
+
storyAeneid,
|
|
41
|
+
storyMainnet,
|
|
42
|
+
teaSepolia,
|
|
43
|
+
unichainMainnet,
|
|
44
|
+
worldChain,
|
|
18
45
|
} from "./chains.js";
|
|
46
|
+
import type { EntryPointVersion } from "@aa-sdk/core";
|
|
47
|
+
export const AlchemyPaymasterAddressV06Unify =
|
|
48
|
+
"0x0000000000ce04e2359130e7d0204A5249958921";
|
|
49
|
+
export const AlchemyPaymasterAddressV07Unify =
|
|
50
|
+
"0x00000000000667F27D4DB42334ec11a25db7EBb4";
|
|
19
51
|
|
|
52
|
+
export const AlchemyPaymasterAddressV4 =
|
|
53
|
+
"0xEaf0Cde110a5d503f2dD69B3a49E031e29b3F9D2";
|
|
20
54
|
export const AlchemyPaymasterAddressV3 =
|
|
21
55
|
"0x4f84a207A80c39E9e8BaE717c1F25bA7AD1fB08F";
|
|
22
56
|
export const AlchemyPaymasterAddressV2 =
|
|
@@ -26,6 +60,11 @@ export const ArbSepoliaPaymasterAddress =
|
|
|
26
60
|
export const AlchemyPaymasterAddressV1 =
|
|
27
61
|
"0xc03aac639bb21233e0139381970328db8bceeb67";
|
|
28
62
|
|
|
63
|
+
export const AlchemyPaymasterAddressV07V2 =
|
|
64
|
+
"0x2cc0c7981D846b9F2a16276556f6e8cb52BfB633";
|
|
65
|
+
export const AlchemyPaymasterAddressV07V1 =
|
|
66
|
+
"0xEF725Aa22d43Ea69FB22bE2EBe6ECa205a6BCf5B";
|
|
67
|
+
|
|
29
68
|
/**
|
|
30
69
|
* Retrieves the Alchemy paymaster address for the given chain. Returns different addresses based on the chain ID.
|
|
31
70
|
*
|
|
@@ -33,37 +72,121 @@ export const AlchemyPaymasterAddressV1 =
|
|
|
33
72
|
* ```ts
|
|
34
73
|
* import { sepolia, getAlchemyPaymasterAddress } from "@account-kit/infra";
|
|
35
74
|
*
|
|
36
|
-
* const paymasterAddress = getAlchemyPaymasterAddress(sepolia);
|
|
75
|
+
* const paymasterAddress = getAlchemyPaymasterAddress(sepolia, "0.6.0");
|
|
37
76
|
* ```
|
|
38
77
|
*
|
|
39
78
|
* @param {Chain} chain The chain for which the paymaster address is required
|
|
79
|
+
* @param {EntryPointVersion} version The version of the entry point
|
|
40
80
|
* @returns {Address} The Alchemy paymaster address corresponding to the specified chain
|
|
41
|
-
*
|
|
42
|
-
* @deprecated This chain list in this function is no longer maintained since the ERC-7677 middleware is typically used to resolve the paymaster address
|
|
43
81
|
*/
|
|
44
|
-
export const getAlchemyPaymasterAddress = (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
case
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
82
|
+
export const getAlchemyPaymasterAddress = (
|
|
83
|
+
chain: Chain,
|
|
84
|
+
version: EntryPointVersion,
|
|
85
|
+
): Address => {
|
|
86
|
+
switch (version) {
|
|
87
|
+
case "0.6.0":
|
|
88
|
+
switch (chain.id) {
|
|
89
|
+
case fraxtalSepolia.id:
|
|
90
|
+
case worldChainSepolia.id:
|
|
91
|
+
case shapeSepolia.id:
|
|
92
|
+
case unichainSepolia.id:
|
|
93
|
+
case opbnbTestnet.id:
|
|
94
|
+
case inkSepolia.id:
|
|
95
|
+
case monadTestnet.id:
|
|
96
|
+
case openlootSepolia.id:
|
|
97
|
+
case gensynTestnet.id:
|
|
98
|
+
case riseTestnet.id:
|
|
99
|
+
case storyAeneid.id:
|
|
100
|
+
case teaSepolia.id:
|
|
101
|
+
case arbitrumGoerli.id:
|
|
102
|
+
case goerli.id:
|
|
103
|
+
case optimismGoerli.id:
|
|
104
|
+
case baseGoerli.id:
|
|
105
|
+
case polygonMumbai.id:
|
|
106
|
+
case worldChain.id:
|
|
107
|
+
case shape.id:
|
|
108
|
+
case unichainMainnet.id:
|
|
109
|
+
case soneiumMinato.id:
|
|
110
|
+
case soneiumMainnet.id:
|
|
111
|
+
case opbnbMainnet.id:
|
|
112
|
+
case beraChainBartio.id:
|
|
113
|
+
case inkMainnet.id:
|
|
114
|
+
case arbitrumNova.id:
|
|
115
|
+
case storyMainnet.id:
|
|
116
|
+
case celoAlfajores.id:
|
|
117
|
+
case celoMainnet.id:
|
|
118
|
+
return AlchemyPaymasterAddressV4;
|
|
119
|
+
case polygonAmoy.id:
|
|
120
|
+
case optimismSepolia.id:
|
|
121
|
+
case baseSepolia.id:
|
|
122
|
+
case zora.id:
|
|
123
|
+
case zoraSepolia.id:
|
|
124
|
+
case fraxtal.id:
|
|
125
|
+
return AlchemyPaymasterAddressV3;
|
|
126
|
+
case mainnet.id:
|
|
127
|
+
case arbitrum.id:
|
|
128
|
+
case optimism.id:
|
|
129
|
+
case polygon.id:
|
|
130
|
+
case base.id:
|
|
131
|
+
return AlchemyPaymasterAddressV2;
|
|
132
|
+
case arbitrumSepolia.id:
|
|
133
|
+
return ArbSepoliaPaymasterAddress;
|
|
134
|
+
case sepolia.id:
|
|
135
|
+
return AlchemyPaymasterAddressV1;
|
|
136
|
+
default:
|
|
137
|
+
return AlchemyPaymasterAddressV06Unify;
|
|
138
|
+
}
|
|
139
|
+
case "0.7.0":
|
|
140
|
+
switch (chain.id) {
|
|
141
|
+
case arbitrumNova.id:
|
|
142
|
+
case celoAlfajores.id:
|
|
143
|
+
case celoMainnet.id:
|
|
144
|
+
case gensynTestnet.id:
|
|
145
|
+
case inkMainnet.id:
|
|
146
|
+
case inkSepolia.id:
|
|
147
|
+
case monadTestnet.id:
|
|
148
|
+
case opbnbMainnet.id:
|
|
149
|
+
case opbnbTestnet.id:
|
|
150
|
+
case openlootSepolia.id:
|
|
151
|
+
case riseTestnet.id:
|
|
152
|
+
case shape.id:
|
|
153
|
+
case shapeSepolia.id:
|
|
154
|
+
case soneiumMainnet.id:
|
|
155
|
+
case soneiumMinato.id:
|
|
156
|
+
case storyAeneid.id:
|
|
157
|
+
case storyMainnet.id:
|
|
158
|
+
case teaSepolia.id:
|
|
159
|
+
case unichainMainnet.id:
|
|
160
|
+
case unichainSepolia.id:
|
|
161
|
+
case worldChain.id:
|
|
162
|
+
case worldChainSepolia.id:
|
|
163
|
+
return AlchemyPaymasterAddressV07V1;
|
|
164
|
+
case arbitrum.id:
|
|
165
|
+
case arbitrumGoerli.id:
|
|
166
|
+
case arbitrumSepolia.id:
|
|
167
|
+
case base.id:
|
|
168
|
+
case baseGoerli.id:
|
|
169
|
+
case baseSepolia.id:
|
|
170
|
+
case beraChainBartio.id:
|
|
171
|
+
case fraxtal.id:
|
|
172
|
+
case fraxtalSepolia.id:
|
|
173
|
+
case goerli.id:
|
|
174
|
+
case mainnet.id:
|
|
175
|
+
case optimism.id:
|
|
176
|
+
case optimismGoerli.id:
|
|
177
|
+
case optimismSepolia.id:
|
|
178
|
+
case polygon.id:
|
|
179
|
+
case polygonAmoy.id:
|
|
180
|
+
case polygonMumbai.id:
|
|
181
|
+
case sepolia.id:
|
|
182
|
+
case zora.id:
|
|
183
|
+
case zoraSepolia.id:
|
|
184
|
+
return AlchemyPaymasterAddressV07V2;
|
|
185
|
+
default:
|
|
186
|
+
return AlchemyPaymasterAddressV07Unify;
|
|
187
|
+
}
|
|
65
188
|
default:
|
|
66
|
-
throw new Error(`Unsupported
|
|
189
|
+
throw new Error(`Unsupported EntryPointVersion: ${version}`);
|
|
67
190
|
}
|
|
68
191
|
};
|
|
69
192
|
|
|
@@ -83,13 +206,28 @@ export const PermitTypes = {
|
|
|
83
206
|
],
|
|
84
207
|
} as const;
|
|
85
208
|
|
|
86
|
-
export const
|
|
87
|
-
"function nonces(address owner) external view returns (uint)",
|
|
209
|
+
export const ERC20Abis = [
|
|
88
210
|
"function decimals() public view returns (uint8)",
|
|
89
211
|
"function balanceOf(address owner) external view returns (uint256)",
|
|
90
212
|
"function allowance(address owner, address spender) external view returns (uint256)",
|
|
213
|
+
"function approve(address spender, uint256 amount) external returns (bool)",
|
|
91
214
|
] as const;
|
|
92
215
|
|
|
216
|
+
export const EIP7597Abis = [
|
|
217
|
+
"function nonces(address owner) external view returns (uint)",
|
|
218
|
+
] as const;
|
|
219
|
+
|
|
220
|
+
export const approveTokenCallData = (
|
|
221
|
+
paymasterAddress: Address,
|
|
222
|
+
allowance: BigInt,
|
|
223
|
+
) => {
|
|
224
|
+
return encodeFunctionData({
|
|
225
|
+
abi: ERC20Abis,
|
|
226
|
+
functionName: "approve",
|
|
227
|
+
args: [paymasterAddress, allowance],
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
|
|
93
231
|
export type PermitMessage = {
|
|
94
232
|
owner: Hex;
|
|
95
233
|
spender: Hex;
|
|
@@ -3,7 +3,6 @@ import type {
|
|
|
3
3
|
ClientMiddlewareConfig,
|
|
4
4
|
ClientMiddlewareFn,
|
|
5
5
|
EntryPointVersion,
|
|
6
|
-
Erc7677Client,
|
|
7
6
|
Multiplier,
|
|
8
7
|
SmartContractAccount,
|
|
9
8
|
UserOperationFeeOptions,
|
|
@@ -26,18 +25,21 @@ import {
|
|
|
26
25
|
import {
|
|
27
26
|
fromHex,
|
|
28
27
|
isHex,
|
|
29
|
-
toHex,
|
|
30
28
|
type Hex,
|
|
31
29
|
encodeAbiParameters,
|
|
32
30
|
encodeFunctionData,
|
|
33
31
|
parseAbi,
|
|
34
|
-
sliceHex,
|
|
35
32
|
} from "viem";
|
|
36
33
|
import type { AlchemySmartAccountClient } from "../client/smartAccountClient.js";
|
|
37
34
|
import type { AlchemyTransport } from "../alchemyTransport.js";
|
|
38
35
|
import { alchemyFeeEstimator } from "./feeEstimator.js";
|
|
39
36
|
import type { RequestGasAndPaymasterAndDataRequest } from "../actions/types.js";
|
|
40
|
-
import {
|
|
37
|
+
import {
|
|
38
|
+
PermitTypes,
|
|
39
|
+
EIP7597Abis,
|
|
40
|
+
ERC20Abis,
|
|
41
|
+
getAlchemyPaymasterAddress,
|
|
42
|
+
} from "../gas-manager.js";
|
|
41
43
|
import type { PermitMessage, PermitDomain } from "../gas-manager.js";
|
|
42
44
|
import type { MiddlewareClient } from "../../../../aa-sdk/core/dist/types/middleware/actions.js";
|
|
43
45
|
|
|
@@ -76,7 +78,6 @@ export function alchemyGasManagerMiddleware(
|
|
|
76
78
|
Pick<ClientMiddlewareConfig, "dummyPaymasterAndData" | "paymasterAndData">
|
|
77
79
|
> {
|
|
78
80
|
const buildContext = async (
|
|
79
|
-
uo: Parameters<ClientMiddlewareFn>[0],
|
|
80
81
|
args: Parameters<ClientMiddlewareFn>[1],
|
|
81
82
|
): Promise<Context> => {
|
|
82
83
|
const context: Context = { policyId };
|
|
@@ -87,7 +88,6 @@ export function alchemyGasManagerMiddleware(
|
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
if (policyToken !== undefined) {
|
|
90
|
-
const userOp = await deepHexlify(await resolveProperties(uo));
|
|
91
91
|
context.erc20Context = {
|
|
92
92
|
tokenAddress: policyToken.address,
|
|
93
93
|
maxTokenAmount: policyToken.maxTokenAmount,
|
|
@@ -95,10 +95,8 @@ export function alchemyGasManagerMiddleware(
|
|
|
95
95
|
|
|
96
96
|
if (policyToken.approvalMode === "PERMIT") {
|
|
97
97
|
context.erc20Context.permit = await generateSignedPermit(
|
|
98
|
-
userOp,
|
|
99
98
|
client as AlchemySmartAccountClient,
|
|
100
99
|
account,
|
|
101
|
-
policyId,
|
|
102
100
|
policyToken,
|
|
103
101
|
);
|
|
104
102
|
}
|
|
@@ -108,13 +106,13 @@ export function alchemyGasManagerMiddleware(
|
|
|
108
106
|
};
|
|
109
107
|
return {
|
|
110
108
|
dummyPaymasterAndData: async (uo, args) => {
|
|
111
|
-
const context = await buildContext(
|
|
109
|
+
const context = await buildContext(args);
|
|
112
110
|
const baseMiddleware = erc7677Middleware({ context });
|
|
113
111
|
return baseMiddleware.dummyPaymasterAndData(uo, args);
|
|
114
112
|
},
|
|
115
113
|
|
|
116
114
|
paymasterAndData: async (uo, args) => {
|
|
117
|
-
const context = await buildContext(
|
|
115
|
+
const context = await buildContext(args);
|
|
118
116
|
const baseMiddleware = erc7677Middleware({ context });
|
|
119
117
|
return baseMiddleware.paymasterAndData(uo, args);
|
|
120
118
|
},
|
|
@@ -132,6 +130,7 @@ interface AlchemyGasAndPaymasterAndDataMiddlewareParams {
|
|
|
132
130
|
export type PolicyToken = {
|
|
133
131
|
address: Address;
|
|
134
132
|
maxTokenAmount: bigint;
|
|
133
|
+
paymasterAddress?: Address;
|
|
135
134
|
approvalMode?: "NONE" | "PERMIT";
|
|
136
135
|
erc20Name?: string;
|
|
137
136
|
version?: string;
|
|
@@ -280,10 +279,8 @@ export function alchemyGasAndPaymasterAndDataMiddleware(
|
|
|
280
279
|
};
|
|
281
280
|
if (policyToken.approvalMode === "PERMIT") {
|
|
282
281
|
erc20Context.permit = await generateSignedPermit(
|
|
283
|
-
userOp,
|
|
284
282
|
client,
|
|
285
283
|
account,
|
|
286
|
-
policyId,
|
|
287
284
|
policyToken,
|
|
288
285
|
);
|
|
289
286
|
}
|
|
@@ -366,29 +363,24 @@ const overrideField = <
|
|
|
366
363
|
/**
|
|
367
364
|
* Utility function to generate a signed Permit for erc20 transaction
|
|
368
365
|
*
|
|
369
|
-
* @param {UserOperationRequest<TEntryPointVersion>} userOp - The user operation request
|
|
370
366
|
* @param {MiddlewareClient} client - The Alchemy smart account client
|
|
371
367
|
* @param {TAccount} account - The smart account instance
|
|
372
|
-
* @param {string | string[]} policyId - The policy ID or array of policy IDs
|
|
373
368
|
* @param {PolicyToken} policyToken - The policy token configuration
|
|
374
369
|
* @param {Address} policyToken.address - ERC20 contract addressya
|
|
375
370
|
* @param {bigint} [policyToken.maxTokenAmount] - Optional ERC20 token limit
|
|
371
|
+
* @param {Address} [policyToken.paymasterAddress] - Optional Paymaster Address
|
|
376
372
|
* @param {"NONE" | "PERMIT"} [policyToken.approvalMode] - ERC20 approve mode
|
|
377
373
|
* @param {string} [policyToken.erc20Name] - EIP2612 specified ERC20 contract name
|
|
378
374
|
* @param {string} [policyToken.version] - EIP2612 specified ERC20 contract version
|
|
379
375
|
* @returns {Promise<Hex>} Returns a Promise containing the signed EIP2612 permit
|
|
380
376
|
*/
|
|
381
|
-
const generateSignedPermit = async <
|
|
382
|
-
TAccount extends SmartContractAccount,
|
|
383
|
-
TEntryPointVersion extends EntryPointVersion = EntryPointVersion,
|
|
384
|
-
>(
|
|
385
|
-
userOp: UserOperationRequest<TEntryPointVersion>,
|
|
377
|
+
const generateSignedPermit = async <TAccount extends SmartContractAccount>(
|
|
386
378
|
client: MiddlewareClient,
|
|
387
379
|
account: TAccount,
|
|
388
|
-
policyId: string | string[],
|
|
389
380
|
policyToken: {
|
|
390
381
|
address: Address;
|
|
391
382
|
maxTokenAmount: bigint;
|
|
383
|
+
paymasterAddress?: Address;
|
|
392
384
|
approvalMode?: "NONE" | "PERMIT";
|
|
393
385
|
erc20Name?: string;
|
|
394
386
|
version?: string;
|
|
@@ -404,7 +396,7 @@ const generateSignedPermit = async <
|
|
|
404
396
|
let decimalsFuture = client.call({
|
|
405
397
|
to: policyToken.address,
|
|
406
398
|
data: encodeFunctionData({
|
|
407
|
-
abi: parseAbi(
|
|
399
|
+
abi: parseAbi(ERC20Abis),
|
|
408
400
|
functionName: "decimals",
|
|
409
401
|
args: [],
|
|
410
402
|
}),
|
|
@@ -413,28 +405,15 @@ const generateSignedPermit = async <
|
|
|
413
405
|
let nonceFuture = client.call({
|
|
414
406
|
to: policyToken.address,
|
|
415
407
|
data: encodeFunctionData({
|
|
416
|
-
abi: parseAbi(
|
|
408
|
+
abi: parseAbi(EIP7597Abis),
|
|
417
409
|
functionName: "nonces",
|
|
418
410
|
args: [account.address],
|
|
419
411
|
}),
|
|
420
412
|
});
|
|
421
413
|
|
|
422
|
-
|
|
423
|
-
method: "pm_getPaymasterStubData",
|
|
424
|
-
params: [
|
|
425
|
-
userOp,
|
|
426
|
-
account.getEntryPoint().address,
|
|
427
|
-
toHex(client.chain.id),
|
|
428
|
-
{
|
|
429
|
-
policyId: Array.isArray(policyId) ? policyId[0] : policyId,
|
|
430
|
-
},
|
|
431
|
-
],
|
|
432
|
-
});
|
|
433
|
-
|
|
434
|
-
const [decimalsResponse, nonceResponse, paymasterData] = await Promise.all([
|
|
414
|
+
const [decimalsResponse, nonceResponse] = await Promise.all([
|
|
435
415
|
decimalsFuture,
|
|
436
416
|
nonceFuture,
|
|
437
|
-
paymasterDataFuture,
|
|
438
417
|
]);
|
|
439
418
|
if (!decimalsResponse.data) {
|
|
440
419
|
throw new Error("No decimals returned from erc20 contract call");
|
|
@@ -448,11 +427,9 @@ const generateSignedPermit = async <
|
|
|
448
427
|
const maxAmountToken = policyToken.maxTokenAmount * decimals;
|
|
449
428
|
const nonce = BigInt(nonceResponse.data);
|
|
450
429
|
|
|
451
|
-
const paymasterAddress =
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
? sliceHex(paymasterData.paymasterAndData, 0, 20)
|
|
455
|
-
: undefined;
|
|
430
|
+
const paymasterAddress =
|
|
431
|
+
policyToken.paymasterAddress ??
|
|
432
|
+
getAlchemyPaymasterAddress(client.chain, account.getEntryPoint().version);
|
|
456
433
|
|
|
457
434
|
if (paymasterAddress === undefined || paymasterAddress === "0x") {
|
|
458
435
|
throw new Error("no paymaster contract address available");
|
package/src/version.ts
CHANGED