@aztec/end-to-end 0.0.0-test.0 → 0.0.1-commit.023c3e5

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 (240) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +62 -0
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
  3. package/dest/bench/client_flows/benchmark.js +281 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +79 -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 +321 -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 +79 -0
  13. package/dest/bench/utils.d.ts +16 -41
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +41 -72
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +26 -19
  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 +114 -102
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +32 -32
  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 +104 -104
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +19 -10
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +26 -27
  25. package/dest/e2e_epochs/epochs_test.d.ts +71 -22
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +260 -54
  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 +61 -0
  31. package/dest/e2e_fees/fees_test.d.ts +38 -23
  32. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  33. package/dest/e2e_fees/fees_test.js +162 -183
  34. package/dest/e2e_l1_publisher/write_json.d.ts +11 -0
  35. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
  36. package/dest/e2e_l1_publisher/write_json.js +56 -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 +15 -15
  41. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_nested_contract/nested_contract_test.js +37 -41
  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 +281 -27
  47. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  48. package/dest/e2e_p2p/p2p_network.js +237 -175
  49. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  50. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  51. package/dest/e2e_p2p/reqresp/utils.js +153 -0
  52. package/dest/e2e_p2p/shared.d.ts +44 -8
  53. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  54. package/dest/e2e_p2p/shared.js +165 -27
  55. package/dest/e2e_token_contract/token_contract_test.d.ts +27 -14
  56. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  57. package/dest/e2e_token_contract/token_contract_test.js +96 -74
  58. package/dest/fixtures/e2e_prover_test.d.ts +55 -0
  59. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
  60. package/dest/fixtures/e2e_prover_test.js +278 -0
  61. package/dest/fixtures/fixtures.d.ts +6 -8
  62. package/dest/fixtures/fixtures.d.ts.map +1 -1
  63. package/dest/fixtures/fixtures.js +5 -5
  64. package/dest/fixtures/get_acvm_config.d.ts +2 -2
  65. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  66. package/dest/fixtures/get_acvm_config.js +3 -15
  67. package/dest/fixtures/get_bb_config.d.ts +2 -2
  68. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  69. package/dest/fixtures/get_bb_config.js +10 -17
  70. package/dest/fixtures/index.d.ts +1 -1
  71. package/dest/fixtures/l1_to_l2_messaging.d.ts +11 -7
  72. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  73. package/dest/fixtures/l1_to_l2_messaging.js +45 -19
  74. package/dest/fixtures/logging.d.ts +1 -1
  75. package/dest/fixtures/setup.d.ts +218 -0
  76. package/dest/fixtures/setup.d.ts.map +1 -0
  77. package/dest/fixtures/setup.js +695 -0
  78. package/dest/fixtures/setup_p2p_test.d.ts +15 -15
  79. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  80. package/dest/fixtures/setup_p2p_test.js +96 -31
  81. package/dest/fixtures/token_utils.d.ts +10 -4
  82. package/dest/fixtures/token_utils.d.ts.map +1 -1
  83. package/dest/fixtures/token_utils.js +31 -12
  84. package/dest/fixtures/utils.d.ts +5 -153
  85. package/dest/fixtures/utils.d.ts.map +1 -1
  86. package/dest/fixtures/utils.js +4 -552
  87. package/dest/fixtures/web3signer.d.ts +5 -0
  88. package/dest/fixtures/web3signer.d.ts.map +1 -0
  89. package/dest/fixtures/web3signer.js +53 -0
  90. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  91. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  92. package/dest/fixtures/with_telemetry_utils.js +2 -2
  93. package/dest/index.d.ts +1 -1
  94. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  95. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  96. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  97. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  98. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  99. package/dest/quality_of_service/prometheus_client.js +67 -0
  100. package/dest/shared/cross_chain_test_harness.d.ts +44 -27
  101. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  102. package/dest/shared/cross_chain_test_harness.js +105 -51
  103. package/dest/shared/gas_portal_test_harness.d.ts +33 -25
  104. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  105. package/dest/shared/gas_portal_test_harness.js +51 -30
  106. package/dest/shared/index.d.ts +2 -2
  107. package/dest/shared/index.d.ts.map +1 -1
  108. package/dest/shared/jest_setup.d.ts +1 -1
  109. package/dest/shared/jest_setup.js +1 -1
  110. package/dest/shared/submit-transactions.d.ts +6 -4
  111. package/dest/shared/submit-transactions.d.ts.map +1 -1
  112. package/dest/shared/submit-transactions.js +15 -16
  113. package/dest/shared/uniswap_l1_l2.d.ts +3 -25
  114. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  115. package/dest/shared/uniswap_l1_l2.js +176 -126
  116. package/dest/simulators/index.d.ts +1 -1
  117. package/dest/simulators/lending_simulator.d.ts +7 -7
  118. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  119. package/dest/simulators/lending_simulator.js +17 -18
  120. package/dest/simulators/token_simulator.d.ts +6 -3
  121. package/dest/simulators/token_simulator.d.ts.map +1 -1
  122. package/dest/simulators/token_simulator.js +16 -13
  123. package/dest/spartan/setup_test_wallets.d.ts +27 -11
  124. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  125. package/dest/spartan/setup_test_wallets.js +233 -62
  126. package/dest/spartan/tx_metrics.d.ts +88 -0
  127. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  128. package/dest/spartan/tx_metrics.js +422 -0
  129. package/dest/spartan/utils/bot.d.ts +27 -0
  130. package/dest/spartan/utils/bot.d.ts.map +1 -0
  131. package/dest/spartan/utils/bot.js +141 -0
  132. package/dest/spartan/utils/chaos.d.ts +79 -0
  133. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  134. package/dest/spartan/utils/chaos.js +142 -0
  135. package/dest/spartan/utils/clients.d.ts +39 -0
  136. package/dest/spartan/utils/clients.d.ts.map +1 -0
  137. package/dest/spartan/utils/clients.js +90 -0
  138. package/dest/spartan/utils/config.d.ts +36 -0
  139. package/dest/spartan/utils/config.d.ts.map +1 -0
  140. package/dest/spartan/utils/config.js +20 -0
  141. package/dest/spartan/utils/health.d.ts +63 -0
  142. package/dest/spartan/utils/health.d.ts.map +1 -0
  143. package/dest/spartan/utils/health.js +202 -0
  144. package/dest/spartan/utils/helm.d.ts +15 -0
  145. package/dest/spartan/utils/helm.d.ts.map +1 -0
  146. package/dest/spartan/utils/helm.js +47 -0
  147. package/dest/spartan/utils/index.d.ts +9 -0
  148. package/dest/spartan/utils/index.d.ts.map +1 -0
  149. package/dest/spartan/utils/index.js +18 -0
  150. package/dest/spartan/utils/k8s.d.ts +126 -0
  151. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  152. package/dest/spartan/utils/k8s.js +375 -0
  153. package/dest/spartan/utils/nodes.d.ts +41 -0
  154. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  155. package/dest/spartan/utils/nodes.js +461 -0
  156. package/dest/spartan/utils/scripts.d.ts +16 -0
  157. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  158. package/dest/spartan/utils/scripts.js +66 -0
  159. package/dest/spartan/utils.d.ts +2 -415
  160. package/dest/spartan/utils.d.ts.map +1 -1
  161. package/dest/spartan/utils.js +1 -445
  162. package/package.json +66 -58
  163. package/src/bench/client_flows/benchmark.ts +363 -0
  164. package/src/bench/client_flows/client_flows_benchmark.ts +384 -0
  165. package/src/bench/client_flows/config.ts +61 -0
  166. package/src/bench/client_flows/data_extractor.ts +89 -0
  167. package/src/bench/utils.ts +41 -85
  168. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +134 -169
  169. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +156 -182
  170. package/src/e2e_deploy_contract/deploy_test.ts +40 -48
  171. package/src/e2e_epochs/epochs_test.ts +341 -81
  172. package/src/e2e_fees/bridging_race.notest.ts +74 -0
  173. package/src/e2e_fees/fees_test.ts +220 -258
  174. package/src/e2e_l1_publisher/write_json.ts +77 -0
  175. package/src/e2e_multi_validator/utils.ts +258 -0
  176. package/src/e2e_nested_contract/nested_contract_test.ts +46 -59
  177. package/src/e2e_p2p/inactivity_slash_test.ts +179 -0
  178. package/src/e2e_p2p/p2p_network.ts +341 -234
  179. package/src/e2e_p2p/reqresp/utils.ts +207 -0
  180. package/src/e2e_p2p/shared.ts +260 -39
  181. package/src/e2e_token_contract/token_contract_test.ts +115 -126
  182. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  183. package/src/fixtures/e2e_prover_test.ts +336 -0
  184. package/src/fixtures/fixtures.ts +5 -7
  185. package/src/fixtures/get_acvm_config.ts +4 -12
  186. package/src/fixtures/get_bb_config.ts +18 -13
  187. package/src/fixtures/l1_to_l2_messaging.ts +56 -24
  188. package/src/fixtures/setup.ts +1017 -0
  189. package/src/fixtures/setup_p2p_test.ts +133 -50
  190. package/src/fixtures/token_utils.ts +33 -15
  191. package/src/fixtures/utils.ts +27 -820
  192. package/src/fixtures/web3signer.ts +63 -0
  193. package/src/fixtures/with_telemetry_utils.ts +2 -2
  194. package/src/guides/up_quick_start.sh +7 -15
  195. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +2 -2
  196. package/src/quality_of_service/prometheus_client.ts +113 -0
  197. package/src/shared/cross_chain_test_harness.ts +103 -91
  198. package/src/shared/gas_portal_test_harness.ts +59 -50
  199. package/src/shared/index.ts +1 -1
  200. package/src/shared/jest_setup.ts +1 -1
  201. package/src/shared/submit-transactions.ts +18 -20
  202. package/src/shared/uniswap_l1_l2.ts +197 -221
  203. package/src/simulators/lending_simulator.ts +16 -17
  204. package/src/simulators/token_simulator.ts +21 -13
  205. package/src/spartan/DEVELOP.md +128 -0
  206. package/src/spartan/setup_test_wallets.ts +308 -95
  207. package/src/spartan/tx_metrics.ts +376 -0
  208. package/src/spartan/utils/bot.ts +185 -0
  209. package/src/spartan/utils/chaos.ts +253 -0
  210. package/src/spartan/utils/clients.ts +100 -0
  211. package/src/spartan/utils/config.ts +26 -0
  212. package/src/spartan/utils/health.ts +255 -0
  213. package/src/spartan/utils/helm.ts +84 -0
  214. package/src/spartan/utils/index.ts +64 -0
  215. package/src/spartan/utils/k8s.ts +527 -0
  216. package/src/spartan/utils/nodes.ts +538 -0
  217. package/src/spartan/utils/scripts.ts +63 -0
  218. package/src/spartan/utils.ts +1 -582
  219. package/dest/e2e_prover/e2e_prover_test.d.ts +0 -56
  220. package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
  221. package/dest/e2e_prover/e2e_prover_test.js +0 -291
  222. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  223. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  224. package/dest/fixtures/setup_l1_contracts.js +0 -17
  225. package/dest/fixtures/snapshot_manager.d.ts +0 -87
  226. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  227. package/dest/fixtures/snapshot_manager.js +0 -479
  228. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  229. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  230. package/dest/sample-dapp/connect.js +0 -12
  231. package/dest/sample-dapp/contracts.js +0 -10
  232. package/dest/sample-dapp/deploy.js +0 -35
  233. package/dest/sample-dapp/index.js +0 -98
  234. package/src/e2e_prover/e2e_prover_test.ts +0 -418
  235. package/src/fixtures/setup_l1_contracts.ts +0 -27
  236. package/src/fixtures/snapshot_manager.ts +0 -617
  237. package/src/sample-dapp/connect.mjs +0 -16
  238. package/src/sample-dapp/contracts.mjs +0 -14
  239. package/src/sample-dapp/deploy.mjs +0 -40
  240. package/src/sample-dapp/index.mjs +0 -128
@@ -0,0 +1,63 @@
1
+ import { randomBytes } from '@aztec/foundation/crypto/random';
2
+ import { retryUntil } from '@aztec/foundation/retry';
3
+ import { sleep } from '@aztec/foundation/sleep';
4
+ import { RemoteSigner } from '@aztec/node-keystore';
5
+
6
+ import { mkdirSync } from 'node:fs';
7
+ import { writeFile } from 'node:fs/promises';
8
+ import { join } from 'node:path';
9
+
10
+ export async function createWeb3SignerKeystore(dir: string, ...privateKeys: string[]) {
11
+ const yaml = privateKeys
12
+ .map(
13
+ pk => `\
14
+ type: file-raw
15
+ keyType: SECP256K1
16
+ privateKey: ${pk}`,
17
+ )
18
+ .join('\n---\n');
19
+
20
+ // NOTE: nodejs stdlib can only create temp directories, not temp files!
21
+ // this write uses wx (write-exclusive) so it'll throw if the file already exists
22
+ const path = join(dir, `keystore-${randomBytes(4).toString('hex')}.yaml`);
23
+ await writeFile(path, yaml, { flag: 'wx' });
24
+ }
25
+
26
+ export async function refreshWeb3Signer(url: string, ...expectedAddresses: string[]) {
27
+ await fetch(new URL('reload', url), { method: 'POST' });
28
+
29
+ if (expectedAddresses.length > 0) {
30
+ await retryUntil(
31
+ async () => {
32
+ try {
33
+ await RemoteSigner.validateAccess(url, expectedAddresses);
34
+ return true;
35
+ } catch {
36
+ return false;
37
+ }
38
+ },
39
+ 'web3signer refresh',
40
+ 10,
41
+ 0.5,
42
+ );
43
+ } else {
44
+ await sleep(1000);
45
+ }
46
+ }
47
+
48
+ export function getWeb3SignerTestKeystoreDir(): string {
49
+ if (process.env.WEB3_SIGNER_TEST_KEYSTORE_DIR) {
50
+ mkdirSync(process.env.WEB3_SIGNER_TEST_KEYSTORE_DIR, { recursive: true });
51
+ return process.env.WEB3_SIGNER_TEST_KEYSTORE_DIR;
52
+ } else {
53
+ throw new Error('Web3signer not running');
54
+ }
55
+ }
56
+
57
+ export function getWeb3SignerUrl(): string {
58
+ if (process.env.WEB3_SIGNER_URL) {
59
+ return process.env.WEB3_SIGNER_URL;
60
+ } else {
61
+ throw new Error('Web3signer not running');
62
+ }
63
+ }
@@ -7,12 +7,12 @@ import {
7
7
  } from '@aztec/telemetry-client';
8
8
  import { OTelPinoStream } from '@aztec/telemetry-client/otel-pino-stream';
9
9
 
10
- export function getEndToEndTestTelemetryClient(metricsPort?: number): TelemetryClient {
10
+ export async function getEndToEndTestTelemetryClient(metricsPort?: number): Promise<TelemetryClient> {
11
11
  if (metricsPort) {
12
12
  const otelStream = new OTelPinoStream({ levels });
13
13
  registerLoggingStream(otelStream);
14
14
  }
15
- return initTelemetryClient(getEndToEndTestTelemetryConfig(metricsPort));
15
+ return await initTelemetryClient(getEndToEndTestTelemetryConfig(metricsPort));
16
16
  }
17
17
 
18
18
  /**
@@ -1,9 +1,10 @@
1
- #!/bin/bash
2
- # Run locally from end-to-end folder while running anvil and sandbox with:
1
+ #!/usr/bin/env bash
2
+ # Run locally from end-to-end folder while running anvil and local network with:
3
3
  # PATH=$PATH:../node_modules/.bin ./src/guides/up_quick_start.sh
4
4
  set -eux
5
5
 
6
6
  export WALLET_DATA_DIRECTORY=$(mktemp -d)/up_quick_start
7
+ export PXE_PROVER="none"
7
8
 
8
9
  function on_exit {
9
10
  echo "Cleaning up $WALLET_DATA_DIRECTORY..."
@@ -18,37 +19,28 @@ aztec-wallet() {
18
19
  aztec-wallet import-test-accounts
19
20
 
20
21
  # docs:start:declare-accounts
21
- aztec-wallet create-account -a alice --payment method=fee_juice,feePayer=test0
22
- aztec-wallet create-account -a bob --payment method=fee_juice,feePayer=test0
22
+ aztec-wallet create-account -a alice -f test0
23
+ aztec-wallet create-account -a bob -f test0
23
24
  # docs:end:declare-accounts
24
25
 
25
- # docs:start:deploy
26
26
  DEPLOY_OUTPUT=$(aztec-wallet deploy ../noir-contracts.js/artifacts/token_contract-Token.json --args accounts:test0 Test TST 18 -f test0)
27
27
  TOKEN_ADDRESS=$(echo "$DEPLOY_OUTPUT" | grep -oE 'Contract deployed at 0x[0-9a-fA-F]+' | cut -d ' ' -f4)
28
28
  echo "Deployed contract at $TOKEN_ADDRESS"
29
- # docs:end:deploy
30
29
 
31
- # docs:start:mint-private
32
30
  MINT_AMOUNT=69
33
- aztec-wallet send mint_to_private -ca last --args accounts:test0 accounts:alice $MINT_AMOUNT -f test0
34
- # docs:end:mint-private
31
+ aztec-wallet send mint_to_private -ca last --args accounts:alice $MINT_AMOUNT -f test0
35
32
 
36
- # docs:start:get-balance
37
33
  ALICE_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:alice -f alice)
38
34
  if ! echo $ALICE_BALANCE | grep -q $MINT_AMOUNT; then
39
35
  echo "Incorrect Alice balance after transaction (expected $MINT_AMOUNT but got $ALICE_BALANCE)"
40
36
  exit 1
41
37
  fi
42
- # docs:end:get-balance
43
38
 
44
- # docs:start:transfer
45
39
  TRANSFER_AMOUNT=42
46
40
 
47
41
  aztec-wallet create-authwit transfer_in_private accounts:test0 -ca last --args accounts:alice accounts:bob $TRANSFER_AMOUNT 1 -f alice
48
- aztec-wallet add-authwit authwits:last alice -f test0
49
42
 
50
- aztec-wallet send transfer_in_private -ca last --args accounts:alice accounts:bob $TRANSFER_AMOUNT 1 -f test0
51
- # docs:end:transfer
43
+ aztec-wallet send transfer_in_private -ca last --args accounts:alice accounts:bob $TRANSFER_AMOUNT 1 -aw authwits:last -f test0
52
44
 
53
45
  # Test end result
54
46
  ALICE_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:alice -f alice)
@@ -1,4 +1,4 @@
1
- import type { Logger } from '@aztec/aztec.js';
1
+ import type { Logger } from '@aztec/aztec.js/log';
2
2
 
3
3
  import * as fs from 'fs';
4
4
  import * as yaml from 'js-yaml';
@@ -25,7 +25,7 @@ const DEFAULT_CONFIG: AlertCheckerConfig = {
25
25
  grafanaCredentials: 'admin:admin',
26
26
  };
27
27
 
28
- export class AlertChecker {
28
+ export class GrafanaClient {
29
29
  private config: AlertCheckerConfig;
30
30
  private logger: Logger;
31
31
 
@@ -0,0 +1,113 @@
1
+ export type PromteheusClientOptions = {
2
+ server: URL;
3
+ };
4
+
5
+ export class PrometheusClient {
6
+ constructor(
7
+ private config: PromteheusClientOptions,
8
+ private httpClient: typeof fetch = fetch,
9
+ ) {}
10
+
11
+ public async querySingleValue(query: string, time = new Date()): Promise<number> {
12
+ const resp = await this.queryRaw(query, time);
13
+ if (resp.status === 'success') {
14
+ if (resp.data.resultType === 'vector') {
15
+ if (resp.data.result.length === 0) {
16
+ return 0;
17
+ }
18
+ const [_, value] = resp.data.result[0].value;
19
+ return parseFloat(value);
20
+ }
21
+ }
22
+
23
+ throw new TypeError('Unsupported response body', { cause: JSON.stringify(resp) });
24
+ }
25
+
26
+ public queryRaw(query: string, time = new Date()): Promise<PrometheusResponse> {
27
+ const searchParams = new URLSearchParams();
28
+ searchParams.set('query', query);
29
+ searchParams.set('time', String(Math.trunc(time.getTime() / 1000)));
30
+ searchParams.set('limit', '10');
31
+
32
+ return this.callPrometheus('query', searchParams);
33
+ }
34
+
35
+ public queryRangeRaw(
36
+ query: string,
37
+ step: PrometheusDuration,
38
+ start: Date,
39
+ end = new Date(),
40
+ ): Promise<PrometheusResponse> {
41
+ const searchParams = new URLSearchParams();
42
+ searchParams.set('query', query);
43
+ searchParams.set('step', step);
44
+ searchParams.set('start', String(Math.trunc(start.getTime() / 1000)));
45
+ searchParams.set('end', String(Math.trunc(end.getTime() / 1000)));
46
+ searchParams.set('limit', '10');
47
+
48
+ return this.callPrometheus('query_range', searchParams);
49
+ }
50
+
51
+ private async callPrometheus(api: string, searchParams: URLSearchParams): Promise<PrometheusResponse> {
52
+ const url = new URL('api/v1/' + api, this.config.server);
53
+ for (const [name, value] of searchParams) {
54
+ url.searchParams.append(name, value);
55
+ }
56
+
57
+ const resp = await this.httpClient(url, { method: 'GET' });
58
+ if (!resp.ok || resp.status !== 200) {
59
+ throw new Error('Invalid HTTP response from Prometheus', {
60
+ cause: {
61
+ url,
62
+ status: resp.status,
63
+ statusText: resp.statusText,
64
+ },
65
+ });
66
+ }
67
+
68
+ const body = await resp.json();
69
+ if ('status' in body && (body.status === 'error' || body.status === 'success')) {
70
+ return body;
71
+ }
72
+
73
+ throw new Error('Invalid response from Prometheus', {
74
+ cause: {
75
+ url,
76
+ body,
77
+ },
78
+ });
79
+ }
80
+ }
81
+
82
+ export type PrometheusDuration = `${number}s` | `${number}m` | `${number}h`;
83
+
84
+ export type PrometheusData =
85
+ | {
86
+ resultType: 'vector';
87
+ result: Array<{
88
+ metric: unknown;
89
+ value: [unixTimestamp: number, value: string];
90
+ }>;
91
+ }
92
+ | {
93
+ resultType: 'matrix';
94
+ result: Array<{
95
+ metric: unknown;
96
+ values: [unixTimestamp: number, value: string];
97
+ }>;
98
+ }
99
+ | {
100
+ resultType: 'scalar' | 'string';
101
+ result: unknown;
102
+ };
103
+
104
+ export type PrometheusResponse =
105
+ | {
106
+ status: 'error';
107
+ errorType: string;
108
+ error: string;
109
+ }
110
+ | {
111
+ status: 'success';
112
+ data: PrometheusData;
113
+ };
@@ -1,24 +1,23 @@
1
- // docs:start:cross_chain_test_harness
1
+ import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { EthAddress } from '@aztec/aztec.js/addresses';
3
+ import { AuthWitness } from '@aztec/aztec.js/authorization';
2
4
  import {
3
- type AccountWallet,
4
- type AztecAddress,
5
- type AztecNode,
6
- EthAddress,
7
- type FieldsOf,
8
- Fr,
9
5
  type L1TokenManager,
10
6
  L1TokenPortalManager,
11
7
  type L2AmountClaim,
12
8
  type L2AmountClaimWithRecipient,
13
- type Logger,
14
- type PXE,
15
- type SiblingPath,
16
- type TxReceipt,
17
- type Wallet,
18
- deployL1Contract,
19
- retryUntil,
20
- } from '@aztec/aztec.js';
21
- import type { L1ContractAddresses, ViemPublicClient, ViemWalletClient } from '@aztec/ethereum';
9
+ } from '@aztec/aztec.js/ethereum';
10
+ import { Fr } from '@aztec/aztec.js/fields';
11
+ import type { Logger } from '@aztec/aztec.js/log';
12
+ import type { AztecNode } from '@aztec/aztec.js/node';
13
+ import type { SiblingPath } from '@aztec/aztec.js/trees';
14
+ import type { TxReceipt } from '@aztec/aztec.js/tx';
15
+ import type { Wallet } from '@aztec/aztec.js/wallet';
16
+ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
17
+ import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
18
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
19
+ import { EpochNumber } from '@aztec/foundation/branded-types';
20
+ import { retryUntil } from '@aztec/foundation/retry';
22
21
  import { TestERC20Abi, TokenPortalAbi, TokenPortalBytecode } from '@aztec/l1-artifacts';
23
22
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
24
23
  import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
@@ -27,7 +26,6 @@ import { type Hex, getContract } from 'viem';
27
26
 
28
27
  import { mintTokensToPrivate } from '../fixtures/token_utils.js';
29
28
 
30
- // docs:start:deployAndInitializeTokenAndBridgeContracts
31
29
  /**
32
30
  * Deploy L1 token and portal, initialize portal, deploy a non native l2 token contract, its L2 bridge contract and attach is to the portal.
33
31
  * @param wallet - the wallet instance
@@ -40,8 +38,7 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
40
38
  */
41
39
  export async function deployAndInitializeTokenAndBridgeContracts(
42
40
  wallet: Wallet,
43
- walletClient: ViemWalletClient,
44
- publicClient: ViemPublicClient,
41
+ l1Client: ExtendedViemWalletClient,
45
42
  rollupRegistryAddress: EthAddress,
46
43
  owner: AztecAddress,
47
44
  underlyingERC20Address: EthAddress,
@@ -68,35 +65,30 @@ export async function deployAndInitializeTokenAndBridgeContracts(
68
65
  underlyingERC20: any;
69
66
  }> {
70
67
  // deploy the token portal
71
- const { address: tokenPortalAddress } = await deployL1Contract(
72
- walletClient,
73
- publicClient,
74
- TokenPortalAbi,
75
- TokenPortalBytecode,
76
- );
68
+ const { address: tokenPortalAddress } = await deployL1Contract(l1Client, TokenPortalAbi, TokenPortalBytecode);
77
69
  const tokenPortal = getContract({
78
70
  address: tokenPortalAddress.toString(),
79
71
  abi: TokenPortalAbi,
80
- client: walletClient,
72
+ client: l1Client,
81
73
  });
82
74
 
83
75
  // deploy l2 token
84
- const token = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18).send().deployed();
76
+ const token = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18).send({ from: owner });
85
77
 
86
78
  // deploy l2 token bridge and attach to the portal
87
- const bridge = await TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress).send().deployed();
79
+ const bridge = await TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress).send({ from: owner });
88
80
 
89
- if ((await token.methods.get_admin().simulate()) !== owner.toBigInt()) {
81
+ if ((await token.methods.get_admin().simulate({ from: owner })) !== owner.toBigInt()) {
90
82
  throw new Error(`Token admin is not ${owner}`);
91
83
  }
92
84
 
93
- if (!(await bridge.methods.get_config().simulate()).token.equals(token.address)) {
85
+ if (!(await bridge.methods.get_config().simulate({ from: owner })).token.equals(token.address)) {
94
86
  throw new Error(`Bridge token is not ${token.address}`);
95
87
  }
96
88
 
97
89
  // make the bridge a minter on the token:
98
- await token.methods.set_minter(bridge.address, true).send().wait();
99
- if ((await token.methods.is_minter(bridge.address).simulate()) === 1n) {
90
+ await token.methods.set_minter(bridge.address, true).send({ from: owner });
91
+ if ((await token.methods.is_minter(bridge.address).simulate({ from: owner })) === 1n) {
100
92
  throw new Error(`Bridge is not a minter`);
101
93
  }
102
94
 
@@ -109,12 +101,22 @@ export async function deployAndInitializeTokenAndBridgeContracts(
109
101
  const underlyingERC20 = getContract({
110
102
  address: underlyingERC20Address.toString(),
111
103
  abi: TestERC20Abi,
112
- client: walletClient,
104
+ client: l1Client,
113
105
  });
114
106
 
115
107
  return { token, bridge, tokenPortalAddress, tokenPortal, underlyingERC20 };
116
108
  }
117
- // docs:end:deployAndInitializeTokenAndBridgeContracts
109
+
110
+ export type CrossChainContext = {
111
+ l2Token: AztecAddress;
112
+ l2Bridge: AztecAddress;
113
+ tokenPortal: EthAddress;
114
+ underlying: EthAddress;
115
+ ethAccount: EthAddress;
116
+ ownerAddress: AztecAddress;
117
+ inbox: EthAddress;
118
+ outbox: EthAddress;
119
+ };
118
120
 
119
121
  /**
120
122
  * A Class for testing cross chain interactions, contains common interactions
@@ -123,54 +125,47 @@ export async function deployAndInitializeTokenAndBridgeContracts(
123
125
  export class CrossChainTestHarness {
124
126
  static async new(
125
127
  aztecNode: AztecNode,
126
- pxeService: PXE,
127
- publicClient: ViemPublicClient,
128
- walletClient: ViemWalletClient,
129
- wallet: AccountWallet,
128
+ l1Client: ExtendedViemWalletClient,
129
+ wallet: Wallet,
130
+ ownerAddress: AztecAddress,
130
131
  logger: Logger,
131
132
  underlyingERC20Address: EthAddress,
132
133
  ): Promise<CrossChainTestHarness> {
133
- const ethAccount = EthAddress.fromString((await walletClient.getAddresses())[0]);
134
- const l1ContractAddresses = (await pxeService.getNodeInfo()).l1ContractAddresses;
134
+ const ethAccount = EthAddress.fromString((await l1Client.getAddresses())[0]);
135
+ const l1ContractAddresses = (await aztecNode.getNodeInfo()).l1ContractAddresses;
135
136
 
136
137
  // Deploy and initialize all required contracts
137
138
  logger.info('Deploying and initializing token, portal and its bridge...');
138
139
  const { token, bridge, tokenPortalAddress, underlyingERC20 } = await deployAndInitializeTokenAndBridgeContracts(
139
140
  wallet,
140
- walletClient,
141
- publicClient,
141
+ l1Client,
142
142
  l1ContractAddresses.registryAddress,
143
- wallet.getAddress(),
143
+ ownerAddress,
144
144
  underlyingERC20Address,
145
145
  );
146
146
  logger.info('Deployed and initialized token, portal and its bridge.');
147
147
 
148
148
  return new CrossChainTestHarness(
149
149
  aztecNode,
150
- pxeService,
151
150
  logger,
152
151
  token,
153
152
  bridge,
154
153
  ethAccount,
155
154
  tokenPortalAddress,
156
155
  underlyingERC20.address,
157
- publicClient,
158
- walletClient,
156
+ l1Client,
159
157
  l1ContractAddresses,
160
158
  wallet,
159
+ ownerAddress,
161
160
  );
162
161
  }
163
162
 
164
163
  private readonly l1TokenManager: L1TokenManager;
165
164
  private readonly l1TokenPortalManager: L1TokenPortalManager;
166
165
 
167
- public readonly ownerAddress: AztecAddress;
168
-
169
166
  constructor(
170
167
  /** Aztec node instance. */
171
168
  public aztecNode: AztecNode,
172
- /** Private eXecution Environment (PXE). */
173
- public pxeService: PXE,
174
169
  /** Logger. */
175
170
  public logger: Logger,
176
171
 
@@ -186,32 +181,39 @@ export class CrossChainTestHarness {
186
181
  public tokenPortalAddress: EthAddress,
187
182
  /** Underlying token for portal tests. */
188
183
  public underlyingERC20Address: EthAddress,
189
- /** Viem Public client instance. */
190
- public publicClient: ViemPublicClient,
191
- /** Viem Wallet Client instance. */
192
- public walletClient: ViemWalletClient,
184
+ /** Viem Extended client instance. */
185
+ public l1Client: ExtendedViemWalletClient,
193
186
 
194
187
  /** Deployment addresses for all L1 contracts */
195
188
  public readonly l1ContractAddresses: L1ContractAddresses,
196
189
 
197
- /** Wallet of the owner. */
198
- public readonly ownerWallet: AccountWallet,
190
+ /** Wallet to simulate and send txs from. */
191
+ public readonly wallet: Wallet,
192
+
193
+ /** Owner of the l2 token and bridge */
194
+ public readonly ownerAddress: AztecAddress,
199
195
  ) {
200
196
  this.l1TokenPortalManager = new L1TokenPortalManager(
201
197
  this.tokenPortalAddress,
202
198
  this.underlyingERC20Address,
199
+ this.l1ContractAddresses.feeAssetHandlerAddress,
203
200
  this.l1ContractAddresses.outboxAddress,
204
- this.publicClient,
205
- this.walletClient,
201
+ this.l1Client,
206
202
  this.logger,
207
203
  );
208
204
  this.l1TokenManager = this.l1TokenPortalManager.getTokenManager();
209
- this.ownerAddress = this.ownerWallet.getAddress();
210
205
  }
211
206
 
212
207
  async mintTokensOnL1(amount: bigint) {
213
- await this.l1TokenManager.mint(amount, this.ethAccount.toString());
214
- expect(await this.l1TokenManager.getL1TokenBalance(this.ethAccount.toString())).toEqual(amount);
208
+ const contract = getContract({
209
+ abi: TestERC20Abi,
210
+ address: this.l1TokenManager.tokenAddress.toString(),
211
+ client: this.l1Client,
212
+ });
213
+ const balanceBefore = await this.l1TokenManager.getL1TokenBalance(this.ethAccount.toString());
214
+ const hash = await contract.write.mint([this.ethAccount.toString(), amount]);
215
+ await this.l1Client.waitForTransactionReceipt({ hash });
216
+ expect(await this.l1TokenManager.getL1TokenBalance(this.ethAccount.toString())).toEqual(balanceBefore + amount);
215
217
  }
216
218
 
217
219
  getL1BalanceOf(address: EthAddress) {
@@ -228,16 +230,18 @@ export class CrossChainTestHarness {
228
230
 
229
231
  async mintTokensPublicOnL2(amount: bigint) {
230
232
  this.logger.info('Minting tokens on L2 publicly');
231
- await this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send().wait();
233
+ await this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send({ from: this.ownerAddress });
232
234
  }
233
235
 
234
236
  async mintTokensPrivateOnL2(amount: bigint) {
235
- await mintTokensToPrivate(this.l2Token, this.ownerWallet, this.ownerAddress, amount);
237
+ await mintTokensToPrivate(this.l2Token, this.ownerAddress, this.ownerAddress, amount);
236
238
  }
237
239
 
238
240
  async sendL2PublicTransfer(transferAmount: bigint, receiverAddress: AztecAddress) {
239
241
  // send a transfer tx to force through rollup with the message included
240
- await this.l2Token.methods.transfer_in_public(this.ownerAddress, receiverAddress, transferAmount, 0).send().wait();
242
+ await this.l2Token.methods
243
+ .transfer_in_public(this.ownerAddress, receiverAddress, transferAmount, 0)
244
+ .send({ from: this.ownerAddress });
241
245
  }
242
246
 
243
247
  async consumeMessageOnAztecAndMintPrivately(
@@ -247,8 +251,7 @@ export class CrossChainTestHarness {
247
251
  const { recipient, claimAmount, claimSecret: secretForL2MessageConsumption, messageLeafIndex } = claim;
248
252
  await this.l2Bridge.methods
249
253
  .claim_private(recipient, claimAmount, secretForL2MessageConsumption, messageLeafIndex)
250
- .send()
251
- .wait();
254
+ .send({ from: this.ownerAddress });
252
255
  }
253
256
 
254
257
  async consumeMessageOnAztecAndMintPublicly(
@@ -258,24 +261,25 @@ export class CrossChainTestHarness {
258
261
  const { claimAmount, claimSecret, messageLeafIndex } = claim;
259
262
  await this.l2Bridge.methods
260
263
  .claim_public(this.ownerAddress, claimAmount, claimSecret, messageLeafIndex)
261
- .send()
262
- .wait();
264
+ .send({ from: this.ownerAddress });
263
265
  }
264
266
 
265
- async withdrawPrivateFromAztecToL1(withdrawAmount: bigint, nonce: Fr = Fr.ZERO): Promise<FieldsOf<TxReceipt>> {
267
+ async withdrawPrivateFromAztecToL1(
268
+ withdrawAmount: bigint,
269
+ authwitNonce: Fr = Fr.ZERO,
270
+ authWitness: AuthWitness,
271
+ ): Promise<TxReceipt> {
266
272
  const withdrawReceipt = await this.l2Bridge.methods
267
- .exit_to_l1_private(this.l2Token.address, this.ethAccount, withdrawAmount, EthAddress.ZERO, nonce)
268
- .send()
269
- .wait();
273
+ .exit_to_l1_private(this.l2Token.address, this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
274
+ .send({ authWitnesses: [authWitness], from: this.ownerAddress });
270
275
 
271
276
  return withdrawReceipt;
272
277
  }
273
278
 
274
- async withdrawPublicFromAztecToL1(withdrawAmount: bigint, nonce: Fr = Fr.ZERO): Promise<FieldsOf<TxReceipt>> {
279
+ async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<TxReceipt> {
275
280
  const withdrawReceipt = await this.l2Bridge.methods
276
- .exit_to_l1_public(this.ethAccount, withdrawAmount, EthAddress.ZERO, nonce)
277
- .send()
278
- .wait();
281
+ .exit_to_l1_public(this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
282
+ .send({ from: this.ownerAddress });
279
283
 
280
284
  return withdrawReceipt;
281
285
  }
@@ -291,7 +295,7 @@ export class CrossChainTestHarness {
291
295
  }
292
296
 
293
297
  async getL2PublicBalanceOf(owner: AztecAddress) {
294
- return await this.l2Token.methods.balance_of_public(owner).simulate();
298
+ return await this.l2Token.methods.balance_of_public(owner).simulate({ from: this.ownerAddress });
295
299
  }
296
300
 
297
301
  async expectPublicBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
@@ -299,8 +303,8 @@ export class CrossChainTestHarness {
299
303
  expect(balance).toBe(expectedBalance);
300
304
  }
301
305
 
302
- getL2ToL1MessageLeaf(withdrawAmount: bigint, callerOnL1: EthAddress = EthAddress.ZERO): Fr {
303
- return this.l1TokenPortalManager.getL2ToL1MessageLeaf(
306
+ async getL2ToL1MessageLeaf(withdrawAmount: bigint, callerOnL1: EthAddress = EthAddress.ZERO): Promise<Fr> {
307
+ return await this.l1TokenPortalManager.getL2ToL1MessageLeaf(
304
308
  withdrawAmount,
305
309
  this.ethAccount,
306
310
  this.l2Bridge.address,
@@ -310,27 +314,23 @@ export class CrossChainTestHarness {
310
314
 
311
315
  withdrawFundsFromBridgeOnL1(
312
316
  amount: bigint,
313
- blockNumber: number | bigint,
317
+ epochNumber: EpochNumber,
314
318
  messageIndex: bigint,
315
319
  siblingPath: SiblingPath<number>,
316
320
  ) {
317
- return this.l1TokenPortalManager.withdrawFunds(
318
- amount,
319
- this.ethAccount,
320
- BigInt(blockNumber),
321
- messageIndex,
322
- siblingPath,
323
- );
321
+ return this.l1TokenPortalManager.withdrawFunds(amount, this.ethAccount, epochNumber, messageIndex, siblingPath);
324
322
  }
325
323
 
326
324
  async transferToPrivateOnL2(shieldAmount: bigint) {
327
325
  this.logger.info('Transferring to private on L2');
328
- await this.l2Token.methods.transfer_to_private(this.ownerAddress, shieldAmount).send().wait();
326
+ await this.l2Token.methods.transfer_to_private(this.ownerAddress, shieldAmount).send({ from: this.ownerAddress });
329
327
  }
330
328
 
331
- async transferToPublicOnL2(amount: bigint, nonce = Fr.ZERO) {
329
+ async transferToPublicOnL2(amount: bigint, authwitNonce = Fr.ZERO) {
332
330
  this.logger.info('Transferring tokens to public');
333
- await this.l2Token.methods.transfer_to_public(this.ownerAddress, this.ownerAddress, amount, nonce).send().wait();
331
+ await this.l2Token.methods
332
+ .transfer_to_public(this.ownerAddress, this.ownerAddress, amount, authwitNonce)
333
+ .send({ from: this.ownerAddress });
334
334
  }
335
335
 
336
336
  /**
@@ -348,5 +348,17 @@ export class CrossChainTestHarness {
348
348
  await this.mintTokensPublicOnL2(0n);
349
349
  await this.mintTokensPublicOnL2(0n);
350
350
  }
351
+
352
+ toCrossChainContext(): CrossChainContext {
353
+ return {
354
+ l2Token: this.l2Token.address,
355
+ l2Bridge: this.l2Bridge.address,
356
+ tokenPortal: this.tokenPortalAddress,
357
+ underlying: this.underlyingERC20Address,
358
+ ethAccount: this.ethAccount,
359
+ ownerAddress: this.ownerAddress,
360
+ inbox: this.l1ContractAddresses.inboxAddress,
361
+ outbox: this.l1ContractAddresses.outboxAddress,
362
+ };
363
+ }
351
364
  }
352
- // docs:end:cross_chain_test_harness