@aztec/end-to-end 0.0.1-commit.3469e52 → 0.0.1-commit.54489865

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 (127) hide show
  1. package/dest/bench/client_flows/client_flows_benchmark.d.ts +1 -1
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.js +28 -13
  4. package/dest/bench/utils.d.ts +5 -4
  5. package/dest/bench/utils.d.ts.map +1 -1
  6. package/dest/bench/utils.js +9 -7
  7. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +1 -1
  8. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  9. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +7 -8
  10. package/dest/e2e_epochs/epochs_test.d.ts +7 -1
  11. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  12. package/dest/e2e_epochs/epochs_test.js +29 -7
  13. package/dest/e2e_fees/bridging_race.notest.js +1 -1
  14. package/dest/e2e_fees/fees_test.d.ts +1 -1
  15. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  16. package/dest/e2e_fees/fees_test.js +6 -6
  17. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  18. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  19. package/dest/e2e_l1_publisher/write_json.js +1 -7
  20. package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
  21. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  22. package/dest/e2e_nested_contract/nested_contract_test.js +2 -2
  23. package/dest/e2e_p2p/p2p_network.d.ts +1 -1
  24. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  25. package/dest/e2e_p2p/p2p_network.js +6 -2
  26. package/dest/e2e_p2p/shared.d.ts +6 -6
  27. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  28. package/dest/e2e_p2p/shared.js +9 -16
  29. package/dest/e2e_token_contract/token_contract_test.d.ts +1 -1
  30. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  31. package/dest/e2e_token_contract/token_contract_test.js +3 -3
  32. package/dest/fixtures/e2e_prover_test.d.ts +1 -1
  33. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  34. package/dest/fixtures/e2e_prover_test.js +8 -5
  35. package/dest/fixtures/setup.d.ts +5 -3
  36. package/dest/fixtures/setup.d.ts.map +1 -1
  37. package/dest/fixtures/setup.js +31 -20
  38. package/dest/fixtures/setup_p2p_test.d.ts +4 -5
  39. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  40. package/dest/fixtures/setup_p2p_test.js +24 -19
  41. package/dest/fixtures/token_utils.d.ts +1 -1
  42. package/dest/fixtures/token_utils.d.ts.map +1 -1
  43. package/dest/fixtures/token_utils.js +7 -4
  44. package/dest/shared/cross_chain_test_harness.d.ts +3 -4
  45. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  46. package/dest/shared/cross_chain_test_harness.js +11 -11
  47. package/dest/shared/gas_portal_test_harness.js +1 -1
  48. package/dest/shared/submit-transactions.d.ts +3 -3
  49. package/dest/shared/submit-transactions.d.ts.map +1 -1
  50. package/dest/shared/submit-transactions.js +9 -11
  51. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  52. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  53. package/dest/shared/uniswap_l1_l2.js +12 -12
  54. package/dest/simulators/lending_simulator.js +2 -2
  55. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  56. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  57. package/dest/spartan/setup_test_wallets.js +61 -34
  58. package/dest/spartan/tx_metrics.d.ts +38 -2
  59. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  60. package/dest/spartan/tx_metrics.js +178 -4
  61. package/dest/spartan/utils/bot.d.ts +27 -0
  62. package/dest/spartan/utils/bot.d.ts.map +1 -0
  63. package/dest/spartan/utils/bot.js +141 -0
  64. package/dest/spartan/utils/chaos.d.ts +79 -0
  65. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  66. package/dest/spartan/utils/chaos.js +142 -0
  67. package/dest/spartan/utils/clients.d.ts +39 -0
  68. package/dest/spartan/utils/clients.d.ts.map +1 -0
  69. package/dest/spartan/utils/clients.js +90 -0
  70. package/dest/spartan/utils/config.d.ts +36 -0
  71. package/dest/spartan/utils/config.d.ts.map +1 -0
  72. package/dest/spartan/utils/config.js +20 -0
  73. package/dest/spartan/utils/health.d.ts +63 -0
  74. package/dest/spartan/utils/health.d.ts.map +1 -0
  75. package/dest/spartan/utils/health.js +202 -0
  76. package/dest/spartan/utils/helm.d.ts +15 -0
  77. package/dest/spartan/utils/helm.d.ts.map +1 -0
  78. package/dest/spartan/utils/helm.js +47 -0
  79. package/dest/spartan/utils/index.d.ts +9 -0
  80. package/dest/spartan/utils/index.d.ts.map +1 -0
  81. package/dest/spartan/utils/index.js +18 -0
  82. package/dest/spartan/utils/k8s.d.ts +126 -0
  83. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  84. package/dest/spartan/utils/k8s.js +375 -0
  85. package/dest/spartan/utils/nodes.d.ts +41 -0
  86. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  87. package/dest/spartan/utils/nodes.js +455 -0
  88. package/dest/spartan/utils/scripts.d.ts +16 -0
  89. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  90. package/dest/spartan/utils/scripts.js +66 -0
  91. package/dest/spartan/utils.d.ts +2 -260
  92. package/dest/spartan/utils.d.ts.map +1 -1
  93. package/dest/spartan/utils.js +1 -942
  94. package/package.json +39 -39
  95. package/src/bench/client_flows/client_flows_benchmark.ts +11 -24
  96. package/src/bench/utils.ts +9 -7
  97. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +9 -12
  98. package/src/e2e_epochs/epochs_test.ts +58 -32
  99. package/src/e2e_fees/bridging_race.notest.ts +1 -4
  100. package/src/e2e_fees/fees_test.ts +10 -14
  101. package/src/e2e_l1_publisher/write_json.ts +3 -8
  102. package/src/e2e_nested_contract/nested_contract_test.ts +2 -4
  103. package/src/e2e_p2p/p2p_network.ts +15 -9
  104. package/src/e2e_p2p/shared.ts +20 -22
  105. package/src/e2e_token_contract/token_contract_test.ts +3 -5
  106. package/src/fixtures/e2e_prover_test.ts +4 -9
  107. package/src/fixtures/setup.ts +33 -26
  108. package/src/fixtures/setup_p2p_test.ts +15 -20
  109. package/src/fixtures/token_utils.ts +6 -5
  110. package/src/shared/cross_chain_test_harness.ts +13 -27
  111. package/src/shared/gas_portal_test_harness.ts +1 -1
  112. package/src/shared/submit-transactions.ts +9 -15
  113. package/src/shared/uniswap_l1_l2.ts +12 -19
  114. package/src/simulators/lending_simulator.ts +2 -2
  115. package/src/spartan/setup_test_wallets.ts +72 -24
  116. package/src/spartan/tx_metrics.ts +152 -7
  117. package/src/spartan/utils/bot.ts +185 -0
  118. package/src/spartan/utils/chaos.ts +253 -0
  119. package/src/spartan/utils/clients.ts +100 -0
  120. package/src/spartan/utils/config.ts +26 -0
  121. package/src/spartan/utils/health.ts +255 -0
  122. package/src/spartan/utils/helm.ts +84 -0
  123. package/src/spartan/utils/index.ts +64 -0
  124. package/src/spartan/utils/k8s.ts +527 -0
  125. package/src/spartan/utils/nodes.ts +535 -0
  126. package/src/spartan/utils/scripts.ts +63 -0
  127. package/src/spartan/utils.ts +1 -1246
@@ -1,10 +1,11 @@
1
1
  import { generateSchnorrAccounts } from '@aztec/accounts/testing';
2
2
  import { AztecAddress } from '@aztec/aztec.js/addresses';
3
+ import { NO_WAIT } from '@aztec/aztec.js/contracts';
3
4
  import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
4
5
  import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
5
6
  import { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
6
7
  import { Fr } from '@aztec/aztec.js/fields';
7
- import { createAztecNodeClient } from '@aztec/aztec.js/node';
8
+ import { createAztecNodeClient, waitForTx } from '@aztec/aztec.js/node';
8
9
  import { createEthereumChain } from '@aztec/ethereum/chain';
9
10
  import { createExtendedL1Client } from '@aztec/ethereum/client';
10
11
  import { retryUntil } from '@aztec/foundation/retry';
@@ -46,9 +47,10 @@ export async function deploySponsoredTestAccountsWithTokens(wallet, aztecNode, m
46
47
  from: AztecAddress.ZERO,
47
48
  fee: {
48
49
  paymentMethod
50
+ },
51
+ wait: {
52
+ timeout: 2400
49
53
  }
50
- }).wait({
51
- timeout: 2400
52
54
  });
53
55
  await Promise.all(fundedAccounts.map(async (a)=>{
54
56
  const deployMethod = await a.getDeployMethod();
@@ -56,9 +58,10 @@ export async function deploySponsoredTestAccountsWithTokens(wallet, aztecNode, m
56
58
  from: AztecAddress.ZERO,
57
59
  fee: {
58
60
  paymentMethod
61
+ },
62
+ wait: {
63
+ timeout: 2400
59
64
  }
60
- }).wait({
61
- timeout: 2400
62
65
  }); // increase timeout on purpose in order to account for two empty epochs
63
66
  logger.info(`Account deployed at ${a.address}`);
64
67
  }));
@@ -76,33 +79,52 @@ export async function deploySponsoredTestAccountsWithTokens(wallet, aztecNode, m
76
79
  recipientAddress: recipientAccount.address
77
80
  };
78
81
  }
82
+ async function deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, accountLabel) {
83
+ const deployMethod = await account.getDeployMethod();
84
+ let txHash;
85
+ try {
86
+ txHash = await deployMethod.send({
87
+ from: AztecAddress.ZERO,
88
+ fee: {
89
+ paymentMethod
90
+ },
91
+ wait: NO_WAIT
92
+ });
93
+ await waitForTx(aztecNode, txHash, {
94
+ timeout: 2400
95
+ });
96
+ logger.info(`${accountLabel} deployed at ${account.address}`);
97
+ } catch (error) {
98
+ const blockNumber = await aztecNode.getBlockNumber();
99
+ let receipt;
100
+ try {
101
+ receipt = await aztecNode.getTxReceipt(txHash);
102
+ } catch {
103
+ receipt = 'unavailable';
104
+ }
105
+ logger.error(`${accountLabel} deployment failed`, {
106
+ txHash: txHash.toString(),
107
+ receipt: JSON.stringify(receipt),
108
+ currentBlockNumber: blockNumber,
109
+ error: String(error)
110
+ });
111
+ throw error;
112
+ }
113
+ }
114
+ async function deployAccountsInBatches(accounts, paymentMethod, aztecNode, logger, labelPrefix, batchSize = 2) {
115
+ for(let i = 0; i < accounts.length; i += batchSize){
116
+ const batch = accounts.slice(i, i + batchSize);
117
+ await Promise.all(batch.map((account, idx)=>deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, `${labelPrefix}${i + idx + 1}`)));
118
+ }
119
+ }
79
120
  export async function deploySponsoredTestAccounts(wallet, aztecNode, logger, numberOfFundedWallets = 1) {
80
121
  const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
81
122
  const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
82
123
  const fundedAccounts = await Promise.all(funded.map((a)=>wallet.createSchnorrAccount(a.secret, a.salt)));
83
124
  await registerSponsoredFPC(wallet);
84
125
  const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
85
- const recipientDeployMethod = await recipientAccount.getDeployMethod();
86
- await recipientDeployMethod.send({
87
- from: AztecAddress.ZERO,
88
- fee: {
89
- paymentMethod
90
- }
91
- }).wait({
92
- timeout: 2400
93
- });
94
- await Promise.all(fundedAccounts.map(async (a)=>{
95
- const deployMethod = await a.getDeployMethod();
96
- await deployMethod.send({
97
- from: AztecAddress.ZERO,
98
- fee: {
99
- paymentMethod
100
- }
101
- }).wait({
102
- timeout: 2400
103
- }); // increase timeout on purpose in order to account for two empty epochs
104
- logger.info(`Account deployed at ${a.address}`);
105
- }));
126
+ await deployAccountWithDiagnostics(recipientAccount, paymentMethod, aztecNode, logger, 'Recipient account');
127
+ await deployAccountsInBatches(fundedAccounts, paymentMethod, aztecNode, logger, 'Funded account ', 2);
106
128
  return {
107
129
  aztecNode,
108
130
  wallet,
@@ -129,7 +151,7 @@ export async function deployTestAccountsWithTokens(nodeUrl, l1RpcUrls, mnemonicO
129
151
  fee: {
130
152
  paymentMethod
131
153
  }
132
- }).wait();
154
+ });
133
155
  logger.info(`Account deployed at ${a.address}`);
134
156
  }));
135
157
  const tokenAdmin = fundedAccounts[0];
@@ -175,13 +197,15 @@ async function advanceL2Block(aztecNode, nodeAdmin) {
175
197
  }
176
198
  async function deployTokenAndMint(wallet, accounts, admin, mintAmount, paymentMethod, logger) {
177
199
  logger.verbose(`Deploying TokenContract...`);
178
- const tokenContract = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS).send({
200
+ const { contract: tokenContract } = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS).send({
179
201
  from: admin,
180
202
  fee: {
181
203
  paymentMethod
204
+ },
205
+ wait: {
206
+ timeout: 600,
207
+ returnReceipt: true
182
208
  }
183
- }).deployed({
184
- timeout: 600
185
209
  });
186
210
  const tokenAddress = tokenContract.address;
187
211
  logger.verbose(`Minting ${mintAmount} public assets to the ${accounts.length} accounts...`);
@@ -189,9 +213,10 @@ async function deployTokenAndMint(wallet, accounts, admin, mintAmount, paymentMe
189
213
  from: admin,
190
214
  fee: {
191
215
  paymentMethod
216
+ },
217
+ wait: {
218
+ timeout: 600
192
219
  }
193
- }).wait({
194
- timeout: 600
195
220
  })));
196
221
  logger.verbose(`Minting complete.`);
197
222
  return tokenAddress;
@@ -211,8 +236,10 @@ export async function performTransfers({ wallet, testAccounts, rounds, transferA
211
236
  });
212
237
  });
213
238
  const provenTxs = await Promise.all(txs);
214
- await Promise.all(provenTxs.map((t)=>t.send().wait({
215
- timeout: 600
239
+ await Promise.all(provenTxs.map((t)=>t.send({
240
+ wait: {
241
+ timeout: 600
242
+ }
216
243
  })));
217
244
  logger.info(`Completed round ${i + 1} / ${rounds}`);
218
245
  }
@@ -1,6 +1,41 @@
1
1
  import type { AztecNode } from '@aztec/aztec.js/node';
2
+ import type { Logger } from '@aztec/foundation/log';
2
3
  import type { TopicType } from '@aztec/stdlib/p2p';
3
4
  import { Tx, type TxReceipt } from '@aztec/stdlib/tx';
5
+ /** Metrics class for proving-related benchmarks. */
6
+ export declare class ProvingMetrics {
7
+ private prefix;
8
+ private successfulTxs;
9
+ private proofDuration;
10
+ private activeAgents;
11
+ private avgQueueTime;
12
+ private jobRetries;
13
+ private jobDuration;
14
+ private timedOutJobs;
15
+ private resolvedJobs;
16
+ private rejectedJobs;
17
+ private epochProvingDuration;
18
+ private provenTransactions;
19
+ private provenBlocks;
20
+ constructor(prefix: string);
21
+ recordSuccessfulTxs(count: number): void;
22
+ recordProofDuration(seconds: number): void;
23
+ recordActiveAgents(count: number): void;
24
+ recordAvgQueueTime(ms: number): void;
25
+ recordJobRetries(count: number): void;
26
+ recordJobDuration(ms: number): void;
27
+ recordTimedOutJobs(count: number): void;
28
+ recordResolvedJobs(count: number): void;
29
+ recordRejectedJobs(count: number): void;
30
+ recordEpochProvingDuration(seconds: number): void;
31
+ recordProvenTransactions(count: number): void;
32
+ recordProvenBlocks(count: number): void;
33
+ toGithubActionBenchmarkJSON(): Array<{
34
+ name: string;
35
+ unit: string;
36
+ value: number;
37
+ }>;
38
+ }
4
39
  export type TxInclusionData = {
5
40
  txHash: string;
6
41
  sentAt: number;
@@ -14,6 +49,7 @@ export type TxInclusionData = {
14
49
  };
15
50
  export declare class TxInclusionMetrics {
16
51
  private aztecNode;
52
+ private logger?;
17
53
  private data;
18
54
  private groups;
19
55
  private blocks;
@@ -23,7 +59,7 @@ export declare class TxInclusionMetrics {
23
59
  private reqRespStats;
24
60
  private peerStats;
25
61
  private mempoolMinedDelay;
26
- constructor(aztecNode: AztecNode);
62
+ constructor(aztecNode: AztecNode, logger?: Logger | undefined);
27
63
  recordSentTx(tx: Tx, group: string): void;
28
64
  recordMinedTx(txReceipt: TxReceipt): Promise<void>;
29
65
  inclusionTimeInSeconds(group: string): {
@@ -49,4 +85,4 @@ export declare class TxInclusionMetrics {
49
85
  extra?: string;
50
86
  }>;
51
87
  }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NwYXJ0YW4vdHhfbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxFQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFJaEUsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1QixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDaEIsVUFBVSxFQUFFLE1BQU0sQ0FBQztJQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDO0lBQ3BCLFdBQVcsRUFBRSxNQUFNLENBQUM7SUFDcEIsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUNqQixlQUFlLEVBQUUsTUFBTSxDQUFDO0lBQ3hCLEtBQUssRUFBRSxNQUFNLENBQUM7Q0FDZixDQUFDO0FBRUYscUJBQWEsa0JBQWtCO0lBZWpCLE9BQU8sQ0FBQyxTQUFTO0lBZDdCLE9BQU8sQ0FBQyxJQUFJLENBQXNDO0lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQXFCO0lBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQXNEO0lBRXBFLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBZ0U7SUFFL0YsT0FBTyxDQUFDLGtCQUFrQixDQUEyQztJQUNyRSxPQUFPLENBQUMsaUJBQWlCLENBQXlFO0lBQ2xHLE9BQU8sQ0FBQyxZQUFZLENBQXVFO0lBQzNGLE9BQU8sQ0FBQyxTQUFTLENBQWlHO0lBQ2xILE9BQU8sQ0FBQyxpQkFBaUIsQ0FFWDtJQUVkLFlBQW9CLFNBQVMsRUFBRSxTQUFTLEVBQUk7SUFFNUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBZ0J4QztJQUVLLGFBQWEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FvQnZEO0lBRU0sc0JBQXNCLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRztRQUM1QyxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUNkLEdBQUcsRUFBRSxNQUFNLENBQUM7UUFDWixJQUFJLEVBQUUsTUFBTSxDQUFDO1FBQ2IsR0FBRyxFQUFFLE1BQU0sQ0FBQztRQUNaLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDZixHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ2IsQ0ErQkE7SUFFTSxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRWxGO0lBRU0sd0JBQXdCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFOUQ7SUFFTSx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRTNGO0lBRU0sa0JBQWtCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUVwRjtJQUVNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUUzRztJQUVNLHVCQUF1QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUVqSDtJQUVELDJCQUEyQixJQUFJLEtBQUssQ0FBQztRQUFFLElBQUksRUFBRSxNQUFNLENBQUM7UUFBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1FBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0F3RmxIO0NBQ0YifQ==
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NwYXJ0YW4vdHhfbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJdEQsb0RBQW9EO0FBQ3BELHFCQUFhLGNBQWM7SUFjYixPQUFPLENBQUMsTUFBTTtJQWIxQixPQUFPLENBQUMsYUFBYSxDQUFxQjtJQUMxQyxPQUFPLENBQUMsYUFBYSxDQUFxQjtJQUMxQyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFxQjtJQUN2QyxPQUFPLENBQUMsV0FBVyxDQUFxQjtJQUN4QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsb0JBQW9CLENBQXFCO0lBQ2pELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBcUI7SUFDL0MsT0FBTyxDQUFDLFlBQVksQ0FBcUI7SUFFekMsWUFBb0IsTUFBTSxFQUFFLE1BQU0sRUFBSTtJQUV0QyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFdkM7SUFFRCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFekM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFdEM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFF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
@@ -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,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;IAejB,OAAO,CAAC,SAAS;IAd7B,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAsD;IAEpE,OAAO,CAAC,uBAAuB,CAAgE;IAE/F,OAAO,CAAC,kBAAkB,CAA2C;IACrE,OAAO,CAAC,iBAAiB,CAAyE;IAClG,OAAO,CAAC,YAAY,CAAuE;IAC3F,OAAO,CAAC,SAAS,CAAiG;IAClH,OAAO,CAAC,iBAAiB,CAEX;IAEd,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,CAoBvD;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;IAEM,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9D;IAEM,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAE3F;IAEM,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEpF;IAEM,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAE3G;IAEM,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAEjH;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,CAwFlH;CACF"}
1
+ {"version":3,"file":"tx_metrics.d.ts","sourceRoot":"","sources":["../../src/spartan/tx_metrics.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,157 @@
1
- import { TxStatus } from '@aztec/stdlib/tx';
2
1
  import { createHistogram } from 'perf_hooks';
2
+ /** Metrics class for proving-related benchmarks. */ export class ProvingMetrics {
3
+ prefix;
4
+ successfulTxs;
5
+ proofDuration;
6
+ activeAgents;
7
+ avgQueueTime;
8
+ jobRetries;
9
+ jobDuration;
10
+ timedOutJobs;
11
+ resolvedJobs;
12
+ rejectedJobs;
13
+ epochProvingDuration;
14
+ provenTransactions;
15
+ provenBlocks;
16
+ constructor(prefix){
17
+ this.prefix = prefix;
18
+ }
19
+ recordSuccessfulTxs(count) {
20
+ this.successfulTxs = count;
21
+ }
22
+ recordProofDuration(seconds) {
23
+ this.proofDuration = seconds;
24
+ }
25
+ recordActiveAgents(count) {
26
+ this.activeAgents = count;
27
+ }
28
+ recordAvgQueueTime(ms) {
29
+ this.avgQueueTime = ms;
30
+ }
31
+ recordJobRetries(count) {
32
+ this.jobRetries = count;
33
+ }
34
+ recordJobDuration(ms) {
35
+ this.jobDuration = ms;
36
+ }
37
+ recordTimedOutJobs(count) {
38
+ this.timedOutJobs = count;
39
+ }
40
+ recordResolvedJobs(count) {
41
+ this.resolvedJobs = count;
42
+ }
43
+ recordRejectedJobs(count) {
44
+ this.rejectedJobs = count;
45
+ }
46
+ recordEpochProvingDuration(seconds) {
47
+ this.epochProvingDuration = seconds;
48
+ }
49
+ recordProvenTransactions(count) {
50
+ this.provenTransactions = count;
51
+ }
52
+ recordProvenBlocks(count) {
53
+ this.provenBlocks = count;
54
+ }
55
+ toGithubActionBenchmarkJSON() {
56
+ const data = [];
57
+ if (this.successfulTxs !== undefined) {
58
+ data.push({
59
+ name: `${this.prefix}/successful_txs`,
60
+ unit: 'count',
61
+ value: this.successfulTxs
62
+ });
63
+ }
64
+ if (this.proofDuration !== undefined) {
65
+ data.push({
66
+ name: `${this.prefix}/proof_duration`,
67
+ unit: 's',
68
+ value: this.proofDuration
69
+ });
70
+ }
71
+ if (this.activeAgents !== undefined) {
72
+ data.push({
73
+ name: `${this.prefix}/active_agents`,
74
+ unit: 'count',
75
+ value: this.activeAgents
76
+ });
77
+ }
78
+ if (this.avgQueueTime !== undefined) {
79
+ data.push({
80
+ name: `${this.prefix}/avg_queue_time`,
81
+ unit: 'ms',
82
+ value: this.avgQueueTime
83
+ });
84
+ }
85
+ if (this.jobRetries !== undefined) {
86
+ data.push({
87
+ name: `${this.prefix}/job_retries`,
88
+ unit: 'count',
89
+ value: this.jobRetries
90
+ });
91
+ }
92
+ if (this.jobDuration !== undefined) {
93
+ data.push({
94
+ name: `${this.prefix}/job_duration`,
95
+ unit: 'ms',
96
+ value: this.jobDuration
97
+ });
98
+ }
99
+ if (this.timedOutJobs !== undefined) {
100
+ data.push({
101
+ name: `${this.prefix}/timed_out_jobs`,
102
+ unit: 'count',
103
+ value: this.timedOutJobs
104
+ });
105
+ }
106
+ if (this.resolvedJobs !== undefined) {
107
+ data.push({
108
+ name: `${this.prefix}/resolved_jobs`,
109
+ unit: 'count',
110
+ value: this.resolvedJobs
111
+ });
112
+ }
113
+ if (this.rejectedJobs !== undefined) {
114
+ data.push({
115
+ name: `${this.prefix}/rejected_jobs`,
116
+ unit: 'count',
117
+ value: this.rejectedJobs
118
+ });
119
+ }
120
+ if (this.epochProvingDuration !== undefined) {
121
+ data.push({
122
+ name: `${this.prefix}/epoch_proving_duration`,
123
+ unit: 's',
124
+ value: this.epochProvingDuration
125
+ });
126
+ }
127
+ if (this.provenTransactions !== undefined) {
128
+ data.push({
129
+ name: `${this.prefix}/proven_transactions`,
130
+ unit: 'count',
131
+ value: this.provenTransactions
132
+ });
133
+ }
134
+ if (this.provenBlocks !== undefined) {
135
+ data.push({
136
+ name: `${this.prefix}/proven_blocks`,
137
+ unit: 'count',
138
+ value: this.provenBlocks
139
+ });
140
+ }
141
+ const scenario = process.env.BENCH_SCENARIO?.trim();
142
+ if (!scenario) {
143
+ return data;
144
+ }
145
+ const scenarioPrefix = `scenario/${scenario}/`;
146
+ return data.map((entry)=>({
147
+ ...entry,
148
+ name: `${scenarioPrefix}${entry.name}`
149
+ }));
150
+ }
151
+ }
3
152
  export class TxInclusionMetrics {
4
153
  aztecNode;
154
+ logger;
5
155
  data;
6
156
  groups;
7
157
  blocks;
@@ -11,8 +161,9 @@ export class TxInclusionMetrics {
11
161
  reqRespStats;
12
162
  peerStats;
13
163
  mempoolMinedDelay;
14
- constructor(aztecNode){
164
+ constructor(aztecNode, logger){
15
165
  this.aztecNode = aztecNode;
166
+ this.logger = logger;
16
167
  this.data = new Map();
17
168
  this.groups = new Set();
18
169
  this.blocks = new Map();
@@ -21,6 +172,12 @@ export class TxInclusionMetrics {
21
172
  recordSentTx(tx, group) {
22
173
  const txHash = tx.getTxHash().toString();
23
174
  const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
175
+ if (this.data.has(txHash)) {
176
+ this.logger?.debug(`Overwriting tx inclusion data for ${txHash}`, {
177
+ txHash,
178
+ group
179
+ });
180
+ }
24
181
  this.data.set(txHash, {
25
182
  txHash,
26
183
  sentAt: Math.trunc(Date.now() / 1000),
@@ -35,8 +192,13 @@ export class TxInclusionMetrics {
35
192
  this.groups.add(group);
36
193
  }
37
194
  async recordMinedTx(txReceipt) {
38
- const { status, txHash, blockNumber } = txReceipt;
39
- if (status !== TxStatus.SUCCESS || !blockNumber) {
195
+ const { txHash, blockNumber } = txReceipt;
196
+ if (!txReceipt.isMined() || !txReceipt.hasExecutionSucceeded() || !blockNumber) {
197
+ this.logger?.debug('Skipping mined tx record due to receipt status', {
198
+ txHash: txHash.toString(),
199
+ status: txReceipt.status,
200
+ blockNumber
201
+ });
40
202
  return;
41
203
  }
42
204
  if (!this.blocks.has(blockNumber)) {
@@ -44,9 +206,21 @@ export class TxInclusionMetrics {
44
206
  }
45
207
  const block = await this.blocks.get(blockNumber);
46
208
  if (!block) {
209
+ this.logger?.warn('Failed to load block for mined tx receipt', {
210
+ txHash: txHash.toString(),
211
+ blockNumber
212
+ });
47
213
  return;
48
214
  }
49
215
  const data = this.data.get(txHash.toString());
216
+ if (!data) {
217
+ const message = `Missing sent tx record for mined tx ${txHash.toString()}`;
218
+ this.logger?.warn(message, {
219
+ txHash: txHash.toString(),
220
+ blockNumber
221
+ });
222
+ throw new Error(message);
223
+ }
50
224
  data.blocknumber = blockNumber;
51
225
  data.minedAt = Number(block.header.globalVariables.timestamp);
52
226
  data.attestedAt = -1;
@@ -0,0 +1,27 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+ export declare function restartBot(namespace: string, log: Logger): Promise<void>;
3
+ /**
4
+ * Installs or upgrades the transfer bot Helm release for the given namespace.
5
+ * Intended for test setup to enable L2 traffic generation only when needed.
6
+ */
7
+ export declare function installTransferBot({ namespace, spartanDir, logger: log, replicas, txIntervalSeconds, followChain, mnemonic, mnemonicStartIndex, botPrivateKey, nodeUrl, timeout, reuseValues, aztecSlotDuration }: {
8
+ namespace: string;
9
+ spartanDir: string;
10
+ logger: Logger;
11
+ replicas?: number;
12
+ txIntervalSeconds?: number;
13
+ followChain?: string;
14
+ mnemonic?: string;
15
+ mnemonicStartIndex?: number | string;
16
+ botPrivateKey?: string;
17
+ nodeUrl?: string;
18
+ timeout?: string;
19
+ reuseValues?: boolean;
20
+ aztecSlotDuration?: number;
21
+ }): Promise<void>;
22
+ /**
23
+ * Uninstalls the transfer bot Helm release from the given namespace.
24
+ * Intended for test teardown to clean up bot resources.
25
+ */
26
+ export declare function uninstallTransferBot(namespace: string, log: Logger): Promise<void>;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3BhcnRhbi91dGlscy9ib3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFXcEQsd0JBQXNCLFVBQVUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQWE5RDtBQUVEOzs7R0FHRztBQUNILHdCQUFzQixrQkFBa0IsQ0FBQyxFQUN2QyxTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFBRSxHQUFHLEVBQ1gsUUFBWSxFQUNaLGlCQUFzQixFQUN0QixXQUF1QixFQUN2QixRQUEyRyxFQUMzRyxrQkFBa0IsRUFDbEIsYUFBc0UsRUFDdEUsT0FBTyxFQUNQLE9BQWUsRUFDZixXQUFrQixFQUNsQixpQkFBaUUsRUFDbEUsRUFBRTtJQUNELFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsVUFBVSxFQUFFLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQzNCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDbEIsa0JBQWtCLENBQUMsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3JDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUN2QixPQUFPLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDakIsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2pCLFdBQVcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUN0QixpQkFBaUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUM1QixpQkFnSEE7QUFFRDs7O0dBR0c7QUFDSCx3QkFBc0Isb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxpQkFReEUifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/bot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAWpD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,iBAa9D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,EACvC,SAAS,EACT,UAAU,EACV,MAAM,EAAE,GAAG,EACX,QAAY,EACZ,iBAAsB,EACtB,WAAuB,EACvB,QAA2G,EAC3G,kBAAkB,EAClB,aAAsE,EACtE,OAAO,EACP,OAAe,EACf,WAAkB,EAClB,iBAAiE,EAClE,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,iBAgHA;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,iBAQxE"}
@@ -0,0 +1,141 @@
1
+ import { sleep } from '@aztec/foundation/sleep';
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ import { execHelmCommand, forceDeleteHelmReleaseRecord, getHelmReleaseStatus, hasDeployedHelmRelease } from './helm.js';
5
+ import { deleteResourceByLabel, getChartDir, waitForResourceByLabel } from './k8s.js';
6
+ const execAsync = promisify(exec);
7
+ export async function restartBot(namespace, log) {
8
+ log.info(`Restarting bot`);
9
+ await deleteResourceByLabel({
10
+ resource: 'pods',
11
+ namespace,
12
+ label: 'app.kubernetes.io/name=bot'
13
+ });
14
+ await sleep(10 * 1000);
15
+ // Some bot images may take time to report Ready due to heavy boot-time proving.
16
+ // Waiting for PodReadyToStartContainers ensures the pod is scheduled and starting without blocking on full readiness.
17
+ await waitForResourceByLabel({
18
+ resource: 'pods',
19
+ namespace,
20
+ label: 'app.kubernetes.io/name=bot',
21
+ condition: 'PodReadyToStartContainers'
22
+ });
23
+ log.info(`Bot restarted`);
24
+ }
25
+ /**
26
+ * Installs or upgrades the transfer bot Helm release for the given namespace.
27
+ * Intended for test setup to enable L2 traffic generation only when needed.
28
+ */ export async function installTransferBot({ namespace, spartanDir, logger: log, replicas = 1, txIntervalSeconds = 10, followChain = 'PENDING', mnemonic = process.env.LABS_INFRA_MNEMONIC ?? 'test test test test test test test test test test test junk', mnemonicStartIndex, botPrivateKey = process.env.BOT_TRANSFERS_L2_PRIVATE_KEY ?? '0xcafe01', nodeUrl, timeout = '15m', reuseValues = true, aztecSlotDuration = Number(process.env.AZTEC_SLOT_DURATION ?? 12) }) {
29
+ const instanceName = `${namespace}-bot-transfers`;
30
+ const helmChartDir = getChartDir(spartanDir, 'aztec-bot');
31
+ const resolvedNodeUrl = nodeUrl ?? `http://${namespace}-rpc-aztec-node.${namespace}.svc.cluster.local:8080`;
32
+ log.info(`Installing/upgrading transfer bot: replicas=${replicas}, followChain=${followChain}`);
33
+ const values = {
34
+ 'bot.replicaCount': replicas,
35
+ 'bot.txIntervalSeconds': txIntervalSeconds,
36
+ 'bot.followChain': followChain,
37
+ 'bot.botPrivateKey': botPrivateKey,
38
+ 'bot.nodeUrl': resolvedNodeUrl,
39
+ 'bot.mnemonic': mnemonic,
40
+ 'bot.feePaymentMethod': 'fee_juice',
41
+ 'aztec.slotDuration': aztecSlotDuration,
42
+ // Ensure bot can reach its own PXE started in-process (default rpc.port is 8080)
43
+ // Note: since aztec-bot depends on aztec-node with alias `bot`, env vars go under `bot.node.env`.
44
+ 'bot.node.env.BOT_PXE_URL': 'http://127.0.0.1:8080',
45
+ // Provide L1 execution RPC for bridging fee juice
46
+ 'bot.node.env.ETHEREUM_HOSTS': `http://${namespace}-eth-execution.${namespace}.svc.cluster.local:8545`,
47
+ // Provide L1 mnemonic for bridging (falls back to labs mnemonic)
48
+ 'bot.node.env.BOT_L1_MNEMONIC': mnemonic,
49
+ // The bot does not need Kubernetes API access. Disable RBAC + ServiceAccount creation so the chart
50
+ // can be installed by users without cluster-scoped RBAC permissions.
51
+ 'bot.rbac.create': false,
52
+ 'bot.serviceAccount.create': false,
53
+ 'bot.serviceAccount.name': 'default'
54
+ };
55
+ // Ensure we derive a funded L1 key (index 0 is funded on anvil default mnemonic)
56
+ if (mnemonicStartIndex === undefined) {
57
+ values['bot.mnemonicStartIndex'] = 0;
58
+ }
59
+ // Also pass a funded private key directly if available
60
+ if (process.env.FUNDING_PRIVATE_KEY) {
61
+ values['bot.node.env.BOT_L1_PRIVATE_KEY'] = process.env.FUNDING_PRIVATE_KEY;
62
+ }
63
+ // Align bot image with the running network image: prefer env var, else detect from a validator pod
64
+ let repositoryFromEnv;
65
+ let tagFromEnv;
66
+ const aztecDockerImage = process.env.AZTEC_DOCKER_IMAGE;
67
+ if (aztecDockerImage && aztecDockerImage.includes(':')) {
68
+ const lastColon = aztecDockerImage.lastIndexOf(':');
69
+ repositoryFromEnv = aztecDockerImage.slice(0, lastColon);
70
+ tagFromEnv = aztecDockerImage.slice(lastColon + 1);
71
+ }
72
+ let repository = repositoryFromEnv;
73
+ let tag = tagFromEnv;
74
+ if (!repository || !tag) {
75
+ try {
76
+ const { stdout } = await execAsync(`kubectl get pods -l app.kubernetes.io/name=validator -n ${namespace} -o jsonpath='{.items[0].spec.containers[?(@.name=="aztec")].image}' | cat`);
77
+ const image = stdout.trim().replace(/^'|'$/g, '');
78
+ if (image && image.includes(':')) {
79
+ const lastColon = image.lastIndexOf(':');
80
+ repository = image.slice(0, lastColon);
81
+ tag = image.slice(lastColon + 1);
82
+ }
83
+ } catch (err) {
84
+ log.warn(`Could not detect aztec image from validator pod: ${String(err)}`);
85
+ }
86
+ }
87
+ if (repository && tag) {
88
+ values['global.aztecImage.repository'] = repository;
89
+ values['global.aztecImage.tag'] = tag;
90
+ }
91
+ if (mnemonicStartIndex !== undefined) {
92
+ values['bot.mnemonicStartIndex'] = typeof mnemonicStartIndex === 'string' ? mnemonicStartIndex : Number(mnemonicStartIndex);
93
+ }
94
+ // If a previous install attempt left the release in a non-deployed state (e.g. FAILED),
95
+ // `helm upgrade --install` can error with "has no deployed releases".
96
+ // In that case, clear the release record and do a clean install.
97
+ const existingStatus = await getHelmReleaseStatus(instanceName, namespace);
98
+ if (existingStatus && existingStatus.toLowerCase() !== 'deployed') {
99
+ log.warn(`Transfer bot release ${instanceName} is in status '${existingStatus}'. Reinstalling cleanly.`);
100
+ await execAsync(`helm uninstall ${instanceName} --namespace ${namespace} --wait --ignore-not-found`).catch(()=>undefined);
101
+ // If helm left the release in `uninstalling`, force-delete the record so we can reinstall.
102
+ const afterUninstallStatus = await getHelmReleaseStatus(instanceName, namespace);
103
+ if (afterUninstallStatus?.toLowerCase() === 'uninstalling') {
104
+ await forceDeleteHelmReleaseRecord(instanceName, namespace, log);
105
+ }
106
+ }
107
+ // `--reuse-values` fails if the release has never successfully deployed (e.g. first install, or a previous failed install).
108
+ // Only reuse values when we have a deployed release to reuse from.
109
+ const effectiveReuseValues = reuseValues && await hasDeployedHelmRelease(instanceName, namespace);
110
+ await execHelmCommand({
111
+ instanceName,
112
+ helmChartDir,
113
+ namespace,
114
+ valuesFile: undefined,
115
+ timeout,
116
+ values: values,
117
+ reuseValues: effectiveReuseValues
118
+ });
119
+ if (replicas > 0) {
120
+ await waitForResourceByLabel({
121
+ resource: 'pods',
122
+ namespace,
123
+ label: 'app.kubernetes.io/name=bot',
124
+ condition: 'PodReadyToStartContainers'
125
+ });
126
+ }
127
+ }
128
+ /**
129
+ * Uninstalls the transfer bot Helm release from the given namespace.
130
+ * Intended for test teardown to clean up bot resources.
131
+ */ export async function uninstallTransferBot(namespace, log) {
132
+ const instanceName = `${namespace}-bot-transfers`;
133
+ log.info(`Uninstalling transfer bot release ${instanceName}`);
134
+ await execAsync(`helm uninstall ${instanceName} --namespace ${namespace} --wait --ignore-not-found`);
135
+ // Ensure any leftover pods are removed
136
+ await deleteResourceByLabel({
137
+ resource: 'pods',
138
+ namespace,
139
+ label: 'app.kubernetes.io/name=bot'
140
+ }).catch(()=>undefined);
141
+ }