@aztec/end-to-end 0.85.0 → 0.86.0-nightly.20250426

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 (61) hide show
  1. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  2. package/dest/bench/client_flows/client_flows_benchmark.js +6 -7
  3. package/dest/bench/client_flows/config.js +3 -3
  4. package/dest/bench/client_flows/data_extractor.js +12 -7
  5. package/dest/bench/utils.d.ts.map +1 -1
  6. package/dest/bench/utils.js +2 -0
  7. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
  8. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  9. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +11 -11
  10. package/dest/e2e_epochs/epochs_test.d.ts +3 -3
  11. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  12. package/dest/e2e_epochs/epochs_test.js +4 -2
  13. package/dest/e2e_fees/fees_test.d.ts +4 -0
  14. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  15. package/dest/e2e_fees/fees_test.js +22 -10
  16. package/dest/e2e_p2p/p2p_network.d.ts +67 -72
  17. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  18. package/dest/e2e_p2p/p2p_network.js +20 -61
  19. package/dest/e2e_prover/e2e_prover_test.d.ts.map +1 -1
  20. package/dest/e2e_prover/e2e_prover_test.js +10 -9
  21. package/dest/fixtures/l1_to_l2_messaging.d.ts +2 -3
  22. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  23. package/dest/fixtures/l1_to_l2_messaging.js +3 -3
  24. package/dest/fixtures/setup_l1_contracts.d.ts +1 -1
  25. package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -1
  26. package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
  27. package/dest/fixtures/snapshot_manager.js +15 -13
  28. package/dest/fixtures/utils.d.ts +5 -2
  29. package/dest/fixtures/utils.d.ts.map +1 -1
  30. package/dest/fixtures/utils.js +70 -62
  31. package/dest/shared/capture_private_execution_steps.d.ts.map +1 -1
  32. package/dest/shared/capture_private_execution_steps.js +3 -17
  33. package/dest/shared/cross_chain_test_harness.d.ts +7 -11
  34. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  35. package/dest/shared/cross_chain_test_harness.js +14 -16
  36. package/dest/shared/gas_portal_test_harness.d.ts +6 -11
  37. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  38. package/dest/shared/gas_portal_test_harness.js +8 -10
  39. package/dest/shared/uniswap_l1_l2.d.ts +3 -5
  40. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  41. package/dest/shared/uniswap_l1_l2.js +18 -19
  42. package/dest/spartan/setup_test_wallets.js +3 -3
  43. package/package.json +34 -35
  44. package/src/bench/client_flows/client_flows_benchmark.ts +6 -8
  45. package/src/bench/client_flows/config.ts +3 -3
  46. package/src/bench/client_flows/data_extractor.ts +10 -6
  47. package/src/bench/utils.ts +2 -0
  48. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +14 -18
  49. package/src/e2e_epochs/epochs_test.ts +9 -5
  50. package/src/e2e_fees/fees_test.ts +32 -10
  51. package/src/e2e_p2p/p2p_network.ts +28 -74
  52. package/src/e2e_prover/e2e_prover_test.ts +10 -14
  53. package/src/fixtures/l1_to_l2_messaging.ts +5 -14
  54. package/src/fixtures/setup_l1_contracts.ts +1 -2
  55. package/src/fixtures/snapshot_manager.ts +11 -13
  56. package/src/fixtures/utils.ts +66 -64
  57. package/src/shared/capture_private_execution_steps.ts +3 -19
  58. package/src/shared/cross_chain_test_harness.ts +14 -31
  59. package/src/shared/gas_portal_test_harness.ts +9 -14
  60. package/src/shared/uniswap_l1_l2.ts +25 -43
  61. package/src/spartan/setup_test_wallets.ts +3 -3
@@ -8,13 +8,14 @@ import { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee/testing';
8
8
  import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec.js/testing';
9
9
  import { createBlobSinkClient } from '@aztec/blob-sink/client';
10
10
  import { createBlobSinkServer } from '@aztec/blob-sink/server';
11
- import { GENESIS_ARCHIVE_ROOT, GENESIS_BLOCK_HASH, SPONSORED_FPC_SALT } from '@aztec/constants';
11
+ import { GENESIS_ARCHIVE_ROOT, SPONSORED_FPC_SALT } from '@aztec/constants';
12
12
  import { DefaultMultiCallEntrypoint } from '@aztec/entrypoints/multicall';
13
- import { ForwarderContract, NULL_KEY, createL1Clients, deployL1Contracts, getL1ContractsConfigEnvVars, isAnvilTestChain, l1Artifacts } from '@aztec/ethereum';
13
+ import { ForwarderContract, NULL_KEY, createExtendedL1Client, deployL1Contracts, getL1ContractsConfigEnvVars, isAnvilTestChain, l1Artifacts } from '@aztec/ethereum';
14
14
  import { DelayedTxUtils, EthCheatCodesWithState, startAnvil } from '@aztec/ethereum/test';
15
15
  import { randomBytes } from '@aztec/foundation/crypto';
16
16
  import { EthAddress } from '@aztec/foundation/eth-address';
17
17
  import { Fr } from '@aztec/foundation/fields';
18
+ import { withLogNameSuffix } from '@aztec/foundation/log';
18
19
  import { retryUntil } from '@aztec/foundation/retry';
19
20
  import { TestDateProvider } from '@aztec/foundation/timer';
20
21
  import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
@@ -71,7 +72,6 @@ export const setupL1Contracts = async (l1RpcUrls, account, logger, args = {}, ch
71
72
  vkTreeRoot: getVKTreeRoot(),
72
73
  protocolContractTreeRoot,
73
74
  genesisArchiveRoot: args.genesisArchiveRoot ?? new Fr(GENESIS_ARCHIVE_ROOT),
74
- genesisBlockHash: args.genesisBlockHash ?? new Fr(GENESIS_BLOCK_HASH),
75
75
  salt: args.salt,
76
76
  initialValidators: args.initialValidators,
77
77
  ...getL1ContractsConfigEnvVars(),
@@ -143,11 +143,10 @@ export const setupL1Contracts = async (l1RpcUrls, account, logger, args = {}, ch
143
143
  logger.verbose('JSON RPC client connected to PXE');
144
144
  logger.verbose(`Retrieving contract addresses from ${PXE_URL}`);
145
145
  const l1Contracts = (await pxeClient.getNodeInfo()).l1ContractAddresses;
146
- const { walletClient, publicClient } = createL1Clients(config.l1RpcUrls, account, foundry);
146
+ const l1Client = createExtendedL1Client(config.l1RpcUrls, account, foundry);
147
147
  const deployL1ContractsValues = {
148
148
  l1ContractAddresses: l1Contracts,
149
- walletClient,
150
- publicClient
149
+ l1Client
151
150
  };
152
151
  const cheatCodes = await CheatCodes.create(config.l1RpcUrls, pxeClient);
153
152
  const teardown = ()=>Promise.resolve();
@@ -255,11 +254,10 @@ export const setupL1Contracts = async (l1RpcUrls, account, logger, args = {}, ch
255
254
  return await setupWithRemoteEnvironment(publisherHdAccount, config, logger, numberOfAccounts);
256
255
  }
257
256
  const initialFundedAccounts = opts.initialFundedAccounts ?? await generateSchnorrAccounts(opts.numberOfInitialFundedAccounts ?? numberOfAccounts);
258
- const { genesisBlockHash, genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(initialFundedAccounts.map((a)=>a.address), opts.initialAccountFeeJuice, opts.genesisPublicData);
257
+ const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(initialFundedAccounts.map((a)=>a.address), opts.initialAccountFeeJuice, opts.genesisPublicData);
259
258
  const deployL1ContractsValues = opts.deployL1ContractsValues ?? await setupL1Contracts(config.l1RpcUrls, publisherHdAccount, logger, {
260
259
  ...opts,
261
260
  genesisArchiveRoot,
262
- genesisBlockHash,
263
261
  feeJuicePortalInitialBalance: fundingNeeded
264
262
  }, chain);
265
263
  config.l1Contracts = deployL1ContractsValues.l1ContractAddresses;
@@ -268,20 +266,20 @@ export const setupL1Contracts = async (l1RpcUrls, account, logger, args = {}, ch
268
266
  const rewardDistributor = getContract({
269
267
  address: deployL1ContractsValues.l1ContractAddresses.rewardDistributorAddress.toString(),
270
268
  abi: l1Artifacts.rewardDistributor.contractAbi,
271
- client: deployL1ContractsValues.publicClient
269
+ client: deployL1ContractsValues.l1Client
272
270
  });
273
271
  const blockReward = await rewardDistributor.read.BLOCK_REWARD();
274
272
  const mintAmount = 10_000n * blockReward;
275
273
  const feeJuice = getContract({
276
274
  address: deployL1ContractsValues.l1ContractAddresses.feeJuiceAddress.toString(),
277
275
  abi: l1Artifacts.feeAsset.contractAbi,
278
- client: deployL1ContractsValues.walletClient
276
+ client: deployL1ContractsValues.l1Client
279
277
  });
280
278
  const rewardDistributorMintTxHash = await feeJuice.write.mint([
281
279
  rewardDistributor.address,
282
280
  mintAmount
283
281
  ], {});
284
- await deployL1ContractsValues.publicClient.waitForTransactionReceipt({
282
+ await deployL1ContractsValues.l1Client.waitForTransactionReceipt({
285
283
  hash: rewardDistributorMintTxHash
286
284
  });
287
285
  logger.info(`Funding rewardDistributor in ${rewardDistributorMintTxHash}`);
@@ -292,7 +290,7 @@ export const setupL1Contracts = async (l1RpcUrls, account, logger, args = {}, ch
292
290
  await ethCheatCodes.warp(opts.l2StartTime);
293
291
  }
294
292
  const dateProvider = new TestDateProvider();
295
- const watcher = new AnvilTestWatcher(new EthCheatCodesWithState(config.l1RpcUrls), deployL1ContractsValues.l1ContractAddresses.rollupAddress, deployL1ContractsValues.publicClient, dateProvider);
293
+ const watcher = new AnvilTestWatcher(new EthCheatCodesWithState(config.l1RpcUrls), deployL1ContractsValues.l1ContractAddresses.rollupAddress, deployL1ContractsValues.l1Client, dateProvider);
296
294
  await watcher.start();
297
295
  const telemetry = getTelemetryClient(opts.telemetryConfig);
298
296
  // Blob sink service - blobs get posted here and served from here
@@ -319,7 +317,9 @@ export const setupL1Contracts = async (l1RpcUrls, account, logger, args = {}, ch
319
317
  config.bbWorkingDirectory = bbConfig.bbWorkingDirectory;
320
318
  }
321
319
  config.l1PublishRetryIntervalMS = 100;
322
- const blobSinkClient = createBlobSinkClient(config);
320
+ const blobSinkClient = createBlobSinkClient(config, {
321
+ logger: createLogger('node:blob-sink:client')
322
+ });
323
323
  const aztecNode = await AztecNodeService.createAndSync(config, {
324
324
  dateProvider,
325
325
  blobSinkClient,
@@ -337,7 +337,12 @@ export const setupL1Contracts = async (l1RpcUrls, account, logger, args = {}, ch
337
337
  logger.verbose('Creating and syncing a simulated prover node...');
338
338
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
339
339
  const proverNodePrivateKeyHex = `0x${proverNodePrivateKey.toString('hex')}`;
340
- proverNode = await createAndSyncProverNode(proverNodePrivateKeyHex, config, aztecNode, path.join(directoryToCleanup, randomBytes(8).toString('hex')));
340
+ const proverNodeDataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
341
+ const proverNodeConfig = {
342
+ ...config.proverNodeConfig,
343
+ dataDirectory: proverNodeDataDirectory
344
+ };
345
+ proverNode = await createAndSyncProverNode(proverNodePrivateKeyHex, config, proverNodeConfig, aztecNode, prefilledPublicData);
341
346
  }
342
347
  logger.verbose('Creating a pxe...');
343
348
  const { pxe, teardown: pxeTeardown } = await setupPXEService(aztecNode, pxeOpts, logger);
@@ -513,61 +518,64 @@ export async function waitForProvenChain(node, targetBlock, timeoutSec = 60, int
513
518
  targetBlock ??= await node.getBlockNumber();
514
519
  await retryUntil(async ()=>await node.getProvenBlockNumber() >= targetBlock, 'proven chain status', timeoutSec, intervalSec);
515
520
  }
516
- export async function createAndSyncProverNode(proverNodePrivateKey, aztecNodeConfig, aztecNode, dataDirectory, prefilledPublicData = []) {
517
- // Disable stopping the aztec node as the prover coordination test will kill it otherwise
518
- // This is only required when stopping the prover node for testing
519
- const aztecNodeWithoutStop = {
520
- getTxByHash: aztecNode.getTxByHash.bind(aztecNode),
521
- getTxsByHash: aztecNode.getTxsByHash.bind(aztecNode),
522
- stop: ()=>Promise.resolve()
523
- };
524
- const blobSinkClient = createBlobSinkClient(aztecNodeConfig);
525
- // Creating temp store and archiver for simulated prover node
526
- const archiverConfig = {
527
- ...aztecNodeConfig,
528
- dataDirectory
529
- };
530
- const archiver = await createArchiver(archiverConfig, blobSinkClient, {
531
- blockUntilSync: true
532
- });
533
- // Prover node config is for simulated proofs
534
- const proverConfig = {
535
- ...aztecNodeConfig,
536
- proverCoordinationNodeUrl: undefined,
537
- dataDirectory: undefined,
538
- realProofs: false,
539
- proverAgentCount: 2,
540
- publisherPrivateKey: proverNodePrivateKey,
541
- proverNodeMaxPendingJobs: 10,
542
- proverNodeMaxParallelBlocksPerEpoch: 32,
543
- proverNodePollingIntervalMs: 200,
544
- txGatheringTimeoutMs: 60000,
545
- txGatheringIntervalMs: 1000,
546
- txGatheringMaxParallelRequests: 100
547
- };
548
- const l1TxUtils = createDelayedL1TxUtils(aztecNodeConfig, proverNodePrivateKey, 'prover-node');
549
- const proverNode = await createProverNode(proverConfig, {
550
- aztecNodeTxProvider: aztecNodeWithoutStop,
551
- archiver: archiver,
552
- l1TxUtils
553
- }, {
554
- prefilledPublicData
555
- });
556
- getLogger().info(`Created and synced prover node`, {
557
- publisherAddress: l1TxUtils.walletClient.account.address
521
+ export function createAndSyncProverNode(proverNodePrivateKey, aztecNodeConfig, proverNodeConfig, aztecNode, prefilledPublicData = []) {
522
+ return withLogNameSuffix('prover-node', async ()=>{
523
+ // Disable stopping the aztec node as the prover coordination test will kill it otherwise
524
+ // This is only required when stopping the prover node for testing
525
+ const aztecNodeTxProvider = {
526
+ getTxByHash: aztecNode.getTxByHash.bind(aztecNode),
527
+ getTxsByHash: aztecNode.getTxsByHash.bind(aztecNode),
528
+ stop: ()=>Promise.resolve()
529
+ };
530
+ const blobSinkClient = createBlobSinkClient(aztecNodeConfig);
531
+ // Creating temp store and archiver for simulated prover node
532
+ const archiverConfig = {
533
+ ...aztecNodeConfig,
534
+ dataDirectory: proverNodeConfig.dataDirectory
535
+ };
536
+ const archiver = await createArchiver(archiverConfig, blobSinkClient, {
537
+ blockUntilSync: true
538
+ });
539
+ // Prover node config is for simulated proofs
540
+ const proverConfig = {
541
+ ...aztecNodeConfig,
542
+ proverCoordinationNodeUrls: [],
543
+ realProofs: false,
544
+ proverAgentCount: 2,
545
+ publisherPrivateKey: proverNodePrivateKey,
546
+ proverNodeMaxPendingJobs: 10,
547
+ proverNodeMaxParallelBlocksPerEpoch: 32,
548
+ proverNodePollingIntervalMs: 200,
549
+ txGatheringIntervalMs: 1000,
550
+ txGatheringBatchSize: 10,
551
+ txGatheringMaxParallelRequestsPerNode: 10,
552
+ proverNodeFailedEpochStore: undefined,
553
+ ...proverNodeConfig
554
+ };
555
+ const l1TxUtils = createDelayedL1TxUtils(aztecNodeConfig, proverNodePrivateKey, 'prover-node');
556
+ const proverNode = await createProverNode(proverConfig, {
557
+ aztecNodeTxProvider,
558
+ archiver: archiver,
559
+ l1TxUtils
560
+ }, {
561
+ prefilledPublicData
562
+ });
563
+ getLogger().info(`Created and synced prover node`, {
564
+ publisherAddress: l1TxUtils.client.account.address
565
+ });
566
+ await proverNode.start();
567
+ return proverNode;
558
568
  });
559
- proverNode.start();
560
- return proverNode;
561
569
  }
562
570
  function createDelayedL1TxUtils(aztecNodeConfig, privateKey, logName) {
563
- const { publicClient, walletClient } = createL1Clients(aztecNodeConfig.l1RpcUrls, privateKey, foundry);
571
+ const l1Client = createExtendedL1Client(aztecNodeConfig.l1RpcUrls, privateKey, foundry);
564
572
  const log = createLogger(logName);
565
- const l1TxUtils = new DelayedTxUtils(publicClient, walletClient, log, aztecNodeConfig);
573
+ const l1TxUtils = new DelayedTxUtils(l1Client, log, aztecNodeConfig);
566
574
  l1TxUtils.enableDelayer(aztecNodeConfig.ethereumSlotDuration);
567
575
  return l1TxUtils;
568
576
  }
569
577
  export async function createForwarderContract(aztecNodeConfig, privateKey, rollupAddress) {
570
- const { walletClient, publicClient } = createL1Clients(aztecNodeConfig.l1RpcUrls, privateKey, foundry);
571
- const forwarderContract = await ForwarderContract.create(walletClient.account.address, walletClient, publicClient, createLogger('forwarder'), rollupAddress);
578
+ const l1Client = createExtendedL1Client(aztecNodeConfig.l1RpcUrls, privateKey, foundry);
579
+ const forwarderContract = await ForwarderContract.create(l1Client.account.address, l1Client, createLogger('forwarder'), rollupAddress);
572
580
  return forwarderContract;
573
581
  }
@@ -1 +1 @@
1
- {"version":3,"file":"capture_private_execution_steps.d.ts","sourceRoot":"","sources":["../../src/shared/capture_private_execution_steps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,2BAA2B,EAC3B,YAAY,EACZ,aAAa,EACb,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AA0BnC,wBAAsB,oCAAoC,CACxD,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,2BAA2B,GAAG,YAAY,EACvD,IAAI,CAAC,EAAE,IAAI,CAAC,oBAAoB,GAAG,aAAa,EAAE,aAAa,CAAC,EAChE,aAAa,CAAC,EAAE,MAAM,iBAqCvB"}
1
+ {"version":3,"file":"capture_private_execution_steps.d.ts","sourceRoot":"","sources":["../../src/shared/capture_private_execution_steps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,2BAA2B,EAC3B,YAAY,EACZ,aAAa,EACb,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AASnC,wBAAsB,oCAAoC,CACxD,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,2BAA2B,GAAG,YAAY,EACvD,IAAI,CAAC,EAAE,IAAI,CAAC,oBAAoB,GAAG,aAAa,EAAE,aAAa,CAAC,EAChE,aAAa,CAAC,EAAE,MAAM,iBAsCvB"}
@@ -2,25 +2,10 @@
2
2
  * This module exposes the ability to capture the private exection steps that go into our "Client IVC" prover.
3
3
  * These are used for debugging and benchmarking barretenberg (the prover component).
4
4
  */ import { createLogger } from '@aztec/foundation/log';
5
- import { serializeWitness } from '@aztec/noir-noirc_abi';
6
- import { encode } from '@msgpack/msgpack';
5
+ import { serializePrivateExecutionSteps } from '@aztec/stdlib/kernel';
7
6
  import { promises as fs } from 'fs';
8
7
  import path from 'path';
9
8
  const logger = createLogger('e2e:capture-private-execution-steps');
10
- // TODO(#7371): This is duplicated.
11
- // Longer term we won't use this hacked together msgpack format
12
- // Leaving duplicated as this eventually bb will provide a serialization
13
- // helper for passing to a generic msgpack RPC endpoint.
14
- async function _createClientIvcProofFiles(directory, executionSteps) {
15
- const acirPath = path.join(directory, 'acir.msgpack');
16
- const witnessPath = path.join(directory, 'witnesses.msgpack');
17
- await fs.writeFile(acirPath, encode(executionSteps.map((map)=>map.bytecode)));
18
- await fs.writeFile(witnessPath, encode(executionSteps.map((map)=>serializeWitness(map.witness))));
19
- return {
20
- acirPath,
21
- witnessPath
22
- };
23
- }
24
9
  export async function capturePrivateExecutionStepsIfEnvSet(label, interaction, opts, expectedSteps) {
25
10
  // Not included in env_var.ts as internal to e2e tests.
26
11
  const ivcFolder = process.env.CAPTURE_IVC_FOLDER;
@@ -45,7 +30,8 @@ export async function capturePrivateExecutionStepsIfEnvSet(label, interaction, o
45
30
  recursive: true
46
31
  });
47
32
  // Write the client IVC files read by the prover.
48
- await _createClientIvcProofFiles(resultsDirectory, result.executionSteps);
33
+ const ivcInputsPath = path.join(resultsDirectory, 'ivc-inputs.msgpack');
34
+ await fs.writeFile(ivcInputsPath, serializePrivateExecutionSteps(result.executionSteps));
49
35
  if (profileMode === 'full') {
50
36
  // If we have gate counts, write the steps in human-readable format.
51
37
  await fs.writeFile(path.join(resultsDirectory, 'steps.json'), JSON.stringify(result.executionSteps.map((step)=>({
@@ -1,5 +1,5 @@
1
1
  import { type AccountWallet, AuthWitness, type AztecAddress, type AztecNode, EthAddress, type FieldsOf, Fr, type L2AmountClaim, type L2AmountClaimWithRecipient, type Logger, type PXE, type SiblingPath, type TxReceipt, type Wallet } from '@aztec/aztec.js';
2
- import { type L1ContractAddresses, type ViemPublicClient, type ViemWalletClient } from '@aztec/ethereum';
2
+ import { type ExtendedViemWalletClient, type L1ContractAddresses } from '@aztec/ethereum';
3
3
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
4
4
  import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
5
5
  import { type Hex } from 'viem';
@@ -13,7 +13,7 @@ import { type Hex } from 'viem';
13
13
  * @param underlyingERC20Address - address of the underlying ERC20 contract to use (if none supplied, it deploys one)
14
14
  * @returns l2 contract instance, bridge contract instance, token portal instance, token portal address and the underlying ERC20 instance
15
15
  */
16
- export declare function deployAndInitializeTokenAndBridgeContracts(wallet: Wallet, walletClient: ViemWalletClient, publicClient: ViemPublicClient, rollupRegistryAddress: EthAddress, owner: AztecAddress, underlyingERC20Address: EthAddress): Promise<{
16
+ export declare function deployAndInitializeTokenAndBridgeContracts(wallet: Wallet, l1Client: ExtendedViemWalletClient, rollupRegistryAddress: EthAddress, owner: AztecAddress, underlyingERC20Address: EthAddress): Promise<{
17
17
  /**
18
18
  * The L2 token contract instance.
19
19
  */
@@ -66,15 +66,13 @@ export declare class CrossChainTestHarness {
66
66
  tokenPortalAddress: EthAddress;
67
67
  /** Underlying token for portal tests. */
68
68
  underlyingERC20Address: EthAddress;
69
- /** Viem Public client instance. */
70
- publicClient: ViemPublicClient;
71
- /** Viem Wallet Client instance. */
72
- walletClient: ViemWalletClient;
69
+ /** Viem Extended client instance. */
70
+ l1Client: ExtendedViemWalletClient;
73
71
  /** Deployment addresses for all L1 contracts */
74
72
  readonly l1ContractAddresses: L1ContractAddresses;
75
73
  /** Wallet of the owner. */
76
74
  readonly ownerWallet: AccountWallet;
77
- static new(aztecNode: AztecNode, pxeService: PXE, publicClient: ViemPublicClient, walletClient: ViemWalletClient, wallet: AccountWallet, logger: Logger, underlyingERC20Address: EthAddress): Promise<CrossChainTestHarness>;
75
+ static new(aztecNode: AztecNode, pxeService: PXE, l1Client: ExtendedViemWalletClient, wallet: AccountWallet, logger: Logger, underlyingERC20Address: EthAddress): Promise<CrossChainTestHarness>;
78
76
  private readonly l1TokenManager;
79
77
  private readonly l1TokenPortalManager;
80
78
  readonly ownerAddress: AztecAddress;
@@ -95,10 +93,8 @@ export declare class CrossChainTestHarness {
95
93
  tokenPortalAddress: EthAddress,
96
94
  /** Underlying token for portal tests. */
97
95
  underlyingERC20Address: EthAddress,
98
- /** Viem Public client instance. */
99
- publicClient: ViemPublicClient,
100
- /** Viem Wallet Client instance. */
101
- walletClient: ViemWalletClient,
96
+ /** Viem Extended client instance. */
97
+ l1Client: ExtendedViemWalletClient,
102
98
  /** Deployment addresses for all L1 contracts */
103
99
  l1ContractAddresses: L1ContractAddresses,
104
100
  /** Wallet of the owner. */
@@ -1 +1 @@
1
- {"version":3,"file":"cross_chain_test_harness.d.ts","sourceRoot":"","sources":["../../src/shared/cross_chain_test_harness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cross_chain_test_harness.d.ts","sourceRoot":"","sources":["../../src/shared/cross_chain_test_harness.ts"],"names":[],"mappings":"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"}
@@ -16,13 +16,13 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
16
16
  * @param owner - owner of the L2 contract
17
17
  * @param underlyingERC20Address - address of the underlying ERC20 contract to use (if none supplied, it deploys one)
18
18
  * @returns l2 contract instance, bridge contract instance, token portal instance, token portal address and the underlying ERC20 instance
19
- */ export async function deployAndInitializeTokenAndBridgeContracts(wallet, walletClient, publicClient, rollupRegistryAddress, owner, underlyingERC20Address) {
19
+ */ export async function deployAndInitializeTokenAndBridgeContracts(wallet, l1Client, rollupRegistryAddress, owner, underlyingERC20Address) {
20
20
  // deploy the token portal
21
- const { address: tokenPortalAddress } = await deployL1Contract(walletClient, publicClient, TokenPortalAbi, TokenPortalBytecode);
21
+ const { address: tokenPortalAddress } = await deployL1Contract(l1Client, TokenPortalAbi, TokenPortalBytecode);
22
22
  const tokenPortal = getContract({
23
23
  address: tokenPortalAddress.toString(),
24
24
  abi: TokenPortalAbi,
25
- client: walletClient
25
+ client: l1Client
26
26
  });
27
27
  // deploy l2 token
28
28
  const token = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18).send().deployed();
@@ -48,7 +48,7 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
48
48
  const underlyingERC20 = getContract({
49
49
  address: underlyingERC20Address.toString(),
50
50
  abi: TestERC20Abi,
51
- client: walletClient
51
+ client: l1Client
52
52
  });
53
53
  return {
54
54
  token,
@@ -70,23 +70,22 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
70
70
  ethAccount;
71
71
  tokenPortalAddress;
72
72
  underlyingERC20Address;
73
- publicClient;
74
- walletClient;
73
+ l1Client;
75
74
  l1ContractAddresses;
76
75
  ownerWallet;
77
- static async new(aztecNode, pxeService, publicClient, walletClient, wallet, logger, underlyingERC20Address) {
78
- const ethAccount = EthAddress.fromString((await walletClient.getAddresses())[0]);
76
+ static async new(aztecNode, pxeService, l1Client, wallet, logger, underlyingERC20Address) {
77
+ const ethAccount = EthAddress.fromString((await l1Client.getAddresses())[0]);
79
78
  const l1ContractAddresses = (await pxeService.getNodeInfo()).l1ContractAddresses;
80
79
  // Deploy and initialize all required contracts
81
80
  logger.info('Deploying and initializing token, portal and its bridge...');
82
- const { token, bridge, tokenPortalAddress, underlyingERC20 } = await deployAndInitializeTokenAndBridgeContracts(wallet, walletClient, publicClient, l1ContractAddresses.registryAddress, wallet.getAddress(), underlyingERC20Address);
81
+ const { token, bridge, tokenPortalAddress, underlyingERC20 } = await deployAndInitializeTokenAndBridgeContracts(wallet, l1Client, l1ContractAddresses.registryAddress, wallet.getAddress(), underlyingERC20Address);
83
82
  logger.info('Deployed and initialized token, portal and its bridge.');
84
- return new CrossChainTestHarness(aztecNode, pxeService, logger, token, bridge, ethAccount, tokenPortalAddress, underlyingERC20.address, publicClient, walletClient, l1ContractAddresses, wallet);
83
+ return new CrossChainTestHarness(aztecNode, pxeService, logger, token, bridge, ethAccount, tokenPortalAddress, underlyingERC20.address, l1Client, l1ContractAddresses, wallet);
85
84
  }
86
85
  l1TokenManager;
87
86
  l1TokenPortalManager;
88
87
  ownerAddress;
89
- constructor(/** Aztec node instance. */ aztecNode, /** Private eXecution Environment (PXE). */ pxeService, /** Logger. */ logger, /** L2 Token contract. */ l2Token, /** L2 Token bridge contract. */ l2Bridge, /** Eth account to interact with. */ ethAccount, /** Portal address. */ tokenPortalAddress, /** Underlying token for portal tests. */ underlyingERC20Address, /** Viem Public client instance. */ publicClient, /** Viem Wallet Client instance. */ walletClient, /** Deployment addresses for all L1 contracts */ l1ContractAddresses, /** Wallet of the owner. */ ownerWallet){
88
+ constructor(/** Aztec node instance. */ aztecNode, /** Private eXecution Environment (PXE). */ pxeService, /** Logger. */ logger, /** L2 Token contract. */ l2Token, /** L2 Token bridge contract. */ l2Bridge, /** Eth account to interact with. */ ethAccount, /** Portal address. */ tokenPortalAddress, /** Underlying token for portal tests. */ underlyingERC20Address, /** Viem Extended client instance. */ l1Client, /** Deployment addresses for all L1 contracts */ l1ContractAddresses, /** Wallet of the owner. */ ownerWallet){
90
89
  this.aztecNode = aztecNode;
91
90
  this.pxeService = pxeService;
92
91
  this.logger = logger;
@@ -95,11 +94,10 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
95
94
  this.ethAccount = ethAccount;
96
95
  this.tokenPortalAddress = tokenPortalAddress;
97
96
  this.underlyingERC20Address = underlyingERC20Address;
98
- this.publicClient = publicClient;
99
- this.walletClient = walletClient;
97
+ this.l1Client = l1Client;
100
98
  this.l1ContractAddresses = l1ContractAddresses;
101
99
  this.ownerWallet = ownerWallet;
102
- this.l1TokenPortalManager = new L1TokenPortalManager(this.tokenPortalAddress, this.underlyingERC20Address, this.l1ContractAddresses.feeAssetHandlerAddress, this.l1ContractAddresses.outboxAddress, this.publicClient, this.walletClient, this.logger);
100
+ this.l1TokenPortalManager = new L1TokenPortalManager(this.tokenPortalAddress, this.underlyingERC20Address, this.l1ContractAddresses.feeAssetHandlerAddress, this.l1ContractAddresses.outboxAddress, this.l1Client, this.logger);
103
101
  this.l1TokenManager = this.l1TokenPortalManager.getTokenManager();
104
102
  this.ownerAddress = this.ownerWallet.getAddress();
105
103
  }
@@ -107,14 +105,14 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
107
105
  const contract = getContract({
108
106
  abi: TestERC20Abi,
109
107
  address: this.l1TokenManager.tokenAddress.toString(),
110
- client: this.walletClient
108
+ client: this.l1Client
111
109
  });
112
110
  const balanceBefore = await this.l1TokenManager.getL1TokenBalance(this.ethAccount.toString());
113
111
  const hash = await contract.write.mint([
114
112
  this.ethAccount.toString(),
115
113
  amount
116
114
  ]);
117
- await this.publicClient.waitForTransactionReceipt({
115
+ await this.l1Client.waitForTransactionReceipt({
118
116
  hash
119
117
  });
120
118
  expect(await this.l1TokenManager.getL1TokenBalance(this.ethAccount.toString())).toEqual(balanceBefore + amount);
@@ -1,5 +1,5 @@
1
1
  import { type AztecAddress, type AztecNode, EthAddress, L1FeeJuicePortalManager, type L1TokenManager, type L2AmountClaim, type Logger, type PXE, type Wallet } from '@aztec/aztec.js';
2
- import type { ViemPublicClient, ViemWalletClient } from '@aztec/ethereum';
2
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum';
3
3
  import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
4
4
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
5
5
  export interface IGasBridgingTestHarness {
@@ -13,8 +13,7 @@ export interface FeeJuicePortalTestingHarnessFactoryConfig {
13
13
  aztecNode: AztecNode;
14
14
  aztecNodeAdmin?: AztecNodeAdmin;
15
15
  pxeService: PXE;
16
- publicClient: ViemPublicClient;
17
- walletClient: ViemWalletClient;
16
+ l1Client: ExtendedViemWalletClient;
18
17
  wallet: Wallet;
19
18
  logger: Logger;
20
19
  mockL1?: boolean;
@@ -48,10 +47,8 @@ export declare class GasBridgingTestHarness implements IGasBridgingTestHarness {
48
47
  l1FeeJuiceAddress: EthAddress;
49
48
  /** Fee asset handler address. */
50
49
  feeAssetHandlerAddress: EthAddress;
51
- /** Viem Public client instance. */
52
- publicClient: ViemPublicClient;
53
- /** Viem Wallet Client instance. */
54
- walletClient: ViemWalletClient;
50
+ /** Viem Extended client instance. */
51
+ l1Client: ExtendedViemWalletClient;
55
52
  readonly l1TokenManager: L1TokenManager;
56
53
  readonly feeJuicePortalManager: L1FeeJuicePortalManager;
57
54
  constructor(
@@ -73,10 +70,8 @@ export declare class GasBridgingTestHarness implements IGasBridgingTestHarness {
73
70
  l1FeeJuiceAddress: EthAddress,
74
71
  /** Fee asset handler address. */
75
72
  feeAssetHandlerAddress: EthAddress,
76
- /** Viem Public client instance. */
77
- publicClient: ViemPublicClient,
78
- /** Viem Wallet Client instance. */
79
- walletClient: ViemWalletClient);
73
+ /** Viem Extended client instance. */
74
+ l1Client: ExtendedViemWalletClient);
80
75
  mintTokensOnL1(amount: bigint, to?: EthAddress): Promise<void>;
81
76
  getL1FeeJuiceBalance(address: EthAddress): Promise<bigint>;
82
77
  sendTokensToPortalPublic(bridgeAmount: bigint, l2Address: AztecAddress): Promise<L2AmountClaim>;
@@ -1 +1 @@
1
- {"version":3,"file":"gas_portal_test_harness.d.ts","sourceRoot":"","sources":["../../src/shared/gas_portal_test_harness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gas_portal_test_harness.d.ts","sourceRoot":"","sources":["../../src/shared/gas_portal_test_harness.ts"],"names":[],"mappings":"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"}
@@ -9,8 +9,8 @@ export class FeeJuicePortalTestingHarnessFactory {
9
9
  this.config = config;
10
10
  }
11
11
  async createReal() {
12
- const { aztecNode, aztecNodeAdmin, pxeService, publicClient, walletClient, wallet, logger } = this.config;
13
- const ethAccount = EthAddress.fromString((await walletClient.getAddresses())[0]);
12
+ const { aztecNode, aztecNodeAdmin, pxeService, l1Client, wallet, logger } = this.config;
13
+ const ethAccount = EthAddress.fromString((await l1Client.getAddresses())[0]);
14
14
  const l1ContractAddresses = (await pxeService.getNodeInfo()).l1ContractAddresses;
15
15
  const feeJuiceAddress = l1ContractAddresses.feeJuiceAddress;
16
16
  const feeJuicePortalAddress = l1ContractAddresses.feeJuicePortalAddress;
@@ -18,7 +18,7 @@ export class FeeJuicePortalTestingHarnessFactory {
18
18
  throw new Error('Fee Juice portal not deployed on L1');
19
19
  }
20
20
  const gasL2 = await FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, wallet);
21
- return new GasBridgingTestHarness(aztecNode, aztecNodeAdmin, pxeService, logger, gasL2, ethAccount, feeJuicePortalAddress, feeJuiceAddress, l1ContractAddresses.feeAssetHandlerAddress, publicClient, walletClient);
21
+ return new GasBridgingTestHarness(aztecNode, aztecNodeAdmin, pxeService, logger, gasL2, ethAccount, feeJuicePortalAddress, feeJuiceAddress, l1ContractAddresses.feeAssetHandlerAddress, l1Client);
22
22
  }
23
23
  static create(config) {
24
24
  const factory = new FeeJuicePortalTestingHarnessFactory(config);
@@ -38,11 +38,10 @@ export class FeeJuicePortalTestingHarnessFactory {
38
38
  feeJuicePortalAddress;
39
39
  l1FeeJuiceAddress;
40
40
  feeAssetHandlerAddress;
41
- publicClient;
42
- walletClient;
41
+ l1Client;
43
42
  l1TokenManager;
44
43
  feeJuicePortalManager;
45
- constructor(/** Aztec node */ aztecNode, /** Aztec node admin interface */ aztecNodeAdmin, /** Private eXecution Environment (PXE). */ pxeService, /** Logger. */ logger, /** L2 Token/Bridge contract. */ feeJuice, /** Eth account to interact with. */ ethAccount, /** Portal address. */ feeJuicePortalAddress, /** Underlying token for portal tests. */ l1FeeJuiceAddress, /** Fee asset handler address. */ feeAssetHandlerAddress, /** Viem Public client instance. */ publicClient, /** Viem Wallet Client instance. */ walletClient){
44
+ constructor(/** Aztec node */ aztecNode, /** Aztec node admin interface */ aztecNodeAdmin, /** Private eXecution Environment (PXE). */ pxeService, /** Logger. */ logger, /** L2 Token/Bridge contract. */ feeJuice, /** Eth account to interact with. */ ethAccount, /** Portal address. */ feeJuicePortalAddress, /** Underlying token for portal tests. */ l1FeeJuiceAddress, /** Fee asset handler address. */ feeAssetHandlerAddress, /** Viem Extended client instance. */ l1Client){
46
45
  this.aztecNode = aztecNode;
47
46
  this.aztecNodeAdmin = aztecNodeAdmin;
48
47
  this.pxeService = pxeService;
@@ -52,9 +51,8 @@ export class FeeJuicePortalTestingHarnessFactory {
52
51
  this.feeJuicePortalAddress = feeJuicePortalAddress;
53
52
  this.l1FeeJuiceAddress = l1FeeJuiceAddress;
54
53
  this.feeAssetHandlerAddress = feeAssetHandlerAddress;
55
- this.publicClient = publicClient;
56
- this.walletClient = walletClient;
57
- this.feeJuicePortalManager = new L1FeeJuicePortalManager(this.feeJuicePortalAddress, this.l1FeeJuiceAddress, this.feeAssetHandlerAddress, this.publicClient, this.walletClient, this.logger);
54
+ this.l1Client = l1Client;
55
+ this.feeJuicePortalManager = new L1FeeJuicePortalManager(this.feeJuicePortalAddress, this.l1FeeJuiceAddress, this.feeAssetHandlerAddress, this.l1Client, this.logger);
58
56
  this.l1TokenManager = this.feeJuicePortalManager.getTokenManager();
59
57
  }
60
58
  async mintTokensOnL1(amount, to = this.ethAccount) {
@@ -63,7 +61,7 @@ export class FeeJuicePortalTestingHarnessFactory {
63
61
  const feeAssetL1 = getContract({
64
62
  address: this.l1FeeJuiceAddress.toString(),
65
63
  abi: TestERC20Abi,
66
- client: this.walletClient
64
+ client: this.l1Client
67
65
  });
68
66
  await feeAssetL1.write.mint([
69
67
  to.toString(),
@@ -1,6 +1,6 @@
1
1
  import { type AccountWallet, type AztecNode, type Logger, type PXE } from '@aztec/aztec.js';
2
2
  import { CheatCodes } from '@aztec/aztec.js/testing';
3
- import { type DeployL1ContractsReturnType, type ViemPublicClient, type ViemWalletClient } from '@aztec/ethereum';
3
+ import { type DeployL1ContractsReturnType, type ExtendedViemWalletClient } from '@aztec/ethereum';
4
4
  /** Objects to be returned by the uniswap setup function */
5
5
  export type UniswapSetupContext = {
6
6
  /** Aztec Node instance */
@@ -9,10 +9,8 @@ export type UniswapSetupContext = {
9
9
  pxe: PXE;
10
10
  /** Logger instance named as the current test. */
11
11
  logger: Logger;
12
- /** Viem Public client instance. */
13
- publicClient: ViemPublicClient;
14
- /** Viem Wallet Client instance. */
15
- walletClient: ViemWalletClient;
12
+ /** The L1 wallet client, extended with public actions. */
13
+ l1Client: ExtendedViemWalletClient;
16
14
  /** The owner wallet. */
17
15
  ownerWallet: AccountWallet;
18
16
  /** The sponsor wallet. */
@@ -1 +1 @@
1
- {"version":3,"file":"uniswap_l1_l2.d.ts","sourceRoot":"","sources":["../../src/shared/uniswap_l1_l2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,SAAS,EAGd,KAAK,MAAM,EACX,KAAK,GAAG,EAGT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACL,KAAK,2BAA2B,EAEhC,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAGtB,MAAM,iBAAiB,CAAC;AAqBzB,2DAA2D;AAC3D,MAAM,MAAM,mBAAmB,GAAG;IAChC,0BAA0B;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,+CAA+C;IAC/C,GAAG,EAAE,GAAG,CAAC;IACT,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,mCAAmC;IACnC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,wBAAwB;IACxB,WAAW,EAAE,aAAa,CAAC;IAC3B,0BAA0B;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO;IACP,uBAAuB,EAAE,2BAA2B,CAAC;IACrD,4BAA4B;IAC5B,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAGF,eAAO,MAAM,oBAAoB,UACxB,MAAM,QAAQ,mBAAmB,CAAC,WAChC,MAAM,QAAQ,IAAI,CAAC,2CA69B7B,CAAC"}
1
+ {"version":3,"file":"uniswap_l1_l2.d.ts","sourceRoot":"","sources":["../../src/shared/uniswap_l1_l2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,SAAS,EAGd,KAAK,MAAM,EACX,KAAK,GAAG,EAGT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAI9B,MAAM,iBAAiB,CAAC;AAqBzB,2DAA2D;AAC3D,MAAM,MAAM,mBAAmB,GAAG;IAChC,0BAA0B;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,+CAA+C;IAC/C,GAAG,EAAE,GAAG,CAAC;IACT,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,QAAQ,EAAE,wBAAwB,CAAC;IACnC,wBAAwB;IACxB,WAAW,EAAE,aAAa,CAAC;IAC3B,0BAA0B;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO;IACP,uBAAuB,EAAE,2BAA2B,CAAC;IACrD,4BAA4B;IAC5B,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAGF,eAAO,MAAM,oBAAoB,UACxB,MAAM,QAAQ,mBAAmB,CAAC,WAChC,MAAM,QAAQ,IAAI,CAAC,2CA88B7B,CAAC"}