@zerodev/sdk 4.0.8 → 4.0.10

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 (228) hide show
  1. package/README.md +125 -3
  2. package/dist/cjs/index.d.ts +3 -4
  3. package/dist/cjs/index.js +6 -1
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/kernel-zerodev/abis/ESCDAValidatorAbi.d.ts +2 -2
  6. package/dist/cjs/kernel-zerodev/abis/ESCDAValidatorAbi.js +2 -2
  7. package/dist/cjs/kernel-zerodev/abis/ESCDAValidatorAbi.js.map +1 -1
  8. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.d.ts +3 -3
  9. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js +3 -3
  10. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -1
  11. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +158 -0
  12. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.js +210 -0
  13. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.js.map +1 -0
  14. package/dist/cjs/kernel-zerodev/abis/Test_ERC20Abi.d.ts +237 -39
  15. package/dist/cjs/kernel-zerodev/abis/Test_ERC20Abi.js.map +1 -1
  16. package/dist/cjs/kernel-zerodev/account.d.ts +13 -4
  17. package/dist/cjs/kernel-zerodev/account.js +50 -38
  18. package/dist/cjs/kernel-zerodev/account.js.map +1 -1
  19. package/dist/cjs/kernel-zerodev/constants.d.ts +2 -0
  20. package/dist/cjs/kernel-zerodev/constants.js +3 -1
  21. package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
  22. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  23. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.js +1 -1
  24. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.js.map +1 -1
  25. package/dist/cjs/kernel-zerodev/ethers-provider/ethers-provider.d.ts +4 -3
  26. package/dist/cjs/kernel-zerodev/ethers-provider/ethers-provider.js +12 -1
  27. package/dist/cjs/kernel-zerodev/ethers-provider/ethers-provider.js.map +1 -1
  28. package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js +2 -2
  29. package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
  30. package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js +0 -1
  31. package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
  32. package/dist/cjs/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
  33. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +1 -10
  34. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  35. package/dist/cjs/kernel-zerodev/provider.js +1 -0
  36. package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
  37. package/dist/cjs/kernel-zerodev/signer/empty-account.d.ts +10 -0
  38. package/dist/cjs/kernel-zerodev/signer/empty-account.js +43 -0
  39. package/dist/cjs/kernel-zerodev/signer/empty-account.js.map +1 -0
  40. package/dist/cjs/kernel-zerodev/utils.d.ts +2 -0
  41. package/dist/cjs/kernel-zerodev/utils.js +11 -1
  42. package/dist/cjs/kernel-zerodev/utils.js.map +1 -1
  43. package/dist/cjs/kernel-zerodev/validator/base.d.ts +6 -3
  44. package/dist/cjs/kernel-zerodev/validator/base.js +20 -3
  45. package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
  46. package/dist/cjs/kernel-zerodev/validator/erc165-session-key-validator.d.ts +1 -0
  47. package/dist/cjs/kernel-zerodev/validator/erc165-session-key-validator.js +11 -0
  48. package/dist/cjs/kernel-zerodev/validator/erc165-session-key-validator.js.map +1 -1
  49. package/dist/cjs/kernel-zerodev/validator/index.d.ts +2 -1
  50. package/dist/cjs/kernel-zerodev/validator/index.js +4 -1
  51. package/dist/cjs/kernel-zerodev/validator/index.js.map +1 -1
  52. package/dist/cjs/kernel-zerodev/validator/kill-switch-validator.js +1 -0
  53. package/dist/cjs/kernel-zerodev/validator/kill-switch-validator.js.map +1 -1
  54. package/dist/cjs/kernel-zerodev/validator/session-key-validator.d.ts +65 -0
  55. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +345 -0
  56. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -0
  57. package/dist/cjs/kernel-zerodev/validator/types.d.ts +5 -1
  58. package/dist/cjs/kernel-zerodev/validator/types.js.map +1 -1
  59. package/dist/cjs/kernel-zerodev/validator-provider/base.d.ts +5 -4
  60. package/dist/cjs/kernel-zerodev/validator-provider/base.js +17 -2
  61. package/dist/cjs/kernel-zerodev/validator-provider/base.js.map +1 -1
  62. package/dist/cjs/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +2 -2
  63. package/dist/cjs/kernel-zerodev/validator-provider/ecdsa-provider.js.map +1 -1
  64. package/dist/cjs/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +2 -2
  65. package/dist/cjs/kernel-zerodev/validator-provider/erc165-session-key-provider.js.map +1 -1
  66. package/dist/cjs/kernel-zerodev/validator-provider/index.d.ts +2 -1
  67. package/dist/cjs/kernel-zerodev/validator-provider/index.js +4 -1
  68. package/dist/cjs/kernel-zerodev/validator-provider/index.js.map +1 -1
  69. package/dist/cjs/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +2 -2
  70. package/dist/cjs/kernel-zerodev/validator-provider/kill-switch-provider.js.map +1 -1
  71. package/dist/cjs/kernel-zerodev/validator-provider/session-key-provider.d.ts +18 -0
  72. package/dist/cjs/kernel-zerodev/validator-provider/session-key-provider.js +114 -0
  73. package/dist/cjs/kernel-zerodev/validator-provider/session-key-provider.js.map +1 -0
  74. package/dist/cjs/kernel-zerodev/validator-provider/types.d.ts +5 -0
  75. package/dist/cjs/kernel-zerodev/validator-provider/types.js.map +1 -1
  76. package/dist/esm/index.d.ts +3 -4
  77. package/dist/esm/index.js +3 -1
  78. package/dist/esm/index.js.map +1 -1
  79. package/dist/esm/kernel-zerodev/abis/ESCDAValidatorAbi.d.ts +2 -2
  80. package/dist/esm/kernel-zerodev/abis/ESCDAValidatorAbi.js +2 -2
  81. package/dist/esm/kernel-zerodev/abis/ESCDAValidatorAbi.js.map +1 -1
  82. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.d.ts +3 -3
  83. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js +3 -3
  84. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -1
  85. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +158 -0
  86. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.js +207 -0
  87. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.js.map +1 -0
  88. package/dist/esm/kernel-zerodev/abis/Test_ERC20Abi.d.ts +237 -39
  89. package/dist/esm/kernel-zerodev/abis/Test_ERC20Abi.js.map +1 -1
  90. package/dist/esm/kernel-zerodev/account.d.ts +13 -4
  91. package/dist/esm/kernel-zerodev/account.js +51 -38
  92. package/dist/esm/kernel-zerodev/account.js.map +1 -1
  93. package/dist/esm/kernel-zerodev/constants.d.ts +2 -0
  94. package/dist/esm/kernel-zerodev/constants.js +2 -0
  95. package/dist/esm/kernel-zerodev/constants.js.map +1 -1
  96. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  97. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.js +2 -2
  98. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.js.map +1 -1
  99. package/dist/esm/kernel-zerodev/ethers-provider/ethers-provider.d.ts +4 -3
  100. package/dist/esm/kernel-zerodev/ethers-provider/ethers-provider.js +13 -2
  101. package/dist/esm/kernel-zerodev/ethers-provider/ethers-provider.js.map +1 -1
  102. package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js +3 -3
  103. package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
  104. package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js +1 -2
  105. package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
  106. package/dist/esm/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
  107. package/dist/esm/kernel-zerodev/owner/passkey/utils.js +0 -8
  108. package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  109. package/dist/esm/kernel-zerodev/provider.js +1 -0
  110. package/dist/esm/kernel-zerodev/provider.js.map +1 -1
  111. package/dist/esm/kernel-zerodev/signer/empty-account.d.ts +10 -0
  112. package/dist/esm/kernel-zerodev/signer/empty-account.js +40 -0
  113. package/dist/esm/kernel-zerodev/signer/empty-account.js.map +1 -0
  114. package/dist/esm/kernel-zerodev/utils.d.ts +2 -0
  115. package/dist/esm/kernel-zerodev/utils.js +8 -0
  116. package/dist/esm/kernel-zerodev/utils.js.map +1 -1
  117. package/dist/esm/kernel-zerodev/validator/base.d.ts +6 -3
  118. package/dist/esm/kernel-zerodev/validator/base.js +20 -3
  119. package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
  120. package/dist/esm/kernel-zerodev/validator/erc165-session-key-validator.d.ts +1 -0
  121. package/dist/esm/kernel-zerodev/validator/erc165-session-key-validator.js +13 -2
  122. package/dist/esm/kernel-zerodev/validator/erc165-session-key-validator.js.map +1 -1
  123. package/dist/esm/kernel-zerodev/validator/index.d.ts +2 -1
  124. package/dist/esm/kernel-zerodev/validator/index.js +3 -1
  125. package/dist/esm/kernel-zerodev/validator/index.js.map +1 -1
  126. package/dist/esm/kernel-zerodev/validator/kill-switch-validator.js +2 -1
  127. package/dist/esm/kernel-zerodev/validator/kill-switch-validator.js.map +1 -1
  128. package/dist/esm/kernel-zerodev/validator/session-key-validator.d.ts +65 -0
  129. package/dist/esm/kernel-zerodev/validator/session-key-validator.js +341 -0
  130. package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -0
  131. package/dist/esm/kernel-zerodev/validator/types.d.ts +5 -1
  132. package/dist/esm/kernel-zerodev/validator/types.js.map +1 -1
  133. package/dist/esm/kernel-zerodev/validator-provider/base.d.ts +5 -4
  134. package/dist/esm/kernel-zerodev/validator-provider/base.js +17 -2
  135. package/dist/esm/kernel-zerodev/validator-provider/base.js.map +1 -1
  136. package/dist/esm/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +2 -2
  137. package/dist/esm/kernel-zerodev/validator-provider/ecdsa-provider.js.map +1 -1
  138. package/dist/esm/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +2 -2
  139. package/dist/esm/kernel-zerodev/validator-provider/erc165-session-key-provider.js.map +1 -1
  140. package/dist/esm/kernel-zerodev/validator-provider/index.d.ts +2 -1
  141. package/dist/esm/kernel-zerodev/validator-provider/index.js +3 -1
  142. package/dist/esm/kernel-zerodev/validator-provider/index.js.map +1 -1
  143. package/dist/esm/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +2 -2
  144. package/dist/esm/kernel-zerodev/validator-provider/kill-switch-provider.js.map +1 -1
  145. package/dist/esm/kernel-zerodev/validator-provider/session-key-provider.d.ts +18 -0
  146. package/dist/esm/kernel-zerodev/validator-provider/session-key-provider.js +110 -0
  147. package/dist/esm/kernel-zerodev/validator-provider/session-key-provider.js.map +1 -0
  148. package/dist/esm/kernel-zerodev/validator-provider/types.d.ts +5 -0
  149. package/dist/esm/kernel-zerodev/validator-provider/types.js.map +1 -1
  150. package/dist/types/index.d.ts +3 -4
  151. package/dist/types/index.d.ts.map +1 -1
  152. package/dist/types/kernel-zerodev/abis/ESCDAValidatorAbi.d.ts +2 -2
  153. package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts +3 -3
  154. package/dist/types/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +159 -0
  155. package/dist/types/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts.map +1 -0
  156. package/dist/types/kernel-zerodev/abis/Test_ERC20Abi.d.ts +237 -39
  157. package/dist/types/kernel-zerodev/abis/Test_ERC20Abi.d.ts.map +1 -1
  158. package/dist/types/kernel-zerodev/account.d.ts +13 -4
  159. package/dist/types/kernel-zerodev/account.d.ts.map +1 -1
  160. package/dist/types/kernel-zerodev/constants.d.ts +2 -0
  161. package/dist/types/kernel-zerodev/constants.d.ts.map +1 -1
  162. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  163. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts.map +1 -1
  164. package/dist/types/kernel-zerodev/ethers-provider/ethers-provider.d.ts +4 -3
  165. package/dist/types/kernel-zerodev/ethers-provider/ethers-provider.d.ts.map +1 -1
  166. package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts.map +1 -1
  167. package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts.map +1 -1
  168. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
  169. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -1
  170. package/dist/types/kernel-zerodev/provider.d.ts.map +1 -1
  171. package/dist/types/kernel-zerodev/signer/empty-account.d.ts +11 -0
  172. package/dist/types/kernel-zerodev/signer/empty-account.d.ts.map +1 -0
  173. package/dist/types/kernel-zerodev/utils.d.ts +2 -0
  174. package/dist/types/kernel-zerodev/utils.d.ts.map +1 -1
  175. package/dist/types/kernel-zerodev/validator/base.d.ts +6 -3
  176. package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
  177. package/dist/types/kernel-zerodev/validator/erc165-session-key-validator.d.ts +1 -0
  178. package/dist/types/kernel-zerodev/validator/erc165-session-key-validator.d.ts.map +1 -1
  179. package/dist/types/kernel-zerodev/validator/index.d.ts +2 -1
  180. package/dist/types/kernel-zerodev/validator/index.d.ts.map +1 -1
  181. package/dist/types/kernel-zerodev/validator/kill-switch-validator.d.ts.map +1 -1
  182. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts +66 -0
  183. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -0
  184. package/dist/types/kernel-zerodev/validator/types.d.ts +5 -1
  185. package/dist/types/kernel-zerodev/validator/types.d.ts.map +1 -1
  186. package/dist/types/kernel-zerodev/validator-provider/base.d.ts +5 -4
  187. package/dist/types/kernel-zerodev/validator-provider/base.d.ts.map +1 -1
  188. package/dist/types/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +2 -2
  189. package/dist/types/kernel-zerodev/validator-provider/ecdsa-provider.d.ts.map +1 -1
  190. package/dist/types/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +2 -2
  191. package/dist/types/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts.map +1 -1
  192. package/dist/types/kernel-zerodev/validator-provider/index.d.ts +2 -1
  193. package/dist/types/kernel-zerodev/validator-provider/index.d.ts.map +1 -1
  194. package/dist/types/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +2 -2
  195. package/dist/types/kernel-zerodev/validator-provider/kill-switch-provider.d.ts.map +1 -1
  196. package/dist/types/kernel-zerodev/validator-provider/session-key-provider.d.ts +19 -0
  197. package/dist/types/kernel-zerodev/validator-provider/session-key-provider.d.ts.map +1 -0
  198. package/dist/types/kernel-zerodev/validator-provider/types.d.ts +5 -0
  199. package/dist/types/kernel-zerodev/validator-provider/types.d.ts.map +1 -1
  200. package/package.json +2 -1
  201. package/src/index.ts +3 -4
  202. package/src/kernel-zerodev/abis/ESCDAValidatorAbi.ts +2 -2
  203. package/src/kernel-zerodev/abis/KernelAccountAbi.ts +3 -3
  204. package/src/kernel-zerodev/abis/SessionKeyValidatorAbi.ts +206 -0
  205. package/src/kernel-zerodev/abis/Test_ERC20Abi.ts +1 -1
  206. package/src/kernel-zerodev/account.ts +58 -50
  207. package/src/kernel-zerodev/constants.ts +3 -0
  208. package/src/kernel-zerodev/ethers-provider/account-signer.ts +3 -3
  209. package/src/kernel-zerodev/ethers-provider/ethers-provider.ts +25 -7
  210. package/src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts +3 -3
  211. package/src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts +1 -2
  212. package/src/kernel-zerodev/owner/passkey/utils.ts +0 -9
  213. package/src/kernel-zerodev/provider.ts +4 -2
  214. package/src/kernel-zerodev/signer/empty-account.ts +27 -0
  215. package/src/kernel-zerodev/utils.ts +10 -0
  216. package/src/kernel-zerodev/validator/base.ts +32 -6
  217. package/src/kernel-zerodev/validator/erc165-session-key-validator.ts +20 -1
  218. package/src/kernel-zerodev/validator/index.ts +8 -1
  219. package/src/kernel-zerodev/validator/kill-switch-validator.ts +6 -1
  220. package/src/kernel-zerodev/validator/session-key-validator.ts +483 -0
  221. package/src/kernel-zerodev/validator/types.ts +14 -1
  222. package/src/kernel-zerodev/validator-provider/base.ts +24 -13
  223. package/src/kernel-zerodev/validator-provider/ecdsa-provider.ts +4 -1
  224. package/src/kernel-zerodev/validator-provider/erc165-session-key-provider.ts +4 -1
  225. package/src/kernel-zerodev/validator-provider/index.ts +8 -1
  226. package/src/kernel-zerodev/validator-provider/kill-switch-provider.ts +4 -1
  227. package/src/kernel-zerodev/validator-provider/session-key-provider.ts +151 -0
  228. package/src/kernel-zerodev/validator-provider/types.ts +10 -0
@@ -8,17 +8,14 @@ import {
8
8
  type Hex,
9
9
  toBytes,
10
10
  type Transport,
11
- pad,
12
- toHex,
13
11
  } from "viem";
14
12
  import { parseAbiParameters } from "abitype";
15
- import { KernelBaseValidator, ValidatorMode } from "./validator/base.js";
13
+ import { KernelBaseValidator } from "./validator/base.js";
16
14
  import { KernelAccountAbi } from "./abis/KernelAccountAbi.js";
17
15
  import { KernelFactoryAbi } from "./abis/KernelFactoryAbi.js";
18
16
  import {
19
17
  type BaseSmartAccountParams,
20
18
  BaseSmartContractAccount,
21
- type SmartAccountSigner,
22
19
  type BatchUserOperationCallData,
23
20
  type UserOperationRequest,
24
21
  defineReadOnly,
@@ -38,17 +35,22 @@ import { polygonMumbai } from "viem/chains";
38
35
  import { getChainId } from "./api/index.js";
39
36
  import { createZeroDevPublicErc4337Client } from "./client/create-client.js";
40
37
  import type { PaymasterAndBundlerProviders } from "./paymaster/types.js";
41
- import type { KillSwitchValidator } from "./validator/kill-switch-validator.js";
42
38
 
39
+ export enum DeploymentState {
40
+ UNDEFINED = "0x0",
41
+ NOT_DEPLOYED = "0x1",
42
+ DEPLOYED = "0x2",
43
+ }
43
44
  export interface KernelSmartAccountParams<
44
45
  TTransport extends Transport | FallbackTransport = Transport
45
46
  > extends Partial<BaseSmartAccountParams<TTransport>> {
46
47
  projectId: string;
47
- owner: SmartAccountSigner;
48
48
  factoryAddress?: Address;
49
49
  index?: bigint;
50
50
  validator?: KernelBaseValidator;
51
51
  bundlerProvider?: PaymasterAndBundlerProviders;
52
+ defaultValidator?: KernelBaseValidator;
53
+ initCode?: Hex;
52
54
  }
53
55
 
54
56
  export function isKernelAccount(
@@ -60,10 +62,11 @@ export function isKernelAccount(
60
62
  export class KernelSmartContractAccount<
61
63
  TTransport extends Transport | FallbackTransport = Transport
62
64
  > extends BaseSmartContractAccount<TTransport> {
63
- private owner: SmartAccountSigner;
64
65
  private readonly factoryAddress: Address;
65
66
  private readonly index: bigint;
67
+ private initCode?: Hex;
66
68
  validator?: KernelBaseValidator;
69
+ defaultValidator?: KernelBaseValidator;
67
70
 
68
71
  constructor(params: KernelSmartAccountParams) {
69
72
  super({
@@ -73,9 +76,10 @@ export class KernelSmartContractAccount<
73
76
  rpcClient: params.rpcClient ?? BUNDLER_URL,
74
77
  });
75
78
  this.index = params.index ?? 0n;
76
- this.owner = params.owner;
77
79
  this.factoryAddress = params.factoryAddress ?? KERNEL_FACTORY_ADDRESS;
78
80
  this.validator = params.validator;
81
+ this.defaultValidator = params.defaultValidator;
82
+ this.initCode = params.initCode;
79
83
  }
80
84
 
81
85
  public static async init(
@@ -119,52 +123,55 @@ export class KernelSmartContractAccount<
119
123
  return "0x00000000870fe151d548a1c527c3804866fab30abf28ed17b79d5fc5149f19ca0819fefc3c57f3da4fdf9b10fab3f2f3dca536467ae44943b9dbb8433efe7760ddd72aaa1c";
120
124
  }
121
125
 
122
- async getDynamicDummySignature(
123
- kernelAccountAddress: Address,
124
- calldata: Hex
125
- ): Promise<Hex> {
126
- if (!this.validator) {
127
- throw new Error("Validator not connected");
126
+ async getInitCode(): Promise<Hex> {
127
+ if (this.deploymentState === DeploymentState.DEPLOYED) {
128
+ return "0x";
128
129
  }
129
-
130
- const dummyECDSASig =
131
- "0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c";
132
- const validatorMode = await this.validator.resolveValidatorMode(
133
- kernelAccountAddress,
134
- calldata
130
+ const contractCode = await this.rpcProvider.getContractCode(
131
+ await this.getAddress()
135
132
  );
136
- if (validatorMode === ValidatorMode.enable) {
137
- const enableData = await this.validator.getEnableData();
138
- const enableDataLength = enableData.length / 2 - 1;
139
- const enableSigLength = 65;
140
- const staticDummySig = concatHex([
141
- "0x000000000000000000000000",
142
- this.validator.getAddress(),
143
- "0x53dd285022D1512635823952d109dB39467a457E",
144
- ]);
145
- const pausedUntil = await (
146
- this.validator as KillSwitchValidator
147
- ).getPausedUntil();
148
133
 
149
- return concatHex([
150
- ValidatorMode.enable,
151
- staticDummySig,
152
- pad(toHex(enableDataLength), { size: 32 }),
153
- enableData,
154
- pad(toHex(enableSigLength), { size: 32 }),
155
- dummyECDSASig,
156
- pad(toHex(pausedUntil), { size: 6 }),
157
- dummyECDSASig,
158
- ]);
134
+ if ((contractCode?.length ?? 0) > 2) {
135
+ this.deploymentState = DeploymentState.DEPLOYED;
136
+ return "0x";
137
+ } else {
138
+ this.deploymentState = DeploymentState.NOT_DEPLOYED;
139
+ }
140
+
141
+ return this.initCode ?? this.getAccountInitCode();
142
+ }
143
+
144
+ getIndex(): bigint {
145
+ return this.index;
146
+ }
147
+
148
+ async approvePlugin() {
149
+ if (!this.validator) {
150
+ throw new Error("Validator not connected");
151
+ }
152
+ if (this.defaultValidator && !this.validator.getEnableSignature()) {
153
+ const { executor, selector, validAfter, validUntil } =
154
+ this.validator.getPluginValidatorData();
155
+ const enableSig = await this.defaultValidator.approveExecutor(
156
+ await this.getAddress(),
157
+ selector,
158
+ executor,
159
+ validUntil,
160
+ validAfter,
161
+ this.validator
162
+ );
163
+ this.validator.setEnableSignature(enableSig);
159
164
  }
160
- return concatHex([validatorMode, dummyECDSASig]);
161
165
  }
162
166
 
163
167
  async encodeExecute(target: Hex, value: bigint, data: Hex): Promise<Hex> {
164
168
  if (!this.validator) {
165
169
  throw new Error("Validator not connected");
166
170
  }
167
- if (target.toLowerCase() === this.accountAddress?.toLowerCase()) {
171
+ if (
172
+ target.toLowerCase() === (await this.getAddress()).toLowerCase() &&
173
+ this.validator.shouldDelegateViaFallback()
174
+ ) {
168
175
  return data;
169
176
  } else {
170
177
  return this.encodeExecuteAction(target, value, data, 0);
@@ -196,8 +203,11 @@ export class KernelSmartContractAccount<
196
203
 
197
204
  async signWithEip6492(msg: string | Uint8Array): Promise<Hex> {
198
205
  try {
206
+ if (!this.validator) {
207
+ throw new Error("Validator not connected");
208
+ }
199
209
  const formattedMessage = typeof msg === "string" ? toBytes(msg) : msg;
200
- let sig = await this.owner.signMessage(
210
+ let sig = await this.validator.signMessage(
201
211
  toBytes(hashMessage({ raw: formattedMessage }))
202
212
  );
203
213
  // If the account is undeployed, use ERC-6492
@@ -255,7 +265,8 @@ export class KernelSmartContractAccount<
255
265
  }
256
266
 
257
267
  protected async getFactoryInitCode(): Promise<Hex> {
258
- if (!this.validator) {
268
+ const validator = this.defaultValidator ?? this.validator;
269
+ if (!validator) {
259
270
  throw new Error("Validator not connected");
260
271
  }
261
272
  try {
@@ -267,10 +278,7 @@ export class KernelSmartContractAccount<
267
278
  encodeFunctionData({
268
279
  abi: KernelAccountAbi,
269
280
  functionName: "initialize",
270
- args: [
271
- this.validator.getAddress(),
272
- await this.validator.getEnableData(),
273
- ],
281
+ args: [validator.getAddress(), await validator.getEnableData()],
274
282
  }),
275
283
  this.index,
276
284
  ],
@@ -24,6 +24,9 @@ export const DUMMY_ECDSA_SIG =
24
24
  export const ERC165_SESSION_KEY_VALIDATOR_ADDRESS =
25
25
  "0xe149290800De29D4b0BF9dB82c508255D81902E6";
26
26
  export const TOKEN_ACTION = "0x2087C7FfD0d0DAE80a00EE74325aBF3449e0eaf1";
27
+ export const SESSION_KEY_VALIDATOR_ADDRESS =
28
+ "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f";
29
+ export const oneAddress = "0x0000000000000000000000000000000000000001";
27
30
 
28
31
  export const gasTokenChainAddresses: IGasTokenAddresses = {
29
32
  USDC: {
@@ -1,5 +1,4 @@
1
1
  import {
2
- BaseSmartContractAccount,
3
2
  resolveProperties,
4
3
  type AccountMiddlewareFn,
5
4
  type FeeDataMiddleware,
@@ -23,6 +22,7 @@ import {
23
22
  } from "@ethersproject/providers";
24
23
  import { ZeroDevEthersProvider } from "./ethers-provider.js";
25
24
  import type { SupportedValidators } from "../validator/types.js";
25
+ import type { KernelSmartContractAccount } from "../account.js";
26
26
 
27
27
  const hexlifyOptional = (value: any): `0x${string}` | undefined => {
28
28
  if (value == null) {
@@ -36,14 +36,14 @@ export class ZeroDevAccountSigner<V extends SupportedValidators>
36
36
  extends Signer
37
37
  implements TypedDataSigner
38
38
  {
39
- private account?: BaseSmartContractAccount;
39
+ private account?: KernelSmartContractAccount;
40
40
 
41
41
  sendUserOperation;
42
42
  waitForUserOperationTransaction;
43
43
 
44
44
  constructor(readonly provider: ZeroDevEthersProvider<V>) {
45
45
  super();
46
- this.account = this.provider.accountProvider.account;
46
+ this.account = this.provider.accountProvider.getAccount();
47
47
 
48
48
  this.sendUserOperation =
49
49
  this.provider.accountProvider.sendUserOperation.bind(
@@ -1,8 +1,6 @@
1
1
  import { getChainId } from "../api/index.js";
2
2
  import {
3
- SmartAccountProvider,
4
3
  getChain,
5
- type HttpTransport,
6
4
  BaseSmartContractAccount,
7
5
  defineReadOnly,
8
6
  type AccountMiddlewareFn,
@@ -14,22 +12,34 @@ import {
14
12
  import { ZeroDevAccountSigner } from "./account-signer.js";
15
13
  import { JsonRpcProvider } from "@ethersproject/providers";
16
14
  import type { SupportedValidators } from "../validator/types.js";
17
- import type { ValidatorProviderParamsMap } from "../validator-provider/types.js";
15
+ import type {
16
+ ValidatorProviderParamsMap,
17
+ ValidatorProviderTypeMap,
18
+ } from "../validator-provider/types.js";
18
19
  import { ValidatorProviders } from "../validator-provider/index.js";
19
20
  import { withZeroDevPaymasterAndData } from "../middleware/paymaster.js";
20
21
 
21
22
  export class ZeroDevEthersProvider<
22
23
  V extends SupportedValidators
23
24
  > extends JsonRpcProvider {
24
- readonly accountProvider: SmartAccountProvider<HttpTransport>;
25
+ readonly accountProvider: ValidatorProviderTypeMap[V];
25
26
  constructor(validatorType: V, params: ValidatorProviderParamsMap[V]) {
26
27
  super();
27
28
  let accountProvider = new ValidatorProviders[validatorType](params);
28
29
  if (params.usePaymaster === undefined || params.usePaymaster) {
30
+ let paymasterConfig = params.opts?.paymasterConfig ?? {
31
+ policy: "VERIFYING_PAYMASTER",
32
+ };
33
+ paymasterConfig = {
34
+ ...paymasterConfig,
35
+ paymasterProvider:
36
+ params.opts?.paymasterConfig?.paymasterProvider ??
37
+ params.bundlerProvider,
38
+ };
29
39
  accountProvider = withZeroDevPaymasterAndData(
30
40
  accountProvider,
31
- params.opts?.paymasterConfig ?? { policy: "VERIFYING_PAYMASTER" }
32
- ) as typeof accountProvider;
41
+ paymasterConfig
42
+ ) as ValidatorProviderTypeMap[V];
33
43
  }
34
44
  this.accountProvider = accountProvider;
35
45
  }
@@ -57,6 +67,10 @@ export class ZeroDevEthersProvider<
57
67
  return instance;
58
68
  }
59
69
 
70
+ getAccountProvider(): ValidatorProviderTypeMap[V] {
71
+ return this.accountProvider;
72
+ }
73
+
60
74
  /**
61
75
  * Rewrites the send method to use the account provider's EIP-1193
62
76
  * compliant request method
@@ -78,7 +92,11 @@ export class ZeroDevEthersProvider<
78
92
  connectToAccount(
79
93
  fn: (rpcClient: PublicErc4337Client) => BaseSmartContractAccount
80
94
  ): ZeroDevAccountSigner<V> {
81
- defineReadOnly(this, "accountProvider", this.accountProvider.connect(fn));
95
+ defineReadOnly(
96
+ this,
97
+ "accountProvider",
98
+ this.accountProvider.connect(fn) as ValidatorProviderTypeMap[V]
99
+ );
82
100
  return this.getAccountSigner();
83
101
  }
84
102
 
@@ -5,7 +5,6 @@ import {
5
5
  base64UrlEncode,
6
6
  es256,
7
7
  generateRandomBuffer,
8
- getCredentials,
9
8
  publicKey,
10
9
  signMessage,
11
10
  signTypedData,
@@ -26,6 +25,7 @@ export async function createPasskeyOwner({
26
25
  //@ts-expect-error
27
26
  if (typeof window !== "undefined") {
28
27
  const challenge = generateRandomBuffer();
28
+ const authenticatorUserId = generateRandomBuffer();
29
29
  try {
30
30
  const attestation = await getWebAuthnAttestation({
31
31
  publicKey: {
@@ -39,7 +39,7 @@ export async function createPasskeyOwner({
39
39
  residentKey: "required", // or 'preferred', 'discouraged'
40
40
  userVerification: "required",
41
41
  },
42
- excludeCredentials: await getCredentials(projectId),
42
+ // excludeCredentials: await getCredentials(projectId),
43
43
  extensions: { credProps: true },
44
44
  challenge,
45
45
  pubKeyCredParams: [
@@ -49,7 +49,7 @@ export async function createPasskeyOwner({
49
49
  },
50
50
  ],
51
51
  user: {
52
- id: Uint8Array.from(name, (c) => c.charCodeAt(0)),
52
+ id: authenticatorUserId,
53
53
  name,
54
54
  displayName: name,
55
55
  },
@@ -4,7 +4,6 @@ import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
4
4
  import {
5
5
  base64UrlEncode,
6
6
  generateRandomBuffer,
7
- getCredentials,
8
7
  signMessage,
9
8
  signTypedData,
10
9
  } from "./utils.js";
@@ -27,7 +26,7 @@ export async function getPasskeyOwner({
27
26
  //@ts-expect-error
28
27
  rpId: window.location.hostname,
29
28
  userVerification: "required",
30
- allowCredentials: await getCredentials(projectId),
29
+ // allowCredentials: await getCredentials(projectId),
31
30
  },
32
31
  })
33
32
  );
@@ -119,15 +119,6 @@ export const signTypedData = async (
119
119
  );
120
120
  };
121
121
 
122
- export const getCredentials = async (projectId: string, apiUrl = API_URL) => {
123
- const response = await axios.get(`${apiUrl}/projects/${projectId}/wallets`);
124
- const credentials = response.data;
125
- return credentials.map((credential: string) => ({
126
- id: base64URLStringToBuffer(credential),
127
- type: "public-key",
128
- }));
129
- };
130
-
131
122
  // https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8
132
123
  export function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {
133
124
  // Convert from Base64URL to Base64
@@ -56,8 +56,8 @@ export type ZeroDevProviderConfig = {
56
56
  };
57
57
 
58
58
  export enum Operation {
59
- Call,
60
- DelegateCall,
59
+ Call = 0,
60
+ DelegateCall = 1,
61
61
  }
62
62
 
63
63
  type UserOpDataOperationTypes<T> = T extends UserOperationCallData
@@ -214,6 +214,8 @@ export class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {
214
214
  );
215
215
  }
216
216
 
217
+ this.account.approvePlugin();
218
+
217
219
  request.signature = await this.account.validator.getSignature(request);
218
220
  try {
219
221
  hash = await this.rpcClient.sendUserOperation(
@@ -0,0 +1,27 @@
1
+ import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
2
+ import { type Hex } from "viem";
3
+
4
+ export class EmptyAccountSigner implements SmartAccountSigner {
5
+ private owner: Hex;
6
+ constructor(owner: Hex) {
7
+ this.owner = owner;
8
+ }
9
+
10
+ readonly signMessage: (msg: string | Uint8Array) => Promise<`0x${string}`> = (
11
+ _msg
12
+ ) => {
13
+ throw Error("EmptyAccountSigner: method not implemented");
14
+ };
15
+
16
+ readonly signTypedData = (_params: SignTypedDataParams) => {
17
+ throw Error("EmptyAccountSigner: method not implemented");
18
+ };
19
+
20
+ readonly getAddress: () => Promise<`0x${string}`> = async () => {
21
+ return this.owner;
22
+ };
23
+
24
+ static addressToAccountSigner(ownerAddress: Hex): EmptyAccountSigner {
25
+ return new EmptyAccountSigner(ownerAddress);
26
+ }
27
+ }
@@ -46,6 +46,16 @@ export const encodeMultiSend = (
46
46
  return ("0x" + _txs.map((tx) => encodeCall(tx)).join("")) as Hex;
47
47
  };
48
48
 
49
+ export function base64ToBytes(base64: string) {
50
+ const binString = atob(base64);
51
+ return Uint8Array.from(binString, (m) => m.codePointAt(0) as number);
52
+ }
53
+
54
+ export function bytesToBase64(bytes: Uint8Array) {
55
+ const binString = Array.from(bytes, (x) => String.fromCodePoint(x)).join("");
56
+ return btoa(binString);
57
+ }
58
+
49
59
  export function getGasTokenAddress(
50
60
  gasToken: SupportedGasToken,
51
61
  chainId: number
@@ -43,11 +43,18 @@ export interface KernelBaseValidatorParams {
43
43
  validUntil?: number;
44
44
  validAfter?: number;
45
45
  executor?: Address;
46
- selector?: string;
46
+ selector?: Hex;
47
47
  rpcUrl?: string;
48
48
  bundlerProvider?: PaymasterAndBundlerProviders;
49
49
  }
50
50
 
51
+ export type ValidatorPluginData = Required<
52
+ Pick<
53
+ KernelBaseValidatorParams,
54
+ "executor" | "selector" | "validAfter" | "validUntil"
55
+ >
56
+ >;
57
+
51
58
  //Kernel wallet implementation separates out validation and execution phase. It allows you to have
52
59
  // custom wrapper logic for the validation phase in addition to signature of choice.
53
60
  export abstract class KernelBaseValidator {
@@ -60,7 +67,7 @@ export abstract class KernelBaseValidator {
60
67
  protected validUntil: number;
61
68
  protected validAfter: number;
62
69
  protected executor?: Address;
63
- protected selector?: string;
70
+ protected selector?: Hex;
64
71
  protected rpcUrl?: string;
65
72
  protected bundlerProvider?: PaymasterAndBundlerProviders;
66
73
  publicClient?: PublicClient<Transport, Chain>;
@@ -98,13 +105,29 @@ export abstract class KernelBaseValidator {
98
105
 
99
106
  abstract signer(): Promise<SmartAccountSigner>;
100
107
 
101
- abstract getDummyUserOpSignature(): Promise<Hex>;
108
+ abstract getDummyUserOpSignature(callData?: Hex): Promise<Hex>;
102
109
 
103
110
  abstract isPluginEnabled(
104
111
  kernelAccountAddress: Address,
105
112
  selector: Hex
106
113
  ): Promise<boolean>;
107
114
 
115
+ shouldDelegateViaFallback(): boolean {
116
+ return true;
117
+ }
118
+
119
+ getPluginValidatorData(): ValidatorPluginData {
120
+ if (!this.selector || !this.executor) {
121
+ throw Error("Plugin Validator data params uninitialised");
122
+ }
123
+ return {
124
+ selector: this.selector,
125
+ executor: this.executor,
126
+ validAfter: this.validAfter,
127
+ validUntil: this.validUntil,
128
+ };
129
+ }
130
+
108
131
  async getDynamicDummySignature(
109
132
  kernelAccountAddress: Address,
110
133
  calldata: Hex
@@ -122,7 +145,7 @@ export abstract class KernelBaseValidator {
122
145
  const staticDummySig = concatHex([
123
146
  "0x000000000000000000000000",
124
147
  this.getAddress(),
125
- "0x53dd285022D1512635823952d109dB39467a457E",
148
+ this.executor!,
126
149
  ]);
127
150
 
128
151
  return concatHex([
@@ -132,10 +155,13 @@ export abstract class KernelBaseValidator {
132
155
  enableData,
133
156
  pad(toHex(enableSigLength), { size: 32 }),
134
157
  dummyECDSASig,
135
- await this.getDummyUserOpSignature(),
158
+ await this.getDummyUserOpSignature(calldata),
136
159
  ]);
137
160
  }
138
- return concatHex([validatorMode, await this.getDummyUserOpSignature()]);
161
+ return concatHex([
162
+ validatorMode,
163
+ await this.getDummyUserOpSignature(calldata),
164
+ ]);
139
165
  }
140
166
 
141
167
  setEnableSignature(enableSignature: Hex) {
@@ -4,13 +4,19 @@ import {
4
4
  type Hex,
5
5
  type SmartAccountSigner,
6
6
  type UserOperationRequest,
7
+ getChain,
7
8
  type SignTypedDataParams,
8
9
  } from "@alchemy/aa-core";
9
- import { KernelBaseValidator, type KernelBaseValidatorParams } from "./base.js";
10
+ import {
11
+ KernelBaseValidator,
12
+ ValidatorMode,
13
+ type KernelBaseValidatorParams,
14
+ } from "./base.js";
10
15
  import { encodeFunctionData, toBytes, concat, pad, toHex } from "viem";
11
16
  import { ERC165SessionKeyValidatorAbi } from "../abis/ERC165SessionKeyValidatorAbi.js";
12
17
  import { DUMMY_ECDSA_SIG } from "../constants.js";
13
18
  import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
19
+ import { getChainId } from "../api/index.js";
14
20
  import { fixSignedData } from "../utils.js";
15
21
 
16
22
  export interface ERC165SessionKeyValidatorParams
@@ -35,6 +41,19 @@ export class ERC165SessionKeyValidator extends KernelBaseValidator {
35
41
  super(params);
36
42
  this.sessionKey = params.sessionKey;
37
43
  this.sessionKeyData = params.sessionKeyData;
44
+ this.mode = params.mode ?? ValidatorMode.plugin;
45
+ }
46
+
47
+ public static async init(
48
+ params: ERC165SessionKeyValidatorParams
49
+ ): Promise<ERC165SessionKeyValidator> {
50
+ const chainId = await getChainId(params.projectId);
51
+ if (!chainId) {
52
+ throw new Error("ChainId not found");
53
+ }
54
+ const chain = getChain(chainId);
55
+ const instance = new ERC165SessionKeyValidator({ ...params, chain });
56
+ return instance;
38
57
  }
39
58
 
40
59
  async signer(): Promise<SmartAccountSigner> {
@@ -1,12 +1,19 @@
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 { SessionKeyValidator } from "./session-key-validator.js";
4
5
  import type { ValidatorMap } from "./types.js";
5
6
 
6
7
  export const Validators: ValidatorMap = {
7
8
  ECDSA: ECDSAValidator,
8
9
  KILL_SWITCH: KillSwitchValidator,
9
10
  ERC165_SESSION_KEY: ERC165SessionKeyValidator,
11
+ SESSION_KEY: SessionKeyValidator,
10
12
  };
11
13
 
12
- export { ECDSAValidator, KillSwitchValidator, ERC165SessionKeyValidator };
14
+ export {
15
+ ECDSAValidator,
16
+ KillSwitchValidator,
17
+ ERC165SessionKeyValidator,
18
+ SessionKeyValidator,
19
+ };
@@ -7,7 +7,11 @@ import {
7
7
  type UserOperationRequest,
8
8
  type SignTypedDataParams,
9
9
  } from "@alchemy/aa-core";
10
- import { KernelBaseValidator, type KernelBaseValidatorParams } from "./base.js";
10
+ import {
11
+ KernelBaseValidator,
12
+ ValidatorMode,
13
+ type KernelBaseValidatorParams,
14
+ } from "./base.js";
11
15
  import {
12
16
  concat,
13
17
  concatHex,
@@ -37,6 +41,7 @@ export class KillSwitchValidator extends KernelBaseValidator {
37
41
  super(params);
38
42
  this.guardian = params.guardian;
39
43
  this.delaySeconds = params.delaySeconds;
44
+ this.mode = params.mode ?? ValidatorMode.plugin;
40
45
  }
41
46
 
42
47
  public static async init(