@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.
- package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
- package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js +53 -4
- package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -1
- package/dist/cjs/kernel-zerodev/account.d.ts +3 -0
- package/dist/cjs/kernel-zerodev/account.js +47 -6
- package/dist/cjs/kernel-zerodev/account.js.map +1 -1
- package/dist/cjs/kernel-zerodev/constants.d.ts +2 -2
- package/dist/cjs/kernel-zerodev/constants.js +2 -2
- package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
- package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.js.map +1 -1
- package/dist/cjs/kernel-zerodev/middleware/gas-estimator.js +1 -2
- package/dist/cjs/kernel-zerodev/middleware/gas-estimator.js.map +1 -1
- package/dist/cjs/kernel-zerodev/middleware/paymaster.js +19 -6
- package/dist/cjs/kernel-zerodev/middleware/paymaster.js.map +1 -1
- package/dist/cjs/kernel-zerodev/paymaster/base.js +36 -33
- package/dist/cjs/kernel-zerodev/paymaster/base.js.map +1 -1
- package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
- package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js +48 -39
- package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js.map +1 -1
- package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.js +7 -15
- package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.js.map +1 -1
- package/dist/cjs/kernel-zerodev/provider.js +1 -2
- package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
- package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
- package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js +53 -4
- package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -1
- package/dist/esm/kernel-zerodev/account.d.ts +3 -0
- package/dist/esm/kernel-zerodev/account.js +47 -6
- package/dist/esm/kernel-zerodev/account.js.map +1 -1
- package/dist/esm/kernel-zerodev/constants.d.ts +2 -2
- package/dist/esm/kernel-zerodev/constants.js +2 -2
- package/dist/esm/kernel-zerodev/constants.js.map +1 -1
- package/dist/esm/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/esm/kernel-zerodev/ethers-provider/account-signer.js.map +1 -1
- package/dist/esm/kernel-zerodev/middleware/gas-estimator.js +1 -2
- package/dist/esm/kernel-zerodev/middleware/gas-estimator.js.map +1 -1
- package/dist/esm/kernel-zerodev/middleware/paymaster.js +19 -6
- package/dist/esm/kernel-zerodev/middleware/paymaster.js.map +1 -1
- package/dist/esm/kernel-zerodev/paymaster/base.js +36 -33
- package/dist/esm/kernel-zerodev/paymaster/base.js.map +1 -1
- package/dist/esm/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
- package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js +47 -39
- package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js.map +1 -1
- package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.js +7 -15
- package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.js.map +1 -1
- package/dist/esm/kernel-zerodev/provider.js +1 -2
- package/dist/esm/kernel-zerodev/provider.js.map +1 -1
- package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
- package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/account.d.ts +3 -0
- package/dist/types/kernel-zerodev/account.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/constants.d.ts +2 -2
- package/dist/types/kernel-zerodev/constants.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/middleware/gas-estimator.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/middleware/paymaster.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/paymaster/base.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
- package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/paymaster/verifying-paymaster.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/provider.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/kernel-zerodev/abis/KernelAccountAbi.ts +53 -4
- package/src/kernel-zerodev/account.ts +57 -10
- package/src/kernel-zerodev/constants.ts +3 -2
- package/src/kernel-zerodev/ethers-provider/account-signer.ts +1 -1
- package/src/kernel-zerodev/middleware/gas-estimator.ts +1 -2
- package/src/kernel-zerodev/middleware/paymaster.ts +20 -9
- package/src/kernel-zerodev/paymaster/base.ts +44 -38
- package/src/kernel-zerodev/paymaster/token-paymaster.ts +74 -53
- package/src/kernel-zerodev/paymaster/verifying-paymaster.ts +7 -14
- 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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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<
|
|
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:
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
|
|
196
|
-
|
|
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
|
-
|
|
224
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|