@aztec/foundation 0.69.1 → 0.70.0
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/abi/note_selector.d.ts +5 -2
- package/dest/abi/note_selector.d.ts.map +1 -1
- package/dest/abi/note_selector.js +12 -4
- package/dest/collection/array.d.ts +8 -0
- package/dest/collection/array.d.ts.map +1 -1
- package/dest/collection/array.js +28 -1
- package/dest/config/env_var.d.ts +1 -1
- package/dest/config/env_var.d.ts.map +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +7 -2
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.js +18 -16
- package/dest/log/pino-logger.d.ts +3 -0
- package/dest/log/pino-logger.d.ts.map +1 -1
- package/dest/log/pino-logger.js +14 -2
- package/dest/promise/running-promise.d.ts.map +1 -1
- package/dest/promise/running-promise.js +9 -1
- package/dest/queue/serial_queue.d.ts +1 -0
- package/dest/queue/serial_queue.d.ts.map +1 -1
- package/dest/queue/serial_queue.js +6 -1
- package/dest/testing/files/index.d.ts +2 -1
- package/dest/testing/files/index.d.ts.map +1 -1
- package/dest/testing/files/index.js +6 -2
- package/dest/trees/index.d.ts +2 -1
- package/dest/trees/index.d.ts.map +1 -1
- package/dest/trees/index.js +3 -2
- package/dest/trees/{unbalanced_merkle_root.d.ts → unbalanced_merkle_tree.d.ts} +6 -2
- package/dest/trees/unbalanced_merkle_tree.d.ts.map +1 -0
- package/dest/trees/{unbalanced_merkle_root.js → unbalanced_merkle_tree.js} +40 -2
- package/dest/trees/unbalanced_tree_store.d.ts +19 -0
- package/dest/trees/unbalanced_tree_store.d.ts.map +1 -0
- package/dest/trees/unbalanced_tree_store.js +80 -0
- package/package.json +2 -2
- package/src/abi/note_selector.ts +11 -4
- package/src/collection/array.ts +31 -0
- package/src/config/env_var.ts +5 -2
- package/src/json-rpc/server/safe_json_rpc_server.ts +22 -15
- package/src/log/pino-logger.ts +19 -2
- package/src/promise/running-promise.ts +8 -0
- package/src/queue/serial_queue.ts +5 -0
- package/src/testing/files/index.ts +6 -1
- package/src/trees/index.ts +2 -1
- package/src/trees/unbalanced_merkle_tree.ts +103 -0
- package/src/trees/unbalanced_tree_store.ts +102 -0
- package/dest/trees/unbalanced_merkle_root.d.ts.map +0 -1
- package/src/trees/unbalanced_merkle_root.ts +0 -52
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/files/index.ts"],"names":[],"mappings":";;AAOA,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,QAStF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAenG;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAMnF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/files/index.ts"],"names":[],"mappings":";;AAOA,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,QAStF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAenG;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAMnF"}
|
|
@@ -14,6 +14,10 @@ export function writeTestData(targetFileFromRepoRoot, contents) {
|
|
|
14
14
|
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
15
15
|
logger(`Wrote test data to ${targetFile}`);
|
|
16
16
|
}
|
|
17
|
+
export function readTestData(repoPath) {
|
|
18
|
+
const targetFile = getPathToFile(repoPath);
|
|
19
|
+
return readFileSync(targetFile);
|
|
20
|
+
}
|
|
17
21
|
/**
|
|
18
22
|
* Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
|
|
19
23
|
* Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
|
|
@@ -38,7 +42,7 @@ export function updateInlineTestData(targetFileFromRepoRoot, itemName, value) {
|
|
|
38
42
|
/**
|
|
39
43
|
* Updates the sample Prover.toml files in noir-projects/noir-protocol-circuits/crates/.
|
|
40
44
|
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
|
|
41
|
-
* To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn test:e2e
|
|
45
|
+
* To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn test:e2e full.test '
|
|
42
46
|
*/
|
|
43
47
|
export function updateProtocolCircuitSampleInputs(circuitName, value) {
|
|
44
48
|
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
@@ -54,4 +58,4 @@ function getPathToFile(targetFileFromRepoRoot) {
|
|
|
54
58
|
}
|
|
55
59
|
return join(repoRoot, targetFileFromRepoRoot);
|
|
56
60
|
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9maWxlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLGFBQWEsQ0FBQyxzQkFBOEIsRUFBRSxRQUF5QjtJQUNyRixJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkYsYUFBYSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzlELE1BQU0sQ0FBQyxzQkFBc0IsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxRQUFnQjtJQUMzQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLHNCQUE4QixFQUFFLFFBQWdCLEVBQUUsS0FBYTtJQUNsRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdELE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sUUFBUSxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixRQUFRLGlCQUFpQixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLFFBQVEsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2xGLGFBQWEsQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDM0MsTUFBTSxDQUFDLHdCQUF3QixVQUFVLFFBQVEsUUFBUSxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUNBQWlDLENBQUMsV0FBbUIsRUFBRSxLQUFhO0lBQ2xGLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDOUQsTUFBTSxzQkFBc0IsR0FBRywrQ0FBK0MsV0FBVyxjQUFjLENBQUM7SUFDeEcsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekQsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxNQUFNLENBQUMsd0JBQXdCLFVBQVUsUUFBUSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxzQkFBOEI7SUFDbkQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDckYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztBQUNoRCxDQUFDIn0=
|
package/dest/trees/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
-
export * from './
|
|
3
|
+
export * from './unbalanced_merkle_tree.js';
|
|
4
|
+
export * from './unbalanced_tree_store.js';
|
|
4
5
|
/**
|
|
5
6
|
* A leaf of an indexed merkle tree.
|
|
6
7
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trees/index.ts"],"names":[],"mappings":";;AAAA,cAAc,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trees/index.ts"],"names":[],"mappings":";;AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IACnB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,IAAI,eAAe,CAAC;IAC1B;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,UAAU,IAAI,MAAM,CAAC;IACrB;;OAEG;IACH,YAAY,IAAI,MAAM,CAAC;CACxB"}
|
package/dest/trees/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
|
|
1
|
+
export * from './unbalanced_merkle_tree.js';
|
|
2
|
+
export * from './unbalanced_tree_store.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJlZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDRCQUE0QixDQUFDIn0=
|
|
@@ -4,10 +4,14 @@ import { sha256Trunc } from '@aztec/foundation/crypto';
|
|
|
4
4
|
/**
|
|
5
5
|
* Computes the merkle root for an unbalanced tree.
|
|
6
6
|
*
|
|
7
|
-
* @dev Adapted from
|
|
7
|
+
* @dev Adapted from unbalanced_tree.ts.
|
|
8
8
|
* Calculates the tree upwards layer by layer until we reach the root.
|
|
9
9
|
* The L1 calculation instead computes the tree from right to left (slightly cheaper gas).
|
|
10
10
|
* TODO: A more thorough investigation of which method is cheaper, then use that method everywhere.
|
|
11
11
|
*/
|
|
12
12
|
export declare function computeUnbalancedMerkleRoot(leaves: Buffer[], emptyLeaf?: Buffer, hasher?: typeof sha256Trunc): Buffer;
|
|
13
|
-
|
|
13
|
+
export declare function findLeafLevelAndIndex(numLeaves: number, leafIndex: number): {
|
|
14
|
+
level: number;
|
|
15
|
+
indexAtLevel: number;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=unbalanced_merkle_tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unbalanced_merkle_tree.d.ts","sourceRoot":"","sources":["../../src/trees/unbalanced_merkle_tree.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,qBAAc,GAAG,MAAM,CAwC9G;AAgDD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;EAGzE"}
|
|
@@ -3,7 +3,7 @@ import { sha256Trunc } from '@aztec/foundation/crypto';
|
|
|
3
3
|
/**
|
|
4
4
|
* Computes the merkle root for an unbalanced tree.
|
|
5
5
|
*
|
|
6
|
-
* @dev Adapted from
|
|
6
|
+
* @dev Adapted from unbalanced_tree.ts.
|
|
7
7
|
* Calculates the tree upwards layer by layer until we reach the root.
|
|
8
8
|
* The L1 calculation instead computes the tree from right to left (slightly cheaper gas).
|
|
9
9
|
* TODO: A more thorough investigation of which method is cheaper, then use that method everywhere.
|
|
@@ -49,4 +49,42 @@ export function computeUnbalancedMerkleRoot(leaves, emptyLeaf, hasher = sha256Tr
|
|
|
49
49
|
// return the root
|
|
50
50
|
return thisLayer[0];
|
|
51
51
|
}
|
|
52
|
-
|
|
52
|
+
function getMaxBalancedTreeDepth(numLeaves) {
|
|
53
|
+
return Math.floor(Math.log2(numLeaves));
|
|
54
|
+
}
|
|
55
|
+
function getMaxUnbalancedTreeDepth(numLeaves) {
|
|
56
|
+
return Math.ceil(Math.log2(numLeaves));
|
|
57
|
+
}
|
|
58
|
+
function findPosition(rootLevel, leafLevel, numLeaves, indexOffset, targetIndex) {
|
|
59
|
+
if (numLeaves <= 1) {
|
|
60
|
+
// Single leaf.
|
|
61
|
+
return { level: rootLevel, indexAtLevel: indexOffset };
|
|
62
|
+
}
|
|
63
|
+
// The largest balanced tree that can be created with the given number of leaves.
|
|
64
|
+
const maxBalancedTreeDepth = getMaxBalancedTreeDepth(numLeaves);
|
|
65
|
+
const numBalancedLeaves = 2 ** maxBalancedTreeDepth;
|
|
66
|
+
const numRemainingLeaves = numLeaves - numBalancedLeaves;
|
|
67
|
+
if (targetIndex < numBalancedLeaves) {
|
|
68
|
+
// Target is in the balanced tree.
|
|
69
|
+
// - If numRemainingLeaves is 0: this balanced tree is grown from the current root.
|
|
70
|
+
// - If numRemainingLeaves is not 0: the remaining leaves will form another tree, which will become the right child of the root.
|
|
71
|
+
// And the balanced tree will be the left child of the root.
|
|
72
|
+
// There will be an extra level between the root of the balanced tree and the current root.
|
|
73
|
+
const extraLevel = numRemainingLeaves ? 1 : 0;
|
|
74
|
+
return { level: rootLevel + maxBalancedTreeDepth + extraLevel, indexAtLevel: indexOffset + targetIndex };
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Target is in the right branch.
|
|
78
|
+
const rightBranchMaxLevel = getMaxUnbalancedTreeDepth(numRemainingLeaves);
|
|
79
|
+
const shiftedUp = leafLevel - rootLevel - rightBranchMaxLevel - 1;
|
|
80
|
+
const nextLeafLevel = leafLevel - shiftedUp;
|
|
81
|
+
const newIndexOffset = (indexOffset + numBalancedLeaves) >> shiftedUp;
|
|
82
|
+
const shiftedTargetIndex = targetIndex - numBalancedLeaves;
|
|
83
|
+
return findPosition(rootLevel + 1, nextLeafLevel, numRemainingLeaves, newIndexOffset, shiftedTargetIndex);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function findLeafLevelAndIndex(numLeaves, leafIndex) {
|
|
87
|
+
const maxLevel = getMaxUnbalancedTreeDepth(numLeaves);
|
|
88
|
+
return findPosition(0, maxLevel, numLeaves, 0, leafIndex);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iYWxhbmNlZF9tZXJrbGVfdHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmVlcy91bmJhbGFuY2VkX21lcmtsZV90cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxNQUFnQixFQUFFLFNBQWtCLEVBQUUsTUFBTSxHQUFHLFdBQVc7SUFDcEcsa0JBQWtCO0lBQ2xCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RywwREFBMEQ7SUFDMUQs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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface TreeNodeLocation {
|
|
2
|
+
level: number;
|
|
3
|
+
index: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class UnbalancedTreeStore<T> {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(numLeaves: number);
|
|
8
|
+
setLeaf(leafIndex: number, value: T): TreeNodeLocation;
|
|
9
|
+
setNode({ level, index }: TreeNodeLocation, value: T): void;
|
|
10
|
+
getParentLocation({ level, index }: TreeNodeLocation): TreeNodeLocation;
|
|
11
|
+
getSiblingLocation({ level, index }: TreeNodeLocation): TreeNodeLocation;
|
|
12
|
+
getChildLocations({ level, index }: TreeNodeLocation): [TreeNodeLocation, TreeNodeLocation];
|
|
13
|
+
getLeaf(leafIndex: number): T | undefined;
|
|
14
|
+
getNode(location: TreeNodeLocation): T | undefined;
|
|
15
|
+
getParent(location: TreeNodeLocation): T | undefined;
|
|
16
|
+
getSibling(location: TreeNodeLocation): T | undefined;
|
|
17
|
+
getChildren(location: TreeNodeLocation): [T | undefined, T | undefined];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=unbalanced_tree_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unbalanced_tree_store.d.ts","sourceRoot":"","sources":["../../src/trees/unbalanced_tree_store.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,qBAAa,mBAAmB,CAAC,CAAC;;gBAIpB,SAAS,EAAE,MAAM;IAI7B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB;IAiBtD,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAWpD,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,GAAG,gBAAgB;IAQvE,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,GAAG,gBAAgB;IAQxE,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAM3F,OAAO,CAAC,SAAS,EAAE,MAAM;IASzB,OAAO,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,GAAG,SAAS;IAIlD,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,GAAG,SAAS;IAKpD,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,GAAG,SAAS;IAKrD,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC;CAQxE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
var _UnbalancedTreeStore_instances, _UnbalancedTreeStore_nodeMapping, _UnbalancedTreeStore_numLeaves, _UnbalancedTreeStore_getKey;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { findLeafLevelAndIndex } from './unbalanced_merkle_tree.js';
|
|
4
|
+
export class UnbalancedTreeStore {
|
|
5
|
+
constructor(numLeaves) {
|
|
6
|
+
_UnbalancedTreeStore_instances.add(this);
|
|
7
|
+
_UnbalancedTreeStore_nodeMapping.set(this, new Map());
|
|
8
|
+
_UnbalancedTreeStore_numLeaves.set(this, void 0);
|
|
9
|
+
__classPrivateFieldSet(this, _UnbalancedTreeStore_numLeaves, numLeaves, "f");
|
|
10
|
+
}
|
|
11
|
+
setLeaf(leafIndex, value) {
|
|
12
|
+
if (leafIndex >= __classPrivateFieldGet(this, _UnbalancedTreeStore_numLeaves, "f")) {
|
|
13
|
+
throw new Error(`Expected at most ${__classPrivateFieldGet(this, _UnbalancedTreeStore_numLeaves, "f")} leaves. Received a leaf at index ${leafIndex}.`);
|
|
14
|
+
}
|
|
15
|
+
const { level, indexAtLevel } = findLeafLevelAndIndex(__classPrivateFieldGet(this, _UnbalancedTreeStore_numLeaves, "f"), leafIndex);
|
|
16
|
+
const location = {
|
|
17
|
+
level,
|
|
18
|
+
index: indexAtLevel,
|
|
19
|
+
};
|
|
20
|
+
__classPrivateFieldGet(this, _UnbalancedTreeStore_nodeMapping, "f").set(__classPrivateFieldGet(this, _UnbalancedTreeStore_instances, "m", _UnbalancedTreeStore_getKey).call(this, location), {
|
|
21
|
+
location,
|
|
22
|
+
value,
|
|
23
|
+
});
|
|
24
|
+
return location;
|
|
25
|
+
}
|
|
26
|
+
setNode({ level, index }, value) {
|
|
27
|
+
const location = {
|
|
28
|
+
level,
|
|
29
|
+
index,
|
|
30
|
+
};
|
|
31
|
+
__classPrivateFieldGet(this, _UnbalancedTreeStore_nodeMapping, "f").set(__classPrivateFieldGet(this, _UnbalancedTreeStore_instances, "m", _UnbalancedTreeStore_getKey).call(this, location), {
|
|
32
|
+
location,
|
|
33
|
+
value,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
getParentLocation({ level, index }) {
|
|
37
|
+
if (level === 0) {
|
|
38
|
+
throw new Error('Tree root does not have a parent.');
|
|
39
|
+
}
|
|
40
|
+
return { level: level - 1, index: Math.floor(index / 2) };
|
|
41
|
+
}
|
|
42
|
+
getSiblingLocation({ level, index }) {
|
|
43
|
+
if (level === 0) {
|
|
44
|
+
throw new Error('Tree root does not have a sibling.');
|
|
45
|
+
}
|
|
46
|
+
return { level, index: index % 2 ? index - 1 : index + 1 };
|
|
47
|
+
}
|
|
48
|
+
getChildLocations({ level, index }) {
|
|
49
|
+
const left = { level: level + 1, index: index * 2 };
|
|
50
|
+
const right = { level: level + 1, index: index * 2 + 1 };
|
|
51
|
+
return [left, right];
|
|
52
|
+
}
|
|
53
|
+
getLeaf(leafIndex) {
|
|
54
|
+
const { level, indexAtLevel } = findLeafLevelAndIndex(__classPrivateFieldGet(this, _UnbalancedTreeStore_numLeaves, "f"), leafIndex);
|
|
55
|
+
const location = {
|
|
56
|
+
level,
|
|
57
|
+
index: indexAtLevel,
|
|
58
|
+
};
|
|
59
|
+
return this.getNode(location);
|
|
60
|
+
}
|
|
61
|
+
getNode(location) {
|
|
62
|
+
return __classPrivateFieldGet(this, _UnbalancedTreeStore_nodeMapping, "f").get(__classPrivateFieldGet(this, _UnbalancedTreeStore_instances, "m", _UnbalancedTreeStore_getKey).call(this, location))?.value;
|
|
63
|
+
}
|
|
64
|
+
getParent(location) {
|
|
65
|
+
const parentLocation = this.getParentLocation(location);
|
|
66
|
+
return this.getNode(parentLocation);
|
|
67
|
+
}
|
|
68
|
+
getSibling(location) {
|
|
69
|
+
const siblingLocation = this.getSiblingLocation(location);
|
|
70
|
+
return this.getNode(siblingLocation);
|
|
71
|
+
}
|
|
72
|
+
getChildren(location) {
|
|
73
|
+
const [left, right] = this.getChildLocations(location);
|
|
74
|
+
return [this.getNode(left), this.getNode(right)];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
_UnbalancedTreeStore_nodeMapping = new WeakMap(), _UnbalancedTreeStore_numLeaves = new WeakMap(), _UnbalancedTreeStore_instances = new WeakSet(), _UnbalancedTreeStore_getKey = function _UnbalancedTreeStore_getKey(location) {
|
|
78
|
+
return `${location.level}-${location.index}`;
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iYWxhbmNlZF90cmVlX3N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyZWVzL3VuYmFsYW5jZWRfdHJlZV9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBWXBFLE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFBWSxTQUFpQjs7UUFIN0IsMkNBQXlDLElBQUksR0FBRyxFQUFFLEVBQUM7UUFDMUMsaURBQW1CO1FBRzFCLHVCQUFBLElBQUksa0NBQWMsU0FBUyxNQUFBLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU8sQ0FBQyxTQUFpQixFQUFFLEtBQVE7UUFDakMsSUFBSSxTQUFTLElBQUksdUJBQUEsSUFBSSxzQ0FBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsdUJBQUEsSUFBSSxzQ0FBVyxxQ0FBcUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUN4RyxDQUFDO1FBRUQsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyx1QkFBQSxJQUFJLHNDQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEYsTUFBTSxRQUFRLEdBQUc7WUFDZixLQUFLO1lBQ0wsS0FBSyxFQUFFLFlBQVk7U0FDcEIsQ0FBQztRQUNGLHVCQUFBLElBQUksd0NBQWEsQ0FBQyxHQUFHLENBQUMsdUJBQUEsSUFBSSxtRUFBUSxNQUFaLElBQUksRUFBUyxRQUFRLENBQUMsRUFBRTtZQUM1QyxRQUFRO1lBQ1IsS0FBSztTQUNOLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFvQixFQUFFLEtBQVE7UUFDbEQsTUFBTSxRQUFRLEdBQUc7WUFDZixLQUFLO1lBQ0wsS0FBSztTQUNOLENBQUM7UUFDRix1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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/foundation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.70.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dest/index.js",
|
|
6
6
|
"types": "./dest/index.d.ts",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
]
|
|
103
103
|
},
|
|
104
104
|
"dependencies": {
|
|
105
|
-
"@aztec/bb.js": "0.
|
|
105
|
+
"@aztec/bb.js": "0.70.0",
|
|
106
106
|
"@koa/cors": "^5.0.0",
|
|
107
107
|
"@noble/curves": "^1.2.0",
|
|
108
108
|
"bn.js": "^5.2.1",
|
package/src/abi/note_selector.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { toBigIntBE } from '../bigint-buffer/index.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { randomInt } from '../crypto/index.js';
|
|
3
|
+
import { Fr } from '../fields/fields.js';
|
|
4
4
|
import { hexSchemaFor } from '../schemas/utils.js';
|
|
5
5
|
import { BufferReader } from '../serialize/buffer_reader.js';
|
|
6
6
|
import { TypeRegistry } from '../serialize/type_registry.js';
|
|
@@ -14,7 +14,10 @@ export interface NoteSelector {
|
|
|
14
14
|
_branding: 'NoteSelector';
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* A note selector is a 7 bit long value that identifies a note type within a contract.
|
|
19
|
+
* TODO(#10952): Encoding of note type id can be reduced to 7 bits.
|
|
20
|
+
*/
|
|
18
21
|
export class NoteSelector extends Selector {
|
|
19
22
|
/**
|
|
20
23
|
* Deserializes from a buffer or reader, corresponding to a write in cpp.
|
|
@@ -24,6 +27,9 @@ export class NoteSelector extends Selector {
|
|
|
24
27
|
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
25
28
|
const reader = BufferReader.asReader(buffer);
|
|
26
29
|
const value = Number(toBigIntBE(reader.readBytes(Selector.SIZE)));
|
|
30
|
+
if (value >= 1 << 7) {
|
|
31
|
+
throw new Error(`Invalid note selector: ${value}`);
|
|
32
|
+
}
|
|
27
33
|
return new NoteSelector(value);
|
|
28
34
|
}
|
|
29
35
|
|
|
@@ -55,7 +61,8 @@ export class NoteSelector extends Selector {
|
|
|
55
61
|
* @returns A random selector.
|
|
56
62
|
*/
|
|
57
63
|
static random() {
|
|
58
|
-
|
|
64
|
+
const value = randomInt(1 << 7);
|
|
65
|
+
return NoteSelector.fromField(new Fr(value));
|
|
59
66
|
}
|
|
60
67
|
|
|
61
68
|
toJSON() {
|
package/src/collection/array.ts
CHANGED
|
@@ -146,6 +146,11 @@ export function maxBy<T>(arr: T[], fn: (x: T) => number): T | undefined {
|
|
|
146
146
|
return arr.reduce((max, x) => (fn(x) > fn(max) ? x : max), arr[0]);
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
+
/** Computes the sum of a numeric array. */
|
|
150
|
+
export function sum(arr: number[]): number {
|
|
151
|
+
return arr.reduce((a, b) => a + b, 0);
|
|
152
|
+
}
|
|
153
|
+
|
|
149
154
|
/** Computes the median of a numeric array. Returns undefined if array is empty. */
|
|
150
155
|
export function median(arr: number[]) {
|
|
151
156
|
if (arr.length === 0) {
|
|
@@ -155,3 +160,29 @@ export function median(arr: number[]) {
|
|
|
155
160
|
const mid = Math.floor(sorted.length / 2);
|
|
156
161
|
return sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
|
|
157
162
|
}
|
|
163
|
+
|
|
164
|
+
/** Computes the mean of a numeric array. Returns undefined if the array is empty. */
|
|
165
|
+
export function mean(values: number[]) {
|
|
166
|
+
if (values.length === 0) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
return values.reduce((a, b) => a + b, 0) / values.length;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Computes the variance of a numeric array. Returns undefined if there are less than 2 points. */
|
|
173
|
+
export function variance(values: number[]) {
|
|
174
|
+
if (values.length < 2) {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
const avg = mean(values)!;
|
|
178
|
+
const points = values.map(value => value * value + avg * avg - 2 * value * avg);
|
|
179
|
+
return sum(points) / (values.length - 1);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Computes the standard deviation of a numeric array. Returns undefined if there are less than 2 points. */
|
|
183
|
+
export function stdDev(values: number[]) {
|
|
184
|
+
if (values.length < 2) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
return Math.sqrt(variance(values)!);
|
|
188
|
+
}
|
package/src/config/env_var.ts
CHANGED
|
@@ -64,6 +64,7 @@ export type EnvVar =
|
|
|
64
64
|
| 'NETWORK'
|
|
65
65
|
| 'NO_PXE'
|
|
66
66
|
| 'COIN_ISSUER_CONTRACT_ADDRESS'
|
|
67
|
+
| 'USE_GCLOUD_OBSERVABILITY'
|
|
67
68
|
| 'OTEL_EXPORTER_OTLP_METRICS_ENDPOINT'
|
|
68
69
|
| 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT'
|
|
69
70
|
| 'OTEL_EXPORTER_OTLP_LOGS_ENDPOINT'
|
|
@@ -113,7 +114,6 @@ export type EnvVar =
|
|
|
113
114
|
| 'PROVER_BROKER_JOB_TIMEOUT_MS'
|
|
114
115
|
| 'PROVER_BROKER_POLL_INTERVAL_MS'
|
|
115
116
|
| 'PROVER_BROKER_JOB_MAX_RETRIES'
|
|
116
|
-
| 'PROVER_BROKER_DATA_DIRECTORY'
|
|
117
117
|
| 'PROVER_COORDINATION_NODE_URL'
|
|
118
118
|
| 'PROVER_DISABLED'
|
|
119
119
|
| 'PROVER_ID'
|
|
@@ -189,8 +189,10 @@ export type EnvVar =
|
|
|
189
189
|
| 'L1_GAS_LIMIT_BUFFER_FIXED'
|
|
190
190
|
| 'L1_GAS_PRICE_MIN'
|
|
191
191
|
| 'L1_GAS_PRICE_MAX'
|
|
192
|
+
| 'L1_BLOB_FEE_PER_GAS_MAX'
|
|
192
193
|
| 'L1_PRIORITY_FEE_BUMP_PERCENTAGE'
|
|
193
194
|
| 'L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE'
|
|
195
|
+
| 'L1_FIXED_PRIORITY_FEE_PER_GAS'
|
|
194
196
|
| 'L1_TX_MONITOR_MAX_ATTEMPTS'
|
|
195
197
|
| 'L1_TX_MONITOR_CHECK_INTERVAL_MS'
|
|
196
198
|
| 'L1_TX_MONITOR_STALL_TIME_MS'
|
|
@@ -201,4 +203,5 @@ export type EnvVar =
|
|
|
201
203
|
| 'FAUCET_INTERVAL_MS'
|
|
202
204
|
| 'FAUCET_L1_ASSETS'
|
|
203
205
|
| 'K8S_POD_NAME'
|
|
204
|
-
| 'K8S_POD_UID'
|
|
206
|
+
| 'K8S_POD_UID'
|
|
207
|
+
| 'K8S_NAMESPACE_NAME';
|
|
@@ -60,6 +60,12 @@ export class SafeJsonRpcServer {
|
|
|
60
60
|
const message = err.issues.map(e => `${e.message} (${e.path.join('.')})`).join('. ') || 'Validation error';
|
|
61
61
|
ctx.status = 400;
|
|
62
62
|
ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32701, message } };
|
|
63
|
+
} else if (this.http200OnError) {
|
|
64
|
+
ctx.body = {
|
|
65
|
+
jsonrpc: '2.0',
|
|
66
|
+
id: null,
|
|
67
|
+
error: { code: err.code || -32600, data: err.data, message: err.message },
|
|
68
|
+
};
|
|
63
69
|
} else {
|
|
64
70
|
ctx.status = 500;
|
|
65
71
|
ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32600, message: err.message ?? 'Internal error' } };
|
|
@@ -111,16 +117,8 @@ export class SafeJsonRpcServer {
|
|
|
111
117
|
ctx.body = { jsonrpc, id, error: { code: -32601, message: `Method not found: ${method}` } };
|
|
112
118
|
} else {
|
|
113
119
|
ctx.status = 200;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
ctx.body = { jsonrpc, id, result };
|
|
117
|
-
} catch (err: any) {
|
|
118
|
-
if (this.http200OnError) {
|
|
119
|
-
ctx.body = { jsonrpc, id, error: { code: err.code || -32600, data: err.data, message: err.message } };
|
|
120
|
-
} else {
|
|
121
|
-
throw err;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
120
|
+
const result = await this.proxy.call(method, params);
|
|
121
|
+
ctx.body = { jsonrpc, id, result };
|
|
124
122
|
}
|
|
125
123
|
});
|
|
126
124
|
|
|
@@ -265,6 +263,12 @@ function makeAggregateHealthcheck(namedHandlers: NamespacedApiHandlers, log?: Lo
|
|
|
265
263
|
};
|
|
266
264
|
}
|
|
267
265
|
|
|
266
|
+
type SafeJsonRpcServerOptions = {
|
|
267
|
+
http200OnError: boolean;
|
|
268
|
+
healthCheck?: StatusCheckFn;
|
|
269
|
+
log?: Logger;
|
|
270
|
+
};
|
|
271
|
+
|
|
268
272
|
/**
|
|
269
273
|
* Creates a single SafeJsonRpcServer from multiple handlers.
|
|
270
274
|
* @param servers - List of handlers to be combined.
|
|
@@ -272,9 +276,12 @@ function makeAggregateHealthcheck(namedHandlers: NamespacedApiHandlers, log?: Lo
|
|
|
272
276
|
*/
|
|
273
277
|
export function createNamespacedSafeJsonRpcServer(
|
|
274
278
|
handlers: NamespacedApiHandlers,
|
|
275
|
-
|
|
276
|
-
|
|
279
|
+
options: Omit<SafeJsonRpcServerOptions, 'healthcheck'> = {
|
|
280
|
+
http200OnError: false,
|
|
281
|
+
log: createLogger('json-rpc:server'),
|
|
282
|
+
},
|
|
277
283
|
): SafeJsonRpcServer {
|
|
284
|
+
const { http200OnError, log } = options;
|
|
278
285
|
const proxy = new NamespacedSafeJsonProxy(handlers);
|
|
279
286
|
const healthCheck = makeAggregateHealthcheck(handlers, log);
|
|
280
287
|
return new SafeJsonRpcServer(proxy, http200OnError, healthCheck, log);
|
|
@@ -283,11 +290,11 @@ export function createNamespacedSafeJsonRpcServer(
|
|
|
283
290
|
export function createSafeJsonRpcServer<T extends object = any>(
|
|
284
291
|
handler: T,
|
|
285
292
|
schema: ApiSchemaFor<T>,
|
|
286
|
-
|
|
287
|
-
healthCheck?: StatusCheckFn,
|
|
293
|
+
options: SafeJsonRpcServerOptions = { http200OnError: false },
|
|
288
294
|
) {
|
|
295
|
+
const { http200OnError, log, healthCheck } = options;
|
|
289
296
|
const proxy = new SafeJsonProxy(handler, schema);
|
|
290
|
-
return new SafeJsonRpcServer(proxy, http200OnError, healthCheck);
|
|
297
|
+
return new SafeJsonRpcServer(proxy, http200OnError, healthCheck, log);
|
|
291
298
|
}
|
|
292
299
|
|
|
293
300
|
/**
|
package/src/log/pino-logger.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { type LogLevel } from './log-levels.js';
|
|
|
10
10
|
import { type LogData, type LogFn } from './log_fn.js';
|
|
11
11
|
|
|
12
12
|
export function createLogger(module: string): Logger {
|
|
13
|
-
module = module.replace(/^aztec:/, '');
|
|
13
|
+
module = logNameHandlers.reduce((moduleName, handler) => handler(moduleName), module.replace(/^aztec:/, ''));
|
|
14
14
|
const pinoLogger = logger.child({ module }, { level: getLogLevelFromFilters(logFilters, module) });
|
|
15
15
|
|
|
16
16
|
// We check manually for isLevelEnabled to avoid calling processLogData unnecessarily.
|
|
@@ -56,6 +56,22 @@ function processLogData(data: LogData): LogData {
|
|
|
56
56
|
return logDataHandlers.reduce((accum, handler) => handler(accum), data);
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
// Allow global hooks for tweaking module names.
|
|
60
|
+
// Used in tests to add a uid to modules, so we can differentiate multiple nodes in the same process.
|
|
61
|
+
type LogNameHandler = (module: string) => string;
|
|
62
|
+
const logNameHandlers: LogNameHandler[] = [];
|
|
63
|
+
|
|
64
|
+
export function addLogNameHandler(handler: LogNameHandler): void {
|
|
65
|
+
logNameHandlers.push(handler);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function removeLogNameHandler(handler: LogNameHandler) {
|
|
69
|
+
const index = logNameHandlers.indexOf(handler);
|
|
70
|
+
if (index !== -1) {
|
|
71
|
+
logNameHandlers.splice(index, 1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
59
75
|
// Patch isLevelEnabled missing from pino/browser.
|
|
60
76
|
function isLevelEnabled(logger: pino.Logger<'verbose', boolean>, level: LogLevel): boolean {
|
|
61
77
|
return typeof logger.isLevelEnabled === 'function'
|
|
@@ -101,8 +117,10 @@ const levelToSeverityFormatter = (label: string, level: number): object => {
|
|
|
101
117
|
return { severity, level };
|
|
102
118
|
};
|
|
103
119
|
|
|
120
|
+
const useGcloudObservability = process.env.USE_GCLOUD_OBSERVABILITY === 'true';
|
|
104
121
|
const pinoOpts: pino.LoggerOptions<keyof typeof customLevels> = {
|
|
105
122
|
customLevels,
|
|
123
|
+
messageKey: useGcloudObservability ? 'message' : 'msg',
|
|
106
124
|
useOnlyCustomLevels: false,
|
|
107
125
|
level: logLevel,
|
|
108
126
|
formatters: {
|
|
@@ -156,7 +174,6 @@ const otelTransport: pino.TransportTargetOptions = {
|
|
|
156
174
|
options: otelOpts,
|
|
157
175
|
level: 'trace',
|
|
158
176
|
};
|
|
159
|
-
|
|
160
177
|
function makeLogger() {
|
|
161
178
|
if (!isNode) {
|
|
162
179
|
// We are on the browser.
|
|
@@ -23,6 +23,10 @@ export class RunningPromise {
|
|
|
23
23
|
* Starts the running promise.
|
|
24
24
|
*/
|
|
25
25
|
public start() {
|
|
26
|
+
if (this.running) {
|
|
27
|
+
this.logger.warn(`Attempted to start running promise that was already started`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
26
30
|
this.running = true;
|
|
27
31
|
|
|
28
32
|
const poll = async () => {
|
|
@@ -54,6 +58,10 @@ export class RunningPromise {
|
|
|
54
58
|
* and waits for the currently executing function to complete.
|
|
55
59
|
*/
|
|
56
60
|
async stop(): Promise<void> {
|
|
61
|
+
if (!this.running) {
|
|
62
|
+
this.logger.warn(`Running promise was not started`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
57
65
|
this.running = false;
|
|
58
66
|
this.interruptibleSleep.interrupt();
|
|
59
67
|
await this.runningPromise;
|
|
@@ -6,6 +6,7 @@ import { FifoMemoryQueue } from './fifo_memory_queue.js';
|
|
|
6
6
|
export class SerialQueue {
|
|
7
7
|
private readonly queue = new FifoMemoryQueue<() => Promise<void>>();
|
|
8
8
|
private runningPromise!: Promise<void>;
|
|
9
|
+
private started = false;
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Initializes the execution of enqueued functions in the serial queue.
|
|
@@ -14,7 +15,11 @@ export class SerialQueue {
|
|
|
14
15
|
* This method should be called once to start processing the queue.
|
|
15
16
|
*/
|
|
16
17
|
public start() {
|
|
18
|
+
if (this.started) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
17
21
|
this.runningPromise = this.queue.process(fn => fn());
|
|
22
|
+
this.started = true;
|
|
18
23
|
}
|
|
19
24
|
|
|
20
25
|
/**
|
|
@@ -17,6 +17,11 @@ export function writeTestData(targetFileFromRepoRoot: string, contents: string |
|
|
|
17
17
|
logger(`Wrote test data to ${targetFile}`);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
export function readTestData(repoPath: string): Buffer {
|
|
21
|
+
const targetFile = getPathToFile(repoPath);
|
|
22
|
+
return readFileSync(targetFile);
|
|
23
|
+
}
|
|
24
|
+
|
|
20
25
|
/**
|
|
21
26
|
* Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
|
|
22
27
|
* Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
|
|
@@ -43,7 +48,7 @@ export function updateInlineTestData(targetFileFromRepoRoot: string, itemName: s
|
|
|
43
48
|
/**
|
|
44
49
|
* Updates the sample Prover.toml files in noir-projects/noir-protocol-circuits/crates/.
|
|
45
50
|
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
|
|
46
|
-
* To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn test:e2e
|
|
51
|
+
* To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn test:e2e full.test '
|
|
47
52
|
*/
|
|
48
53
|
export function updateProtocolCircuitSampleInputs(circuitName: string, value: string) {
|
|
49
54
|
const logger = createConsoleLogger('aztec:testing:test_data');
|
package/src/trees/index.ts
CHANGED