@zerodev/sdk 4.0.16 → 4.0.18

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 (152) hide show
  1. package/README.md +109 -0
  2. package/dist/cjs/kernel-zerodev/abis/RecoveryActionAbi.d.ts +15 -0
  3. package/dist/cjs/kernel-zerodev/abis/RecoveryActionAbi.js +24 -0
  4. package/dist/cjs/kernel-zerodev/abis/RecoveryActionAbi.js.map +1 -0
  5. package/dist/cjs/kernel-zerodev/abis/WeightedValidatorAbi.d.ts +296 -0
  6. package/dist/cjs/kernel-zerodev/abis/WeightedValidatorAbi.js +389 -0
  7. package/dist/cjs/kernel-zerodev/abis/WeightedValidatorAbi.js.map +1 -0
  8. package/dist/cjs/kernel-zerodev/account.d.ts +2 -0
  9. package/dist/cjs/kernel-zerodev/account.js +30 -0
  10. package/dist/cjs/kernel-zerodev/account.js.map +1 -1
  11. package/dist/cjs/kernel-zerodev/api/index.d.ts +2 -0
  12. package/dist/cjs/kernel-zerodev/api/index.js +28 -1
  13. package/dist/cjs/kernel-zerodev/api/index.js.map +1 -1
  14. package/dist/cjs/kernel-zerodev/constants.d.ts +2 -0
  15. package/dist/cjs/kernel-zerodev/constants.js +3 -1
  16. package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
  17. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  18. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +1 -1
  19. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  20. package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
  21. package/dist/cjs/kernel-zerodev/validator/base.d.ts +2 -0
  22. package/dist/cjs/kernel-zerodev/validator/base.js +9 -0
  23. package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
  24. package/dist/cjs/kernel-zerodev/validator/index.d.ts +2 -1
  25. package/dist/cjs/kernel-zerodev/validator/index.js +4 -1
  26. package/dist/cjs/kernel-zerodev/validator/index.js.map +1 -1
  27. package/dist/cjs/kernel-zerodev/validator/recovery-validator.d.ts +52 -0
  28. package/dist/cjs/kernel-zerodev/validator/recovery-validator.js +298 -0
  29. package/dist/cjs/kernel-zerodev/validator/recovery-validator.js.map +1 -0
  30. package/dist/cjs/kernel-zerodev/validator/session-key-validator.d.ts +1 -1
  31. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +14 -1
  32. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -1
  33. package/dist/cjs/kernel-zerodev/validator/types.d.ts +7 -1
  34. package/dist/cjs/kernel-zerodev/validator/types.js.map +1 -1
  35. package/dist/cjs/kernel-zerodev/validator-provider/base.d.ts +2 -2
  36. package/dist/cjs/kernel-zerodev/validator-provider/base.js +7 -3
  37. package/dist/cjs/kernel-zerodev/validator-provider/base.js.map +1 -1
  38. package/dist/cjs/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +1 -1
  39. package/dist/cjs/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +1 -1
  40. package/dist/cjs/kernel-zerodev/validator-provider/index.d.ts +2 -1
  41. package/dist/cjs/kernel-zerodev/validator-provider/index.js +4 -1
  42. package/dist/cjs/kernel-zerodev/validator-provider/index.js.map +1 -1
  43. package/dist/cjs/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +1 -1
  44. package/dist/cjs/kernel-zerodev/validator-provider/recovery-provider.d.ts +26 -0
  45. package/dist/cjs/kernel-zerodev/validator-provider/recovery-provider.js +278 -0
  46. package/dist/cjs/kernel-zerodev/validator-provider/recovery-provider.js.map +1 -0
  47. package/dist/cjs/kernel-zerodev/validator-provider/session-key-provider.d.ts +1 -1
  48. package/dist/cjs/kernel-zerodev/validator-provider/types.d.ts +3 -0
  49. package/dist/cjs/kernel-zerodev/validator-provider/types.js.map +1 -1
  50. package/dist/esm/kernel-zerodev/abis/RecoveryActionAbi.d.ts +15 -0
  51. package/dist/esm/kernel-zerodev/abis/RecoveryActionAbi.js +21 -0
  52. package/dist/esm/kernel-zerodev/abis/RecoveryActionAbi.js.map +1 -0
  53. package/dist/esm/kernel-zerodev/abis/WeightedValidatorAbi.d.ts +296 -0
  54. package/dist/esm/kernel-zerodev/abis/WeightedValidatorAbi.js +386 -0
  55. package/dist/esm/kernel-zerodev/abis/WeightedValidatorAbi.js.map +1 -0
  56. package/dist/esm/kernel-zerodev/account.d.ts +2 -0
  57. package/dist/esm/kernel-zerodev/account.js +30 -0
  58. package/dist/esm/kernel-zerodev/account.js.map +1 -1
  59. package/dist/esm/kernel-zerodev/api/index.d.ts +2 -0
  60. package/dist/esm/kernel-zerodev/api/index.js +25 -0
  61. package/dist/esm/kernel-zerodev/api/index.js.map +1 -1
  62. package/dist/esm/kernel-zerodev/constants.d.ts +2 -0
  63. package/dist/esm/kernel-zerodev/constants.js +2 -0
  64. package/dist/esm/kernel-zerodev/constants.js.map +1 -1
  65. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  66. package/dist/esm/kernel-zerodev/owner/passkey/utils.js +1 -1
  67. package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  68. package/dist/esm/kernel-zerodev/provider.js.map +1 -1
  69. package/dist/esm/kernel-zerodev/validator/base.d.ts +2 -0
  70. package/dist/esm/kernel-zerodev/validator/base.js +9 -0
  71. package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
  72. package/dist/esm/kernel-zerodev/validator/index.d.ts +2 -1
  73. package/dist/esm/kernel-zerodev/validator/index.js +3 -1
  74. package/dist/esm/kernel-zerodev/validator/index.js.map +1 -1
  75. package/dist/esm/kernel-zerodev/validator/recovery-validator.d.ts +52 -0
  76. package/dist/esm/kernel-zerodev/validator/recovery-validator.js +292 -0
  77. package/dist/esm/kernel-zerodev/validator/recovery-validator.js.map +1 -0
  78. package/dist/esm/kernel-zerodev/validator/session-key-validator.d.ts +1 -1
  79. package/dist/esm/kernel-zerodev/validator/session-key-validator.js +14 -1
  80. package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -1
  81. package/dist/esm/kernel-zerodev/validator/types.d.ts +7 -1
  82. package/dist/esm/kernel-zerodev/validator/types.js.map +1 -1
  83. package/dist/esm/kernel-zerodev/validator-provider/base.d.ts +2 -2
  84. package/dist/esm/kernel-zerodev/validator-provider/base.js +7 -3
  85. package/dist/esm/kernel-zerodev/validator-provider/base.js.map +1 -1
  86. package/dist/esm/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +1 -1
  87. package/dist/esm/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +1 -1
  88. package/dist/esm/kernel-zerodev/validator-provider/index.d.ts +2 -1
  89. package/dist/esm/kernel-zerodev/validator-provider/index.js +3 -1
  90. package/dist/esm/kernel-zerodev/validator-provider/index.js.map +1 -1
  91. package/dist/esm/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +1 -1
  92. package/dist/esm/kernel-zerodev/validator-provider/recovery-provider.d.ts +26 -0
  93. package/dist/esm/kernel-zerodev/validator-provider/recovery-provider.js +271 -0
  94. package/dist/esm/kernel-zerodev/validator-provider/recovery-provider.js.map +1 -0
  95. package/dist/esm/kernel-zerodev/validator-provider/session-key-provider.d.ts +1 -1
  96. package/dist/esm/kernel-zerodev/validator-provider/types.d.ts +3 -0
  97. package/dist/esm/kernel-zerodev/validator-provider/types.js.map +1 -1
  98. package/dist/types/kernel-zerodev/abis/RecoveryActionAbi.d.ts +16 -0
  99. package/dist/types/kernel-zerodev/abis/RecoveryActionAbi.d.ts.map +1 -0
  100. package/dist/types/kernel-zerodev/abis/WeightedValidatorAbi.d.ts +297 -0
  101. package/dist/types/kernel-zerodev/abis/WeightedValidatorAbi.d.ts.map +1 -0
  102. package/dist/types/kernel-zerodev/account.d.ts +2 -0
  103. package/dist/types/kernel-zerodev/account.d.ts.map +1 -1
  104. package/dist/types/kernel-zerodev/api/index.d.ts +2 -0
  105. package/dist/types/kernel-zerodev/api/index.d.ts.map +1 -1
  106. package/dist/types/kernel-zerodev/constants.d.ts +2 -0
  107. package/dist/types/kernel-zerodev/constants.d.ts.map +1 -1
  108. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  109. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts.map +1 -1
  110. package/dist/types/kernel-zerodev/validator/base.d.ts +2 -0
  111. package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
  112. package/dist/types/kernel-zerodev/validator/index.d.ts +2 -1
  113. package/dist/types/kernel-zerodev/validator/index.d.ts.map +1 -1
  114. package/dist/types/kernel-zerodev/validator/recovery-validator.d.ts +53 -0
  115. package/dist/types/kernel-zerodev/validator/recovery-validator.d.ts.map +1 -0
  116. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts +1 -1
  117. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -1
  118. package/dist/types/kernel-zerodev/validator/types.d.ts +7 -1
  119. package/dist/types/kernel-zerodev/validator/types.d.ts.map +1 -1
  120. package/dist/types/kernel-zerodev/validator-provider/base.d.ts +2 -2
  121. package/dist/types/kernel-zerodev/validator-provider/base.d.ts.map +1 -1
  122. package/dist/types/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +1 -1
  123. package/dist/types/kernel-zerodev/validator-provider/ecdsa-provider.d.ts.map +1 -1
  124. package/dist/types/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +1 -1
  125. package/dist/types/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts.map +1 -1
  126. package/dist/types/kernel-zerodev/validator-provider/index.d.ts +2 -1
  127. package/dist/types/kernel-zerodev/validator-provider/index.d.ts.map +1 -1
  128. package/dist/types/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +1 -1
  129. package/dist/types/kernel-zerodev/validator-provider/kill-switch-provider.d.ts.map +1 -1
  130. package/dist/types/kernel-zerodev/validator-provider/recovery-provider.d.ts +27 -0
  131. package/dist/types/kernel-zerodev/validator-provider/recovery-provider.d.ts.map +1 -0
  132. package/dist/types/kernel-zerodev/validator-provider/session-key-provider.d.ts +1 -1
  133. package/dist/types/kernel-zerodev/validator-provider/session-key-provider.d.ts.map +1 -1
  134. package/dist/types/kernel-zerodev/validator-provider/types.d.ts +3 -0
  135. package/dist/types/kernel-zerodev/validator-provider/types.d.ts.map +1 -1
  136. package/package.json +1 -1
  137. package/src/kernel-zerodev/abis/RecoveryActionAbi.ts +20 -0
  138. package/src/kernel-zerodev/abis/WeightedValidatorAbi.ts +385 -0
  139. package/src/kernel-zerodev/account.ts +33 -0
  140. package/src/kernel-zerodev/api/index.ts +32 -0
  141. package/src/kernel-zerodev/constants.ts +3 -0
  142. package/src/kernel-zerodev/owner/passkey/utils.ts +2 -2
  143. package/src/kernel-zerodev/provider.ts +1 -1
  144. package/src/kernel-zerodev/validator/base.ts +11 -0
  145. package/src/kernel-zerodev/validator/index.ts +3 -0
  146. package/src/kernel-zerodev/validator/recovery-validator.ts +366 -0
  147. package/src/kernel-zerodev/validator/session-key-validator.ts +17 -4
  148. package/src/kernel-zerodev/validator/types.ts +10 -1
  149. package/src/kernel-zerodev/validator-provider/base.ts +7 -3
  150. package/src/kernel-zerodev/validator-provider/index.ts +3 -0
  151. package/src/kernel-zerodev/validator-provider/recovery-provider.ts +350 -0
  152. package/src/kernel-zerodev/validator-provider/types.ts +6 -0
@@ -1,6 +1,7 @@
1
1
  import { ECDSAValidator } from "./ecdsa-validator.js";
2
2
  import { ERC165SessionKeyValidator } from "./erc165-session-key-validator.js";
3
3
  import { KillSwitchValidator } from "./kill-switch-validator.js";
4
+ import { RecoveryValidator } from "./recovery-validator.js";
4
5
  import { SessionKeyValidator } from "./session-key-validator.js";
5
6
  import type { ValidatorMap } from "./types.js";
6
7
 
@@ -9,6 +10,7 @@ export const Validators: ValidatorMap = {
9
10
  KILL_SWITCH: KillSwitchValidator,
10
11
  ERC165_SESSION_KEY: ERC165SessionKeyValidator,
11
12
  SESSION_KEY: SessionKeyValidator,
13
+ RECOVERY: RecoveryValidator,
12
14
  };
13
15
 
14
16
  export {
@@ -16,4 +18,5 @@ export {
16
18
  KillSwitchValidator,
17
19
  ERC165SessionKeyValidator,
18
20
  SessionKeyValidator,
21
+ RecoveryValidator,
19
22
  };
@@ -0,0 +1,366 @@
1
+ import {
2
+ getChain,
3
+ type Address,
4
+ type Hex,
5
+ type SmartAccountSigner,
6
+ type UserOperationRequest,
7
+ type SignTypedDataParams,
8
+ } from "@alchemy/aa-core";
9
+ import {
10
+ KernelBaseValidator,
11
+ ValidatorMode,
12
+ type KernelBaseValidatorParams,
13
+ } from "./base.js";
14
+ import {
15
+ concatHex,
16
+ encodeAbiParameters,
17
+ encodeFunctionData,
18
+ getContract,
19
+ parseAbiParameters,
20
+ type LocalAccount,
21
+ createWalletClient,
22
+ type WalletClient,
23
+ http,
24
+ custom,
25
+ type Transport,
26
+ type Chain,
27
+ type Account,
28
+ publicActions,
29
+ getFunctionSelector,
30
+ } from "viem";
31
+ import { WeightedValidatorAbi } from "../abis/WeightedValidatorAbi.js";
32
+ import { getChainId } from "../api/index.js";
33
+ import {
34
+ CHAIN_ID_TO_NODE,
35
+ DUMMY_ECDSA_SIG,
36
+ RECOVERY_ACTION,
37
+ } from "../constants.js";
38
+ import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
39
+ import { fixSignedData } from "../utils.js";
40
+ import type { EthereumProvider } from "./types.js";
41
+ import { polygonMumbai } from "viem/chains";
42
+ import { RecoveryActionAbi } from "../abis/RecoveryActionAbi.js";
43
+
44
+ interface WeightedGuardians {
45
+ [guardian: Address]: number;
46
+ }
47
+ export interface RecoveryValidatorParams extends KernelBaseValidatorParams {
48
+ guardians?: WeightedGuardians;
49
+ threshold?: number;
50
+ delaySeconds?: number;
51
+ accountSigner?: SmartAccountSigner;
52
+ guardianAccountOrProvider?: LocalAccount<string> | EthereumProvider;
53
+ walletClient?: WalletClient<Transport, Chain>;
54
+ signatures?: Hex;
55
+ }
56
+
57
+ export type RecoveryConfig = Required<
58
+ Pick<RecoveryValidatorParams, "guardians" | "threshold" | "delaySeconds">
59
+ >;
60
+
61
+ export function isLocalAccount(account: any): account is LocalAccount<string> {
62
+ return account && account.signTransaction !== undefined;
63
+ }
64
+
65
+ export function isEthereumProvider(
66
+ provider: any
67
+ ): provider is EthereumProvider {
68
+ return provider && provider.request !== undefined;
69
+ }
70
+
71
+ type WalletClientAccountType<T> = T extends LocalAccount<string>
72
+ ? Account
73
+ : T extends EthereumProvider
74
+ ? undefined
75
+ : never;
76
+
77
+ export const recoverySelector = getFunctionSelector(
78
+ "doRecovery(address, bytes)"
79
+ );
80
+
81
+ export class RecoveryValidator extends KernelBaseValidator {
82
+ protected guardians?: WeightedGuardians;
83
+ protected threshold?: number;
84
+ protected delaySeconds: number;
85
+ protected accountSigner?: SmartAccountSigner;
86
+ protected guardianAccountOrProvider?: LocalAccount<string> | EthereumProvider;
87
+ protected signatures?: Hex;
88
+ walletClient?: WalletClient<
89
+ Transport,
90
+ Chain,
91
+ WalletClientAccountType<typeof this.guardianAccountOrProvider>
92
+ >;
93
+
94
+ constructor(params: RecoveryValidatorParams) {
95
+ super(params);
96
+ this.guardians = params.guardians;
97
+ this.threshold = params.threshold;
98
+ this.delaySeconds = params.delaySeconds ?? 0;
99
+ this.accountSigner = params.accountSigner;
100
+ this.mode = params.mode ?? ValidatorMode.plugin;
101
+ this.guardianAccountOrProvider = params.guardianAccountOrProvider;
102
+ this.signatures = params.signatures;
103
+ this.validAfter = params.validAfter ?? 0;
104
+ this.validUntil = params.validUntil ?? 0;
105
+ this.executor = params.executor ?? RECOVERY_ACTION;
106
+ this.selector = params.selector ?? recoverySelector;
107
+ if (isLocalAccount(params.guardianAccountOrProvider)) {
108
+ this.walletClient = createWalletClient({
109
+ account: params.guardianAccountOrProvider,
110
+ chain: this.chain ?? polygonMumbai,
111
+ transport: http(CHAIN_ID_TO_NODE[this.chain?.id ?? polygonMumbai.id]),
112
+ }).extend(publicActions);
113
+ } else if (isEthereumProvider(params.guardianAccountOrProvider)) {
114
+ this.walletClient = createWalletClient({
115
+ chain: this.chain ?? polygonMumbai,
116
+ transport: custom(params.guardianAccountOrProvider),
117
+ }).extend(publicActions);
118
+ } else if (params.walletClient) {
119
+ this.walletClient = params.walletClient.extend(publicActions);
120
+ } else if (params.guardianAccountOrProvider) {
121
+ throw Error("Incorrect guardianAccountOrProvider type");
122
+ }
123
+ }
124
+
125
+ public static async init(
126
+ params: RecoveryValidatorParams
127
+ ): Promise<RecoveryValidator> {
128
+ const chainId = await getChainId(params.projectId);
129
+ if (!chainId) {
130
+ throw new Error("ChainId not found");
131
+ }
132
+ const chain = getChain(chainId);
133
+ const instance = new RecoveryValidator({ ...params, chain });
134
+ return instance;
135
+ }
136
+
137
+ getNonceKey(): bigint {
138
+ return BigInt(this.validatorAddress);
139
+ }
140
+
141
+ setRecoverySignatures(signatures: Hex) {
142
+ this.signatures = signatures;
143
+ }
144
+
145
+ getRecoverySignatures(): Hex | undefined {
146
+ return this.signatures;
147
+ }
148
+
149
+ getRecoveryConfig(): RecoveryConfig {
150
+ if (
151
+ this.guardians === undefined ||
152
+ !this.threshold ||
153
+ Object.entries(this.guardians).length !== this.threshold
154
+ ) {
155
+ throw Error("Recovery config unintialised");
156
+ }
157
+ return {
158
+ guardians: this.guardians,
159
+ threshold: this.threshold,
160
+ delaySeconds: this.delaySeconds,
161
+ };
162
+ }
163
+
164
+ async signer(): Promise<SmartAccountSigner> {
165
+ if (!this.accountSigner) {
166
+ throw Error("AccountSigner not set");
167
+ }
168
+ return await Promise.resolve(this.accountSigner);
169
+ }
170
+
171
+ async getEnableData(): Promise<Hex> {
172
+ if (
173
+ this.guardians === undefined ||
174
+ !this.threshold ||
175
+ Object.entries(this.guardians).length !== this.threshold
176
+ ) {
177
+ throw Error("Recovery config unintialised");
178
+ }
179
+ return encodeAbiParameters(
180
+ parseAbiParameters(
181
+ "address[] guardians, uint24[] weights, uint24 threshold, uint48 delay"
182
+ ),
183
+ [
184
+ Object.keys(this.guardians) as Address[],
185
+ Object.values(this.guardians),
186
+ this.threshold,
187
+ this.delaySeconds,
188
+ ]
189
+ );
190
+ }
191
+
192
+ encodeEnable(recoveryData: Hex): Hex {
193
+ return encodeFunctionData({
194
+ abi: WeightedValidatorAbi,
195
+ functionName: "enable",
196
+ args: [recoveryData],
197
+ });
198
+ }
199
+
200
+ encodeDisable(disableData: Hex = "0x"): Hex {
201
+ return encodeFunctionData({
202
+ abi: WeightedValidatorAbi,
203
+ functionName: "disable",
204
+ args: [disableData],
205
+ });
206
+ }
207
+
208
+ encodeApprove(callDataAndNonceHash: Hex, kernelAccountAddress: Address): Hex {
209
+ return encodeFunctionData({
210
+ abi: WeightedValidatorAbi,
211
+ functionName: "approve",
212
+ args: [callDataAndNonceHash, kernelAccountAddress],
213
+ });
214
+ }
215
+
216
+ encodeApproveWithSig(
217
+ callDataAndNonceHash: Hex,
218
+ kernelAccountAddress: Address,
219
+ sigs: Hex
220
+ ): Hex {
221
+ return encodeFunctionData({
222
+ abi: WeightedValidatorAbi,
223
+ functionName: "approveWithSig",
224
+ args: [callDataAndNonceHash, kernelAccountAddress, sigs],
225
+ });
226
+ }
227
+
228
+ encodeVeto(callDataAndNonceHash: Hex): Hex {
229
+ return encodeFunctionData({
230
+ abi: WeightedValidatorAbi,
231
+ functionName: "veto",
232
+ args: [callDataAndNonceHash],
233
+ });
234
+ }
235
+
236
+ encodeRecoveryAction(enableData: Hex, defaultValidatorAddress: Address): Hex {
237
+ return encodeFunctionData({
238
+ abi: RecoveryActionAbi,
239
+ functionName: "doRecovery",
240
+ args: [defaultValidatorAddress, enableData],
241
+ });
242
+ }
243
+
244
+ async isPluginEnabled(
245
+ kernelAccountAddress: Address,
246
+ selector: Hex
247
+ ): Promise<boolean> {
248
+ if (
249
+ this.guardians === undefined ||
250
+ !this.threshold ||
251
+ Object.entries(this.guardians).length !== this.threshold
252
+ ) {
253
+ throw Error("Recovery config unintialised");
254
+ }
255
+ if (!this.publicClient) {
256
+ throw new Error("Validator uninitialized: PublicClient missing");
257
+ }
258
+ try {
259
+ const kernel = getContract({
260
+ abi: KernelAccountAbi,
261
+ address: kernelAccountAddress,
262
+ publicClient: this.publicClient,
263
+ });
264
+ const execDetail = await kernel.read.getExecution([selector]);
265
+ const enableData = await this.publicClient.readContract({
266
+ abi: WeightedValidatorAbi,
267
+ address: this.validatorAddress,
268
+ functionName: "weightedStorage",
269
+ args: [kernelAccountAddress],
270
+ });
271
+
272
+ return (
273
+ execDetail.validator.toLowerCase() ===
274
+ this.validatorAddress.toLowerCase() &&
275
+ enableData[0] ===
276
+ Object.values(this.guardians).reduce((a, c) => a + c, 0) &&
277
+ enableData[1] === this.threshold &&
278
+ enableData[2] === this.delaySeconds &&
279
+ this.isGuardiansEnabled(kernelAccountAddress)
280
+ );
281
+ } catch (error) {
282
+ return false;
283
+ }
284
+ }
285
+
286
+ async isGuardiansEnabled(kernelAccountAddress: Address): Promise<boolean> {
287
+ if (
288
+ this.guardians === undefined ||
289
+ !this.threshold ||
290
+ Object.entries(this.guardians).length !== this.threshold
291
+ ) {
292
+ throw Error("Recovery config unintialised");
293
+ }
294
+ const weightedValidator = getContract({
295
+ abi: WeightedValidatorAbi,
296
+ address: this.validatorAddress,
297
+ publicClient: this.publicClient,
298
+ });
299
+ for (const [addr, weight] of Object.entries(this.guardians)) {
300
+ const result = await weightedValidator.read.guardian([
301
+ addr as Address,
302
+ kernelAccountAddress,
303
+ ]);
304
+ if (result[0] !== weight) {
305
+ return false;
306
+ }
307
+ }
308
+ return true;
309
+ }
310
+
311
+ async getDummyUserOpSignature(): Promise<Hex> {
312
+ let dummySignature: Hex = "0x";
313
+ if (this.signatures) {
314
+ const totalSigs = this.signatures.substring(2).length / 130;
315
+ for (let i = 0; i < totalSigs; i++) {
316
+ dummySignature = concatHex([dummySignature, DUMMY_ECDSA_SIG]);
317
+ }
318
+ // Hack - Fix this to not send original signatures
319
+ return this.signatures;
320
+ }
321
+ return DUMMY_ECDSA_SIG;
322
+ }
323
+
324
+ async signMessage(message: string | Uint8Array): Promise<Hex> {
325
+ if (!this.accountSigner) {
326
+ throw Error("AccountSigner not set");
327
+ }
328
+ return await this.accountSigner.signMessage(message);
329
+ }
330
+
331
+ async signTypedData(params: SignTypedDataParams): Promise<Hex> {
332
+ if (!this.accountSigner) {
333
+ throw Error("AccountSigner not set");
334
+ }
335
+ return fixSignedData(await this.accountSigner.signTypedData(params));
336
+ }
337
+
338
+ async signRecoveryHash(recoveryHash: Hex): Promise<Hex> {
339
+ if (!this.chain) {
340
+ throw new Error("Validator uninitialized");
341
+ }
342
+ const signer = await this.signer();
343
+ return await signer.signTypedData({
344
+ domain: {
345
+ name: "WeightedECDSAValidator",
346
+ version: "1",
347
+ chainId: this.chain.id,
348
+ verifyingContract: this.validatorAddress,
349
+ },
350
+ types: {
351
+ Approve: [{ name: "callDataAndNonceHash", type: "bytes32" }],
352
+ },
353
+ message: {
354
+ callDataAndNonceHash: recoveryHash,
355
+ },
356
+ primaryType: "Approve",
357
+ });
358
+ }
359
+
360
+ async signUserOp(_userOp: UserOperationRequest): Promise<Hex> {
361
+ if (!this.chain) {
362
+ throw new Error("Validator uninitialized");
363
+ }
364
+ return this.signatures ?? DUMMY_ECDSA_SIG;
365
+ }
366
+ }
@@ -35,6 +35,13 @@ import type { Operation } from "../provider.js";
35
35
  import { getChainId } from "../api/index.js";
36
36
  import { fixSignedData } from "../utils.js";
37
37
 
38
+ // We need to be able to serialize bigint to transmit session key over
39
+ // the network.
40
+ // Using this trick: https://github.com/GoogleChromeLabs/jsbi/issues/30#issuecomment-1006086291
41
+ (BigInt.prototype as any).toJSON = function () {
42
+ return this.toString();
43
+ };
44
+
38
45
  export interface SessionKeyValidatorParams extends KernelBaseValidatorParams {
39
46
  sessionKey: SmartAccountSigner;
40
47
  sessionKeyData: SessionKeyData;
@@ -67,7 +74,7 @@ export interface ParamRules {
67
74
 
68
75
  export interface Permission {
69
76
  target: Address;
70
- valueLimit: number;
77
+ valueLimit: bigint;
71
78
  sig: Hex;
72
79
  rules: ParamRules[];
73
80
  operation: Operation;
@@ -163,9 +170,15 @@ export class SessionKeyValidator extends KernelBaseValidator {
163
170
 
164
171
  if (!valueLimitPermissions.length) return undefined;
165
172
 
166
- const sortedPermissions = valueLimitPermissions.sort(
167
- (a, b) => b.valueLimit - a.valueLimit
168
- );
173
+ const sortedPermissions = valueLimitPermissions.sort((a, b) => {
174
+ if (b.valueLimit > a.valueLimit) {
175
+ return 1;
176
+ } else if (b.valueLimit < a.valueLimit) {
177
+ return -1;
178
+ } else {
179
+ return 0;
180
+ }
181
+ });
169
182
 
170
183
  return this.findPermissionByRule(sortedPermissions, args[2]);
171
184
  } catch (error) {
@@ -11,6 +11,10 @@ import type {
11
11
  KillSwitchValidator,
12
12
  KillSwitchValidatorParams,
13
13
  } from "./kill-switch-validator.js";
14
+ import type {
15
+ RecoveryValidator,
16
+ RecoveryValidatorParams,
17
+ } from "./recovery-validator.js";
14
18
  import type {
15
19
  SessionKeyValidator,
16
20
  SessionKeyValidatorParams,
@@ -24,13 +28,15 @@ export type SupportedValidators =
24
28
  | "ECDSA"
25
29
  | "KILL_SWITCH"
26
30
  | "ERC165_SESSION_KEY"
27
- | "SESSION_KEY";
31
+ | "SESSION_KEY"
32
+ | "RECOVERY";
28
33
 
29
34
  export type ValidatorTypeMap = {
30
35
  ECDSA: ECDSAValidator;
31
36
  KILL_SWITCH: KillSwitchValidator;
32
37
  ERC165_SESSION_KEY: ERC165SessionKeyValidator;
33
38
  SESSION_KEY: SessionKeyValidator;
39
+ RECOVERY: RecoveryValidator;
34
40
  };
35
41
 
36
42
  export type ValidatorParamsMap = {
@@ -38,6 +44,7 @@ export type ValidatorParamsMap = {
38
44
  KILL_SWITCH: KillSwitchValidatorParams;
39
45
  ERC165_SESSION_KEY: ERC165SessionKeyValidatorParams;
40
46
  SESSION_KEY: SessionKeyValidatorParams;
47
+ RECOVERY: RecoveryValidatorParams;
41
48
  };
42
49
 
43
50
  export type ValidatorMap = {
@@ -46,4 +53,6 @@ export type ValidatorMap = {
46
53
  ) => ValidatorTypeMap[V];
47
54
  };
48
55
 
56
+ export type EthereumProvider = { request(...args: any): Promise<any> };
57
+
49
58
  export type { ParamRules, Permission, SessionKeyData, SessionKeyParams };
@@ -74,6 +74,7 @@ export abstract class ValidatorProvider<
74
74
  projectId: params.projectId,
75
75
  bundlerProvider,
76
76
  });
77
+ this.defaultProvider = params.defaultProvider;
77
78
  this.connect(
78
79
  () =>
79
80
  new KernelSmartContractAccount({
@@ -117,7 +118,7 @@ export abstract class ValidatorProvider<
117
118
  return await this.account.validator.encodeEnable(enableData);
118
119
  };
119
120
 
120
- getEncodedDisableData = async (disableData: Hex): Promise<Hex> => {
121
+ getEncodedDisableData = async (disableData: Hex = "0x"): Promise<Hex> => {
121
122
  if (!isKernelAccount(this.account) || !this.account.validator) {
122
123
  throw new Error(
123
124
  "ValidatorProvider: account with validator is not set, did you call all connects first?"
@@ -143,7 +144,7 @@ export abstract class ValidatorProvider<
143
144
  };
144
145
 
145
146
  sendDisableUserOperation = async (
146
- disableData: Hex
147
+ disableData: Hex = "0x"
147
148
  ): Promise<SendUserOperationResult> => {
148
149
  const encodedDisableData = await this.getEncodedDisableData(disableData);
149
150
  if (!isKernelAccount(this.account) || !this.account.validator) {
@@ -151,8 +152,11 @@ export abstract class ValidatorProvider<
151
152
  "ValidatorProvider: account with validator is not set, did you call all connects first?"
152
153
  );
153
154
  }
155
+ if (!this.defaultProvider) {
156
+ throw Error("Default Validator provider unintialized");
157
+ }
154
158
 
155
- return await this.sendUserOperation({
159
+ return await this.defaultProvider.sendUserOperation({
156
160
  target: this.account.validator.validatorAddress,
157
161
  data: encodedDisableData,
158
162
  });
@@ -1,6 +1,7 @@
1
1
  import { ECDSAProvider } from "./ecdsa-provider.js";
2
2
  import { ERC165SessionKeyProvider } from "./erc165-session-key-provider.js";
3
3
  import { KillSwitchProvider } from "./kill-switch-provider.js";
4
+ import { RecoveryProvider } from "./recovery-provider.js";
4
5
  import { SessionKeyProvider } from "./session-key-provider.js";
5
6
  import type { ValidatorProviderMap } from "./types.js";
6
7
 
@@ -9,6 +10,7 @@ export const ValidatorProviders: ValidatorProviderMap = {
9
10
  KILL_SWITCH: KillSwitchProvider,
10
11
  ERC165_SESSION_KEY: ERC165SessionKeyProvider,
11
12
  SESSION_KEY: SessionKeyProvider,
13
+ RECOVERY: RecoveryProvider,
12
14
  };
13
15
 
14
16
  export {
@@ -16,4 +18,5 @@ export {
16
18
  KillSwitchProvider,
17
19
  ERC165SessionKeyProvider,
18
20
  SessionKeyProvider,
21
+ RecoveryProvider,
19
22
  };