@aztec/end-to-end 4.0.0-nightly.20260112 → 4.0.0-nightly.20260114
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/bench/client_flows/client_flows_benchmark.d.ts +10 -10
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +98 -133
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +5 -6
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +94 -112
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +5 -5
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +60 -62
- package/dest/e2e_deploy_contract/deploy_test.d.ts +4 -3
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +15 -13
- package/dest/e2e_epochs/epochs_test.js +1 -1
- package/dest/e2e_fees/bridging_race.notest.js +2 -4
- package/dest/e2e_fees/fees_test.d.ts +11 -11
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +118 -139
- package/dest/e2e_l1_publisher/write_json.d.ts +1 -1
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +1 -0
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +5 -8
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +29 -40
- package/dest/e2e_p2p/inactivity_slash_test.js +1 -1
- package/dest/e2e_p2p/p2p_network.d.ts +5 -3
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +99 -102
- package/dest/e2e_token_contract/token_contract_test.d.ts +15 -8
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +88 -92
- package/dest/fixtures/e2e_prover_test.d.ts +7 -13
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +78 -91
- package/dest/fixtures/snapshot_manager.d.ts +10 -44
- package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
- package/dest/fixtures/snapshot_manager.js +12 -255
- package/dest/fixtures/utils.js +3 -3
- package/dest/quality_of_service/grafana_client.d.ts +41 -0
- package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
- package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
- package/dest/quality_of_service/prometheus_client.d.ts +38 -0
- package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
- package/dest/quality_of_service/prometheus_client.js +67 -0
- package/dest/spartan/setup_test_wallets.d.ts +4 -3
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.d.ts +4 -1
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +21 -1
- package/dest/spartan/utils.d.ts +5 -1
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +25 -8
- package/package.json +38 -38
- package/src/bench/client_flows/client_flows_benchmark.ts +134 -192
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -136
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +91 -103
- package/src/e2e_deploy_contract/deploy_test.ts +18 -14
- package/src/e2e_epochs/epochs_test.ts +1 -1
- package/src/e2e_fees/bridging_race.notest.ts +2 -5
- package/src/e2e_fees/fees_test.ts +165 -210
- package/src/e2e_l1_publisher/write_json.ts +1 -0
- package/src/e2e_nested_contract/nested_contract_test.ts +30 -54
- package/src/e2e_p2p/inactivity_slash_test.ts +1 -1
- package/src/e2e_p2p/p2p_network.ts +149 -165
- package/src/e2e_token_contract/token_contract_test.ts +104 -113
- package/src/fixtures/e2e_prover_test.ts +97 -130
- package/src/fixtures/snapshot_manager.ts +12 -325
- package/src/fixtures/utils.ts +3 -3
- package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
- package/src/quality_of_service/prometheus_client.ts +113 -0
- package/src/spartan/setup_test_wallets.ts +7 -1
- package/src/spartan/tx_metrics.ts +21 -1
- package/src/spartan/utils.ts +26 -8
- package/dest/quality_of_service/alert_checker.d.ts +0 -41
- package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
|
@@ -2,7 +2,6 @@ import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
|
|
|
2
2
|
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
3
3
|
import { AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
|
|
4
4
|
import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
|
|
5
|
-
import { getContractClassFromArtifact } from '@aztec/aztec.js/contracts';
|
|
6
5
|
import { BatchCall, waitForProven } from '@aztec/aztec.js/contracts';
|
|
7
6
|
import { publishContractClass, publishInstance } from '@aztec/aztec.js/deployment';
|
|
8
7
|
import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec/testing';
|
|
@@ -11,25 +10,19 @@ import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
|
|
|
11
10
|
import { deployMulticall3 } from '@aztec/ethereum/contracts';
|
|
12
11
|
import { deployAztecL1Contracts } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
13
12
|
import { EthCheatCodesWithState, startAnvil } from '@aztec/ethereum/test';
|
|
14
|
-
import { asyncMap } from '@aztec/foundation/async-map';
|
|
15
13
|
import { SecretValue } from '@aztec/foundation/config';
|
|
16
14
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
17
15
|
import { tryRmDir } from '@aztec/foundation/fs';
|
|
18
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
19
|
-
import { resolver, reviver } from '@aztec/foundation/serialize';
|
|
20
16
|
import { TestDateProvider } from '@aztec/foundation/timer';
|
|
21
17
|
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
22
18
|
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
23
19
|
import { getPXEConfig } from '@aztec/pxe/server';
|
|
24
20
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
25
|
-
import { getConfigEnvVars as getTelemetryConfig, initTelemetryClient } from '@aztec/telemetry-client';
|
|
26
21
|
import { TestWallet } from '@aztec/test-wallet/server';
|
|
27
22
|
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
28
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
29
|
-
import { copySync, removeSync } from 'fs-extra/esm';
|
|
30
23
|
import fs from 'fs/promises';
|
|
31
24
|
import { tmpdir } from 'os';
|
|
32
|
-
import path
|
|
25
|
+
import path from 'path';
|
|
33
26
|
import { mnemonicToAccount } from 'viem/accounts';
|
|
34
27
|
import { foundry } from 'viem/chains';
|
|
35
28
|
import { MNEMONIC, TEST_MAX_PENDING_TX_POOL_COUNT, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
|
|
@@ -37,151 +30,9 @@ import { getACVMConfig } from './get_acvm_config.js';
|
|
|
37
30
|
import { getBBConfig } from './get_bb_config.js';
|
|
38
31
|
import { createAndSyncProverNode, getLogger, getPrivateKeyFromIndex, getSponsoredFPCAddress, setupSharedBlobStorage } from './utils.js';
|
|
39
32
|
import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
|
|
40
|
-
export function createSnapshotManager(testName, dataPath, config = {}, deployL1ContractsArgs = {
|
|
41
|
-
initialValidators: []
|
|
42
|
-
}) {
|
|
43
|
-
return dataPath ? new SnapshotManager(testName, dataPath, config, deployL1ContractsArgs) : new MockSnapshotManager(testName, config, deployL1ContractsArgs);
|
|
44
|
-
}
|
|
45
|
-
/** Snapshot manager that does not perform snapshotting, it just applies transition and restoration functions as it receives them. */ class MockSnapshotManager {
|
|
46
|
-
config;
|
|
47
|
-
deployL1ContractsArgs;
|
|
48
|
-
context;
|
|
49
|
-
logger;
|
|
50
|
-
constructor(testName, config = {}, deployL1ContractsArgs = {}){
|
|
51
|
-
this.config = config;
|
|
52
|
-
this.deployL1ContractsArgs = deployL1ContractsArgs;
|
|
53
|
-
this.logger = createLogger(`e2e:snapshot_manager:${testName}`);
|
|
54
|
-
this.logger.warn(`No data path given, will not persist any snapshots.`);
|
|
55
|
-
}
|
|
56
|
-
async snapshot(name, apply, restore = ()=>Promise.resolve()) {
|
|
57
|
-
// We are running in disabled mode. Just apply the state.
|
|
58
|
-
const context = await this.setup();
|
|
59
|
-
this.logger.verbose(`Applying state transition for ${name}...`);
|
|
60
|
-
const snapshotData = await apply(context);
|
|
61
|
-
this.logger.verbose(`State transition for ${name} complete.`);
|
|
62
|
-
// Execute the restoration function.
|
|
63
|
-
await restore(snapshotData, context);
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
async setup() {
|
|
67
|
-
if (!this.context) {
|
|
68
|
-
this.context = await setupFromFresh(undefined, this.logger, this.config, this.deployL1ContractsArgs);
|
|
69
|
-
}
|
|
70
|
-
return this.context;
|
|
71
|
-
}
|
|
72
|
-
async teardown() {
|
|
73
|
-
await teardown(this.context);
|
|
74
|
-
this.context = undefined;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Snapshot engine for local e2e tests. Read more:
|
|
79
|
-
* https://github.com/AztecProtocol/aztec-packages/pull/5526
|
|
80
|
-
*/ class SnapshotManager {
|
|
81
|
-
dataPath;
|
|
82
|
-
config;
|
|
83
|
-
deployL1ContractsArgs;
|
|
84
|
-
snapshotStack;
|
|
85
|
-
context;
|
|
86
|
-
livePath;
|
|
87
|
-
logger;
|
|
88
|
-
constructor(testName, dataPath, config = {}, deployL1ContractsArgs = {}){
|
|
89
|
-
this.dataPath = dataPath;
|
|
90
|
-
this.config = config;
|
|
91
|
-
this.deployL1ContractsArgs = deployL1ContractsArgs;
|
|
92
|
-
this.snapshotStack = [];
|
|
93
|
-
this.livePath = join(this.dataPath, 'live', testName);
|
|
94
|
-
this.logger = createLogger(`e2e:snapshot_manager:${testName}`);
|
|
95
|
-
}
|
|
96
|
-
async snapshot(name, apply, restore = ()=>Promise.resolve()) {
|
|
97
|
-
const snapshotPath = join(this.dataPath, 'snapshots', ...this.snapshotStack.map((e)=>e.name), name, 'snapshot');
|
|
98
|
-
if (existsSync(snapshotPath)) {
|
|
99
|
-
// Snapshot exists. Record entry on stack but do nothing else as we're probably still descending the tree.
|
|
100
|
-
// It's the tests responsibility to call setup() before a test to ensure subsystems get created.
|
|
101
|
-
this.logger.verbose(`Snapshot exists at ${snapshotPath}. Continuing...`);
|
|
102
|
-
this.snapshotStack.push({
|
|
103
|
-
name,
|
|
104
|
-
apply,
|
|
105
|
-
restore,
|
|
106
|
-
snapshotPath
|
|
107
|
-
});
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
// Snapshot didn't exist at snapshotPath, and by definition none of the child snapshots can exist.
|
|
111
|
-
// If we have no subsystem context yet, create it from the top of the snapshot stack (if it exists).
|
|
112
|
-
const context = await this.setup();
|
|
113
|
-
this.snapshotStack.push({
|
|
114
|
-
name,
|
|
115
|
-
apply,
|
|
116
|
-
restore,
|
|
117
|
-
snapshotPath
|
|
118
|
-
});
|
|
119
|
-
// Apply current state transition.
|
|
120
|
-
this.logger.verbose(`Applying state transition for ${name}...`);
|
|
121
|
-
const snapshotData = await apply(context);
|
|
122
|
-
this.logger.verbose(`State transition for ${name} complete.`);
|
|
123
|
-
// Execute the restoration function.
|
|
124
|
-
await restore(snapshotData, context);
|
|
125
|
-
// Save the snapshot data.
|
|
126
|
-
const ethCheatCodes = new EthCheatCodesWithState(context.aztecNodeConfig.l1RpcUrls, context.dateProvider);
|
|
127
|
-
const anvilStateFile = `${this.livePath}/anvil.dat`;
|
|
128
|
-
await ethCheatCodes.dumpChainState(anvilStateFile);
|
|
129
|
-
writeFileSync(`${this.livePath}/${name}.json`, JSON.stringify(snapshotData || {}, resolver));
|
|
130
|
-
// Copy everything to snapshot path.
|
|
131
|
-
// We want it to be atomic, in case multiple processes are racing to create the snapshot.
|
|
132
|
-
this.logger.verbose(`Saving snapshot to ${snapshotPath}...`);
|
|
133
|
-
if (mkdirSync(snapshotPath, {
|
|
134
|
-
recursive: true
|
|
135
|
-
})) {
|
|
136
|
-
copySync(this.livePath, snapshotPath);
|
|
137
|
-
this.logger.verbose(`Snapshot copied to ${snapshotPath}.`);
|
|
138
|
-
} else {
|
|
139
|
-
this.logger.verbose(`Snapshot already exists at ${snapshotPath}. Discarding our version.`);
|
|
140
|
-
await this.teardown();
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Creates and returns the subsystem context based on the current snapshot stack.
|
|
145
|
-
* If the subsystem context already exists, just return it.
|
|
146
|
-
* If you want to be sure to get a clean snapshot, be sure to call teardown() before calling setup().
|
|
147
|
-
*/ async setup() {
|
|
148
|
-
// We have no subsystem context yet.
|
|
149
|
-
// If one exists on the snapshot stack, create one from that snapshot.
|
|
150
|
-
// Otherwise create a fresh one.
|
|
151
|
-
if (!this.context) {
|
|
152
|
-
removeSync(this.livePath);
|
|
153
|
-
mkdirSync(this.livePath, {
|
|
154
|
-
recursive: true
|
|
155
|
-
});
|
|
156
|
-
const previousSnapshotPath = this.snapshotStack[this.snapshotStack.length - 1]?.snapshotPath;
|
|
157
|
-
if (previousSnapshotPath) {
|
|
158
|
-
this.logger.verbose(`Copying snapshot from ${previousSnapshotPath} to ${this.livePath}...`);
|
|
159
|
-
copySync(previousSnapshotPath, this.livePath);
|
|
160
|
-
this.context = await setupFromState(this.livePath, this.logger);
|
|
161
|
-
// Execute each of the previous snapshots restoration functions in turn.
|
|
162
|
-
await asyncMap(this.snapshotStack, async (e)=>{
|
|
163
|
-
const snapshotData = JSON.parse(readFileSync(`${e.snapshotPath}/${e.name}.json`, 'utf-8'), reviver);
|
|
164
|
-
this.logger.verbose(`Executing restoration function for ${e.name}...`);
|
|
165
|
-
await e.restore(snapshotData, this.context);
|
|
166
|
-
this.logger.verbose(`Restoration of ${e.name} complete.`);
|
|
167
|
-
});
|
|
168
|
-
} else {
|
|
169
|
-
this.context = await setupFromFresh(this.livePath, this.logger, this.config, this.deployL1ContractsArgs);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return this.context;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Destroys the current subsystem context.
|
|
176
|
-
*/ async teardown() {
|
|
177
|
-
await teardown(this.context);
|
|
178
|
-
this.context = undefined;
|
|
179
|
-
removeSync(this.livePath);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
33
|
/**
|
|
183
34
|
* Destroys the current subsystem context.
|
|
184
|
-
*/ async function teardown(context) {
|
|
35
|
+
*/ export async function teardown(context) {
|
|
185
36
|
if (!context) {
|
|
186
37
|
return;
|
|
187
38
|
}
|
|
@@ -201,9 +52,8 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
|
|
|
201
52
|
}
|
|
202
53
|
/**
|
|
203
54
|
* Initializes a fresh set of subsystems.
|
|
204
|
-
*
|
|
205
|
-
|
|
206
|
-
*/ async function setupFromFresh(statePath, logger, { numberOfInitialFundedAccounts = 10, ...opts } = {}, deployL1ContractsArgs = {
|
|
55
|
+
* State is stored in temporary in-memory locations.
|
|
56
|
+
*/ export async function setupFromFresh(logger, { numberOfInitialFundedAccounts = 10, ...opts } = {}, deployL1ContractsArgs = {
|
|
207
57
|
initialValidators: []
|
|
208
58
|
}) {
|
|
209
59
|
logger.verbose(`Initializing state...`);
|
|
@@ -231,11 +81,7 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
|
|
|
231
81
|
await fs.mkdir(directoryToCleanup, {
|
|
232
82
|
recursive: true
|
|
233
83
|
});
|
|
234
|
-
|
|
235
|
-
aztecNodeConfig.dataDirectory = directoryToCleanup;
|
|
236
|
-
} else {
|
|
237
|
-
aztecNodeConfig.dataDirectory = statePath;
|
|
238
|
-
}
|
|
84
|
+
aztecNodeConfig.dataDirectory = directoryToCleanup;
|
|
239
85
|
await setupSharedBlobStorage(aztecNodeConfig);
|
|
240
86
|
const hdAccount = mnemonicToAccount(MNEMONIC, {
|
|
241
87
|
addressIndex: 0
|
|
@@ -324,15 +170,11 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
|
|
|
324
170
|
}
|
|
325
171
|
logger.verbose('Creating pxe...');
|
|
326
172
|
const pxeConfig = getPXEConfig();
|
|
327
|
-
pxeConfig.dataDirectory =
|
|
173
|
+
pxeConfig.dataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
|
|
328
174
|
// Only enable proving if specifically requested.
|
|
329
175
|
pxeConfig.proverEnabled = !!opts.realProofs;
|
|
330
176
|
const wallet = await TestWallet.create(aztecNode, pxeConfig);
|
|
331
177
|
const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls, aztecNode, dateProvider);
|
|
332
|
-
if (statePath) {
|
|
333
|
-
writeFileSync(`${statePath}/aztec_node_config.json`, JSON.stringify(aztecNodeConfig, resolver));
|
|
334
|
-
writeFileSync(`${statePath}/accounts.json`, JSON.stringify(initialFundedAccounts, resolver));
|
|
335
|
-
}
|
|
336
178
|
return {
|
|
337
179
|
aztecNodeConfig,
|
|
338
180
|
anvil,
|
|
@@ -351,93 +193,8 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
|
|
|
351
193
|
};
|
|
352
194
|
}
|
|
353
195
|
/**
|
|
354
|
-
*
|
|
355
|
-
|
|
356
|
-
logger.verbose(`Initializing with saved state at ${statePath}...`);
|
|
357
|
-
const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex'));
|
|
358
|
-
await fs.mkdir(directoryToCleanup, {
|
|
359
|
-
recursive: true
|
|
360
|
-
});
|
|
361
|
-
// TODO: For some reason this is currently the union of a bunch of subsystems. That needs fixing.
|
|
362
|
-
const aztecNodeConfig = JSON.parse(readFileSync(`${statePath}/aztec_node_config.json`, 'utf-8'), reviver);
|
|
363
|
-
aztecNodeConfig.dataDirectory = statePath;
|
|
364
|
-
aztecNodeConfig.listenAddress = '127.0.0.1';
|
|
365
|
-
await setupSharedBlobStorage(aztecNodeConfig);
|
|
366
|
-
const initialFundedAccounts = JSON.parse(readFileSync(`${statePath}/accounts.json`, 'utf-8'), reviver) || [];
|
|
367
|
-
const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts.map((a)=>a.address));
|
|
368
|
-
// Start anvil. We go via a wrapper script to ensure if the parent dies, anvil dies.
|
|
369
|
-
const { anvil, rpcUrl } = await startAnvil();
|
|
370
|
-
aztecNodeConfig.l1RpcUrls = [
|
|
371
|
-
rpcUrl
|
|
372
|
-
];
|
|
373
|
-
// Load anvil state.
|
|
374
|
-
const anvilStateFile = `${statePath}/anvil.dat`;
|
|
375
|
-
const dateProvider = new TestDateProvider();
|
|
376
|
-
const ethCheatCodes = new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrls, dateProvider);
|
|
377
|
-
await ethCheatCodes.loadChainState(anvilStateFile);
|
|
378
|
-
// TODO: Encapsulate this in a NativeAcvm impl.
|
|
379
|
-
const acvmConfig = await getACVMConfig(logger);
|
|
380
|
-
if (acvmConfig) {
|
|
381
|
-
aztecNodeConfig.acvmWorkingDirectory = acvmConfig.acvmWorkingDirectory;
|
|
382
|
-
aztecNodeConfig.acvmBinaryPath = acvmConfig.acvmBinaryPath;
|
|
383
|
-
}
|
|
384
|
-
const bbConfig = await getBBConfig(logger);
|
|
385
|
-
if (bbConfig) {
|
|
386
|
-
aztecNodeConfig.bbBinaryPath = bbConfig.bbBinaryPath;
|
|
387
|
-
aztecNodeConfig.bbWorkingDirectory = bbConfig.bbWorkingDirectory;
|
|
388
|
-
}
|
|
389
|
-
logger.verbose('Creating ETH clients...');
|
|
390
|
-
const l1Client = createExtendedL1Client(aztecNodeConfig.l1RpcUrls, mnemonicToAccount(MNEMONIC));
|
|
391
|
-
const watcher = new AnvilTestWatcher(ethCheatCodes, aztecNodeConfig.l1Contracts.rollupAddress, l1Client, dateProvider);
|
|
392
|
-
await watcher.start();
|
|
393
|
-
const telemetry = await initTelemetryClient(getTelemetryConfig());
|
|
394
|
-
logger.verbose('Creating aztec node...');
|
|
395
|
-
const aztecNode = await AztecNodeService.createAndSync(aztecNodeConfig, {
|
|
396
|
-
telemetry,
|
|
397
|
-
dateProvider
|
|
398
|
-
}, {
|
|
399
|
-
prefilledPublicData
|
|
400
|
-
});
|
|
401
|
-
let proverNode = undefined;
|
|
402
|
-
if (aztecNodeConfig.startProverNode) {
|
|
403
|
-
logger.verbose('Creating and syncing a simulated prover node...');
|
|
404
|
-
const proverNodePrivateKey = getPrivateKeyFromIndex(2);
|
|
405
|
-
const proverNodePrivateKeyHex = `0x${proverNodePrivateKey.toString('hex')}`;
|
|
406
|
-
proverNode = await createAndSyncProverNode(proverNodePrivateKeyHex, aztecNodeConfig, {
|
|
407
|
-
...aztecNodeConfig.proverNodeConfig,
|
|
408
|
-
dataDirectory: path.join(directoryToCleanup, randomBytes(8).toString('hex')),
|
|
409
|
-
p2pEnabled: false
|
|
410
|
-
}, aztecNode, prefilledPublicData);
|
|
411
|
-
}
|
|
412
|
-
logger.verbose('Creating pxe...');
|
|
413
|
-
const pxeConfig = getPXEConfig();
|
|
414
|
-
pxeConfig.dataDirectory = statePath;
|
|
415
|
-
const wallet = await TestWallet.create(aztecNode, pxeConfig);
|
|
416
|
-
const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls, aztecNode, dateProvider);
|
|
417
|
-
return {
|
|
418
|
-
aztecNodeConfig,
|
|
419
|
-
anvil,
|
|
420
|
-
aztecNode,
|
|
421
|
-
wallet,
|
|
422
|
-
sequencer: aztecNode.getSequencer(),
|
|
423
|
-
acvmConfig,
|
|
424
|
-
bbConfig,
|
|
425
|
-
proverNode,
|
|
426
|
-
deployL1ContractsValues: {
|
|
427
|
-
l1Client,
|
|
428
|
-
l1ContractAddresses: aztecNodeConfig.l1Contracts,
|
|
429
|
-
rollupVersion: aztecNodeConfig.rollupVersion
|
|
430
|
-
},
|
|
431
|
-
watcher,
|
|
432
|
-
cheatCodes,
|
|
433
|
-
dateProvider,
|
|
434
|
-
initialFundedAccounts,
|
|
435
|
-
directoryToCleanup
|
|
436
|
-
};
|
|
437
|
-
}
|
|
438
|
-
/**
|
|
439
|
-
* Snapshot 'apply' helper function to add accounts.
|
|
440
|
-
* The 'restore' function is not provided, as it must be a closure within the test context to capture the results.
|
|
196
|
+
* Helper function to deploy accounts.
|
|
197
|
+
* Returns deployed account data that can be used by tests.
|
|
441
198
|
*/ export const deployAccounts = (numberOfAccounts, logger)=>async ({ wallet, initialFundedAccounts })=>{
|
|
442
199
|
if (initialFundedAccounts.length < numberOfAccounts) {
|
|
443
200
|
throw new Error(`Cannot deploy more than ${initialFundedAccounts.length} initial accounts.`);
|
|
@@ -465,11 +222,11 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
|
|
|
465
222
|
* @param waitUntilProven - Whether to wait for the tx to be proven.
|
|
466
223
|
* @param node - AztecNode used to wait for proven tx.
|
|
467
224
|
*/ export async function publicDeployAccounts(wallet, accountsToDeploy, waitUntilProven = false, node) {
|
|
468
|
-
const instances = (await Promise.all(accountsToDeploy.map((account)=>wallet.getContractMetadata(account)))).map((metadata)=>metadata.
|
|
469
|
-
const
|
|
470
|
-
const
|
|
225
|
+
const instances = (await Promise.all(accountsToDeploy.map((account)=>wallet.getContractMetadata(account)))).map((metadata)=>metadata.instance);
|
|
226
|
+
const { instance } = await wallet.getContractMetadata(accountsToDeploy[0]);
|
|
227
|
+
const { isContractClassPubliclyRegistered } = await wallet.getContractClassMetadata(instance.currentContractClassId);
|
|
471
228
|
const calls = await Promise.all([
|
|
472
|
-
...!
|
|
229
|
+
...!isContractClassPubliclyRegistered ? [
|
|
473
230
|
publishContractClass(wallet, SchnorrAccountContractArtifact)
|
|
474
231
|
] : [],
|
|
475
232
|
...instances.map((instance)=>publishInstance(wallet, instance))
|
package/dest/fixtures/utils.js
CHANGED
|
@@ -460,14 +460,14 @@ export const getPrivateKeyFromIndex = (index)=>{
|
|
|
460
460
|
deployed: (await wallet.getContractMetadata(address)).isContractPublished
|
|
461
461
|
};
|
|
462
462
|
}));
|
|
463
|
-
const instances = (await Promise.all(accountsAndAddresses.filter(({ deployed })=>!deployed).map(({ address })=>wallet.getContractMetadata(address)))).map((contractMetadata)=>contractMetadata.
|
|
463
|
+
const instances = (await Promise.all(accountsAndAddresses.filter(({ deployed })=>!deployed).map(({ address })=>wallet.getContractMetadata(address)))).map((contractMetadata)=>contractMetadata.instance);
|
|
464
464
|
const contractClass = await getContractClassFromArtifact(SchnorrAccountContractArtifact);
|
|
465
|
-
if (!(await wallet.getContractClassMetadata(contractClass.id
|
|
465
|
+
if (!(await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered) {
|
|
466
466
|
await (await publishContractClass(wallet, SchnorrAccountContractArtifact)).send({
|
|
467
467
|
from: accountsToDeploy[0]
|
|
468
468
|
}).wait();
|
|
469
469
|
}
|
|
470
|
-
const requests =
|
|
470
|
+
const requests = instances.map((instance)=>publishInstance(wallet, instance));
|
|
471
471
|
const batch = new BatchCall(wallet, requests);
|
|
472
472
|
await batch.send({
|
|
473
473
|
from: accountsToDeploy[0]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Logger } from '@aztec/aztec.js/log';
|
|
2
|
+
export interface AlertConfig {
|
|
3
|
+
alert: string;
|
|
4
|
+
expr: string;
|
|
5
|
+
start?: number;
|
|
6
|
+
end?: number;
|
|
7
|
+
step?: number;
|
|
8
|
+
for: string;
|
|
9
|
+
labels: Record<string, string>;
|
|
10
|
+
annotations: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
export interface AlertCheckerConfig {
|
|
13
|
+
grafanaEndpoint: string;
|
|
14
|
+
grafanaCredentials: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class GrafanaClient {
|
|
17
|
+
private config;
|
|
18
|
+
private logger;
|
|
19
|
+
constructor(logger: Logger, config?: Partial<AlertCheckerConfig>);
|
|
20
|
+
/**
|
|
21
|
+
* Load the alerts config from a file path.
|
|
22
|
+
* @param filePath - The absolute path to the alerts file.
|
|
23
|
+
*/
|
|
24
|
+
private loadAlertsConfig;
|
|
25
|
+
private queryGrafana;
|
|
26
|
+
private checkAlerts;
|
|
27
|
+
/**
|
|
28
|
+
* Run the alert check based on the alerts defined in an array.
|
|
29
|
+
* @param alerts - The alerts to check.
|
|
30
|
+
*/
|
|
31
|
+
runAlertCheck(alerts: AlertConfig[]): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Run the alert check based on the alerts defined in a yaml file.
|
|
34
|
+
* @param filePath - The absolute path to the alerts file.
|
|
35
|
+
*/
|
|
36
|
+
runAlertCheckFromFilePath(filePath: string): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export declare class AlertTriggeredError extends Error {
|
|
39
|
+
name: string;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhZmFuYV9jbGllbnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWFsaXR5X29mX3NlcnZpY2UvZ3JhZmFuYV9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFLbEQsTUFBTSxXQUFXLFdBQVc7SUFDMUIsS0FBSyxFQUFFLE1BQU0sQ0FBQztJQUNkLElBQUksRUFBRSxNQUFNLENBQUM7SUFDYixLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDZixHQUFHLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDYixJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDZCxHQUFHLEVBQUUsTUFBTSxDQUFDO0lBQ1osTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FDckM7QUFFRCxNQUFNLFdBQVcsa0JBQWtCO0lBQ2pDLGVBQWUsRUFBRSxNQUFNLENBQUM7SUFDeEIsa0JBQWtCLEVBQUUsTUFBTSxDQUFDO0NBQzVCO0FBUUQscUJBQWEsYUFBYTtJQUN4QixPQUFPLENBQUMsTUFBTSxDQUFxQjtJQUNuQyxPQUFPLENBQUMsTUFBTSxDQUFTO0lBRXZCLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFNLEVBR25FO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLGdCQUFnQjtZQU1WLFlBQVk7WUFxQ1osV0FBVztJQXFCekI7OztPQUdHO0lBQ1UsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBUS9EO0lBRUQ7OztPQUdHO0lBQ1UseUJBQXlCLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBR3RFO0NBQ0Y7QUFFRCxxQkFBYSxtQkFBb0IsU0FBUSxLQUFLO0lBQ25DLElBQUksU0FBeUI7Q0FDdkMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grafana_client.d.ts","sourceRoot":"","sources":["../../src/quality_of_service/grafana_client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAQD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM,EAGnE;IAED;;;OAGG;IACH,OAAO,CAAC,gBAAgB;YAMV,YAAY;YAqCZ,WAAW;IAqBzB;;;OAGG;IACU,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/D;IAED;;;OAGG;IACU,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE;CACF;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IACnC,IAAI,SAAyB;CACvC"}
|
|
@@ -5,7 +5,7 @@ const DEFAULT_CONFIG = {
|
|
|
5
5
|
grafanaEndpoint: 'http://localhost:3000/api/datasources/proxy/uid/prometheus/api/v1',
|
|
6
6
|
grafanaCredentials: 'admin:admin'
|
|
7
7
|
};
|
|
8
|
-
export class
|
|
8
|
+
export class GrafanaClient {
|
|
9
9
|
config;
|
|
10
10
|
logger;
|
|
11
11
|
constructor(logger, config = {}){
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type PromteheusClientOptions = {
|
|
2
|
+
server: URL;
|
|
3
|
+
};
|
|
4
|
+
export declare class PrometheusClient {
|
|
5
|
+
private config;
|
|
6
|
+
private httpClient;
|
|
7
|
+
constructor(config: PromteheusClientOptions, httpClient?: typeof fetch);
|
|
8
|
+
querySingleValue(query: string, time?: Date): Promise<number>;
|
|
9
|
+
queryRaw(query: string, time?: Date): Promise<PrometheusResponse>;
|
|
10
|
+
queryRangeRaw(query: string, step: PrometheusDuration, start: Date, end?: Date): Promise<PrometheusResponse>;
|
|
11
|
+
private callPrometheus;
|
|
12
|
+
}
|
|
13
|
+
export type PrometheusDuration = `${number}s` | `${number}m` | `${number}h`;
|
|
14
|
+
export type PrometheusData = {
|
|
15
|
+
resultType: 'vector';
|
|
16
|
+
result: Array<{
|
|
17
|
+
metric: unknown;
|
|
18
|
+
value: [unixTimestamp: number, value: string];
|
|
19
|
+
}>;
|
|
20
|
+
} | {
|
|
21
|
+
resultType: 'matrix';
|
|
22
|
+
result: Array<{
|
|
23
|
+
metric: unknown;
|
|
24
|
+
values: [unixTimestamp: number, value: string];
|
|
25
|
+
}>;
|
|
26
|
+
} | {
|
|
27
|
+
resultType: 'scalar' | 'string';
|
|
28
|
+
result: unknown;
|
|
29
|
+
};
|
|
30
|
+
export type PrometheusResponse = {
|
|
31
|
+
status: 'error';
|
|
32
|
+
errorType: string;
|
|
33
|
+
error: string;
|
|
34
|
+
} | {
|
|
35
|
+
status: 'success';
|
|
36
|
+
data: PrometheusData;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbWV0aGV1c19jbGllbnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWFsaXR5X29mX3NlcnZpY2UvcHJvbWV0aGV1c19jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxNQUFNLHVCQUF1QixHQUFHO0lBQ3BDLE1BQU0sRUFBRSxHQUFHLENBQUM7Q0FDYixDQUFDO0FBRUYscUJBQWEsZ0JBQWdCO0lBRXpCLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFVBQVU7SUFGcEIsWUFDVSxNQUFNLEVBQUUsdUJBQXVCLEVBQy9CLFVBQVUsR0FBRSxPQUFPLEtBQWEsRUFDdEM7SUFFUyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksT0FBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FhL0U7SUFFTSxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLE9BQWEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FPN0U7SUFFTSxhQUFhLENBQ2xCLEtBQUssRUFBRSxNQUFNLEVBQ2IsSUFBSSxFQUFFLGtCQUFrQixFQUN4QixLQUFLLEVBQUUsSUFBSSxFQUNYLEdBQUcsT0FBYSxHQUNmLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQVM3QjtZQUVhLGNBQWM7Q0E2QjdCO0FBRUQsTUFBTSxNQUFNLGtCQUFrQixHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxDQUFDO0FBRTVFLE1BQU0sTUFBTSxjQUFjLEdBQ3RCO0lBQ0UsVUFBVSxFQUFFLFFBQVEsQ0FBQztJQUNyQixNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQ1osTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUNoQixLQUFLLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztLQUMvQyxDQUFDLENBQUM7Q0FDSixHQUNEO0lBQ0UsVUFBVSxFQUFFLFFBQVEsQ0FBQztJQUNyQixNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQ1osTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUNoQixNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztLQUNoRCxDQUFDLENBQUM7Q0FDSixHQUNEO0lBQ0UsVUFBVSxFQUFFLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDaEMsTUFBTSxFQUFFLE9BQU8sQ0FBQztDQUNqQixDQUFDO0FBRU4sTUFBTSxNQUFNLGtCQUFrQixHQUMxQjtJQUNFLE1BQU0sRUFBRSxPQUFPLENBQUM7SUFDaEIsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixLQUFLLEVBQUUsTUFBTSxDQUFDO0NBQ2YsR0FDRDtJQUNFLE1BQU0sRUFBRSxTQUFTLENBQUM7SUFDbEIsSUFBSSxFQUFFLGNBQWMsQ0FBQztDQUN0QixDQUFDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prometheus_client.d.ts","sourceRoot":"","sources":["../../src/quality_of_service/prometheus_client.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAFpB,YACU,MAAM,EAAE,uBAAuB,EAC/B,UAAU,GAAE,OAAO,KAAa,EACtC;IAES,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,OAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAa/E;IAEM,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,OAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAO7E;IAEM,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,kBAAkB,EACxB,KAAK,EAAE,IAAI,EACX,GAAG,OAAa,GACf,OAAO,CAAC,kBAAkB,CAAC,CAS7B;YAEa,cAAc;CA6B7B;AAED,MAAM,MAAM,kBAAkB,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IACE,UAAU,EAAE,QAAQ,CAAC;IACrB,MAAM,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;KAC/C,CAAC,CAAC;CACJ,GACD;IACE,UAAU,EAAE,QAAQ,CAAC;IACrB,MAAM,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;KAChD,CAAC,CAAC;CACJ,GACD;IACE,UAAU,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEN,MAAM,MAAM,kBAAkB,GAC1B;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;CACtB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export class PrometheusClient {
|
|
2
|
+
config;
|
|
3
|
+
httpClient;
|
|
4
|
+
constructor(config, httpClient = fetch){
|
|
5
|
+
this.config = config;
|
|
6
|
+
this.httpClient = httpClient;
|
|
7
|
+
}
|
|
8
|
+
async querySingleValue(query, time = new Date()) {
|
|
9
|
+
const resp = await this.queryRaw(query, time);
|
|
10
|
+
if (resp.status === 'success') {
|
|
11
|
+
if (resp.data.resultType === 'vector') {
|
|
12
|
+
if (resp.data.result.length === 0) {
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
const [_, value] = resp.data.result[0].value;
|
|
16
|
+
return parseFloat(value);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
throw new TypeError('Unsupported response body', {
|
|
20
|
+
cause: JSON.stringify(resp)
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
queryRaw(query, time = new Date()) {
|
|
24
|
+
const searchParams = new URLSearchParams();
|
|
25
|
+
searchParams.set('query', query);
|
|
26
|
+
searchParams.set('time', String(Math.trunc(time.getTime() / 1000)));
|
|
27
|
+
searchParams.set('limit', '10');
|
|
28
|
+
return this.callPrometheus('query', searchParams);
|
|
29
|
+
}
|
|
30
|
+
queryRangeRaw(query, step, start, end = new Date()) {
|
|
31
|
+
const searchParams = new URLSearchParams();
|
|
32
|
+
searchParams.set('query', query);
|
|
33
|
+
searchParams.set('step', step);
|
|
34
|
+
searchParams.set('start', String(Math.trunc(start.getTime() / 1000)));
|
|
35
|
+
searchParams.set('end', String(Math.trunc(end.getTime() / 1000)));
|
|
36
|
+
searchParams.set('limit', '10');
|
|
37
|
+
return this.callPrometheus('query_range', searchParams);
|
|
38
|
+
}
|
|
39
|
+
async callPrometheus(api, searchParams) {
|
|
40
|
+
const url = new URL('api/v1/' + api, this.config.server);
|
|
41
|
+
for (const [name, value] of searchParams){
|
|
42
|
+
url.searchParams.append(name, value);
|
|
43
|
+
}
|
|
44
|
+
const resp = await this.httpClient(url, {
|
|
45
|
+
method: 'GET'
|
|
46
|
+
});
|
|
47
|
+
if (!resp.ok || resp.status !== 200) {
|
|
48
|
+
throw new Error('Invalid HTTP response from Prometheus', {
|
|
49
|
+
cause: {
|
|
50
|
+
url,
|
|
51
|
+
status: resp.status,
|
|
52
|
+
statusText: resp.statusText
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const body = await resp.json();
|
|
57
|
+
if ('status' in body && (body.status === 'error' || body.status === 'success')) {
|
|
58
|
+
return body;
|
|
59
|
+
}
|
|
60
|
+
throw new Error('Invalid response from Prometheus', {
|
|
61
|
+
cause: {
|
|
62
|
+
url,
|
|
63
|
+
body
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -27,9 +27,10 @@ export declare function performTransfers({ wallet, testAccounts, rounds, transfe
|
|
|
27
27
|
logger: Logger;
|
|
28
28
|
feePaymentMethod?: FeePaymentMethod;
|
|
29
29
|
}): Promise<void>;
|
|
30
|
-
export
|
|
30
|
+
export type WalletWrapper = {
|
|
31
31
|
wallet: TestWallet;
|
|
32
32
|
aztecNode: AztecNode;
|
|
33
33
|
cleanup: () => Promise<void>;
|
|
34
|
-
}
|
|
35
|
-
|
|
34
|
+
};
|
|
35
|
+
export declare function createWalletAndAztecNodeClient(nodeUrl: string, proverEnabled: boolean, logger: Logger): Promise<WalletWrapper>;
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBfdGVzdF93YWxsZXRzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BhcnRhbi9zZXR1cF90ZXN0X3dhbGxldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pELE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUE2QixNQUFNLHFCQUFxQixDQUFDO0FBRXZGLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBeUIsTUFBTSxzQkFBc0IsQ0FBQztBQUk3RSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFL0QsT0FBTyxFQUFFLFVBQVUsRUFBaUUsTUFBTSwyQkFBMkIsQ0FBQztBQU10SCxNQUFNLFdBQVcsWUFBWTtJQUMzQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxVQUFVLENBQUM7SUFDbkIsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQ3pCLGFBQWEsRUFBRSxhQUFhLENBQUM7SUFDN0IsaUJBQWlCLEVBQUUsWUFBWSxDQUFDO0lBQ2hDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDO0lBQy9CLFlBQVksRUFBRSxZQUFZLENBQUM7Q0FDNUI7QUFFRCxNQUFNLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUMxQyxZQUFZLEVBQ1osY0FBYyxHQUFHLGVBQWUsR0FBRyxXQUFXLEdBQUcsbUJBQW1CLENBQ3JFLENBQUM7QUFNRix3QkFBc0IsMkJBQTJCLENBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQ2YsVUFBVSxFQUFFLE1BQU0sRUFDbEIsTUFBTSxFQUFFLE1BQU0sR0FDYixPQUFPLENBQUMsWUFBWSxDQUFDLENBeUJ2QjtBQUVELHdCQUFzQixxQ0FBcUMsQ0FDekQsTUFBTSxFQUFFLFVBQVUsRUFDbEIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsVUFBVSxFQUFFLE1BQU0sRUFDbEIsTUFBTSxFQUFFLE1BQU0sRUFDZCxxQkFBcUIsU0FBSSxHQUN4QixPQUFPLENBQUMsWUFBWSxDQUFDLENBdUN2QjtBQUVELHdCQUFzQiwyQkFBMkIsQ0FDL0MsTUFBTSxFQUFFLFVBQVUsRUFDbEIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsTUFBTSxFQUFFLE1BQU0sRUFDZCxxQkFBcUIsU0FBSSxHQUN4QixPQUFPLENBQUMseUJBQXlCLENBQUMsQ0F3QnBDO0FBRUQsd0JBQXNCLDRCQUE0QixDQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUNmLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFDbkIsb0JBQW9CLEVBQUUsTUFBTSxFQUM1QixVQUFVLEVBQUUsTUFBTSxFQUNsQixNQUFNLEVBQUUsTUFBTSxFQUNkLHFCQUFxQixTQUFJLEdBQ3hCLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0ErQ3ZCO0FBNkVELHdCQUFzQixnQkFBZ0IsQ0FBQyxFQUNyQyxNQUFNLEVBQ04sWUFBWSxFQUNaLE1BQU0sRUFDTixjQUFjLEVBQ2QsTUFBTSxFQUNOLGdCQUFnQixFQUNqQixFQUFFO0lBQ0QsTUFBTSxFQUFFLFVBQVUsQ0FBQztJQUNuQixZQUFZLEVBQUUsWUFBWSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDZixjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDZixnQkFBZ0IsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0NBQ3JDLGlCQXFCQTtBQUVELE1BQU0sTUFBTSxhQUFhLEdBQUc7SUFDMUIsTUFBTSxFQUFFLFVBQVUsQ0FBQztJQUNuQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3JCLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUM5QixDQUFDO0FBRUYsd0JBQXNCLDhCQUE4QixDQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUNmLGFBQWEsRUFBRSxPQUFPLEVBQ3RCLE1BQU0sRUFBRSxNQUFNLEdBQ2IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQXFCeEIifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup_test_wallets.d.ts","sourceRoot":"","sources":["../../src/spartan/setup_test_wallets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,KAAK,gBAAgB,EAA6B,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AAI7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAiE,MAAM,2BAA2B,CAAC;AAMtH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,EAAE,YAAY,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,YAAY,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,YAAY,EACZ,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,mBAAmB,CACrE,CAAC;AAMF,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAyBvB;AAED,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,qBAAqB,SAAI,GACxB,OAAO,CAAC,YAAY,CAAC,CAuCvB;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,qBAAqB,SAAI,GACxB,OAAO,CAAC,yBAAyB,CAAC,CAwBpC;AAED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,EACnB,oBAAoB,EAAE,MAAM,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,qBAAqB,SAAI,GACxB,OAAO,CAAC,YAAY,CAAC,CA+CvB;AA6ED,wBAAsB,gBAAgB,CAAC,EACrC,MAAM,EACN,YAAY,EACZ,MAAM,EACN,cAAc,EACd,MAAM,EACN,gBAAgB,EACjB,EAAE;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,iBAqBA;AAED,
|
|
1
|
+
{"version":3,"file":"setup_test_wallets.d.ts","sourceRoot":"","sources":["../../src/spartan/setup_test_wallets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,KAAK,gBAAgB,EAA6B,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AAI7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAiE,MAAM,2BAA2B,CAAC;AAMtH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,EAAE,YAAY,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,YAAY,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,YAAY,EACZ,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,mBAAmB,CACrE,CAAC;AAMF,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAyBvB;AAED,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,qBAAqB,SAAI,GACxB,OAAO,CAAC,YAAY,CAAC,CAuCvB;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,qBAAqB,SAAI,GACxB,OAAO,CAAC,yBAAyB,CAAC,CAwBpC;AAED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,EACnB,oBAAoB,EAAE,MAAM,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,qBAAqB,SAAI,GACxB,OAAO,CAAC,YAAY,CAAC,CA+CvB;AA6ED,wBAAsB,gBAAgB,CAAC,EACrC,MAAM,EACN,YAAY,EACZ,MAAM,EACN,cAAc,EACd,MAAM,EACN,gBAAgB,EACjB,EAAE;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,iBAqBA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAEF,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,OAAO,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
2
|
+
import type { TopicType } from '@aztec/stdlib/p2p';
|
|
2
3
|
import { Tx, type TxReceipt } from '@aztec/stdlib/tx';
|
|
3
4
|
export type TxInclusionData = {
|
|
4
5
|
txHash: string;
|
|
@@ -16,6 +17,7 @@ export declare class TxInclusionMetrics {
|
|
|
16
17
|
private data;
|
|
17
18
|
private groups;
|
|
18
19
|
private blocks;
|
|
20
|
+
private p2pGossipLatencyByTopic;
|
|
19
21
|
constructor(aztecNode: AztecNode);
|
|
20
22
|
recordSentTx(tx: Tx, group: string): void;
|
|
21
23
|
recordMinedTx(txReceipt: TxReceipt): Promise<void>;
|
|
@@ -28,6 +30,7 @@ export declare class TxInclusionMetrics {
|
|
|
28
30
|
median: number;
|
|
29
31
|
p99: number;
|
|
30
32
|
};
|
|
33
|
+
recordP2PGossipLatency(topicName: TopicType, p50: number, p95: number): void;
|
|
31
34
|
toGithubActionBenchmarkJSON(): Array<{
|
|
32
35
|
name: string;
|
|
33
36
|
unit: string;
|
|
@@ -36,4 +39,4 @@ export declare class TxInclusionMetrics {
|
|
|
36
39
|
extra?: string;
|
|
37
40
|
}>;
|
|
38
41
|
}
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NwYXJ0YW4vdHhfbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxFQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFJaEUsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1QixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDaEIsVUFBVSxFQUFFLE1BQU0sQ0FBQztJQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDO0lBQ3BCLFdBQVcsRUFBRSxNQUFNLENBQUM7SUFDcEIsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUNqQixlQUFlLEVBQUUsTUFBTSxDQUFDO0lBQ3hCLEtBQUssRUFBRSxNQUFNLENBQUM7Q0FDZixDQUFDO0FBRUYscUJBQWEsa0JBQWtCO0lBT2pCLE9BQU8sQ0FBQyxTQUFTO0lBTjdCLE9BQU8sQ0FBQyxJQUFJLENBQXNDO0lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQXFCO0lBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQXVDO0lBRXJELE9BQU8sQ0FBQyx1QkFBdUIsQ0FBZ0U7SUFFL0YsWUFBb0IsU0FBUyxFQUFFLFNBQVMsRUFBSTtJQUU1QyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FnQnhDO0lBRUssYUFBYSxDQUFDLFNBQVMsRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWlCdkQ7SUFFTSxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHO1FBQzVDLEtBQUssRUFBRSxNQUFNLENBQUM7UUFDZCxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ2QsR0FBRyxFQUFFLE1BQU0sQ0FBQztRQUNaLElBQUksRUFBRSxNQUFNLENBQUM7UUFDYixHQUFHLEVBQUUsTUFBTSxDQUFDO1FBQ1osTUFBTSxFQUFFLE1BQU0sQ0FBQztRQUNmLEdBQUcsRUFBRSxNQUFNLENBQUM7S0FDYixDQStCQTtJQUVNLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFbEY7SUFFRCwyQkFBMkIsSUFBSSxLQUFLLENBQUM7UUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDO1FBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztRQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLENBc0NsSDtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_metrics.d.ts","sourceRoot":"","sources":["../../src/spartan/tx_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,EAAE,EAAE,KAAK,SAAS,EAAY,MAAM,kBAAkB,CAAC;AAIhE,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"tx_metrics.d.ts","sourceRoot":"","sources":["../../src/spartan/tx_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,KAAK,SAAS,EAAY,MAAM,kBAAkB,CAAC;AAIhE,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,kBAAkB;IAOjB,OAAO,CAAC,SAAS;IAN7B,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAuC;IAErD,OAAO,CAAC,uBAAuB,CAAgE;IAE/F,YAAoB,SAAS,EAAE,SAAS,EAAI;IAE5C,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAgBxC;IAEK,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvD;IAEM,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG;QAC5C,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CA+BA;IAEM,sBAAsB,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAElF;IAED,2BAA2B,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAsClH;CACF"}
|