@aztec/node-keystore 3.0.0-nightly.20251210 → 3.0.0-nightly.20251212
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/dest/keystore_manager.d.ts +2 -2
- package/dest/keystore_manager.d.ts.map +1 -1
- package/dest/loader.d.ts +1 -1
- package/dest/loader.d.ts.map +1 -1
- package/dest/loader.js +25 -17
- package/dest/signer.d.ts +2 -2
- package/dest/signer.d.ts.map +1 -1
- package/dest/signer.js +5 -5
- package/package.json +4 -4
- package/src/keystore_manager.ts +1 -1
- package/src/loader.ts +20 -11
- package/src/signer.ts +6 -10
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Manages keystore configuration and delegates signing operations to appropriate signers.
|
|
5
5
|
*/
|
|
6
|
-
import type { EthSigner } from '@aztec/ethereum';
|
|
6
|
+
import type { EthSigner } from '@aztec/ethereum/eth-signer';
|
|
7
7
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
8
8
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
9
9
|
import type { Signature } from '@aztec/foundation/eth-signature';
|
|
@@ -136,4 +136,4 @@ export declare class KeystoreManager {
|
|
|
136
136
|
/** Extract ETH accounts from AttesterAccounts */
|
|
137
137
|
private extractEthAccountsFromAttester;
|
|
138
138
|
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5c3RvcmVfbWFuYWdlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2tleXN0b3JlX21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFLaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLaEQsT0FBTyxLQUFLLEVBSVYsV0FBVyxFQUVYLHFCQUFxQixFQUNyQixRQUFRLEVBRVIsY0FBYyxFQUNkLGlCQUFpQixJQUFJLHVCQUF1QixFQUM3QyxNQUFNLFlBQVksQ0FBQztBQUVwQjs7R0FFRztBQUNILHFCQUFhLGFBQWMsU0FBUSxLQUFLO0lBR3BCLEtBQUssQ0FBQztJQUZ4QixZQUNFLE9BQU8sRUFBRSxNQUFNLEVBQ0MsS0FBSyxDQUFDLG1CQUFPLEVBSTlCO0NBQ0Y7QUFFRDs7R0FFRztBQUNILHFCQUFhLGVBQWU7SUFDMUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQVc7SUFFcEM7Ozs7T0FJRztJQUNILFlBQVksUUFBUSxFQUFFLFFBQVEsRUFHN0I7SUFFRDs7O09BR0c7SUFDRyxlQUFlLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQXNFckM7SUFFRDs7Ozs7T0FLRztJQUNILE9BQU8sQ0FBQywrQkFBK0I7SUFrQnZDOzs7T0FHRztJQUNILE9BQU8sQ0FBQywwQ0FBMEM7SUFLbEQ7O09BRUc7SUFDSCxPQUFPLENBQUMsMkNBQTJDO0lBK0NuRDs7T0FFRztJQUNILHFCQUFxQixDQUFDLGNBQWMsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBSXpEO0lBRUQ7O09BRUc7SUFDSCxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQVkxRDtJQUVELGtDQUFrQyxJQUFJLFNBQVMsRUFBRSxDQVNoRDtJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLElBQUksU0FBUyxFQUFFLENBTWxDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUIsSUFBSTtRQUFFLEVBQUUsRUFBRSxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFBO0tBQUUsR0FBRyxTQUFTLENBK0J0RjtJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsdUJBQXVCLENBS25EO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUIsSUFBSSxNQUFNLENBRTFCO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxVQUFVLEdBQUcsVUFBVSxDQVNsRjtJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLGNBQWMsRUFBRSxNQUFNLEdBQUcsWUFBWSxDQUdwRDtJQUVEOzs7T0FHRztJQUNILGtCQUFrQixJQUFJLFdBQVcsR0FBRyxTQUFTLENBRTVDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxJQUFJLGNBQWMsR0FBRyxTQUFTLENBRTVDO0lBRUQ7OztPQUdHO0lBQ0gsdUNBQXVDLElBQUksSUFBSSxDQW1COUM7SUFFRDs7T0FFRztJQUNILE9BQU8sQ0FBQyw0QkFBNEI7SUErQnBDOztPQUVHO0lBQ0gsT0FBTyxDQUFDLDBCQUEwQjtJQTJDbEM7O09BRUc7SUFDSCxPQUFPLENBQUMsc0JBQXNCO0lBa0Q5Qjs7T0FFRztJQUNILE9BQU8sQ0FBQyxnQ0FBZ0M7SUF3QnhDOztPQUVHO0lBQ0gsT0FBTyxDQUFDLHlCQUF5QjtJQThCakM7O09BRUc7SUFDRyxXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FFMUU7SUFFRDs7T0FFRztJQUNHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBRXpGO0lBRUQ7OztPQUdHO0lBQ0gsOEJBQThCLENBQzVCLGNBQWMsRUFBRSxNQUFNLEVBQ3RCLGVBQWUsRUFBRSxVQUFVLEdBQzFCLHFCQUFxQixHQUFHLFNBQVMsQ0F3R25DO0lBRUQsaURBQWlEO0lBQ2pELE9BQU8sQ0FBQyw4QkFBOEI7Q0F5QnZDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keystore_manager.d.ts","sourceRoot":"","sources":["../src/keystore_manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"keystore_manager.d.ts","sourceRoot":"","sources":["../src/keystore_manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAKhD,OAAO,KAAK,EAIV,WAAW,EAEX,qBAAqB,EACrB,QAAQ,EAER,cAAc,EACd,iBAAiB,IAAI,uBAAuB,EAC7C,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAGpB,KAAK,CAAC;IAFxB,YACE,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,mBAAO,EAI9B;CACF;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC;;;;OAIG;IACH,YAAY,QAAQ,EAAE,QAAQ,EAG7B;IAED;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsErC;IAED;;;;;OAKG;IACH,OAAO,CAAC,+BAA+B;IAkBvC;;;OAGG;IACH,OAAO,CAAC,0CAA0C;IAKlD;;OAEG;IACH,OAAO,CAAC,2CAA2C;IA+CnD;;OAEG;IACH,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,CAIzD;IAED;;OAEG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,CAY1D;IAED,kCAAkC,IAAI,SAAS,EAAE,CAShD;IAED;;OAEG;IACH,oBAAoB,IAAI,SAAS,EAAE,CAMlC;IAED;;OAEG;IACH,mBAAmB,IAAI;QAAE,EAAE,EAAE,UAAU,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,SAAS,EAAE,CAAA;KAAE,GAAG,SAAS,CA+BtF;IAED;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,CAKnD;IAED;;OAEG;IACH,iBAAiB,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,GAAG,UAAU,CASlF;IAED;;OAEG;IACH,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,CAGpD;IAED;;;OAGG;IACH,kBAAkB,IAAI,WAAW,GAAG,SAAS,CAE5C;IAED;;;OAGG;IACH,eAAe,IAAI,cAAc,GAAG,SAAS,CAE5C;IAED;;;OAGG;IACH,uCAAuC,IAAI,IAAI,CAmB9C;IAED;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA+BpC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA2ClC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkD9B;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAwBxC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA8BjC;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAE1E;IAED;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAEzF;IAED;;;OAGG;IACH,8BAA8B,CAC5B,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,UAAU,GAC1B,qBAAqB,GAAG,SAAS,CAwGnC;IAED,iDAAiD;IACjD,OAAO,CAAC,8BAA8B;CAyBvC"}
|
package/dest/loader.d.ts
CHANGED
|
@@ -59,4 +59,4 @@ export declare function loadMultipleKeystores(paths: string | string[]): KeyStor
|
|
|
59
59
|
* @throws KeyStoreLoadError When duplicate attester keys are found or multiple prover configs exist.
|
|
60
60
|
*/
|
|
61
61
|
export declare function mergeKeystores(keystores: KeyStore[]): KeyStore;
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNBLE9BQU8sS0FBSyxFQUFlLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUl4RDs7R0FFRztBQUNILHFCQUFhLGlCQUFrQixTQUFRLEtBQUs7SUFHakMsUUFBUSxFQUFFLE1BQU07SUFDUCxLQUFLLENBQUM7SUFIeEIsWUFDRSxPQUFPLEVBQUUsTUFBTSxFQUNSLFFBQVEsRUFBRSxNQUFNLEVBQ1AsS0FBSyxDQUFDLG1CQUFPLEVBSTlCO0NBQ0Y7QUFFRDs7Ozs7O0dBTUc7QUFDSCx3QkFBZ0IsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxRQUFRLENBdUIzRDtBQUVEOzs7Ozs7R0FNRztBQUNILHdCQUFnQixxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQW1DakU7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBZ0IsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsUUFBUSxFQUFFLENBdUJ0RDtBQUVEOzs7Ozs7R0FNRztBQUNILHdCQUFnQixxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxDQThCMUU7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCx3QkFBZ0IsY0FBYyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxRQUFRLENBZ0Y5RCJ9
|
package/dest/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIxD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAGjC,QAAQ,EAAE,MAAM;IACP,KAAK,CAAC;IAHxB,YACE,OAAO,EAAE,MAAM,EACR,QAAQ,EAAE,MAAM,EACP,KAAK,CAAC,mBAAO,EAI9B;CACF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAuB3D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmCjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAuBtD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,QAAQ,EAAE,CA8B1E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAgF9D"}
|
package/dest/loader.js
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* Keystore File Loader
|
|
3
3
|
*
|
|
4
4
|
* Handles loading and parsing keystore configuration files.
|
|
5
|
-
*/ import {
|
|
5
|
+
*/ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
6
7
|
import { readFileSync, readdirSync, statSync } from 'fs';
|
|
7
8
|
import { extname, join } from 'path';
|
|
9
|
+
import { privateKeyToAddress } from 'viem/accounts';
|
|
8
10
|
import { keystoreSchema } from './schemas.js';
|
|
9
11
|
const logger = createLogger('node-keystore:loader');
|
|
10
12
|
/**
|
|
@@ -179,8 +181,9 @@ const logger = createLogger('node-keystore:loader');
|
|
|
179
181
|
if (keystore.validators) {
|
|
180
182
|
for (const validator of keystore.validators){
|
|
181
183
|
// Check for duplicate attester addresses
|
|
182
|
-
const attesterKeys =
|
|
183
|
-
for (
|
|
184
|
+
const attesterKeys = extractAttesterAddresses(validator.attester);
|
|
185
|
+
for (let key of attesterKeys){
|
|
186
|
+
key = key.toLowerCase();
|
|
184
187
|
if (attesterAddresses.has(key)) {
|
|
185
188
|
throw new KeyStoreLoadError(`Duplicate attester address ${key} found across keystore files`, `keystores[${i}].validators`);
|
|
186
189
|
}
|
|
@@ -235,26 +238,37 @@ const logger = createLogger('node-keystore:loader');
|
|
|
235
238
|
*
|
|
236
239
|
* @param attester The attester configuration in any supported shape.
|
|
237
240
|
* @returns Array of string keys used to detect duplicates.
|
|
238
|
-
*/ function
|
|
241
|
+
*/ function extractAttesterAddresses(attester) {
|
|
239
242
|
// String forms (private key or other) - return as-is for coarse uniqueness
|
|
240
243
|
if (typeof attester === 'string') {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
+
if (attester.length === 66) {
|
|
245
|
+
return [
|
|
246
|
+
privateKeyToAddress(attester)
|
|
247
|
+
];
|
|
248
|
+
} else {
|
|
249
|
+
return [
|
|
250
|
+
attester
|
|
251
|
+
];
|
|
252
|
+
}
|
|
244
253
|
}
|
|
245
254
|
// Arrays of attester items
|
|
246
255
|
if (Array.isArray(attester)) {
|
|
247
256
|
const keys = [];
|
|
248
257
|
for (const item of attester){
|
|
249
|
-
keys.push(...
|
|
258
|
+
keys.push(...extractAttesterAddresses(item));
|
|
250
259
|
}
|
|
251
260
|
return keys;
|
|
252
261
|
}
|
|
253
262
|
if (attester && typeof attester === 'object') {
|
|
263
|
+
if (attester instanceof EthAddress) {
|
|
264
|
+
return [
|
|
265
|
+
attester.toString()
|
|
266
|
+
];
|
|
267
|
+
}
|
|
254
268
|
const obj = attester;
|
|
255
269
|
// New shape: { eth: EthAccount, bls?: BLSAccount }
|
|
256
270
|
if ('eth' in obj) {
|
|
257
|
-
return
|
|
271
|
+
return extractAttesterAddresses(obj.eth);
|
|
258
272
|
}
|
|
259
273
|
// Remote signer account object shape: { address, remoteSignerUrl?, ... }
|
|
260
274
|
if ('address' in obj) {
|
|
@@ -262,13 +276,7 @@ const logger = createLogger('node-keystore:loader');
|
|
|
262
276
|
String(obj.address)
|
|
263
277
|
];
|
|
264
278
|
}
|
|
265
|
-
// Mnemonic or other object shapes: stringify
|
|
266
|
-
return [
|
|
267
|
-
JSON.stringify(attester)
|
|
268
|
-
];
|
|
269
279
|
}
|
|
270
|
-
//
|
|
271
|
-
return [
|
|
272
|
-
JSON.stringify(attester)
|
|
273
|
-
];
|
|
280
|
+
// mnemonic, encrypted file just disable early duplicates checking
|
|
281
|
+
return [];
|
|
274
282
|
}
|
package/dest/signer.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Common interface for different signing backends (local, remote, encrypted)
|
|
5
5
|
*/
|
|
6
|
-
import type { EthSigner } from '@aztec/ethereum';
|
|
6
|
+
import type { EthSigner } from '@aztec/ethereum/eth-signer';
|
|
7
7
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
8
8
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
9
9
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
@@ -69,4 +69,4 @@ export declare class RemoteSigner implements EthSigner {
|
|
|
69
69
|
*/
|
|
70
70
|
private generateId;
|
|
71
71
|
}
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2lnbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHcEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBaUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUkzRixPQUFPLEVBQ0wsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxtQkFBbUIsRUFLekIsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4RDs7R0FFRztBQUNILHFCQUFhLFdBQVksU0FBUSxLQUFLO0lBRzNCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsR0FBRyxFQUFFLE1BQU07SUFDWCxVQUFVLENBQUM7SUFDWCxTQUFTLENBQUM7SUFMbkIsWUFDRSxPQUFPLEVBQUUsTUFBTSxFQUNSLE1BQU0sRUFBRSxNQUFNLEVBQ2QsR0FBRyxFQUFFLE1BQU0sRUFDWCxVQUFVLENBQUMsb0JBQVEsRUFDbkIsU0FBUyxDQUFDLG9CQUFRLEVBSTFCO0NBQ0Y7QUFFRDs7R0FFRztBQUNILHFCQUFhLFdBQVksWUFBVyxTQUFTO0lBRy9CLE9BQU8sQ0FBQyxVQUFVO0lBRjlCLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFrQjtJQUV6QyxZQUFvQixVQUFVLEVBQUUsUUFBUSxFQUV2QztJQUVELElBQUksT0FBTyxJQUFJLFVBQVUsQ0FFeEI7SUFFRCxXQUFXLENBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBRWpEO0lBRUQsYUFBYSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBR2hFO0lBRUQsZUFBZSxDQUFDLFdBQVcsRUFBRSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBYXhFO0NBQ0Y7QUFtQkQ7O0dBRUc7QUFDSCxxQkFBYSxZQUFhLFlBQVcsU0FBUzthQUUxQixPQUFPLEVBQUUsVUFBVTtJQUNuQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLEtBQUs7SUFIZixZQUNrQixPQUFPLEVBQUUsVUFBVSxFQUNsQixNQUFNLEVBQUUscUJBQXFCLEVBQ3RDLEtBQUssR0FBRSxPQUFPLFVBQVUsQ0FBQyxLQUF3QixFQUN2RDtJQUVKOzs7Ozs7T0FNRztJQUNILE9BQWEsY0FBYyxDQUN6QixlQUFlLEVBQUUscUJBQXFCLEVBQ3RDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFDbkIsS0FBSyxHQUFFLE9BQU8sVUFBVSxDQUFDLEtBQXdCLEdBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0ErRGY7SUFFRDs7T0FFRztJQUNHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FFdkQ7SUFFRDs7T0FFRztJQUNHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUV0RTtJQUVELGVBQWUsQ0FBQyxXQUFXLEVBQUUsdUJBQXVCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUV4RTtZQVFhLHNCQUFzQjtZQWlCdEIsK0JBQStCO1lBcUIvQixpQ0FBaUM7WUE4Q2pDLGtCQUFrQjtJQXlDaEM7O09BRUc7SUFDSCxPQUFPLENBQUMsWUFBWTtJQU9wQjs7T0FFRztJQUNILE9BQU8sQ0FBQyxVQUFVO0NBR25CIn0=
|
package/dest/signer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAiC,MAAM,iCAAiC,CAAC;AAI3F,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EAKzB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAG3B,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,MAAM;IACX,UAAU,CAAC;IACX,SAAS,CAAC;IALnB,YACE,OAAO,EAAE,MAAM,EACR,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,oBAAQ,EACnB,SAAS,CAAC,oBAAQ,EAI1B;CACF;AAED;;GAEG;AACH,qBAAa,WAAY,YAAW,SAAS;IAG/B,OAAO,CAAC,UAAU;IAF9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,YAAoB,UAAU,EAAE,QAAQ,EAEvC;IAED,IAAI,OAAO,IAAI,UAAU,CAExB;IAED,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAEjD;IAED,aAAa,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAGhE;IAED,eAAe,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,CAaxE;CACF;AAmBD;;GAEG;AACH,qBAAa,YAAa,YAAW,SAAS;aAE1B,OAAO,EAAE,UAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,KAAK;IAHf,YACkB,OAAO,EAAE,UAAU,EAClB,MAAM,EAAE,qBAAqB,EACtC,KAAK,GAAE,OAAO,UAAU,CAAC,KAAwB,EACvD;IAEJ;;;;;;OAMG;IACH,OAAa,cAAc,CACzB,eAAe,EAAE,qBAAqB,EACtC,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,GAAE,OAAO,UAAU,CAAC,KAAwB,GAChD,OAAO,CAAC,IAAI,CAAC,CA+Df;IAED;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAEvD;IAED;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAEtE;IAED,eAAe,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,CAExE;YAQa,sBAAsB;YAiBtB,+BAA+B;YAqB/B,iCAAiC;YA8CjC,kBAAkB;IAyChC;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
|
package/dest/signer.js
CHANGED
|
@@ -7,7 +7,7 @@ import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
|
7
7
|
import { Secp256k1Signer, toRecoveryBit } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
8
8
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
9
9
|
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
10
|
-
import { withHexPrefix } from '@aztec/foundation/string';
|
|
10
|
+
import { bufferToHex, withHexPrefix } from '@aztec/foundation/string';
|
|
11
11
|
import { hashTypedData, keccak256, parseTransaction, serializeTransaction } from 'viem';
|
|
12
12
|
/**
|
|
13
13
|
* Error thrown for remote signer HTTP or JSON-RPC failures
|
|
@@ -156,9 +156,6 @@ import { hashTypedData, keccak256, parseTransaction, serializeTransaction } from
|
|
|
156
156
|
/**
|
|
157
157
|
* Make a JSON-RPC eth_signTransaction request.
|
|
158
158
|
*/ async makeJsonRpcSignTransactionRequest(tx) {
|
|
159
|
-
if (tx.type !== 'eip1559') {
|
|
160
|
-
throw new Error('This signer does not support tx type: ' + tx.type);
|
|
161
|
-
}
|
|
162
159
|
const txObject = {
|
|
163
160
|
from: this.address.toString(),
|
|
164
161
|
to: tx.to ?? null,
|
|
@@ -167,7 +164,10 @@ import { hashTypedData, keccak256, parseTransaction, serializeTransaction } from
|
|
|
167
164
|
nonce: typeof tx.nonce !== 'undefined' ? withHexPrefix(tx.nonce.toString(16)) : undefined,
|
|
168
165
|
gas: typeof tx.gas !== 'undefined' ? withHexPrefix(tx.gas.toString(16)) : undefined,
|
|
169
166
|
maxFeePerGas: typeof tx.maxFeePerGas !== 'undefined' ? withHexPrefix(tx.maxFeePerGas.toString(16)) : undefined,
|
|
170
|
-
maxPriorityFeePerGas: typeof tx.maxPriorityFeePerGas !== 'undefined' ? withHexPrefix(tx.maxPriorityFeePerGas.toString(16)) : undefined
|
|
167
|
+
maxPriorityFeePerGas: typeof tx.maxPriorityFeePerGas !== 'undefined' ? withHexPrefix(tx.maxPriorityFeePerGas.toString(16)) : undefined,
|
|
168
|
+
maxFeePerBlobGas: typeof tx.maxFeePerBlobGas !== 'undefined' ? withHexPrefix(tx.maxFeePerBlobGas.toString(16)) : undefined,
|
|
169
|
+
blobVersionedHashes: tx.blobVersionedHashes,
|
|
170
|
+
blobs: tx.blobs?.map((blob)=>typeof blob === 'string' ? blob : bufferToHex(Buffer.from(blob)))
|
|
171
171
|
};
|
|
172
172
|
let rawTxHex = await this.makeJsonRpcRequest('eth_signTransaction', txObject);
|
|
173
173
|
if (typeof rawTxHex !== 'string') {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/node-keystore",
|
|
3
|
-
"version": "3.0.0-nightly.
|
|
3
|
+
"version": "3.0.0-nightly.20251212",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
]
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@aztec/ethereum": "3.0.0-nightly.
|
|
66
|
-
"@aztec/foundation": "3.0.0-nightly.
|
|
67
|
-
"@aztec/stdlib": "3.0.0-nightly.
|
|
65
|
+
"@aztec/ethereum": "3.0.0-nightly.20251212",
|
|
66
|
+
"@aztec/foundation": "3.0.0-nightly.20251212",
|
|
67
|
+
"@aztec/stdlib": "3.0.0-nightly.20251212",
|
|
68
68
|
"@ethersproject/wallet": "^5.7.0",
|
|
69
69
|
"tslib": "^2.4.0",
|
|
70
70
|
"viem": "npm:@aztec/viem@2.38.2",
|
package/src/keystore_manager.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Manages keystore configuration and delegates signing operations to appropriate signers.
|
|
5
5
|
*/
|
|
6
|
-
import type { EthSigner } from '@aztec/ethereum';
|
|
6
|
+
import type { EthSigner } from '@aztec/ethereum/eth-signer';
|
|
7
7
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
8
8
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
9
9
|
import type { Signature } from '@aztec/foundation/eth-signature';
|
package/src/loader.ts
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles loading and parsing keystore configuration files.
|
|
5
5
|
*/
|
|
6
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
+
import type { Hex } from '@aztec/foundation/string';
|
|
7
9
|
|
|
8
10
|
import { readFileSync, readdirSync, statSync } from 'fs';
|
|
9
11
|
import { extname, join } from 'path';
|
|
12
|
+
import { privateKeyToAddress } from 'viem/accounts';
|
|
10
13
|
|
|
11
14
|
import { keystoreSchema } from './schemas.js';
|
|
12
15
|
import type { EthAccounts, KeyStore } from './types.js';
|
|
@@ -220,8 +223,9 @@ export function mergeKeystores(keystores: KeyStore[]): KeyStore {
|
|
|
220
223
|
if (keystore.validators) {
|
|
221
224
|
for (const validator of keystore.validators) {
|
|
222
225
|
// Check for duplicate attester addresses
|
|
223
|
-
const attesterKeys =
|
|
224
|
-
for (
|
|
226
|
+
const attesterKeys = extractAttesterAddresses(validator.attester);
|
|
227
|
+
for (let key of attesterKeys) {
|
|
228
|
+
key = key.toLowerCase();
|
|
225
229
|
if (attesterAddresses.has(key)) {
|
|
226
230
|
throw new KeyStoreLoadError(
|
|
227
231
|
`Duplicate attester address ${key} found across keystore files`,
|
|
@@ -284,38 +288,43 @@ export function mergeKeystores(keystores: KeyStore[]): KeyStore {
|
|
|
284
288
|
* @param attester The attester configuration in any supported shape.
|
|
285
289
|
* @returns Array of string keys used to detect duplicates.
|
|
286
290
|
*/
|
|
287
|
-
function
|
|
291
|
+
function extractAttesterAddresses(attester: unknown): string[] {
|
|
288
292
|
// String forms (private key or other) - return as-is for coarse uniqueness
|
|
289
293
|
if (typeof attester === 'string') {
|
|
290
|
-
|
|
294
|
+
if (attester.length === 66) {
|
|
295
|
+
return [privateKeyToAddress(attester as Hex<32>)];
|
|
296
|
+
} else {
|
|
297
|
+
return [attester];
|
|
298
|
+
}
|
|
291
299
|
}
|
|
292
300
|
|
|
293
301
|
// Arrays of attester items
|
|
294
302
|
if (Array.isArray(attester)) {
|
|
295
303
|
const keys: string[] = [];
|
|
296
304
|
for (const item of attester) {
|
|
297
|
-
keys.push(...
|
|
305
|
+
keys.push(...extractAttesterAddresses(item));
|
|
298
306
|
}
|
|
299
307
|
return keys;
|
|
300
308
|
}
|
|
301
309
|
|
|
302
310
|
if (attester && typeof attester === 'object') {
|
|
311
|
+
if (attester instanceof EthAddress) {
|
|
312
|
+
return [attester.toString()];
|
|
313
|
+
}
|
|
314
|
+
|
|
303
315
|
const obj = attester as Record<string, unknown>;
|
|
304
316
|
|
|
305
317
|
// New shape: { eth: EthAccount, bls?: BLSAccount }
|
|
306
318
|
if ('eth' in obj) {
|
|
307
|
-
return
|
|
319
|
+
return extractAttesterAddresses(obj.eth);
|
|
308
320
|
}
|
|
309
321
|
|
|
310
322
|
// Remote signer account object shape: { address, remoteSignerUrl?, ... }
|
|
311
323
|
if ('address' in obj) {
|
|
312
324
|
return [String((obj as any).address)];
|
|
313
325
|
}
|
|
314
|
-
|
|
315
|
-
// Mnemonic or other object shapes: stringify
|
|
316
|
-
return [JSON.stringify(attester)];
|
|
317
326
|
}
|
|
318
327
|
|
|
319
|
-
//
|
|
320
|
-
return [
|
|
328
|
+
// mnemonic, encrypted file just disable early duplicates checking
|
|
329
|
+
return [];
|
|
321
330
|
}
|
package/src/signer.ts
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Common interface for different signing backends (local, remote, encrypted)
|
|
5
5
|
*/
|
|
6
|
-
import type { EthSigner } from '@aztec/ethereum';
|
|
6
|
+
import type { EthSigner } from '@aztec/ethereum/eth-signer';
|
|
7
7
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
8
8
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
9
9
|
import { Secp256k1Signer, toRecoveryBit } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
10
10
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
11
11
|
import { Signature, type ViemTransactionSignature } from '@aztec/foundation/eth-signature';
|
|
12
12
|
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
13
|
-
import { withHexPrefix } from '@aztec/foundation/string';
|
|
13
|
+
import { bufferToHex, withHexPrefix } from '@aztec/foundation/string';
|
|
14
14
|
|
|
15
15
|
import {
|
|
16
16
|
type TransactionSerializable,
|
|
@@ -244,10 +244,6 @@ export class RemoteSigner implements EthSigner {
|
|
|
244
244
|
* Make a JSON-RPC eth_signTransaction request.
|
|
245
245
|
*/
|
|
246
246
|
private async makeJsonRpcSignTransactionRequest(tx: TransactionSerializable): Promise<Signature> {
|
|
247
|
-
if (tx.type !== 'eip1559') {
|
|
248
|
-
throw new Error('This signer does not support tx type: ' + tx.type);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
247
|
const txObject: RemoteSignerTxObject = {
|
|
252
248
|
from: this.address.toString(),
|
|
253
249
|
to: tx.to ?? null,
|
|
@@ -261,10 +257,10 @@ export class RemoteSigner implements EthSigner {
|
|
|
261
257
|
? withHexPrefix(tx.maxPriorityFeePerGas.toString(16))
|
|
262
258
|
: undefined,
|
|
263
259
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
260
|
+
maxFeePerBlobGas:
|
|
261
|
+
typeof tx.maxFeePerBlobGas !== 'undefined' ? withHexPrefix(tx.maxFeePerBlobGas.toString(16)) : undefined,
|
|
262
|
+
blobVersionedHashes: tx.blobVersionedHashes,
|
|
263
|
+
blobs: tx.blobs?.map(blob => (typeof blob === 'string' ? blob : bufferToHex(Buffer.from(blob)))),
|
|
268
264
|
};
|
|
269
265
|
|
|
270
266
|
let rawTxHex = await this.makeJsonRpcRequest('eth_signTransaction', txObject);
|