@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.
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.d.ts +2 -2
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js +93 -48
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +2 -2
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/base.d.ts +1 -0
- package/dist/cjs/kernel-zerodev/validator/base.js +11 -2
- package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +1 -2
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.d.ts +2 -2
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js +70 -48
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js +2 -2
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/base.d.ts +1 -0
- package/dist/esm/kernel-zerodev/validator/base.js +11 -2
- package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/session-key-validator.js +1 -2
- package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -1
- package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts +2 -2
- package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/base.d.ts +1 -0
- package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/kernel-zerodev/owner/getCustodialOwner.ts +175 -63
- package/src/kernel-zerodev/owner/passkey/utils.ts +2 -2
- package/src/kernel-zerodev/validator/base.ts +8 -8
- 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.
|
|
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.
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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 (!
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
94
|
-
|
|
95
|
-
{
|
|
96
|
-
|
|
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
|
-
|
|
102
|
-
|
|
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: "
|
|
50
|
+
type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2",
|
|
51
51
|
organizationId: id,
|
|
52
52
|
parameters: {
|
|
53
|
-
|
|
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 =
|
|
140
|
-
|
|
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 =
|
|
294
|
-
|
|
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
|
-
|
|
407
|
-
sort: true,
|
|
406
|
+
sortPairs: true,
|
|
408
407
|
})
|
|
409
408
|
: new MerkleTree([pad("0x00", { size: 32 })], keccak256, {
|
|
410
409
|
hashLeaves: false,
|