@zerodev/sdk 4.0.34 → 4.1.1

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.
Files changed (74) hide show
  1. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
  2. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js +53 -4
  3. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -1
  4. package/dist/cjs/kernel-zerodev/account.d.ts +3 -0
  5. package/dist/cjs/kernel-zerodev/account.js +47 -6
  6. package/dist/cjs/kernel-zerodev/account.js.map +1 -1
  7. package/dist/cjs/kernel-zerodev/constants.d.ts +2 -2
  8. package/dist/cjs/kernel-zerodev/constants.js +2 -2
  9. package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
  10. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  11. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.js.map +1 -1
  12. package/dist/cjs/kernel-zerodev/middleware/gas-estimator.js +1 -2
  13. package/dist/cjs/kernel-zerodev/middleware/gas-estimator.js.map +1 -1
  14. package/dist/cjs/kernel-zerodev/middleware/paymaster.js +19 -6
  15. package/dist/cjs/kernel-zerodev/middleware/paymaster.js.map +1 -1
  16. package/dist/cjs/kernel-zerodev/paymaster/base.js +36 -33
  17. package/dist/cjs/kernel-zerodev/paymaster/base.js.map +1 -1
  18. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
  19. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js +48 -39
  20. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js.map +1 -1
  21. package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.js +7 -15
  22. package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.js.map +1 -1
  23. package/dist/cjs/kernel-zerodev/provider.js +1 -2
  24. package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
  25. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
  26. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js +53 -4
  27. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -1
  28. package/dist/esm/kernel-zerodev/account.d.ts +3 -0
  29. package/dist/esm/kernel-zerodev/account.js +47 -6
  30. package/dist/esm/kernel-zerodev/account.js.map +1 -1
  31. package/dist/esm/kernel-zerodev/constants.d.ts +2 -2
  32. package/dist/esm/kernel-zerodev/constants.js +2 -2
  33. package/dist/esm/kernel-zerodev/constants.js.map +1 -1
  34. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  35. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.js.map +1 -1
  36. package/dist/esm/kernel-zerodev/middleware/gas-estimator.js +1 -2
  37. package/dist/esm/kernel-zerodev/middleware/gas-estimator.js.map +1 -1
  38. package/dist/esm/kernel-zerodev/middleware/paymaster.js +19 -6
  39. package/dist/esm/kernel-zerodev/middleware/paymaster.js.map +1 -1
  40. package/dist/esm/kernel-zerodev/paymaster/base.js +36 -33
  41. package/dist/esm/kernel-zerodev/paymaster/base.js.map +1 -1
  42. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
  43. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js +47 -39
  44. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js.map +1 -1
  45. package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.js +7 -15
  46. package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.js.map +1 -1
  47. package/dist/esm/kernel-zerodev/provider.js +1 -2
  48. package/dist/esm/kernel-zerodev/provider.js.map +1 -1
  49. package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
  50. package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts.map +1 -1
  51. package/dist/types/kernel-zerodev/account.d.ts +3 -0
  52. package/dist/types/kernel-zerodev/account.d.ts.map +1 -1
  53. package/dist/types/kernel-zerodev/constants.d.ts +2 -2
  54. package/dist/types/kernel-zerodev/constants.d.ts.map +1 -1
  55. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  56. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts.map +1 -1
  57. package/dist/types/kernel-zerodev/middleware/gas-estimator.d.ts.map +1 -1
  58. package/dist/types/kernel-zerodev/middleware/paymaster.d.ts.map +1 -1
  59. package/dist/types/kernel-zerodev/paymaster/base.d.ts.map +1 -1
  60. package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
  61. package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts.map +1 -1
  62. package/dist/types/kernel-zerodev/paymaster/verifying-paymaster.d.ts.map +1 -1
  63. package/dist/types/kernel-zerodev/provider.d.ts.map +1 -1
  64. package/package.json +1 -1
  65. package/src/kernel-zerodev/abis/KernelAccountAbi.ts +53 -4
  66. package/src/kernel-zerodev/account.ts +57 -10
  67. package/src/kernel-zerodev/constants.ts +3 -2
  68. package/src/kernel-zerodev/ethers-provider/account-signer.ts +1 -1
  69. package/src/kernel-zerodev/middleware/gas-estimator.ts +1 -2
  70. package/src/kernel-zerodev/middleware/paymaster.ts +20 -9
  71. package/src/kernel-zerodev/paymaster/base.ts +44 -38
  72. package/src/kernel-zerodev/paymaster/token-paymaster.ts +74 -53
  73. package/src/kernel-zerodev/paymaster/verifying-paymaster.ts +7 -14
  74. package/src/kernel-zerodev/provider.ts +1 -2
@@ -36,45 +36,51 @@ export abstract class Paymaster {
36
36
  paymasterProvider?: PaymasterAndBundlerProviders;
37
37
  shouldOverrideFee?: boolean;
38
38
  }): Promise<any> {
39
- try {
40
- const hexifiedUserOp = deepHexlify(await resolveProperties(userOp));
41
- let resolvedERC20UserOp;
42
- let hexifiedERC20UserOp: any;
43
- if (erc20UserOp) {
44
- resolvedERC20UserOp = await resolveProperties(erc20UserOp);
39
+ const hexifiedUserOp = deepHexlify(await resolveProperties(userOp));
40
+ let resolvedERC20UserOp;
41
+ let hexifiedERC20UserOp: any;
42
+ if (erc20UserOp) {
43
+ resolvedERC20UserOp = await resolveProperties(erc20UserOp);
45
44
 
46
- hexifiedERC20UserOp = hexifyUserOp(resolvedERC20UserOp);
47
- }
48
- const chainId = await getChainId(this.provider.getProjectId());
49
- if (!chainId) throw new Error("ChainId not found");
50
- let requestBodyParams = Object.fromEntries(
51
- Object.entries({
52
- projectId: this.provider.getProjectId(),
53
- chainId,
54
- userOp: hexifiedUserOp,
55
- entryPointAddress: ENTRYPOINT_ADDRESS,
56
- callData: callData instanceof Promise ? await callData : callData,
57
- tokenAddress: gasTokenAddress,
58
- erc20UserOp: hexifiedERC20UserOp,
59
- erc20CallData:
60
- erc20CallData instanceof Promise
61
- ? await erc20CallData
62
- : erc20CallData,
63
- paymasterProvider,
64
- shouldOverrideFee,
65
- }).filter(([_, value]) => value !== undefined)
66
- );
67
- const { data: paymasterResp } = await axios.post(
68
- `${PAYMASTER_URL}/sign`,
69
- {
70
- ...requestBodyParams,
71
- },
72
- { headers: { "Content-Type": "application/json" } }
73
- );
74
- return paymasterResp;
75
- } catch (error) {
76
- console.log(error);
77
- return undefined;
45
+ hexifiedERC20UserOp = hexifyUserOp(resolvedERC20UserOp);
78
46
  }
47
+ const chainId = await getChainId(this.provider.getProjectId());
48
+ if (!chainId) throw new Error("ChainId not found");
49
+ let requestBodyParams = Object.fromEntries(
50
+ Object.entries({
51
+ projectId: this.provider.getProjectId(),
52
+ chainId,
53
+ userOp: hexifiedUserOp,
54
+ entryPointAddress: ENTRYPOINT_ADDRESS,
55
+ callData: callData instanceof Promise ? await callData : callData,
56
+ gasTokenData:
57
+ gasTokenAddress && hexifiedERC20UserOp && erc20CallData
58
+ ? {
59
+ tokenAddress: gasTokenAddress,
60
+ erc20UserOp: hexifiedERC20UserOp,
61
+ erc20CallData:
62
+ erc20CallData instanceof Promise
63
+ ? await erc20CallData
64
+ : erc20CallData,
65
+ }
66
+ : undefined,
67
+ tokenAddress: gasTokenAddress,
68
+ erc20UserOp: hexifiedERC20UserOp,
69
+ erc20CallData:
70
+ erc20CallData instanceof Promise
71
+ ? await erc20CallData
72
+ : erc20CallData,
73
+ paymasterProvider,
74
+ shouldOverrideFee,
75
+ }).filter(([_, value]) => value !== undefined)
76
+ );
77
+ const { data: paymasterResp } = await axios.post(
78
+ `${PAYMASTER_URL}/getPaymasterAndData`,
79
+ {
80
+ ...requestBodyParams,
81
+ },
82
+ { headers: { "Content-Type": "application/json" } }
83
+ );
84
+ return paymasterResp;
79
85
  }
80
86
  }
@@ -3,6 +3,7 @@ import {
3
3
  type BytesLike,
4
4
  type UserOperationCallData,
5
5
  type UserOperationStruct,
6
+ type BatchUserOperationCallData,
6
7
  } from "@alchemy/aa-core";
7
8
  import axios from "axios";
8
9
  import {
@@ -14,12 +15,11 @@ import {
14
15
  } from "viem";
15
16
  import { ERC20Abi } from "../abis/ERC20Abi.js";
16
17
  import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
17
- import { MultiSendAbi } from "../abis/MultiSendAbi.js";
18
18
  import {
19
19
  PAYMASTER_URL,
20
20
  ENTRYPOINT_ADDRESS,
21
- MULTISEND_ADDR,
22
21
  ERC20_APPROVAL_AMOUNT,
22
+ MULTISEND_ADDR,
23
23
  } from "../constants.js";
24
24
  import {
25
25
  AccountNotConnected,
@@ -36,7 +36,13 @@ import {
36
36
  type PaymasterConfig,
37
37
  } from "./types.js";
38
38
  import { getChainId } from "../api/index.js";
39
+ import { MultiSendAbi } from "../abis/MultiSendAbi.js";
39
40
 
41
+ export function isBatchUserOperationCallData(
42
+ data: any
43
+ ): data is BatchUserOperationCallData {
44
+ return data && Array.isArray(data);
45
+ }
40
46
  export class TokenPaymaster extends Paymaster {
41
47
  constructor(
42
48
  provider: ZeroDevProvider,
@@ -68,7 +74,12 @@ export class TokenPaymaster extends Paymaster {
68
74
  async decodeMainCallFromCallData(
69
75
  kernelAddress: PromiseOrValue<string>,
70
76
  callData: PromiseOrValue<BytesLike>
71
- ): Promise<UserOperationCallDataWithDelegate | undefined> {
77
+ ): Promise<
78
+ | UserOperationCallData
79
+ | BatchUserOperationCallData
80
+ | UserOperationCallDataWithDelegate
81
+ | undefined
82
+ > {
72
83
  let data: Hex = "0x";
73
84
  if (callData instanceof Promise) {
74
85
  const _data = await callData;
@@ -113,6 +124,13 @@ export class TokenPaymaster extends Paymaster {
113
124
  };
114
125
  }
115
126
  return mainCall;
127
+ } else if (functionName === "executeBatch") {
128
+ const [txs] = args;
129
+ return txs.map((tx) => ({
130
+ target: tx.to,
131
+ value: tx.value ?? 0n,
132
+ data: tx.data,
133
+ }));
116
134
  }
117
135
  } catch (error) {
118
136
  return {
@@ -127,9 +145,11 @@ export class TokenPaymaster extends Paymaster {
127
145
  return;
128
146
  }
129
147
 
130
- async getERC20UserOp(
148
+ async getERC20UserOp<
149
+ T extends UserOperationCallData | BatchUserOperationCallData
150
+ >(
131
151
  struct: UserOperationStruct,
132
- mainCall: UserOperationCallDataWithDelegate,
152
+ mainCall: T,
133
153
  gasTokenAddress: Hex,
134
154
  paymasterAddress: Hex
135
155
  ): Promise<UserOperationStruct | undefined> {
@@ -146,10 +166,17 @@ export class TokenPaymaster extends Paymaster {
146
166
  if (!this.provider.account) {
147
167
  throw AccountNotConnected;
148
168
  }
149
- const erc20CallData = await this.provider.account.encodeBatchExecute([
150
- approveData,
151
- mainCall,
152
- ]);
169
+
170
+ let calls: BatchUserOperationCallData;
171
+
172
+ if (isBatchUserOperationCallData(mainCall)) {
173
+ calls = [approveData, ...mainCall];
174
+ } else {
175
+ calls = [approveData, mainCall];
176
+ }
177
+ const erc20CallData = await this.provider.account.encodeBatchExecute(
178
+ calls
179
+ );
153
180
  return {
154
181
  ...struct,
155
182
  callData: erc20CallData,
@@ -176,52 +203,46 @@ export class TokenPaymaster extends Paymaster {
176
203
  paymasterProvider?: PaymasterAndBundlerProviders,
177
204
  shouldOverrideFee?: boolean
178
205
  ): Promise<UserOperationStruct | undefined> {
179
- try {
180
- const mainCall = await this.decodeMainCallFromCallData(
181
- struct.sender,
182
- struct.callData
183
- );
184
- if (!mainCall) {
185
- throw IncorrectCallDataForTokenPaymaster;
186
- }
187
- const chainId = await getChainId(this.provider.getProjectId());
188
- if (!chainId) {
189
- throw new Error("ChainId not found");
190
- }
191
- const gasTokenAddress = getGasTokenAddress(
192
- this.paymasterConfig.gasToken,
193
- chainId
206
+ const mainCall = await this.decodeMainCallFromCallData(
207
+ struct.sender,
208
+ struct.callData
209
+ );
210
+ if (!mainCall) {
211
+ throw IncorrectCallDataForTokenPaymaster;
212
+ }
213
+ const chainId = await getChainId(this.provider.getProjectId());
214
+ if (!chainId) {
215
+ throw new Error("ChainId not found");
216
+ }
217
+ const gasTokenAddress = getGasTokenAddress(
218
+ this.paymasterConfig.gasToken,
219
+ chainId
220
+ );
221
+ let paymasterAddress = await this.getPaymasterAddress(paymasterProvider);
222
+ if (
223
+ gasTokenAddress !== undefined &&
224
+ paymasterAddress !== undefined &&
225
+ isAddress(paymasterAddress)
226
+ ) {
227
+ const erc20UserOp = await this.getERC20UserOp(
228
+ struct,
229
+ mainCall,
230
+ gasTokenAddress,
231
+ paymasterAddress
194
232
  );
195
- let paymasterAddress = await this.getPaymasterAddress(paymasterProvider);
196
- if (
197
- gasTokenAddress !== undefined &&
198
- paymasterAddress !== undefined &&
199
- isAddress(paymasterAddress)
200
- ) {
201
- const erc20UserOp = await this.getERC20UserOp(
202
- struct,
203
- mainCall,
204
- gasTokenAddress,
205
- paymasterAddress
206
- );
207
- if (!erc20UserOp) {
208
- return;
209
- }
210
- const paymasterResp = await this.signUserOp({
211
- userOp: struct,
212
- callData: struct.callData,
213
- gasTokenAddress,
214
- erc20UserOp,
215
- erc20CallData: erc20UserOp.callData,
216
- paymasterProvider,
217
- shouldOverrideFee,
218
- });
219
- if (paymasterResp) {
220
- return paymasterResp;
221
- }
233
+ if (!erc20UserOp) {
234
+ return;
222
235
  }
223
- } catch (error) {
224
- console.log(error);
236
+ const paymasterResp = await this.signUserOp({
237
+ userOp: struct,
238
+ callData: struct.callData,
239
+ gasTokenAddress,
240
+ erc20UserOp,
241
+ erc20CallData: erc20UserOp.callData,
242
+ paymasterProvider,
243
+ shouldOverrideFee,
244
+ });
245
+ return paymasterResp;
225
246
  }
226
247
  return;
227
248
  }
@@ -19,19 +19,12 @@ export class VerifyingPaymaster extends Paymaster {
19
19
  paymasterProvider?: PaymasterAndBundlerProviders,
20
20
  shouldOverrideFee?: boolean
21
21
  ): Promise<UserOperationStruct | undefined> {
22
- try {
23
- const hexifiedUserOp = deepHexlify(await resolveProperties(struct));
24
- const paymasterResp = await this.signUserOp({
25
- userOp: hexifiedUserOp,
26
- paymasterProvider,
27
- shouldOverrideFee,
28
- });
29
- if (paymasterResp) {
30
- return paymasterResp;
31
- }
32
- } catch (error) {
33
- console.log(error);
34
- }
35
- return;
22
+ const hexifiedUserOp = deepHexlify(await resolveProperties(struct));
23
+ const paymasterResp = await this.signUserOp({
24
+ userOp: hexifiedUserOp,
25
+ paymasterProvider,
26
+ shouldOverrideFee,
27
+ });
28
+ return paymasterResp;
36
29
  }
37
30
  }
@@ -298,8 +298,7 @@ export class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {
298
298
  dummyPaymasterDataMiddleware: AccountMiddlewareFn = async (
299
299
  struct: UserOperationStruct
300
300
  ): Promise<UserOperationStruct> => {
301
- struct.paymasterAndData =
302
- "0xfe7dbcab8aaee4eb67943c1e6be95b1d065985c6000000000000000000000000000000000000000000000000000001869aa31cf400000000000000000000000000000000000000000000000000000000000000007dfe2190f34af27b265bae608717cdc9368b471fc0c097ab7b4088f255b4961e57b039e7e571b15221081c5dce7bcb93459b27a3ab65d2f8a889f4a40b4022801b";
301
+ struct.paymasterAndData = "0x";
303
302
  return struct;
304
303
  };
305
304