@aztec/end-to-end 0.0.0-test.0 → 0.0.1-commit.03f7ef2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +61 -0
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
  3. package/dest/bench/client_flows/benchmark.js +261 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +80 -0
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -0
  6. package/dest/bench/client_flows/client_flows_benchmark.js +336 -0
  7. package/dest/bench/client_flows/config.d.ts +14 -0
  8. package/dest/bench/client_flows/config.d.ts.map +1 -0
  9. package/dest/bench/client_flows/config.js +106 -0
  10. package/dest/bench/client_flows/data_extractor.d.ts +2 -0
  11. package/dest/bench/client_flows/data_extractor.d.ts.map +1 -0
  12. package/dest/bench/client_flows/data_extractor.js +77 -0
  13. package/dest/bench/utils.d.ts +12 -38
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +26 -66
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +21 -13
  17. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  18. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +85 -57
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +20 -25
  20. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  21. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +51 -70
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +16 -8
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +13 -19
  25. package/dest/e2e_epochs/epochs_test.d.ts +65 -22
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +233 -49
  28. package/dest/e2e_fees/bridging_race.notest.d.ts +2 -0
  29. package/dest/e2e_fees/bridging_race.notest.d.ts.map +1 -0
  30. package/dest/e2e_fees/bridging_race.notest.js +63 -0
  31. package/dest/e2e_fees/fees_test.d.ts +27 -12
  32. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  33. package/dest/e2e_fees/fees_test.js +106 -109
  34. package/dest/e2e_l1_publisher/write_json.d.ts +10 -0
  35. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
  36. package/dest/e2e_l1_publisher/write_json.js +58 -0
  37. package/dest/e2e_multi_validator/utils.d.ts +12 -0
  38. package/dest/e2e_multi_validator/utils.d.ts.map +1 -0
  39. package/dest/e2e_multi_validator/utils.js +214 -0
  40. package/dest/e2e_nested_contract/nested_contract_test.d.ts +10 -7
  41. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_nested_contract/nested_contract_test.js +24 -20
  43. package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
  44. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
  45. package/dest/e2e_p2p/inactivity_slash_test.js +136 -0
  46. package/dest/e2e_p2p/p2p_network.d.ts +276 -23
  47. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  48. package/dest/e2e_p2p/p2p_network.js +188 -133
  49. package/dest/e2e_p2p/shared.d.ts +43 -7
  50. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  51. package/dest/e2e_p2p/shared.js +164 -19
  52. package/dest/e2e_token_contract/token_contract_test.d.ts +12 -6
  53. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  54. package/dest/e2e_token_contract/token_contract_test.js +50 -26
  55. package/dest/fixtures/e2e_prover_test.d.ts +61 -0
  56. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
  57. package/dest/{e2e_prover → fixtures}/e2e_prover_test.js +108 -112
  58. package/dest/fixtures/fixtures.d.ts +6 -8
  59. package/dest/fixtures/fixtures.d.ts.map +1 -1
  60. package/dest/fixtures/fixtures.js +5 -5
  61. package/dest/fixtures/get_acvm_config.d.ts +2 -2
  62. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  63. package/dest/fixtures/get_acvm_config.js +3 -15
  64. package/dest/fixtures/get_bb_config.d.ts +2 -2
  65. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  66. package/dest/fixtures/get_bb_config.js +10 -17
  67. package/dest/fixtures/index.d.ts +1 -1
  68. package/dest/fixtures/l1_to_l2_messaging.d.ts +11 -7
  69. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  70. package/dest/fixtures/l1_to_l2_messaging.js +45 -19
  71. package/dest/fixtures/logging.d.ts +1 -1
  72. package/dest/fixtures/setup_p2p_test.d.ts +15 -14
  73. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  74. package/dest/fixtures/setup_p2p_test.js +82 -22
  75. package/dest/fixtures/snapshot_manager.d.ts +20 -14
  76. package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
  77. package/dest/fixtures/snapshot_manager.js +154 -140
  78. package/dest/fixtures/token_utils.d.ts +10 -4
  79. package/dest/fixtures/token_utils.d.ts.map +1 -1
  80. package/dest/fixtures/token_utils.js +28 -12
  81. package/dest/fixtures/utils.d.ts +95 -54
  82. package/dest/fixtures/utils.d.ts.map +1 -1
  83. package/dest/fixtures/utils.js +456 -389
  84. package/dest/fixtures/web3signer.d.ts +5 -0
  85. package/dest/fixtures/web3signer.d.ts.map +1 -0
  86. package/dest/fixtures/web3signer.js +53 -0
  87. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  88. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  89. package/dest/fixtures/with_telemetry_utils.js +2 -2
  90. package/dest/index.d.ts +1 -1
  91. package/dest/quality_of_service/alert_checker.d.ts +2 -2
  92. package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
  93. package/dest/shared/cross_chain_test_harness.d.ts +42 -35
  94. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  95. package/dest/shared/cross_chain_test_harness.js +104 -50
  96. package/dest/shared/gas_portal_test_harness.d.ts +29 -31
  97. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  98. package/dest/shared/gas_portal_test_harness.js +51 -30
  99. package/dest/shared/index.d.ts +1 -1
  100. package/dest/shared/jest_setup.d.ts +1 -1
  101. package/dest/shared/jest_setup.js +1 -1
  102. package/dest/shared/submit-transactions.d.ts +6 -4
  103. package/dest/shared/submit-transactions.d.ts.map +1 -1
  104. package/dest/shared/submit-transactions.js +8 -7
  105. package/dest/shared/uniswap_l1_l2.d.ts +16 -13
  106. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  107. package/dest/shared/uniswap_l1_l2.js +149 -117
  108. package/dest/simulators/index.d.ts +1 -1
  109. package/dest/simulators/lending_simulator.d.ts +7 -11
  110. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  111. package/dest/simulators/lending_simulator.js +16 -17
  112. package/dest/simulators/token_simulator.d.ts +6 -3
  113. package/dest/simulators/token_simulator.d.ts.map +1 -1
  114. package/dest/simulators/token_simulator.js +16 -13
  115. package/dest/spartan/setup_test_wallets.d.ts +26 -11
  116. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  117. package/dest/spartan/setup_test_wallets.js +202 -58
  118. package/dest/spartan/tx_metrics.d.ts +39 -0
  119. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  120. package/dest/spartan/tx_metrics.js +95 -0
  121. package/dest/spartan/utils.d.ts +129 -313
  122. package/dest/spartan/utils.d.ts.map +1 -1
  123. package/dest/spartan/utils.js +559 -151
  124. package/package.json +65 -58
  125. package/src/bench/client_flows/benchmark.ts +341 -0
  126. package/src/bench/client_flows/client_flows_benchmark.ts +450 -0
  127. package/src/bench/client_flows/config.ts +61 -0
  128. package/src/bench/client_flows/data_extractor.ts +89 -0
  129. package/src/bench/utils.ts +22 -76
  130. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +80 -77
  131. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +70 -107
  132. package/src/e2e_deploy_contract/deploy_test.ts +24 -39
  133. package/src/e2e_epochs/epochs_test.ts +299 -65
  134. package/src/e2e_fees/bridging_race.notest.ts +80 -0
  135. package/src/e2e_fees/fees_test.ts +151 -141
  136. package/src/e2e_l1_publisher/write_json.ts +77 -0
  137. package/src/e2e_multi_validator/utils.ts +258 -0
  138. package/src/e2e_nested_contract/nested_contract_test.ts +29 -19
  139. package/src/e2e_p2p/inactivity_slash_test.ts +179 -0
  140. package/src/e2e_p2p/p2p_network.ts +274 -171
  141. package/src/e2e_p2p/shared.ts +251 -29
  142. package/src/e2e_token_contract/token_contract_test.ts +43 -39
  143. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  144. package/src/{e2e_prover → fixtures}/e2e_prover_test.ts +113 -160
  145. package/src/fixtures/fixtures.ts +5 -7
  146. package/src/fixtures/get_acvm_config.ts +4 -12
  147. package/src/fixtures/get_bb_config.ts +18 -13
  148. package/src/fixtures/l1_to_l2_messaging.ts +56 -24
  149. package/src/fixtures/setup_p2p_test.ts +127 -39
  150. package/src/fixtures/snapshot_manager.ts +196 -162
  151. package/src/fixtures/token_utils.ts +32 -15
  152. package/src/fixtures/utils.ts +562 -475
  153. package/src/fixtures/web3signer.ts +63 -0
  154. package/src/fixtures/with_telemetry_utils.ts +2 -2
  155. package/src/guides/up_quick_start.sh +7 -15
  156. package/src/quality_of_service/alert_checker.ts +1 -1
  157. package/src/shared/cross_chain_test_harness.ts +112 -80
  158. package/src/shared/gas_portal_test_harness.ts +59 -50
  159. package/src/shared/jest_setup.ts +1 -1
  160. package/src/shared/submit-transactions.ts +12 -8
  161. package/src/shared/uniswap_l1_l2.ts +187 -192
  162. package/src/simulators/lending_simulator.ts +15 -16
  163. package/src/simulators/token_simulator.ts +21 -13
  164. package/src/spartan/DEVELOP.md +128 -0
  165. package/src/spartan/setup_test_wallets.ts +252 -93
  166. package/src/spartan/tx_metrics.ts +130 -0
  167. package/src/spartan/utils.ts +641 -146
  168. package/dest/e2e_prover/e2e_prover_test.d.ts +0 -56
  169. package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
  170. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  171. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  172. package/dest/fixtures/setup_l1_contracts.js +0 -17
  173. package/dest/sample-dapp/connect.js +0 -12
  174. package/dest/sample-dapp/contracts.js +0 -10
  175. package/dest/sample-dapp/deploy.js +0 -35
  176. package/dest/sample-dapp/index.js +0 -98
  177. package/src/fixtures/setup_l1_contracts.ts +0 -27
  178. package/src/sample-dapp/connect.mjs +0 -16
  179. package/src/sample-dapp/contracts.mjs +0 -14
  180. package/src/sample-dapp/deploy.mjs +0 -40
  181. package/src/sample-dapp/index.mjs +0 -128
@@ -0,0 +1,95 @@
1
+ import { TxStatus } from '@aztec/stdlib/tx';
2
+ import { createHistogram } from 'perf_hooks';
3
+ export class TxInclusionMetrics {
4
+ aztecNode;
5
+ data;
6
+ groups;
7
+ blocks;
8
+ constructor(aztecNode){
9
+ this.aztecNode = aztecNode;
10
+ this.data = new Map();
11
+ this.groups = new Set();
12
+ this.blocks = new Map();
13
+ }
14
+ recordSentTx(tx, group) {
15
+ const txHash = tx.getTxHash().toString();
16
+ const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
17
+ this.data.set(txHash, {
18
+ txHash,
19
+ sentAt: Math.trunc(Date.now() / 1000),
20
+ minedAt: -1,
21
+ attestedAt: -1,
22
+ blocknumber: -1,
23
+ priorityFee: Number(priorityFees.feePerDaGas + priorityFees.feePerL2Gas),
24
+ totalFee: -1,
25
+ positionInBlock: -1,
26
+ group
27
+ });
28
+ this.groups.add(group);
29
+ }
30
+ async recordMinedTx(txReceipt) {
31
+ const { status, txHash, blockNumber } = txReceipt;
32
+ if (status !== TxStatus.SUCCESS || !blockNumber) {
33
+ return;
34
+ }
35
+ if (!this.blocks.has(blockNumber)) {
36
+ this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber));
37
+ }
38
+ const block = await this.blocks.get(blockNumber);
39
+ const data = this.data.get(txHash.toString());
40
+ data.blocknumber = blockNumber;
41
+ data.minedAt = Number(block.header.globalVariables.timestamp);
42
+ data.attestedAt = -1;
43
+ data.totalFee = Number(txReceipt.transactionFee ?? 0n);
44
+ data.positionInBlock = block.body.txEffects.findIndex((txEffect)=>txEffect.txHash.equals(txHash));
45
+ }
46
+ inclusionTimeInSeconds(group) {
47
+ const histogram = createHistogram({});
48
+ for (const tx of this.data.values()){
49
+ if (!tx.blocknumber || tx.group !== group) {
50
+ continue;
51
+ }
52
+ histogram.record(tx.minedAt - tx.sentAt);
53
+ }
54
+ if (histogram.count === 0) {
55
+ return {
56
+ group,
57
+ count: 0,
58
+ mean: 0,
59
+ max: 0,
60
+ median: 0,
61
+ min: 0,
62
+ p99: 0
63
+ };
64
+ }
65
+ return {
66
+ group,
67
+ count: histogram.count,
68
+ mean: histogram.mean,
69
+ max: histogram.max,
70
+ median: histogram.percentile(50),
71
+ min: histogram.min,
72
+ p99: histogram.percentile(99)
73
+ };
74
+ }
75
+ toGithubActionBenchmarkJSON() {
76
+ const data = [];
77
+ for (const group of this.groups){
78
+ const stats = this.inclusionTimeInSeconds(group);
79
+ data.push({
80
+ name: `${group}/avg_inclusion`,
81
+ unit: 's',
82
+ value: stats.mean
83
+ }, {
84
+ name: `${group}/median_inclusion`,
85
+ unit: 's',
86
+ value: stats.median
87
+ }, {
88
+ name: `${group}/p99_inclusion`,
89
+ unit: 's',
90
+ value: stats.p99
91
+ });
92
+ }
93
+ return data;
94
+ }
95
+ }
@@ -1,308 +1,52 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import type { RollupCheatCodes } from '@aztec/aztec.js/ethereum';
1
+ import type { RollupCheatCodes } from '@aztec/aztec/testing';
2
+ import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
3
+ import type { ViemPublicClient } from '@aztec/ethereum/types';
4
+ import type { CheckpointNumber } from '@aztec/foundation/branded-types';
3
5
  import type { Logger } from '@aztec/foundation/log';
4
- import type { SequencerConfig } from '@aztec/sequencer-client';
6
+ import { type AztecNodeAdmin, type AztecNodeAdminConfig, createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
5
7
  import { ChildProcess } from 'child_process';
6
8
  import { z } from 'zod';
7
- import { type AlertConfig } from '../quality_of_service/alert_checker.js';
8
- declare const k8sLocalConfigSchema: z.ZodObject<{
9
- ETHEREUM_SLOT_DURATION: z.ZodNumber;
10
- AZTEC_SLOT_DURATION: z.ZodNumber;
11
- AZTEC_EPOCH_DURATION: z.ZodNumber;
12
- AZTEC_PROOF_SUBMISSION_WINDOW: z.ZodNumber;
13
- INSTANCE_NAME: z.ZodString;
14
- NAMESPACE: z.ZodString;
15
- CONTAINER_NODE_PORT: z.ZodDefault<z.ZodNumber>;
16
- CONTAINER_SEQUENCER_PORT: z.ZodDefault<z.ZodNumber>;
17
- CONTAINER_PROVER_NODE_PORT: z.ZodDefault<z.ZodNumber>;
18
- CONTAINER_PXE_PORT: z.ZodDefault<z.ZodNumber>;
19
- CONTAINER_ETHEREUM_PORT: z.ZodDefault<z.ZodNumber>;
20
- CONTAINER_METRICS_PORT: z.ZodDefault<z.ZodNumber>;
21
- GRAFANA_PASSWORD: z.ZodOptional<z.ZodString>;
22
- METRICS_API_PATH: z.ZodDefault<z.ZodString>;
23
- SPARTAN_DIR: z.ZodString;
24
- ETHEREUM_HOSTS: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
25
- L1_ACCOUNT_MNEMONIC: z.ZodDefault<z.ZodString>;
26
- SEPOLIA_RUN: z.ZodDefault<z.ZodString>;
27
- K8S: z.ZodLiteral<"local">;
9
+ declare const testConfigSchema: z.ZodObject<{
10
+ NAMESPACE: z.ZodDefault<z.ZodString>;
11
+ REAL_VERIFIER: z.ZodDefault<z.ZodOptional<z.ZodUnion<[z.ZodBoolean, z.ZodEffects<z.ZodEffects<z.ZodNumber, 0 | 1, number>, boolean, number>, z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, boolean, string>]>>>;
12
+ CREATE_ETH_DEVNET: z.ZodDefault<z.ZodOptional<z.ZodUnion<[z.ZodBoolean, z.ZodEffects<z.ZodEffects<z.ZodNumber, 0 | 1, number>, boolean, number>, z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, boolean, string>]>>>;
13
+ L1_RPC_URLS_JSON: z.ZodOptional<z.ZodString>;
14
+ L1_ACCOUNT_MNEMONIC: z.ZodOptional<z.ZodString>;
15
+ AZTEC_SLOT_DURATION: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
16
+ AZTEC_EPOCH_DURATION: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
17
+ AZTEC_PROOF_SUBMISSION_WINDOW: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
28
18
  }, "strip", z.ZodTypeAny, {
29
- ETHEREUM_SLOT_DURATION: number;
30
- AZTEC_SLOT_DURATION: number;
31
- AZTEC_EPOCH_DURATION: number;
32
- AZTEC_PROOF_SUBMISSION_WINDOW: number;
33
- INSTANCE_NAME: string;
34
19
  NAMESPACE: string;
35
- CONTAINER_NODE_PORT: number;
36
- CONTAINER_SEQUENCER_PORT: number;
37
- CONTAINER_PROVER_NODE_PORT: number;
38
- CONTAINER_PXE_PORT: number;
39
- CONTAINER_ETHEREUM_PORT: number;
40
- CONTAINER_METRICS_PORT: number;
41
- METRICS_API_PATH: string;
42
- SPARTAN_DIR: string;
43
- L1_ACCOUNT_MNEMONIC: string;
44
- SEPOLIA_RUN: string;
45
- K8S: "local";
46
- ETHEREUM_HOSTS?: string | undefined;
47
- GRAFANA_PASSWORD?: string | undefined;
48
- }, {
49
- ETHEREUM_SLOT_DURATION: number;
50
- AZTEC_SLOT_DURATION: number;
51
- AZTEC_EPOCH_DURATION: number;
52
- AZTEC_PROOF_SUBMISSION_WINDOW: number;
53
- INSTANCE_NAME: string;
54
- NAMESPACE: string;
55
- SPARTAN_DIR: string;
56
- K8S: "local";
57
- ETHEREUM_HOSTS?: string | undefined;
58
- CONTAINER_NODE_PORT?: number | undefined;
59
- CONTAINER_SEQUENCER_PORT?: number | undefined;
60
- CONTAINER_PROVER_NODE_PORT?: number | undefined;
61
- CONTAINER_PXE_PORT?: number | undefined;
62
- CONTAINER_ETHEREUM_PORT?: number | undefined;
63
- CONTAINER_METRICS_PORT?: number | undefined;
64
- GRAFANA_PASSWORD?: string | undefined;
65
- METRICS_API_PATH?: string | undefined;
20
+ REAL_VERIFIER: boolean;
21
+ CREATE_ETH_DEVNET: boolean;
22
+ L1_RPC_URLS_JSON?: string | undefined;
66
23
  L1_ACCOUNT_MNEMONIC?: string | undefined;
67
- SEPOLIA_RUN?: string | undefined;
68
- }>;
69
- declare const k8sGCloudConfigSchema: z.ZodObject<z.objectUtil.extendShape<{
70
- ETHEREUM_SLOT_DURATION: z.ZodNumber;
71
- AZTEC_SLOT_DURATION: z.ZodNumber;
72
- AZTEC_EPOCH_DURATION: z.ZodNumber;
73
- AZTEC_PROOF_SUBMISSION_WINDOW: z.ZodNumber;
74
- INSTANCE_NAME: z.ZodString;
75
- NAMESPACE: z.ZodString;
76
- CONTAINER_NODE_PORT: z.ZodDefault<z.ZodNumber>;
77
- CONTAINER_SEQUENCER_PORT: z.ZodDefault<z.ZodNumber>;
78
- CONTAINER_PROVER_NODE_PORT: z.ZodDefault<z.ZodNumber>;
79
- CONTAINER_PXE_PORT: z.ZodDefault<z.ZodNumber>;
80
- CONTAINER_ETHEREUM_PORT: z.ZodDefault<z.ZodNumber>;
81
- CONTAINER_METRICS_PORT: z.ZodDefault<z.ZodNumber>;
82
- GRAFANA_PASSWORD: z.ZodOptional<z.ZodString>;
83
- METRICS_API_PATH: z.ZodDefault<z.ZodString>;
84
- SPARTAN_DIR: z.ZodString;
85
- ETHEREUM_HOSTS: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
86
- L1_ACCOUNT_MNEMONIC: z.ZodDefault<z.ZodString>;
87
- SEPOLIA_RUN: z.ZodDefault<z.ZodString>;
88
- K8S: z.ZodLiteral<"local">;
89
- }, {
90
- K8S: z.ZodLiteral<"gcloud">;
91
- CLUSTER_NAME: z.ZodString;
92
- REGION: z.ZodString;
93
- }>, "strip", z.ZodTypeAny, {
94
- ETHEREUM_SLOT_DURATION: number;
95
24
  AZTEC_SLOT_DURATION: number;
96
25
  AZTEC_EPOCH_DURATION: number;
97
26
  AZTEC_PROOF_SUBMISSION_WINDOW: number;
98
- INSTANCE_NAME: string;
99
- NAMESPACE: string;
100
- CONTAINER_NODE_PORT: number;
101
- CONTAINER_SEQUENCER_PORT: number;
102
- CONTAINER_PROVER_NODE_PORT: number;
103
- CONTAINER_PXE_PORT: number;
104
- CONTAINER_ETHEREUM_PORT: number;
105
- CONTAINER_METRICS_PORT: number;
106
- METRICS_API_PATH: string;
107
- SPARTAN_DIR: string;
108
- L1_ACCOUNT_MNEMONIC: string;
109
- SEPOLIA_RUN: string;
110
- K8S: "gcloud";
111
- CLUSTER_NAME: string;
112
- REGION: string;
113
- ETHEREUM_HOSTS?: string | undefined;
114
- GRAFANA_PASSWORD?: string | undefined;
115
27
  }, {
116
- ETHEREUM_SLOT_DURATION: number;
117
- AZTEC_SLOT_DURATION: number;
118
- AZTEC_EPOCH_DURATION: number;
119
- AZTEC_PROOF_SUBMISSION_WINDOW: number;
120
- INSTANCE_NAME: string;
121
- NAMESPACE: string;
122
- SPARTAN_DIR: string;
123
- K8S: "gcloud";
124
- CLUSTER_NAME: string;
125
- REGION: string;
126
- ETHEREUM_HOSTS?: string | undefined;
127
- CONTAINER_NODE_PORT?: number | undefined;
128
- CONTAINER_SEQUENCER_PORT?: number | undefined;
129
- CONTAINER_PROVER_NODE_PORT?: number | undefined;
130
- CONTAINER_PXE_PORT?: number | undefined;
131
- CONTAINER_ETHEREUM_PORT?: number | undefined;
132
- CONTAINER_METRICS_PORT?: number | undefined;
133
- GRAFANA_PASSWORD?: string | undefined;
134
- METRICS_API_PATH?: string | undefined;
28
+ NAMESPACE?: string | undefined;
29
+ REAL_VERIFIER?: string | number | boolean | undefined;
30
+ CREATE_ETH_DEVNET?: string | number | boolean | undefined;
31
+ L1_RPC_URLS_JSON?: string | undefined;
135
32
  L1_ACCOUNT_MNEMONIC?: string | undefined;
136
- SEPOLIA_RUN?: string | undefined;
137
- }>;
138
- declare const directConfigSchema: z.ZodObject<{
139
- PXE_URL: z.ZodString;
140
- NODE_URL: z.ZodString;
141
- ETHEREUM_HOSTS: z.ZodEffects<z.ZodString, string, string>;
142
- K8S: z.ZodLiteral<"false">;
143
- }, "strip", z.ZodTypeAny, {
144
- PXE_URL: string;
145
- ETHEREUM_HOSTS: string;
146
- K8S: "false";
147
- NODE_URL: string;
148
- }, {
149
- PXE_URL: string;
150
- ETHEREUM_HOSTS: string;
151
- K8S: "false";
152
- NODE_URL: string;
33
+ AZTEC_SLOT_DURATION?: number | undefined;
34
+ AZTEC_EPOCH_DURATION?: number | undefined;
35
+ AZTEC_PROOF_SUBMISSION_WINDOW?: number | undefined;
153
36
  }>;
154
- declare const envSchema: z.ZodDiscriminatedUnion<"K8S", [z.ZodObject<{
155
- ETHEREUM_SLOT_DURATION: z.ZodNumber;
156
- AZTEC_SLOT_DURATION: z.ZodNumber;
157
- AZTEC_EPOCH_DURATION: z.ZodNumber;
158
- AZTEC_PROOF_SUBMISSION_WINDOW: z.ZodNumber;
159
- INSTANCE_NAME: z.ZodString;
160
- NAMESPACE: z.ZodString;
161
- CONTAINER_NODE_PORT: z.ZodDefault<z.ZodNumber>;
162
- CONTAINER_SEQUENCER_PORT: z.ZodDefault<z.ZodNumber>;
163
- CONTAINER_PROVER_NODE_PORT: z.ZodDefault<z.ZodNumber>;
164
- CONTAINER_PXE_PORT: z.ZodDefault<z.ZodNumber>;
165
- CONTAINER_ETHEREUM_PORT: z.ZodDefault<z.ZodNumber>;
166
- CONTAINER_METRICS_PORT: z.ZodDefault<z.ZodNumber>;
167
- GRAFANA_PASSWORD: z.ZodOptional<z.ZodString>;
168
- METRICS_API_PATH: z.ZodDefault<z.ZodString>;
169
- SPARTAN_DIR: z.ZodString;
170
- ETHEREUM_HOSTS: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
171
- L1_ACCOUNT_MNEMONIC: z.ZodDefault<z.ZodString>;
172
- SEPOLIA_RUN: z.ZodDefault<z.ZodString>;
173
- K8S: z.ZodLiteral<"local">;
174
- }, "strip", z.ZodTypeAny, {
175
- ETHEREUM_SLOT_DURATION: number;
176
- AZTEC_SLOT_DURATION: number;
177
- AZTEC_EPOCH_DURATION: number;
178
- AZTEC_PROOF_SUBMISSION_WINDOW: number;
179
- INSTANCE_NAME: string;
180
- NAMESPACE: string;
181
- CONTAINER_NODE_PORT: number;
182
- CONTAINER_SEQUENCER_PORT: number;
183
- CONTAINER_PROVER_NODE_PORT: number;
184
- CONTAINER_PXE_PORT: number;
185
- CONTAINER_ETHEREUM_PORT: number;
186
- CONTAINER_METRICS_PORT: number;
187
- METRICS_API_PATH: string;
188
- SPARTAN_DIR: string;
189
- L1_ACCOUNT_MNEMONIC: string;
190
- SEPOLIA_RUN: string;
191
- K8S: "local";
192
- ETHEREUM_HOSTS?: string | undefined;
193
- GRAFANA_PASSWORD?: string | undefined;
194
- }, {
195
- ETHEREUM_SLOT_DURATION: number;
196
- AZTEC_SLOT_DURATION: number;
197
- AZTEC_EPOCH_DURATION: number;
198
- AZTEC_PROOF_SUBMISSION_WINDOW: number;
199
- INSTANCE_NAME: string;
200
- NAMESPACE: string;
201
- SPARTAN_DIR: string;
202
- K8S: "local";
203
- ETHEREUM_HOSTS?: string | undefined;
204
- CONTAINER_NODE_PORT?: number | undefined;
205
- CONTAINER_SEQUENCER_PORT?: number | undefined;
206
- CONTAINER_PROVER_NODE_PORT?: number | undefined;
207
- CONTAINER_PXE_PORT?: number | undefined;
208
- CONTAINER_ETHEREUM_PORT?: number | undefined;
209
- CONTAINER_METRICS_PORT?: number | undefined;
210
- GRAFANA_PASSWORD?: string | undefined;
211
- METRICS_API_PATH?: string | undefined;
212
- L1_ACCOUNT_MNEMONIC?: string | undefined;
213
- SEPOLIA_RUN?: string | undefined;
214
- }>, z.ZodObject<z.objectUtil.extendShape<{
215
- ETHEREUM_SLOT_DURATION: z.ZodNumber;
216
- AZTEC_SLOT_DURATION: z.ZodNumber;
217
- AZTEC_EPOCH_DURATION: z.ZodNumber;
218
- AZTEC_PROOF_SUBMISSION_WINDOW: z.ZodNumber;
219
- INSTANCE_NAME: z.ZodString;
220
- NAMESPACE: z.ZodString;
221
- CONTAINER_NODE_PORT: z.ZodDefault<z.ZodNumber>;
222
- CONTAINER_SEQUENCER_PORT: z.ZodDefault<z.ZodNumber>;
223
- CONTAINER_PROVER_NODE_PORT: z.ZodDefault<z.ZodNumber>;
224
- CONTAINER_PXE_PORT: z.ZodDefault<z.ZodNumber>;
225
- CONTAINER_ETHEREUM_PORT: z.ZodDefault<z.ZodNumber>;
226
- CONTAINER_METRICS_PORT: z.ZodDefault<z.ZodNumber>;
227
- GRAFANA_PASSWORD: z.ZodOptional<z.ZodString>;
228
- METRICS_API_PATH: z.ZodDefault<z.ZodString>;
229
- SPARTAN_DIR: z.ZodString;
230
- ETHEREUM_HOSTS: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
231
- L1_ACCOUNT_MNEMONIC: z.ZodDefault<z.ZodString>;
232
- SEPOLIA_RUN: z.ZodDefault<z.ZodString>;
233
- K8S: z.ZodLiteral<"local">;
234
- }, {
235
- K8S: z.ZodLiteral<"gcloud">;
236
- CLUSTER_NAME: z.ZodString;
237
- REGION: z.ZodString;
238
- }>, "strip", z.ZodTypeAny, {
239
- ETHEREUM_SLOT_DURATION: number;
240
- AZTEC_SLOT_DURATION: number;
241
- AZTEC_EPOCH_DURATION: number;
242
- AZTEC_PROOF_SUBMISSION_WINDOW: number;
243
- INSTANCE_NAME: string;
244
- NAMESPACE: string;
245
- CONTAINER_NODE_PORT: number;
246
- CONTAINER_SEQUENCER_PORT: number;
247
- CONTAINER_PROVER_NODE_PORT: number;
248
- CONTAINER_PXE_PORT: number;
249
- CONTAINER_ETHEREUM_PORT: number;
250
- CONTAINER_METRICS_PORT: number;
251
- METRICS_API_PATH: string;
252
- SPARTAN_DIR: string;
253
- L1_ACCOUNT_MNEMONIC: string;
254
- SEPOLIA_RUN: string;
255
- K8S: "gcloud";
256
- CLUSTER_NAME: string;
257
- REGION: string;
258
- ETHEREUM_HOSTS?: string | undefined;
259
- GRAFANA_PASSWORD?: string | undefined;
260
- }, {
261
- ETHEREUM_SLOT_DURATION: number;
262
- AZTEC_SLOT_DURATION: number;
263
- AZTEC_EPOCH_DURATION: number;
264
- AZTEC_PROOF_SUBMISSION_WINDOW: number;
265
- INSTANCE_NAME: string;
266
- NAMESPACE: string;
267
- SPARTAN_DIR: string;
268
- K8S: "gcloud";
269
- CLUSTER_NAME: string;
270
- REGION: string;
271
- ETHEREUM_HOSTS?: string | undefined;
272
- CONTAINER_NODE_PORT?: number | undefined;
273
- CONTAINER_SEQUENCER_PORT?: number | undefined;
274
- CONTAINER_PROVER_NODE_PORT?: number | undefined;
275
- CONTAINER_PXE_PORT?: number | undefined;
276
- CONTAINER_ETHEREUM_PORT?: number | undefined;
277
- CONTAINER_METRICS_PORT?: number | undefined;
278
- GRAFANA_PASSWORD?: string | undefined;
279
- METRICS_API_PATH?: string | undefined;
280
- L1_ACCOUNT_MNEMONIC?: string | undefined;
281
- SEPOLIA_RUN?: string | undefined;
282
- }>, z.ZodObject<{
283
- PXE_URL: z.ZodString;
284
- NODE_URL: z.ZodString;
285
- ETHEREUM_HOSTS: z.ZodEffects<z.ZodString, string, string>;
286
- K8S: z.ZodLiteral<"false">;
287
- }, "strip", z.ZodTypeAny, {
288
- PXE_URL: string;
289
- ETHEREUM_HOSTS: string;
290
- K8S: "false";
291
- NODE_URL: string;
292
- }, {
293
- PXE_URL: string;
294
- ETHEREUM_HOSTS: string;
295
- K8S: "false";
296
- NODE_URL: string;
297
- }>]>;
298
- export type K8sLocalConfig = z.infer<typeof k8sLocalConfigSchema>;
299
- export type K8sGCloudConfig = z.infer<typeof k8sGCloudConfigSchema>;
300
- export type DirectConfig = z.infer<typeof directConfigSchema>;
301
- export type EnvConfig = z.infer<typeof envSchema>;
302
- export declare function isK8sConfig(config: EnvConfig): config is K8sLocalConfig | K8sGCloudConfig;
303
- export declare function isGCloudConfig(config: EnvConfig): config is K8sGCloudConfig;
304
- export declare function setupEnvironment(env: unknown): EnvConfig;
305
- export declare function startPortForward({ resource, namespace, containerPort, hostPort, }: {
37
+ export type TestConfig = z.infer<typeof testConfigSchema>;
38
+ export declare function setupEnvironment(env: unknown): TestConfig;
39
+ export declare function getAztecBin(): string;
40
+ /**
41
+ * Runs the Aztec binary
42
+ * @param args - The arguments to pass to the Aztec binary
43
+ * @param logger - The logger to use
44
+ * @param env - Optional environment variables to set for the process
45
+ * @returns The exit code of the Aztec binary
46
+ */
47
+ export declare function runAztecBin(args: string[], logger: Logger, env?: Record<string, string>): Promise<number>;
48
+ export declare function runProjectScript(script: string, args: string[], logger: Logger, env?: Record<string, string>): Promise<number>;
49
+ export declare function startPortForward({ resource, namespace, containerPort, hostPort }: {
306
50
  resource: string;
307
51
  namespace: string;
308
52
  containerPort: number;
@@ -311,18 +55,29 @@ export declare function startPortForward({ resource, namespace, containerPort, h
311
55
  process: ChildProcess;
312
56
  port: number;
313
57
  }>;
314
- export declare function deleteResourceByName({ resource, namespace, name, force, }: {
58
+ export declare function getExternalIP(namespace: string, serviceName: string): Promise<string>;
59
+ export declare function startPortForwardForRPC(namespace: string, index?: number): Promise<{
60
+ process: ChildProcess;
61
+ port: number;
62
+ }>;
63
+ export declare function startPortForwardForEthereum(namespace: string): Promise<{
64
+ process: ChildProcess;
65
+ port: number;
66
+ }>;
67
+ export declare function deleteResourceByName({ resource, namespace, name, force }: {
315
68
  resource: string;
316
69
  namespace: string;
317
70
  name: string;
318
71
  force?: boolean;
319
72
  }): Promise<string>;
320
- export declare function deleteResourceByLabel({ resource, namespace, label, }: {
73
+ export declare function deleteResourceByLabel({ resource, namespace, label, timeout, force }: {
321
74
  resource: string;
322
75
  namespace: string;
323
76
  label: string;
77
+ timeout?: string;
78
+ force?: boolean;
324
79
  }): Promise<string>;
325
- export declare function waitForResourceByLabel({ resource, label, namespace, condition, timeout, }: {
80
+ export declare function waitForResourceByLabel({ resource, label, namespace, condition, timeout }: {
326
81
  resource: string;
327
82
  label: string;
328
83
  namespace: string;
@@ -330,6 +85,7 @@ export declare function waitForResourceByLabel({ resource, label, namespace, con
330
85
  timeout?: string;
331
86
  }): Promise<string>;
332
87
  export declare function getChartDir(spartanDir: string, chartName: string): string;
88
+ export declare function uninstallChaosMesh(instanceName: string, namespace: string, logger: Logger): Promise<void>;
333
89
  /**
334
90
  * Installs a Helm chart with the given parameters.
335
91
  * @param instanceName - The name of the Helm chart instance.
@@ -347,7 +103,7 @@ export declare function getChartDir(spartanDir: string, chartName: string): stri
347
103
  * console.log(stdout);
348
104
  * ```
349
105
  */
350
- export declare function installChaosMeshChart({ instanceName, targetNamespace, valuesFile, helmChartDir, chaosMeshNamespace, timeout, clean, values, logger, }: {
106
+ export declare function installChaosMeshChart({ instanceName, targetNamespace, valuesFile, helmChartDir, timeout, clean, values, logger }: {
351
107
  instanceName: string;
352
108
  targetNamespace: string;
353
109
  valuesFile: string;
@@ -358,51 +114,101 @@ export declare function installChaosMeshChart({ instanceName, targetNamespace, v
358
114
  values?: Record<string, string | number>;
359
115
  logger: Logger;
360
116
  }): Promise<string>;
361
- export declare function applyProverFailure({ namespace, spartanDir, durationSeconds, logger, }: {
117
+ export declare function applyProverFailure({ namespace, spartanDir, durationSeconds, logger }: {
362
118
  namespace: string;
363
119
  spartanDir: string;
364
120
  durationSeconds: number;
365
121
  logger: Logger;
366
122
  }): Promise<string>;
367
- export declare function applyProverKill({ namespace, spartanDir, logger, }: {
123
+ export declare function applyProverKill({ namespace, spartanDir, logger, values }: {
368
124
  namespace: string;
369
125
  spartanDir: string;
370
126
  logger: Logger;
127
+ values?: Record<string, string | number>;
371
128
  }): Promise<string>;
372
- export declare function applyProverBrokerKill({ namespace, spartanDir, logger, }: {
129
+ export declare function applyProverBrokerKill({ namespace, spartanDir, logger, values }: {
373
130
  namespace: string;
374
131
  spartanDir: string;
375
132
  logger: Logger;
133
+ values?: Record<string, string | number>;
376
134
  }): Promise<string>;
377
- export declare function applyBootNodeFailure({ namespace, spartanDir, durationSeconds, logger, }: {
135
+ export declare function applyBootNodeFailure({ instanceName, namespace, spartanDir, durationSeconds, logger, values }: {
136
+ instanceName?: string;
378
137
  namespace: string;
379
138
  spartanDir: string;
380
139
  durationSeconds: number;
381
140
  logger: Logger;
141
+ values?: Record<string, string | number>;
382
142
  }): Promise<string>;
383
- export declare function applyValidatorKill({ namespace, spartanDir, logger, }: {
143
+ export declare function applyValidatorKill({ instanceName, namespace, spartanDir, logger, values }: {
144
+ instanceName?: string;
384
145
  namespace: string;
385
146
  spartanDir: string;
386
147
  logger: Logger;
148
+ values?: Record<string, string | number>;
387
149
  }): Promise<string>;
388
- export declare function applyNetworkShaping({ valuesFile, namespace, spartanDir, logger, }: {
150
+ export declare function applyNetworkShaping({ instanceName, valuesFile, namespace, spartanDir, logger }: {
151
+ instanceName?: string;
389
152
  valuesFile: string;
390
153
  namespace: string;
391
154
  spartanDir: string;
392
155
  logger: Logger;
393
156
  }): Promise<string>;
394
- export declare function awaitL2BlockNumber(rollupCheatCodes: RollupCheatCodes, blockNumber: bigint, timeoutSeconds: number, logger: Logger): Promise<void>;
157
+ export declare function awaitCheckpointNumber(rollupCheatCodes: RollupCheatCodes, checkpointNumber: CheckpointNumber, timeoutSeconds: number, logger: Logger): Promise<void>;
395
158
  export declare function restartBot(namespace: string, logger: Logger): Promise<void>;
396
- export declare function enableValidatorDynamicBootNode(instanceName: string, namespace: string, spartanDir: string, logger: Logger): Promise<void>;
397
- export declare function runAlertCheck(config: EnvConfig, alerts: AlertConfig[], logger: Logger): Promise<void>;
398
- export declare function updateSequencerConfig(url: string, config: Partial<SequencerConfig>): Promise<void>;
399
- export declare function getSequencers(namespace: string): Promise<string[]>;
400
- export declare function updateK8sSequencersConfig(args: {
401
- containerPort: number;
159
+ /**
160
+ * Installs or upgrades the transfer bot Helm release for the given namespace.
161
+ * Intended for test setup to enable L2 traffic generation only when needed.
162
+ */
163
+ export declare function installTransferBot({ namespace, spartanDir, logger, replicas, txIntervalSeconds, followChain, mnemonic, mnemonicStartIndex, botPrivateKey, nodeUrl, timeout, reuseValues, aztecSlotDuration }: {
402
164
  namespace: string;
403
- config: Partial<SequencerConfig>;
165
+ spartanDir: string;
166
+ logger: Logger;
167
+ replicas?: number;
168
+ txIntervalSeconds?: number;
169
+ followChain?: string;
170
+ mnemonic?: string;
171
+ mnemonicStartIndex?: number | string;
172
+ botPrivateKey?: string;
173
+ nodeUrl?: string;
174
+ timeout?: string;
175
+ reuseValues?: boolean;
176
+ aztecSlotDuration?: number;
177
+ }): Promise<void>;
178
+ /**
179
+ * Uninstalls the transfer bot Helm release from the given namespace.
180
+ * Intended for test teardown to clean up bot resources.
181
+ */
182
+ export declare function uninstallTransferBot(namespace: string, logger: Logger): Promise<void>;
183
+ /**
184
+ * Enables or disables probabilistic transaction dropping on validators and waits for rollout.
185
+ * Wired to env vars P2P_DROP_TX and P2P_DROP_TX_CHANCE via Helm values.
186
+ */
187
+ export declare function setValidatorTxDrop({ namespace, enabled, probability, logger }: {
188
+ namespace: string;
189
+ enabled: boolean;
190
+ probability: number;
191
+ logger: Logger;
404
192
  }): Promise<void>;
405
- export declare function updateSequencersConfig(env: EnvConfig, config: Partial<SequencerConfig>): Promise<void>;
193
+ export declare function restartValidators(namespace: string, logger: Logger): Promise<void>;
194
+ export declare function enableValidatorDynamicBootNode(instanceName: string, namespace: string, spartanDir: string, logger: Logger): Promise<void>;
195
+ export declare function getSequencers(namespace: string): Promise<string[]>;
196
+ export declare function updateSequencersConfig(env: TestConfig, config: Partial<AztecNodeAdminConfig>): Promise<AztecNodeAdminConfig[]>;
197
+ export declare function getSequencersConfig(env: TestConfig): Promise<AztecNodeAdminConfig[]>;
198
+ export declare function withSequencersAdmin<T>(env: TestConfig, fn: (node: AztecNodeAdmin) => Promise<T>): Promise<T[]>;
199
+ /**
200
+ * Returns a public viem client to the eth execution node. If it was part of a local eth devnet,
201
+ * it first port-forwards the service and points to it. Otherwise, just uses the external RPC url.
202
+ */
203
+ export declare function getPublicViemClient(env: TestConfig,
204
+ /** If set, will push the new process into it */
205
+ processes?: ChildProcess[]): Promise<{
206
+ url: string;
207
+ client: ViemPublicClient;
208
+ process?: ChildProcess;
209
+ }>;
210
+ /** Queries an Aztec node for the L1 deployment addresses */
211
+ export declare function getL1DeploymentAddresses(env: TestConfig): Promise<L1ContractAddresses>;
406
212
  /**
407
213
  * Rolls the Aztec pods in the given namespace.
408
214
  * @param namespace - The namespace to roll the Aztec pods in.
@@ -411,5 +217,15 @@ export declare function updateSequencersConfig(env: EnvConfig, config: Partial<S
411
217
  * This is useful for testing, but you should be aware of the implications.
412
218
  */
413
219
  export declare function rollAztecPods(namespace: string): Promise<void>;
220
+ /**
221
+ * Returns the absolute path to the git repository root
222
+ */
223
+ export declare function getGitProjectRoot(): string;
224
+ /** Returns a client to the RPC of the given sequencer (defaults to first) */
225
+ export declare function getNodeClient(env: TestConfig, index?: number): Promise<{
226
+ node: ReturnType<typeof createAztecNodeClient>;
227
+ port: number;
228
+ process: ChildProcess;
229
+ }>;
414
230
  export {};
415
- //# sourceMappingURL=utils.d.ts.map
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGFydGFuL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLcEQsT0FBTyxFQUNMLEtBQUssY0FBYyxFQUNuQixLQUFLLG9CQUFvQixFQUV6QixxQkFBcUIsRUFDdEIsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6QyxPQUFPLEVBQUUsWUFBWSxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUlwRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBTXhCLFFBQUEsTUFBTSxnQkFBZ0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQVNwQixDQUFDO0FBRUgsTUFBTSxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQztBQUUxRCx3QkFBZ0IsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sR0FBRyxVQUFVLENBSXpEO0FBeUJELHdCQUFnQixXQUFXLFdBRTFCO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsd0JBQWdCLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxtQkFFdkY7QUFFRCx3QkFBZ0IsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1B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