@aztec/end-to-end 0.0.1-commit.c7c42ec → 0.0.1-commit.f295ac2

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 (111) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +3 -2
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/benchmark.js +21 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +12 -13
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +105 -135
  7. package/dest/bench/client_flows/data_extractor.js +3 -1
  8. package/dest/bench/utils.d.ts +5 -5
  9. package/dest/bench/utils.d.ts.map +1 -1
  10. package/dest/bench/utils.js +8 -5
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -7
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  13. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +98 -113
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +15 -10
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  16. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +89 -70
  17. package/dest/e2e_deploy_contract/deploy_test.d.ts +4 -3
  18. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  19. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  20. package/dest/e2e_epochs/epochs_test.js +2 -2
  21. package/dest/e2e_fees/bridging_race.notest.js +2 -4
  22. package/dest/e2e_fees/fees_test.d.ts +13 -13
  23. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  24. package/dest/e2e_fees/fees_test.js +123 -141
  25. package/dest/e2e_l1_publisher/write_json.d.ts +3 -3
  26. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  27. package/dest/e2e_l1_publisher/write_json.js +19 -15
  28. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  29. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  30. package/dest/e2e_nested_contract/nested_contract_test.js +32 -40
  31. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  32. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  33. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  34. package/dest/e2e_p2p/p2p_network.d.ts +7 -6
  35. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  36. package/dest/e2e_p2p/p2p_network.js +107 -104
  37. package/dest/e2e_p2p/shared.d.ts +1 -1
  38. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  39. package/dest/e2e_p2p/shared.js +4 -4
  40. package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
  41. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_token_contract/token_contract_test.js +90 -92
  43. package/dest/fixtures/e2e_prover_test.d.ts +8 -14
  44. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  45. package/dest/fixtures/e2e_prover_test.js +83 -95
  46. package/dest/fixtures/setup.d.ts +216 -0
  47. package/dest/fixtures/setup.d.ts.map +1 -0
  48. package/dest/fixtures/setup.js +684 -0
  49. package/dest/fixtures/utils.d.ts +5 -194
  50. package/dest/fixtures/utils.d.ts.map +1 -1
  51. package/dest/fixtures/utils.js +4 -619
  52. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  53. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  54. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  55. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  56. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  57. package/dest/quality_of_service/prometheus_client.js +67 -0
  58. package/dest/shared/cross_chain_test_harness.d.ts +14 -3
  59. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  60. package/dest/shared/cross_chain_test_harness.js +2 -2
  61. package/dest/shared/gas_portal_test_harness.d.ts +11 -1
  62. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  63. package/dest/shared/index.d.ts +2 -2
  64. package/dest/shared/index.d.ts.map +1 -1
  65. package/dest/shared/uniswap_l1_l2.d.ts +3 -28
  66. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  67. package/dest/shared/uniswap_l1_l2.js +39 -21
  68. package/dest/simulators/lending_simulator.d.ts +5 -1
  69. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  70. package/dest/spartan/setup_test_wallets.d.ts +4 -3
  71. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  72. package/dest/spartan/tx_metrics.d.ts +4 -1
  73. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  74. package/dest/spartan/tx_metrics.js +24 -1
  75. package/dest/spartan/utils.d.ts +12 -5
  76. package/dest/spartan/utils.d.ts.map +1 -1
  77. package/dest/spartan/utils.js +123 -73
  78. package/package.json +40 -39
  79. package/src/bench/client_flows/benchmark.ts +24 -2
  80. package/src/bench/client_flows/client_flows_benchmark.ts +143 -196
  81. package/src/bench/client_flows/data_extractor.ts +1 -1
  82. package/src/bench/utils.ts +11 -7
  83. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +107 -142
  84. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +127 -116
  85. package/src/e2e_deploy_contract/deploy_test.ts +21 -14
  86. package/src/e2e_epochs/epochs_test.ts +2 -2
  87. package/src/e2e_fees/bridging_race.notest.ts +2 -5
  88. package/src/e2e_fees/fees_test.ts +172 -216
  89. package/src/e2e_l1_publisher/write_json.ts +22 -17
  90. package/src/e2e_nested_contract/nested_contract_test.ts +35 -56
  91. package/src/e2e_p2p/inactivity_slash_test.ts +5 -5
  92. package/src/e2e_p2p/p2p_network.ts +166 -168
  93. package/src/e2e_p2p/shared.ts +6 -5
  94. package/src/e2e_token_contract/token_contract_test.ts +105 -118
  95. package/src/fixtures/e2e_prover_test.ts +107 -137
  96. package/src/fixtures/setup.ts +1010 -0
  97. package/src/fixtures/utils.ts +27 -907
  98. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  99. package/src/quality_of_service/prometheus_client.ts +113 -0
  100. package/src/shared/cross_chain_test_harness.ts +3 -9
  101. package/src/shared/index.ts +1 -1
  102. package/src/shared/uniswap_l1_l2.ts +46 -58
  103. package/src/spartan/setup_test_wallets.ts +7 -1
  104. package/src/spartan/tx_metrics.ts +27 -4
  105. package/src/spartan/utils.ts +112 -24
  106. package/dest/fixtures/snapshot_manager.d.ts +0 -93
  107. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  108. package/dest/fixtures/snapshot_manager.js +0 -493
  109. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  110. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  111. package/src/fixtures/snapshot_manager.ts +0 -651
@@ -211,7 +211,7 @@ export class EpochsTestContext {
211
211
  ...opts,
212
212
  },
213
213
  this.context.aztecNode,
214
- undefined,
214
+ this.context.prefilledPublicData ?? [],
215
215
  { dateProvider: this.context.dateProvider },
216
216
  ),
217
217
  );
@@ -348,7 +348,7 @@ export class EpochsTestContext {
348
348
  ]);
349
349
  this.logger.info(`Wait for node synch ${blockNumber} ${type}`, { blockNumber, type, syncState, tips });
350
350
  if (type === 'proven') {
351
- synched = tips.proven.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
351
+ synched = tips.proven.block.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
352
352
  } else if (type === 'finalized') {
353
353
  synched = syncState.finalizedBlockNumber >= blockNumber;
354
354
  } else {
@@ -26,11 +26,8 @@ describe('e2e_fees bridging_race', () => {
26
26
  });
27
27
 
28
28
  beforeAll(async () => {
29
- await t.applyInitialAccountsSnapshot();
30
- await t.applyPublicDeployAccountsSnapshot();
31
- await t.applySetupFeeJuiceSnapshot();
32
-
33
- ({ wallet, logger } = await t.setup());
29
+ await t.setup();
30
+ ({ wallet, logger } = t);
34
31
  });
35
32
 
36
33
  afterAll(async () => {
@@ -26,25 +26,19 @@ import { getContract } from 'viem';
26
26
 
27
27
  import { MNEMONIC } from '../fixtures/fixtures.js';
28
28
  import {
29
- type ISnapshotManager,
30
- type SubsystemsContext,
31
- createSnapshotManager,
29
+ type EndToEndContext,
30
+ type SetupOptions,
32
31
  deployAccounts,
33
- } from '../fixtures/snapshot_manager.js';
32
+ publicDeployAccounts,
33
+ setup,
34
+ teardown,
35
+ } from '../fixtures/setup.js';
34
36
  import { mintTokensToPrivate } from '../fixtures/token_utils.js';
35
- import {
36
- type BalancesFn,
37
- type SetupOptions,
38
- ensureAccountContractsPublished,
39
- getBalancesFn,
40
- setupSponsoredFPC,
41
- } from '../fixtures/utils.js';
37
+ import { type BalancesFn, getBalancesFn, setupSponsoredFPC } from '../fixtures/utils.js';
42
38
  import { FeeJuicePortalTestingHarnessFactory, type GasBridgingTestHarness } from '../shared/gas_portal_test_harness.js';
43
39
 
44
- const { E2E_DATA_PATH: dataPath } = process.env;
45
-
46
40
  /**
47
- * Test fixture for testing fees. Provides the following snapshots:
41
+ * Test fixture for testing fees. Provides the following setup steps:
48
42
  * InitialAccounts: Initializes 3 Schnorr account contracts.
49
43
  * PublicDeployAccounts: Deploys the accounts publicly.
50
44
  * DeployFeeJuice: Deploys the Fee Juice contract.
@@ -54,8 +48,8 @@ const { E2E_DATA_PATH: dataPath } = process.env;
54
48
  * SetupSubscription: Deploys a counter contract and a subscription contract, and mints Fee Juice to the subscription contract.
55
49
  */
56
50
  export class FeesTest {
57
- private snapshotManager: ISnapshotManager;
58
51
  private accounts: AztecAddress[] = [];
52
+ public context!: EndToEndContext;
59
53
 
60
54
  public logger: Logger;
61
55
  public aztecNode!: AztecNode;
@@ -82,7 +76,6 @@ export class FeesTest {
82
76
  public subscriptionContract!: AppSubscriptionContract;
83
77
  public feeJuiceBridgeTestHarness!: GasBridgingTestHarness;
84
78
 
85
- public context!: SubsystemsContext;
86
79
  public chainMonitor!: ChainMonitor;
87
80
 
88
81
  public getCoinbaseBalance!: () => Promise<bigint>;
@@ -99,7 +92,7 @@ export class FeesTest {
99
92
  constructor(
100
93
  testName: string,
101
94
  private numberOfAccounts = 3,
102
- setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {},
95
+ private setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {},
103
96
  ) {
104
97
  if (!numberOfAccounts) {
105
98
  throw new Error('There must be at least 1 initial account.');
@@ -107,30 +100,33 @@ export class FeesTest {
107
100
  setupOptions.coinbase ??= EthAddress.random();
108
101
  this.coinbase = setupOptions.coinbase!;
109
102
  this.logger = createLogger(`e2e:e2e_fees:${testName}`);
110
- this.snapshotManager = createSnapshotManager(
111
- `e2e_fees/${testName}-${numberOfAccounts}`,
112
- dataPath,
113
- { startProverNode: true, ...setupOptions },
114
- { ...setupOptions },
115
- );
116
103
  }
117
104
 
118
105
  async setup() {
119
- const context = await this.snapshotManager.setup();
106
+ this.logger.verbose('Setting up fresh context...');
107
+ this.context = await setup(0, {
108
+ startProverNode: true,
109
+ ...this.setupOptions,
110
+ fundSponsoredFPC: true,
111
+ skipAccountDeployment: true,
112
+ l1ContractsArgs: { ...this.setupOptions },
113
+ });
120
114
 
121
- this.rollupContract = RollupContract.getFromConfig(context.aztecNodeConfig);
122
- this.chainMonitor = new ChainMonitor(this.rollupContract, context.dateProvider, this.logger, 200).start();
115
+ this.rollupContract = RollupContract.getFromConfig(this.context.config);
116
+ this.chainMonitor = new ChainMonitor(this.rollupContract, this.context.dateProvider!, this.logger, 200).start();
117
+
118
+ await this.applyBaseSetup();
123
119
 
124
120
  return this;
125
121
  }
126
122
 
127
123
  async teardown() {
128
124
  await this.chainMonitor.stop();
129
- await this.snapshotManager.teardown();
125
+ await teardown(this.context);
130
126
  }
131
127
 
132
128
  setIsMarkingAsProven(b: boolean) {
133
- this.context.watcher.setIsMarkingAsProven(b);
129
+ this.context.watcher!.setIsMarkingAsProven(b);
134
130
  }
135
131
 
136
132
  async catchUpProvenChain() {
@@ -144,9 +140,7 @@ export class FeesTest {
144
140
  const blockReward = await this.rollupContract.getCheckpointReward();
145
141
  const rewardConfig = await this.rollupContract.getRewardConfig();
146
142
 
147
- const balance = await this.feeJuiceBridgeTestHarness.getL1FeeJuiceBalance(
148
- EthAddress.fromString(rewardConfig.rewardDistributor),
149
- );
143
+ const balance = await this.feeJuiceBridgeTestHarness.getL1FeeJuiceBalance(rewardConfig.rewardDistributor);
150
144
 
151
145
  const toDistribute = balance > blockReward ? blockReward : balance;
152
146
  const sequencerBlockRewards = (toDistribute * BigInt(rewardConfig.sequencerBps)) / 10000n;
@@ -178,210 +172,172 @@ export class FeesTest {
178
172
  expect(balanceAfter).toEqual(balanceBefore + amount);
179
173
  }
180
174
 
181
- public async applyBaseSnapshots() {
182
- await this.applyInitialAccountsSnapshot();
183
- await this.applyPublicDeployAccountsSnapshot();
184
- await this.applySetupFeeJuiceSnapshot();
185
- await this.applyDeployBananaTokenSnapshot();
175
+ public async applyBaseSetup() {
176
+ await this.applyInitialAccounts();
177
+ await this.applyPublicDeployAccounts();
178
+ await this.applySetupFeeJuice();
179
+ await this.applyDeployBananaToken();
186
180
  }
187
181
 
188
- async applyInitialAccountsSnapshot() {
189
- await this.snapshotManager.snapshot(
190
- 'initial_accounts',
191
- deployAccounts(this.numberOfAccounts, this.logger),
192
- async ({ deployedAccounts }, { wallet, aztecNode, cheatCodes }) => {
193
- this.wallet = wallet;
194
- this.aztecNode = aztecNode;
195
- this.aztecNodeAdmin = aztecNode;
196
- this.gasSettings = GasSettings.default({ maxFeesPerGas: (await this.aztecNode.getCurrentBaseFees()).mul(2) });
197
- this.cheatCodes = cheatCodes;
198
- this.accounts = deployedAccounts.map(a => a.address);
199
- this.accounts.forEach((a, i) => this.logger.verbose(`Account ${i} address: ${a}`));
200
- [this.aliceAddress, this.bobAddress, this.sequencerAddress] = this.accounts.slice(0, 3);
201
-
202
- // We set Alice as the FPC admin to avoid the need for deployment of another account.
203
- this.fpcAdmin = this.aliceAddress;
204
-
205
- const canonicalFeeJuice = await getCanonicalFeeJuice();
206
- this.feeJuiceContract = FeeJuiceContract.at(canonicalFeeJuice.address, this.wallet);
207
- },
208
- );
182
+ async applyInitialAccounts() {
183
+ this.logger.info('Applying initial accounts setup');
184
+
185
+ const { deployedAccounts } = await deployAccounts(
186
+ this.numberOfAccounts,
187
+ this.logger,
188
+ )({
189
+ wallet: this.context.wallet,
190
+ initialFundedAccounts: this.context.initialFundedAccounts,
191
+ });
192
+
193
+ this.wallet = this.context.wallet;
194
+ this.aztecNode = this.context.aztecNodeService!;
195
+ this.aztecNodeAdmin = this.context.aztecNodeService!;
196
+ this.gasSettings = GasSettings.default({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
197
+ this.cheatCodes = this.context.cheatCodes;
198
+ this.accounts = deployedAccounts.map(a => a.address);
199
+ this.accounts.forEach((a, i) => this.logger.verbose(`Account ${i} address: ${a}`));
200
+ [this.aliceAddress, this.bobAddress, this.sequencerAddress] = this.accounts.slice(0, 3);
201
+
202
+ // We set Alice as the FPC admin to avoid the need for deployment of another account.
203
+ this.fpcAdmin = this.aliceAddress;
204
+
205
+ const canonicalFeeJuice = await getCanonicalFeeJuice();
206
+ this.feeJuiceContract = FeeJuiceContract.at(canonicalFeeJuice.address, this.wallet);
209
207
  }
210
208
 
211
- async applyPublicDeployAccountsSnapshot() {
212
- await this.snapshotManager.snapshot('public_deploy_accounts', () =>
213
- ensureAccountContractsPublished(this.wallet, this.accounts),
214
- );
209
+ async applyPublicDeployAccounts() {
210
+ this.logger.info('Applying public deploy accounts setup');
211
+ await publicDeployAccounts(this.wallet, this.accounts);
215
212
  }
216
213
 
217
- async applySetupFeeJuiceSnapshot() {
218
- await this.snapshotManager.snapshot(
219
- 'setup_fee_juice',
220
- async () => {},
221
- async (_data, context) => {
222
- this.context = context;
223
-
224
- this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.wallet);
225
-
226
- this.getGasBalanceFn = getBalancesFn(
227
- '⛽',
228
- this.feeJuiceContract.methods.balance_of_public,
229
- this.aliceAddress,
230
- this.logger,
231
- );
232
-
233
- this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
234
- aztecNode: context.aztecNode,
235
- aztecNodeAdmin: context.aztecNode,
236
- l1Client: context.deployL1ContractsValues.l1Client,
237
- wallet: this.wallet,
238
- logger: this.logger,
239
- });
240
- },
214
+ async applySetupFeeJuice() {
215
+ this.logger.info('Applying fee juice setup');
216
+
217
+ this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.wallet);
218
+
219
+ this.getGasBalanceFn = getBalancesFn(
220
+ '⛽',
221
+ this.feeJuiceContract.methods.balance_of_public,
222
+ this.aliceAddress,
223
+ this.logger,
241
224
  );
225
+
226
+ this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
227
+ aztecNode: this.context.aztecNodeService!,
228
+ aztecNodeAdmin: this.context.aztecNodeService!,
229
+ l1Client: this.context.deployL1ContractsValues.l1Client,
230
+ wallet: this.wallet,
231
+ logger: this.logger,
232
+ });
242
233
  }
243
234
 
244
- async applyDeployBananaTokenSnapshot() {
245
- await this.snapshotManager.snapshot(
246
- 'deploy_banana_token',
247
- async () => {
248
- const bananaCoin = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n)
249
- .send({ from: this.aliceAddress })
250
- .deployed();
251
- this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
252
- return { bananaCoinAddress: bananaCoin.address };
253
- },
254
- ({ bananaCoinAddress }) => {
255
- this.bananaCoin = BananaCoin.at(bananaCoinAddress, this.wallet);
256
- const logger = this.logger;
257
- this.getBananaPublicBalanceFn = getBalancesFn(
258
- '🍌.public',
259
- this.bananaCoin.methods.balance_of_public,
260
- this.aliceAddress,
261
- logger,
262
- );
263
- this.getBananaPrivateBalanceFn = getBalancesFn(
264
- '🍌.private',
265
- this.bananaCoin.methods.balance_of_private,
266
- this.aliceAddress,
267
- logger,
268
- );
269
- return Promise.resolve();
270
- },
235
+ async applyDeployBananaToken() {
236
+ this.logger.info('Applying deploy banana token setup');
237
+
238
+ const bananaCoin = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n)
239
+ .send({ from: this.aliceAddress })
240
+ .deployed();
241
+ this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
242
+
243
+ this.bananaCoin = bananaCoin;
244
+ this.getBananaPublicBalanceFn = getBalancesFn(
245
+ '🍌.public',
246
+ this.bananaCoin.methods.balance_of_public,
247
+ this.aliceAddress,
248
+ this.logger,
249
+ );
250
+ this.getBananaPrivateBalanceFn = getBalancesFn(
251
+ '🍌.private',
252
+ this.bananaCoin.methods.balance_of_private,
253
+ this.aliceAddress,
254
+ this.logger,
271
255
  );
272
256
  }
273
257
 
274
- public async applyFPCSetupSnapshot() {
275
- await this.snapshotManager.snapshot(
276
- 'fpc_setup',
277
- async context => {
278
- const feeJuiceContract = this.feeJuiceBridgeTestHarness.feeJuice;
279
- expect((await context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
280
-
281
- const bananaCoin = this.bananaCoin;
282
- const bananaFPC = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin)
283
- .send({ from: this.aliceAddress })
284
- .deployed();
285
-
286
- this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
287
-
288
- await this.feeJuiceBridgeTestHarness.bridgeFromL1ToL2(bananaFPC.address, this.aliceAddress);
289
-
290
- return {
291
- bananaFPCAddress: bananaFPC.address,
292
- feeJuiceAddress: feeJuiceContract.address,
293
- l1FeeJuiceAddress: this.feeJuiceBridgeTestHarness.l1FeeJuiceAddress,
294
- rollupAddress: context.deployL1ContractsValues.l1ContractAddresses.rollupAddress,
295
- };
296
- },
297
- (data, context) => {
298
- const bananaFPC = FPCContract.at(data.bananaFPCAddress, this.wallet);
299
- this.bananaFPC = bananaFPC;
300
-
301
- this.getCoinbaseBalance = async () => {
302
- const l1Client = createExtendedL1Client(context.aztecNodeConfig.l1RpcUrls, MNEMONIC);
303
- const gasL1 = getContract({
304
- address: data.l1FeeJuiceAddress.toString(),
305
- abi: TestERC20Abi,
306
- client: l1Client,
307
- });
308
- return await gasL1.read.balanceOf([this.coinbase.toString()]);
309
- };
310
-
311
- this.getCoinbaseSequencerRewards = async () => {
312
- return await this.rollupContract.getSequencerRewards(this.coinbase);
313
- };
314
-
315
- this.getProverFee = async (blockNumber: BlockNumber) => {
316
- const block = await this.aztecNode.getBlock(blockNumber);
317
-
318
- // @todo @lherskind As we deal with #13601
319
- // Right now the value is from `FeeLib.sol`
320
- const L1_GAS_PER_EPOCH_VERIFIED = 1000000n;
321
-
322
- // We round up
323
- const mulDiv = (a: bigint, b: bigint, c: bigint) => (a * b) / c + ((a * b) % c > 0n ? 1n : 0n);
324
-
325
- const { baseFee } = await this.rollupContract.getL1FeesAt(block!.header.globalVariables.timestamp);
326
- const proverCost =
327
- mulDiv(
328
- mulDiv(L1_GAS_PER_EPOCH_VERIFIED, baseFee, await this.rollupContract.getEpochDuration()),
329
- 1n,
330
- await this.rollupContract.getManaTarget(),
331
- ) + (await this.rollupContract.getProvingCostPerMana());
332
-
333
- const price = await this.rollupContract.getFeeAssetPerEth();
334
-
335
- const mana = block!.header.totalManaUsed.toBigInt();
336
- return mulDiv(mana * proverCost, price, 10n ** 9n);
337
- };
338
- return Promise.resolve();
339
- },
340
- );
258
+ public async applyFPCSetup() {
259
+ this.logger.info('Applying FPC setup');
260
+
261
+ const feeJuiceContract = this.feeJuiceBridgeTestHarness.feeJuice;
262
+ expect((await this.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
263
+
264
+ const bananaCoin = this.bananaCoin;
265
+ const bananaFPC = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin)
266
+ .send({ from: this.aliceAddress })
267
+ .deployed();
268
+
269
+ this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
270
+
271
+ await this.feeJuiceBridgeTestHarness.bridgeFromL1ToL2(bananaFPC.address, this.aliceAddress);
272
+
273
+ this.bananaFPC = bananaFPC;
274
+
275
+ const l1FeeJuiceAddress = this.feeJuiceBridgeTestHarness.l1FeeJuiceAddress;
276
+
277
+ this.getCoinbaseBalance = async () => {
278
+ const l1Client = createExtendedL1Client(this.context.config.l1RpcUrls, MNEMONIC);
279
+ const gasL1 = getContract({
280
+ address: l1FeeJuiceAddress.toString(),
281
+ abi: TestERC20Abi,
282
+ client: l1Client,
283
+ });
284
+ return await gasL1.read.balanceOf([this.coinbase.toString()]);
285
+ };
286
+
287
+ this.getCoinbaseSequencerRewards = async () => {
288
+ return await this.rollupContract.getSequencerRewards(this.coinbase);
289
+ };
290
+
291
+ this.getProverFee = async (blockNumber: BlockNumber) => {
292
+ const block = await this.aztecNode.getBlock(blockNumber);
293
+
294
+ // @todo @lherskind As we deal with #13601
295
+ // Right now the value is from `FeeLib.sol`
296
+ const L1_GAS_PER_EPOCH_VERIFIED = 1000000n;
297
+
298
+ // We round up
299
+ const mulDiv = (a: bigint, b: bigint, c: bigint) => (a * b) / c + ((a * b) % c > 0n ? 1n : 0n);
300
+
301
+ const { baseFee } = await this.rollupContract.getL1FeesAt(block!.header.globalVariables.timestamp);
302
+ const proverCost =
303
+ mulDiv(
304
+ mulDiv(L1_GAS_PER_EPOCH_VERIFIED, baseFee, BigInt(await this.rollupContract.getEpochDuration())),
305
+ 1n,
306
+ await this.rollupContract.getManaTarget(),
307
+ ) + (await this.rollupContract.getProvingCostPerMana());
308
+
309
+ const price = await this.rollupContract.getFeeAssetPerEth();
310
+
311
+ const mana = block!.header.totalManaUsed.toBigInt();
312
+ return mulDiv(mana * proverCost, price, 10n ** 9n);
313
+ };
341
314
  }
342
315
 
343
- public async applySponsoredFPCSetupSnapshot() {
344
- await this.snapshotManager.snapshot(
345
- 'sponsored_fpc_setup',
346
- async context => {
347
- const feeJuiceContract = this.feeJuiceBridgeTestHarness.feeJuice;
348
- expect((await context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
349
-
350
- const sponsoredFPC = await setupSponsoredFPC(this.wallet);
351
- this.logger.info(`SponsoredFPC at ${sponsoredFPC.address}`);
352
-
353
- return {
354
- sponsoredFPCAddress: sponsoredFPC.address,
355
- };
356
- },
357
- data => {
358
- this.sponsoredFPC = SponsoredFPCContract.at(data.sponsoredFPCAddress, this.wallet);
359
- return Promise.resolve();
360
- },
361
- );
316
+ public async applySponsoredFPCSetup() {
317
+ this.logger.info('Applying sponsored FPC setup');
318
+
319
+ const feeJuiceContract = this.feeJuiceBridgeTestHarness.feeJuice;
320
+ expect((await this.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
321
+
322
+ const sponsoredFPCInstance = await setupSponsoredFPC(this.wallet);
323
+ this.logger.info(`SponsoredFPC at ${sponsoredFPCInstance.address}`);
324
+
325
+ this.sponsoredFPC = SponsoredFPCContract.at(sponsoredFPCInstance.address, this.wallet);
362
326
  }
363
327
 
364
328
  public async applyFundAliceWithBananas() {
365
- await this.snapshotManager.snapshot(
366
- 'fund_alice',
367
- async () => {
368
- await this.mintPrivateBananas(this.ALICE_INITIAL_BANANAS, this.aliceAddress);
369
- await this.bananaCoin.methods
370
- .mint_to_public(this.aliceAddress, this.ALICE_INITIAL_BANANAS)
371
- .send({ from: this.aliceAddress })
372
- .wait();
373
- },
374
- () => Promise.resolve(),
375
- );
329
+ this.logger.info('Applying fund Alice with bananas setup');
330
+
331
+ await this.mintPrivateBananas(this.ALICE_INITIAL_BANANAS, this.aliceAddress);
332
+ await this.bananaCoin.methods
333
+ .mint_to_public(this.aliceAddress, this.ALICE_INITIAL_BANANAS)
334
+ .send({ from: this.aliceAddress })
335
+ .wait();
376
336
  }
377
337
 
378
338
  public async applyFundAliceWithPrivateBananas() {
379
- await this.snapshotManager.snapshot(
380
- 'fund_alice_with_private_bananas',
381
- async () => {
382
- await this.mintPrivateBananas(this.ALICE_INITIAL_BANANAS, this.aliceAddress);
383
- },
384
- () => Promise.resolve(),
385
- );
339
+ this.logger.info('Applying fund Alice with private bananas setup');
340
+
341
+ await this.mintPrivateBananas(this.ALICE_INITIAL_BANANAS, this.aliceAddress);
386
342
  }
387
343
  }
@@ -1,8 +1,9 @@
1
1
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
- import type { L2Block } from '@aztec/aztec.js/block';
3
2
  import { Fr } from '@aztec/aztec.js/fields';
4
3
  import { BatchedBlob, Blob, getEthBlobEvaluationInputs, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
5
4
  import { EthAddress } from '@aztec/foundation/eth-address';
5
+ import { L2BlockNew } from '@aztec/stdlib/block';
6
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
6
7
 
7
8
  import { writeFile } from 'fs/promises';
8
9
 
@@ -14,7 +15,7 @@ const AZTEC_GENERATE_TEST_DATA = !!process.env.AZTEC_GENERATE_TEST_DATA;
14
15
  */
15
16
  export async function writeJson(
16
17
  fileName: string,
17
- block: L2Block,
18
+ block: L2BlockNew,
18
19
  l1ToL2Content: Fr[],
19
20
  blobs: Blob[],
20
21
  batchedBlob: BatchedBlob,
@@ -32,6 +33,12 @@ export async function writeJson(
32
33
  return `0x${buffer.toString('hex').padStart(size, '0')}`;
33
34
  };
34
35
 
36
+ // Create a checkpoint header for this block
37
+ const checkpointHeader = CheckpointHeader.random({
38
+ slotNumber: block.slot,
39
+ timestamp: block.timestamp,
40
+ });
41
+
35
42
  const jsonObject = {
36
43
  populate: {
37
44
  l1ToL2Content: l1ToL2Content.map(value => asHex(value)),
@@ -50,24 +57,22 @@ export async function writeJson(
50
57
  checkpointNumber: block.number,
51
58
  body: `0x${block.body.toBuffer().toString('hex')}`,
52
59
  header: {
53
- lastArchiveRoot: asHex(block.header.lastArchive.root),
54
- blockHeadersHash: asHex(block.header.blockHeadersHash),
55
- contentCommitment: {
56
- blobsHash: asHex(block.header.contentCommitment.blobsHash),
57
- inHash: asHex(block.header.contentCommitment.inHash),
58
- outHash: asHex(block.header.contentCommitment.outHash),
59
- },
60
- slotNumber: Number(block.header.globalVariables.slotNumber),
61
- timestamp: Number(block.header.globalVariables.timestamp),
62
- coinbase: asHex(block.header.globalVariables.coinbase, 40),
63
- feeRecipient: asHex(block.header.globalVariables.feeRecipient),
60
+ lastArchiveRoot: asHex(checkpointHeader.lastArchiveRoot),
61
+ blockHeadersHash: asHex(checkpointHeader.blockHeadersHash),
62
+ blobsHash: asHex(checkpointHeader.blobsHash),
63
+ inHash: asHex(checkpointHeader.inHash),
64
+ outHash: asHex(checkpointHeader.epochOutHash),
65
+ slotNumber: Number(checkpointHeader.slotNumber),
66
+ timestamp: Number(checkpointHeader.timestamp),
67
+ coinbase: asHex(checkpointHeader.coinbase, 40),
68
+ feeRecipient: asHex(checkpointHeader.feeRecipient),
64
69
  gasFees: {
65
- feePerDaGas: Number(block.header.globalVariables.gasFees.feePerDaGas),
66
- feePerL2Gas: Number(block.header.globalVariables.gasFees.feePerL2Gas),
70
+ feePerDaGas: Number(checkpointHeader.gasFees.feePerDaGas),
71
+ feePerL2Gas: Number(checkpointHeader.gasFees.feePerL2Gas),
67
72
  },
68
- totalManaUsed: block.header.totalManaUsed.toNumber(),
73
+ totalManaUsed: checkpointHeader.totalManaUsed.toNumber(),
69
74
  },
70
- headerHash: asHex(block.getCheckpointHeader().hash()),
75
+ headerHash: asHex(checkpointHeader.hash()),
71
76
  numTxs: block.body.txEffects.length,
72
77
  },
73
78
  };