@zerodev/sdk 4.3.1 → 4.3.3

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 (30) hide show
  1. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.d.ts +2 -2
  2. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js +93 -48
  3. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js.map +1 -1
  4. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +2 -2
  5. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  6. package/dist/cjs/kernel-zerodev/validator/base.d.ts +1 -0
  7. package/dist/cjs/kernel-zerodev/validator/base.js +11 -2
  8. package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
  9. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +1 -2
  10. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -1
  11. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.d.ts +2 -2
  12. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js +70 -48
  13. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js.map +1 -1
  14. package/dist/esm/kernel-zerodev/owner/passkey/utils.js +2 -2
  15. package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  16. package/dist/esm/kernel-zerodev/validator/base.d.ts +1 -0
  17. package/dist/esm/kernel-zerodev/validator/base.js +11 -2
  18. package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
  19. package/dist/esm/kernel-zerodev/validator/session-key-validator.js +1 -2
  20. package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -1
  21. package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts +2 -2
  22. package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts.map +1 -1
  23. package/dist/types/kernel-zerodev/validator/base.d.ts +1 -0
  24. package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
  25. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -1
  26. package/package.json +3 -2
  27. package/src/kernel-zerodev/owner/getCustodialOwner.ts +175 -63
  28. package/src/kernel-zerodev/owner/passkey/utils.ts +2 -2
  29. package/src/kernel-zerodev/validator/base.ts +8 -8
  30. package/src/kernel-zerodev/validator/session-key-validator.ts +1 -2
@@ -1 +1 @@
1
- {"version":3,"file":"session-key-validator.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-key-validator.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerodev/sdk",
3
- "version": "4.3.1",
3
+ "version": "4.3.3",
4
4
  "description": "A collection of ERC-4337 compliant smart contract account interfaces",
5
5
  "author": "ZeroDev",
6
6
  "license": "MIT",
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "devDependencies": {
47
47
  "@turnkey/api-key-stamper": "^0.1.1",
48
- "@turnkey/http": "^1.2.0",
48
+ "@turnkey/http": "^2.1.0",
49
49
  "@turnkey/viem": "^0.2.4",
50
50
  "typescript": "^5.0.4",
51
51
  "typescript-template": "*",
@@ -70,6 +70,7 @@
70
70
  "@openzeppelin/merkle-tree": "^1.0.5",
71
71
  "axios": "^1.4.0",
72
72
  "merkletreejs": "^0.3.10",
73
+ "radash": "^11.0.0",
73
74
  "viem": "^1.5.3"
74
75
  }
75
76
  }
@@ -1,12 +1,13 @@
1
1
  import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
2
2
  import { API_URL } from "../constants.js";
3
3
  import axios from "axios";
4
+ import { memo, tryit } from "radash";
4
5
 
5
6
  /**
6
7
  * Params to get a custodial owner
7
8
  * Priv / pub key combo or custodial file path should be in different types
8
9
  */
9
- type GetCustodialOwnerParams = {
10
+ type GetCustodialOwnerParams = Readonly<{
10
11
  // ZeroDev api url
11
12
  apiUrl?: string;
12
13
  // Turnkey client (if the client want to reuse it
@@ -19,7 +20,7 @@ type GetCustodialOwnerParams = {
19
20
 
20
21
  // Or read them from the custodial file path
21
22
  custodialFilePath?: string;
22
- };
23
+ }>;
23
24
 
24
25
  /**
25
26
  * Returns a signer for a custodial wallet via TurnKey
@@ -37,80 +38,40 @@ export async function getCustodialOwner(
37
38
  ): Promise<SmartAccountSigner | undefined> {
38
39
  // Extract data from the custodial file path if provided
39
40
  if (custodialFilePath) {
40
- let fsModule;
41
- try {
42
- fsModule = require.resolve("fs") && require("fs");
43
- } catch (error) {
44
- console.log("FS module not available. Skipping FS operation...");
45
- return;
46
- }
47
- const data = fsModule.readFileSync(custodialFilePath, "utf8");
48
- const values = data.split("\n");
49
- // Override the values, if they are provided, to the one from the custodial file
50
- [privateKey, publicKey, keyId] = values;
41
+ [privateKey, publicKey, keyId] = await loadSignDataFromCustodialFile(
42
+ custodialFilePath
43
+ );
51
44
  }
52
45
 
53
46
  // Ensure we have the required values
54
- if (!privateKey || !publicKey || !keyId) {
55
- throw new Error(
56
- "Must provide custodialFilePath or privateKey, publicKey, and keyId."
57
- );
47
+ if (!keyId) {
48
+ throw new Error("You must provide custodialFilePath or a keyId.");
58
49
  }
59
50
 
60
51
  // Get our turnkey client (build it if needed)
61
- if (!turnKeyClient) {
62
- // Try to fetch turnkey client & api key stamper
63
- let TurnkeyClient;
64
- let ApiKeyStamper;
65
- // TODO: Would be cleaner with something like radash and a tryit function?
66
- try {
67
- TurnkeyClient =
68
- require.resolve("@turnkey/http") &&
69
- require("@turnkey/http").TurnkeyClient;
70
- ApiKeyStamper =
71
- require.resolve("@turnkey/api-key-stamper") &&
72
- require("@turnkey/api-key-stamper").ApiKeyStamper;
73
- } catch (error) {
74
- console.log(
75
- "@turnkey/http or @turnkey/api-key-stamper module not available. Skipping FS operation..."
76
- );
77
- return;
78
- }
79
-
80
- // Build the turnkey client
81
- turnKeyClient = new TurnkeyClient(
82
- {
83
- baseUrl: "https://api.turnkey.com",
84
- },
85
- new ApiKeyStamper({
86
- apiPublicKey: publicKey,
87
- apiPrivateKey: privateKey,
88
- })
52
+ let ensuredTurnkeyClient = turnKeyClient;
53
+ if (!ensuredTurnkeyClient && privateKey && publicKey) {
54
+ ensuredTurnkeyClient = await getDefaultTurnkeyClient({
55
+ privateKey,
56
+ publicKey,
57
+ });
58
+ } else {
59
+ throw new Error(
60
+ "No turnkey client available, if you don't provide one you should provide private and public key or a custodial file path"
89
61
  );
90
62
  }
91
63
 
92
64
  // Get the wallet identifier from the API
93
- const response = await axios.post<any, { data: { walletId: string } }>(
94
- `${apiUrl}/wallets/${identifier}`,
95
- {
96
- keyId,
97
- }
98
- );
65
+ const response = await fetchWallet({ identifier, keyId, apiUrl });
66
+ if (!response?.data?.walletId) {
67
+ throw new Error(`No wallet id found for ${identifier}`);
68
+ }
99
69
 
100
70
  // Build the turnkey viem account
101
- let createAccount;
102
- try {
103
- createAccount =
104
- require.resolve("@turnkey/viem") &&
105
- require("@turnkey/viem").createAccount;
106
- } catch (error) {
107
- console.log("@turnkey/viem module not available. Skipping FS operation...");
108
- return;
109
- }
110
- const turnkeySigner = await createAccount({
111
- client: turnKeyClient,
112
- organizationId: keyId,
71
+ const turnkeySigner = await getTurnkeySigner({
72
+ keyId,
113
73
  privateKeyId: response.data.walletId,
74
+ turnkeyClient: ensuredTurnkeyClient,
114
75
  });
115
76
 
116
77
  // Return an alchemy AA signer from the turnkey signer
@@ -129,3 +90,154 @@ export async function getCustodialOwner(
129
90
  turnkeySigner.signTypedData(params),
130
91
  };
131
92
  }
93
+
94
+ /**
95
+ * Try to load sign data from a local custodial file path
96
+ */
97
+ const loadSignDataFromCustodialFile = memo(
98
+ async (custodialFilePath: string) => {
99
+ const [, fsModule] = await tryit(() => import("fs"))();
100
+ if (!fsModule) {
101
+ console.error("FS module not available");
102
+ throw new Error(
103
+ "FS module not available, you must provide each keys or install this module"
104
+ );
105
+ }
106
+ const data = fsModule.readFileSync(custodialFilePath, "utf8");
107
+ return data.split("\n");
108
+ },
109
+ {
110
+ // TTL of 1min in the memory cache
111
+ ttl: 1000 * 60,
112
+ // The key in the cache
113
+ key: (custodialFilePath: string) => `${custodialFilePath}`,
114
+ }
115
+ );
116
+
117
+ /**
118
+ * Get our default turnkey client
119
+ */
120
+ const getDefaultTurnkeyClient = memo(
121
+ async ({
122
+ privateKey,
123
+ publicKey,
124
+ }: {
125
+ privateKey: string;
126
+ publicKey: string;
127
+ }) => {
128
+ // Try to fetch turnkey client & api key stamper
129
+ const [, turnkeyHttp] = await tryit(() => import("@turnkey/http"))();
130
+ const [, turnkeyApiKeyStamper] = await tryit(
131
+ () => import("@turnkey/api-key-stamper")
132
+ )();
133
+ if (!turnkeyHttp || !turnkeyApiKeyStamper) {
134
+ console.error(
135
+ "@turnkey/http or @turnkey/api-key-stamper module not available."
136
+ );
137
+ throw new Error(
138
+ "Turnkey http or api-key-stamper modules not available, you must provide a turnkey client or install this modules"
139
+ );
140
+ }
141
+
142
+ // Build the turnkey client
143
+ return new turnkeyHttp.TurnkeyClient(
144
+ {
145
+ baseUrl: "https://api.turnkey.com",
146
+ },
147
+ new turnkeyApiKeyStamper.ApiKeyStamper({
148
+ apiPublicKey: publicKey,
149
+ apiPrivateKey: privateKey,
150
+ })
151
+ );
152
+ },
153
+ {
154
+ // TTL of 1min in the memory cache
155
+ ttl: 1000 * 60,
156
+ // The key in the cache
157
+ key: ({
158
+ privateKey,
159
+ publicKey,
160
+ }: {
161
+ privateKey: string;
162
+ publicKey: string;
163
+ }) => `${privateKey}-${publicKey}`,
164
+ }
165
+ );
166
+
167
+ /**
168
+ * Simple function used to fetch the wallet id from the API using an identifier
169
+ */
170
+ const fetchWallet = memo(
171
+ ({
172
+ identifier,
173
+ keyId,
174
+ apiUrl,
175
+ }: {
176
+ identifier: string;
177
+ keyId: string;
178
+ apiUrl: string;
179
+ }) => {
180
+ return axios.post<any, { data: { walletId: string } }>(
181
+ `${apiUrl}/wallets/${identifier}`,
182
+ {
183
+ keyId,
184
+ }
185
+ );
186
+ },
187
+ {
188
+ // TTL of 1min in the memory cache
189
+ ttl: 1000 * 60,
190
+ // The key in the cache
191
+ key: ({
192
+ identifier,
193
+ keyId,
194
+ apiUrl,
195
+ }: {
196
+ identifier: string;
197
+ keyId: string;
198
+ apiUrl: string;
199
+ }) => `${identifier}-${keyId}-${apiUrl}`,
200
+ }
201
+ );
202
+
203
+ /**
204
+ * Get a turnkey signer
205
+ */
206
+ const getTurnkeySigner = memo(
207
+ async ({
208
+ keyId,
209
+ privateKeyId,
210
+ turnkeyClient,
211
+ }: {
212
+ keyId: string;
213
+ privateKeyId: string;
214
+ turnkeyClient: unknown;
215
+ }) => {
216
+ // Get the turnkey viem account
217
+ const [, turnkeyViem] = await tryit(() => import("@turnkey/viem"))();
218
+ if (!turnkeyViem) {
219
+ console.error("@turnkey/viem module not available");
220
+ throw new Error(
221
+ "Turnkey viem module not available, can't create a turnkey signer for the custodial owner"
222
+ );
223
+ }
224
+ return turnkeyViem.createAccount({
225
+ client: turnkeyClient as any,
226
+ organizationId: keyId,
227
+ privateKeyId,
228
+ });
229
+ },
230
+ {
231
+ // TTL of 1min in the memory cache
232
+ ttl: 1000 * 60,
233
+ // The key in the cache
234
+ key: ({
235
+ keyId,
236
+ privateKeyId,
237
+ }: {
238
+ keyId: string;
239
+ privateKeyId: string;
240
+ turnkeyClient: unknown;
241
+ }) => `${keyId}-${privateKeyId}`,
242
+ }
243
+ );
@@ -47,10 +47,10 @@ export const signMessageImplementation = async (
47
47
  const signedRequest = await TurnkeyApi.signSignRawPayload(
48
48
  {
49
49
  body: {
50
- type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD",
50
+ type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2",
51
51
  organizationId: id,
52
52
  parameters: {
53
- privateKeyId: walletId,
53
+ signWith: walletId,
54
54
  payload: msg,
55
55
  encoding: "PAYLOAD_ENCODING_HEXADECIMAL",
56
56
  hashFunction: "HASH_FUNCTION_NO_OP",
@@ -60,6 +60,7 @@ export type ValidatorPluginData = Required<
60
60
  export abstract class KernelBaseValidator {
61
61
  readonly validatorAddress: Hex;
62
62
  mode: ValidatorMode;
63
+ resolvedMode?: ValidatorMode;
63
64
  protected projectId: string;
64
65
  protected chain?: Chain;
65
66
  protected entryPointAddress: Address;
@@ -136,10 +137,9 @@ export abstract class KernelBaseValidator {
136
137
  ): Promise<Hex> {
137
138
  const dummyECDSASig =
138
139
  "0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c";
139
- const validatorMode = await this.resolveValidatorMode(
140
- kernelAccountAddress,
141
- calldata
142
- );
140
+ const validatorMode =
141
+ this.resolvedMode ??
142
+ (await this.resolveValidatorMode(kernelAccountAddress, calldata));
143
143
  if (validatorMode === ValidatorMode.enable) {
144
144
  const enableData = await this.getEnableData(kernelAccountAddress);
145
145
  const enableDataLength = enableData.length / 2 - 1;
@@ -286,14 +286,14 @@ export abstract class KernelBaseValidator {
286
286
  mode = this.mode;
287
287
  }
288
288
  }
289
+ this.resolvedMode = mode;
289
290
  return mode;
290
291
  }
291
292
 
292
293
  async getSignature(userOp: UserOperationRequest): Promise<Hex> {
293
- const mode = await this.resolveValidatorMode(
294
- userOp.sender,
295
- userOp.callData
296
- );
294
+ const mode =
295
+ this.resolvedMode ??
296
+ (await this.resolveValidatorMode(userOp.sender, userOp.callData));
297
297
  if (mode === ValidatorMode.sudo || mode === ValidatorMode.plugin) {
298
298
  return concatHex([this.mode, await this.signUserOp(userOp)]);
299
299
  } else {
@@ -403,8 +403,7 @@ export class SessionKeyValidator extends KernelBaseValidator {
403
403
  return permissionPacked && permissionPacked.length !== 0
404
404
  ? new MerkleTree(permissionPacked, keccak256, {
405
405
  hashLeaves: true,
406
- complete: true,
407
- sort: true,
406
+ sortPairs: true,
408
407
  })
409
408
  : new MerkleTree([pad("0x00", { size: 32 })], keccak256, {
410
409
  hashLeaves: false,