@aztec/end-to-end 0.0.0-test.0 → 0.0.1-commit.21caa21

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 (174) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +61 -0
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
  3. package/dest/bench/client_flows/benchmark.js +261 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +80 -0
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -0
  6. package/dest/bench/client_flows/client_flows_benchmark.js +334 -0
  7. package/dest/bench/client_flows/config.d.ts +14 -0
  8. package/dest/bench/client_flows/config.d.ts.map +1 -0
  9. package/dest/bench/client_flows/config.js +106 -0
  10. package/dest/bench/client_flows/data_extractor.d.ts +2 -0
  11. package/dest/bench/client_flows/data_extractor.d.ts.map +1 -0
  12. package/dest/bench/client_flows/data_extractor.js +77 -0
  13. package/dest/bench/utils.d.ts +12 -38
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +26 -66
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +21 -13
  17. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  18. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +85 -57
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +19 -25
  20. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  21. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +50 -70
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +16 -8
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +13 -19
  25. package/dest/e2e_epochs/epochs_test.d.ts +59 -18
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +226 -44
  28. package/dest/e2e_fees/bridging_race.notest.d.ts +2 -0
  29. package/dest/e2e_fees/bridging_race.notest.d.ts.map +1 -0
  30. package/dest/e2e_fees/bridging_race.notest.js +63 -0
  31. package/dest/e2e_fees/fees_test.d.ts +21 -10
  32. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  33. package/dest/e2e_fees/fees_test.js +103 -109
  34. package/dest/e2e_l1_publisher/write_json.d.ts +10 -0
  35. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
  36. package/dest/e2e_l1_publisher/write_json.js +58 -0
  37. package/dest/e2e_multi_validator/utils.d.ts +12 -0
  38. package/dest/e2e_multi_validator/utils.d.ts.map +1 -0
  39. package/dest/e2e_multi_validator/utils.js +214 -0
  40. package/dest/e2e_nested_contract/nested_contract_test.d.ts +10 -7
  41. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_nested_contract/nested_contract_test.js +24 -20
  43. package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
  44. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
  45. package/dest/e2e_p2p/inactivity_slash_test.js +139 -0
  46. package/dest/e2e_p2p/p2p_network.d.ts +275 -23
  47. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  48. package/dest/e2e_p2p/p2p_network.js +184 -131
  49. package/dest/e2e_p2p/shared.d.ts +43 -7
  50. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  51. package/dest/e2e_p2p/shared.js +164 -19
  52. package/dest/e2e_token_contract/token_contract_test.d.ts +12 -6
  53. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  54. package/dest/e2e_token_contract/token_contract_test.js +50 -26
  55. package/dest/fixtures/e2e_prover_test.d.ts +63 -0
  56. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
  57. package/dest/{e2e_prover → fixtures}/e2e_prover_test.js +104 -105
  58. package/dest/fixtures/fixtures.d.ts +6 -7
  59. package/dest/fixtures/fixtures.d.ts.map +1 -1
  60. package/dest/fixtures/fixtures.js +4 -3
  61. package/dest/fixtures/get_acvm_config.d.ts +2 -2
  62. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  63. package/dest/fixtures/get_acvm_config.js +2 -14
  64. package/dest/fixtures/get_bb_config.d.ts +2 -2
  65. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  66. package/dest/fixtures/get_bb_config.js +10 -17
  67. package/dest/fixtures/index.d.ts +1 -1
  68. package/dest/fixtures/l1_to_l2_messaging.d.ts +9 -6
  69. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  70. package/dest/fixtures/l1_to_l2_messaging.js +44 -18
  71. package/dest/fixtures/logging.d.ts +1 -1
  72. package/dest/fixtures/setup_l1_contracts.d.ts +476 -5
  73. package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -1
  74. package/dest/fixtures/setup_l1_contracts.js +4 -4
  75. package/dest/fixtures/setup_p2p_test.d.ts +15 -14
  76. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  77. package/dest/fixtures/setup_p2p_test.js +81 -21
  78. package/dest/fixtures/snapshot_manager.d.ts +17 -9
  79. package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
  80. package/dest/fixtures/snapshot_manager.js +147 -121
  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 +28 -12
  84. package/dest/fixtures/utils.d.ts +524 -40
  85. package/dest/fixtures/utils.d.ts.map +1 -1
  86. package/dest/fixtures/utils.js +464 -369
  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 +1 -1
  91. package/dest/index.d.ts +1 -1
  92. package/dest/quality_of_service/alert_checker.d.ts +2 -2
  93. package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
  94. package/dest/shared/cross_chain_test_harness.d.ts +39 -34
  95. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  96. package/dest/shared/cross_chain_test_harness.js +104 -50
  97. package/dest/shared/gas_portal_test_harness.d.ts +29 -31
  98. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  99. package/dest/shared/gas_portal_test_harness.js +51 -30
  100. package/dest/shared/index.d.ts +1 -1
  101. package/dest/shared/jest_setup.d.ts +1 -1
  102. package/dest/shared/jest_setup.js +1 -1
  103. package/dest/shared/submit-transactions.d.ts +6 -4
  104. package/dest/shared/submit-transactions.d.ts.map +1 -1
  105. package/dest/shared/submit-transactions.js +8 -7
  106. package/dest/shared/uniswap_l1_l2.d.ts +14 -12
  107. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  108. package/dest/shared/uniswap_l1_l2.js +146 -116
  109. package/dest/simulators/index.d.ts +1 -1
  110. package/dest/simulators/lending_simulator.d.ts +7 -11
  111. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  112. package/dest/simulators/lending_simulator.js +15 -16
  113. package/dest/simulators/token_simulator.d.ts +6 -3
  114. package/dest/simulators/token_simulator.d.ts.map +1 -1
  115. package/dest/simulators/token_simulator.js +16 -13
  116. package/dest/spartan/setup_test_wallets.d.ts +26 -11
  117. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  118. package/dest/spartan/setup_test_wallets.js +201 -58
  119. package/dest/spartan/utils.d.ts +116 -313
  120. package/dest/spartan/utils.d.ts.map +1 -1
  121. package/dest/spartan/utils.js +434 -130
  122. package/package.json +65 -58
  123. package/src/bench/client_flows/benchmark.ts +341 -0
  124. package/src/bench/client_flows/client_flows_benchmark.ts +447 -0
  125. package/src/bench/client_flows/config.ts +61 -0
  126. package/src/bench/client_flows/data_extractor.ts +89 -0
  127. package/src/bench/utils.ts +22 -76
  128. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +80 -77
  129. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +65 -106
  130. package/src/e2e_deploy_contract/deploy_test.ts +24 -39
  131. package/src/e2e_epochs/epochs_test.ts +276 -55
  132. package/src/e2e_fees/bridging_race.notest.ts +80 -0
  133. package/src/e2e_fees/fees_test.ts +142 -138
  134. package/src/e2e_l1_publisher/write_json.ts +77 -0
  135. package/src/e2e_multi_validator/utils.ts +258 -0
  136. package/src/e2e_nested_contract/nested_contract_test.ts +29 -19
  137. package/src/e2e_p2p/inactivity_slash_test.ts +182 -0
  138. package/src/e2e_p2p/p2p_network.ts +279 -169
  139. package/src/e2e_p2p/shared.ts +247 -29
  140. package/src/e2e_token_contract/token_contract_test.ts +43 -39
  141. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  142. package/src/{e2e_prover → fixtures}/e2e_prover_test.ts +107 -152
  143. package/src/fixtures/fixtures.ts +4 -3
  144. package/src/fixtures/get_acvm_config.ts +3 -11
  145. package/src/fixtures/get_bb_config.ts +18 -13
  146. package/src/fixtures/l1_to_l2_messaging.ts +53 -23
  147. package/src/fixtures/setup_l1_contracts.ts +6 -7
  148. package/src/fixtures/setup_p2p_test.ts +126 -38
  149. package/src/fixtures/snapshot_manager.ts +187 -139
  150. package/src/fixtures/token_utils.ts +32 -15
  151. package/src/fixtures/utils.ts +580 -434
  152. package/src/fixtures/web3signer.ts +63 -0
  153. package/src/guides/up_quick_start.sh +7 -15
  154. package/src/quality_of_service/alert_checker.ts +1 -1
  155. package/src/shared/cross_chain_test_harness.ts +108 -79
  156. package/src/shared/gas_portal_test_harness.ts +59 -50
  157. package/src/shared/jest_setup.ts +1 -1
  158. package/src/shared/submit-transactions.ts +12 -8
  159. package/src/shared/uniswap_l1_l2.ts +181 -184
  160. package/src/simulators/lending_simulator.ts +14 -15
  161. package/src/simulators/token_simulator.ts +21 -13
  162. package/src/spartan/DEVELOP.md +121 -0
  163. package/src/spartan/setup_test_wallets.ts +251 -93
  164. package/src/spartan/utils.ts +490 -130
  165. package/dest/e2e_prover/e2e_prover_test.d.ts +0 -56
  166. package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
  167. package/dest/sample-dapp/connect.js +0 -12
  168. package/dest/sample-dapp/contracts.js +0 -10
  169. package/dest/sample-dapp/deploy.js +0 -35
  170. package/dest/sample-dapp/index.js +0 -98
  171. package/src/sample-dapp/connect.mjs +0 -16
  172. package/src/sample-dapp/contracts.mjs +0 -14
  173. package/src/sample-dapp/deploy.mjs +0 -40
  174. package/src/sample-dapp/index.mjs +0 -128
@@ -1,23 +1,21 @@
1
- import { getSchnorrWallet } from '@aztec/accounts/schnorr';
2
- import { ChainMonitor, CheatCodes, createLogger, sleep } from '@aztec/aztec.js';
3
- import { FEE_FUNDING_FOR_TESTER_ACCOUNT } from '@aztec/constants';
4
- import { RollupContract, createL1Clients } from '@aztec/ethereum';
1
+ import { createLogger } from '@aztec/aztec.js/log';
2
+ import { RollupContract, createExtendedL1Client } from '@aztec/ethereum';
3
+ import { ChainMonitor } from '@aztec/ethereum/test';
5
4
  import { EthAddress } from '@aztec/foundation/eth-address';
6
- import { RollupAbi, TestERC20Abi } from '@aztec/l1-artifacts';
7
- import { AppSubscriptionContract } from '@aztec/noir-contracts.js/AppSubscription';
8
- import { CounterContract } from '@aztec/noir-contracts.js/Counter';
5
+ import { sleep } from '@aztec/foundation/sleep';
6
+ import { TestERC20Abi } from '@aztec/l1-artifacts';
9
7
  import { FPCContract } from '@aztec/noir-contracts.js/FPC';
10
8
  import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
9
+ import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
11
10
  import { TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token';
12
11
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
13
12
  import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
14
- import { computePartialAddress } from '@aztec/stdlib/contract';
15
13
  import { GasSettings } from '@aztec/stdlib/gas';
16
14
  import { getContract } from 'viem';
17
15
  import { MNEMONIC } from '../fixtures/fixtures.js';
18
16
  import { createSnapshotManager, deployAccounts } from '../fixtures/snapshot_manager.js';
19
17
  import { mintTokensToPrivate } from '../fixtures/token_utils.js';
20
- import { ensureAccountsPubliclyDeployed, getBalancesFn, setupCanonicalFeeJuice } from '../fixtures/utils.js';
18
+ import { ensureAccountContractsPublished, getBalancesFn, setupSponsoredFPC } from '../fixtures/utils.js';
21
19
  import { FeeJuicePortalTestingHarnessFactory } from '../shared/gas_portal_test_harness.js';
22
20
  const { E2E_DATA_PATH: dataPath } = process.env;
23
21
  /**
@@ -26,27 +24,28 @@ const { E2E_DATA_PATH: dataPath } = process.env;
26
24
  * PublicDeployAccounts: Deploys the accounts publicly.
27
25
  * DeployFeeJuice: Deploys the Fee Juice contract.
28
26
  * FPCSetup: Deploys BananaCoin and FPC contracts, and bridges gas from L1.
27
+ * SponsoredFPCSetup: Deploys Sponsored FPC contract, and bridges gas from L1.
29
28
  * FundAlice: Mints private and public bananas to Alice.
30
29
  * SetupSubscription: Deploys a counter contract and a subscription contract, and mints Fee Juice to the subscription contract.
31
30
  */ export class FeesTest {
32
31
  numberOfAccounts;
33
32
  snapshotManager;
34
- wallets;
33
+ accounts;
35
34
  logger;
36
- pxe;
37
35
  aztecNode;
38
36
  cheatCodes;
39
- aliceWallet;
37
+ wallet;
40
38
  aliceAddress;
41
- bobWallet;
42
39
  bobAddress;
43
40
  sequencerAddress;
44
41
  coinbase;
45
42
  fpcAdmin;
46
43
  gasSettings;
44
+ rollupContract;
47
45
  feeJuiceContract;
48
46
  bananaCoin;
49
47
  bananaFPC;
48
+ sponsoredFPC;
50
49
  counterContract;
51
50
  subscriptionContract;
52
51
  feeJuiceBridgeTestHarness;
@@ -63,13 +62,15 @@ const { E2E_DATA_PATH: dataPath } = process.env;
63
62
  APP_SPONSORED_TX_GAS_LIMIT;
64
63
  constructor(testName, numberOfAccounts = 3, setupOptions = {}){
65
64
  this.numberOfAccounts = numberOfAccounts;
66
- this.wallets = [];
65
+ this.accounts = [];
67
66
  this.ALICE_INITIAL_BANANAS = BigInt(1e22);
68
67
  this.SUBSCRIPTION_AMOUNT = BigInt(1e19);
69
68
  this.APP_SPONSORED_TX_GAS_LIMIT = BigInt(10e9);
70
69
  if (!numberOfAccounts) {
71
70
  throw new Error('There must be at least 1 initial account.');
72
71
  }
72
+ setupOptions.coinbase ??= EthAddress.random();
73
+ this.coinbase = setupOptions.coinbase;
73
74
  this.logger = createLogger(`e2e:e2e_fees:${testName}`);
74
75
  this.snapshotManager = createSnapshotManager(`e2e_fees/${testName}-${numberOfAccounts}`, dataPath, {
75
76
  startProverNode: true,
@@ -80,16 +81,12 @@ const { E2E_DATA_PATH: dataPath } = process.env;
80
81
  }
81
82
  async setup() {
82
83
  const context = await this.snapshotManager.setup();
83
- await context.aztecNode.setConfig({
84
- feeRecipient: this.sequencerAddress,
85
- coinbase: this.coinbase
86
- });
87
- const rollupContract = RollupContract.getFromConfig(context.aztecNodeConfig);
88
- this.chainMonitor = new ChainMonitor(rollupContract, this.logger, 200).start();
84
+ this.rollupContract = RollupContract.getFromConfig(context.aztecNodeConfig);
85
+ this.chainMonitor = new ChainMonitor(this.rollupContract, context.dateProvider, this.logger, 200).start();
89
86
  return this;
90
87
  }
91
88
  async teardown() {
92
- this.chainMonitor.stop();
89
+ await this.chainMonitor.stop();
93
90
  await this.snapshotManager.teardown();
94
91
  }
95
92
  setIsMarkingAsProven(b) {
@@ -101,15 +98,33 @@ const { E2E_DATA_PATH: dataPath } = process.env;
101
98
  await sleep(1000);
102
99
  }
103
100
  }
104
- async mintAndBridgeFeeJuice(address, amount) {
105
- const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(amount, address);
101
+ async getBlockRewards() {
102
+ const blockReward = await this.rollupContract.getCheckpointReward();
103
+ const rewardConfig = await this.rollupContract.getRewardConfig();
104
+ const balance = await this.feeJuiceBridgeTestHarness.getL1FeeJuiceBalance(EthAddress.fromString(rewardConfig.rewardDistributor));
105
+ const toDistribute = balance > blockReward ? blockReward : balance;
106
+ const sequencerBlockRewards = toDistribute * BigInt(rewardConfig.sequencerBps) / 10000n;
107
+ const proverBlockRewards = toDistribute - sequencerBlockRewards;
108
+ return {
109
+ sequencerBlockRewards,
110
+ proverBlockRewards
111
+ };
112
+ }
113
+ async mintAndBridgeFeeJuice(minter, recipient) {
114
+ const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(recipient);
106
115
  const { claimSecret: secret, messageLeafIndex: index } = claim;
107
- await this.feeJuiceContract.methods.claim(address, amount, secret, index).send().wait();
116
+ await this.feeJuiceContract.methods.claim(recipient, claim.claimAmount, secret, index).send({
117
+ from: minter
118
+ }).wait();
108
119
  }
109
120
  /** Alice mints bananaCoin tokens privately to the target address and redeems them. */ async mintPrivateBananas(amount, address) {
110
- const balanceBefore = await this.bananaCoin.methods.balance_of_private(address).simulate();
111
- await mintTokensToPrivate(this.bananaCoin, this.aliceWallet, address, amount);
112
- const balanceAfter = await this.bananaCoin.methods.balance_of_private(address).simulate();
121
+ const balanceBefore = await this.bananaCoin.methods.balance_of_private(address).simulate({
122
+ from: this.aliceAddress
123
+ });
124
+ await mintTokensToPrivate(this.bananaCoin, this.aliceAddress, address, amount);
125
+ const balanceAfter = await this.bananaCoin.methods.balance_of_private(address).simulate({
126
+ from: this.aliceAddress
127
+ });
113
128
  expect(balanceAfter).toEqual(balanceBefore + amount);
114
129
  }
115
130
  async applyBaseSnapshots() {
@@ -119,129 +134,125 @@ const { E2E_DATA_PATH: dataPath } = process.env;
119
134
  await this.applyDeployBananaTokenSnapshot();
120
135
  }
121
136
  async applyInitialAccountsSnapshot() {
122
- await this.snapshotManager.snapshot('initial_accounts', deployAccounts(this.numberOfAccounts, this.logger), async ({ deployedAccounts }, { pxe, aztecNode, aztecNodeConfig })=>{
123
- this.pxe = pxe;
137
+ await this.snapshotManager.snapshot('initial_accounts', deployAccounts(this.numberOfAccounts, this.logger), async ({ deployedAccounts }, { wallet, aztecNode, cheatCodes })=>{
138
+ this.wallet = wallet;
124
139
  this.aztecNode = aztecNode;
125
140
  this.gasSettings = GasSettings.default({
126
141
  maxFeesPerGas: (await this.aztecNode.getCurrentBaseFees()).mul(2)
127
142
  });
128
- this.cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls, pxe);
129
- this.wallets = await Promise.all(deployedAccounts.map((a)=>getSchnorrWallet(pxe, a.address, a.signingKey)));
130
- this.wallets.forEach((w, i)=>this.logger.verbose(`Wallet ${i} address: ${w.getAddress()}`));
131
- [this.aliceWallet, this.bobWallet] = this.wallets.slice(0, 2);
132
- [this.aliceAddress, this.bobAddress, this.sequencerAddress] = this.wallets.map((w)=>w.getAddress());
143
+ this.cheatCodes = cheatCodes;
144
+ this.accounts = deployedAccounts.map((a)=>a.address);
145
+ this.accounts.forEach((a, i)=>this.logger.verbose(`Account ${i} address: ${a}`));
146
+ [this.aliceAddress, this.bobAddress, this.sequencerAddress] = this.accounts.slice(0, 3);
133
147
  // We set Alice as the FPC admin to avoid the need for deployment of another account.
134
148
  this.fpcAdmin = this.aliceAddress;
135
149
  const canonicalFeeJuice = await getCanonicalFeeJuice();
136
- this.feeJuiceContract = await FeeJuiceContract.at(canonicalFeeJuice.address, this.aliceWallet);
137
- if (this.numberOfAccounts > 1) {
138
- const bobInstance = (await this.bobWallet.getContractMetadata(this.bobAddress)).contractInstance;
139
- await this.aliceWallet.registerAccount(deployedAccounts[1].secret, await computePartialAddress(bobInstance));
140
- }
141
- this.coinbase = EthAddress.random();
142
- const { publicClient, walletClient } = createL1Clients(aztecNodeConfig.l1RpcUrls, MNEMONIC);
143
- this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
144
- aztecNode: aztecNode,
145
- pxeService: pxe,
146
- publicClient: publicClient,
147
- walletClient: walletClient,
148
- wallet: this.aliceWallet,
149
- logger: this.logger
150
- });
150
+ this.feeJuiceContract = FeeJuiceContract.at(canonicalFeeJuice.address, this.wallet);
151
151
  });
152
152
  }
153
153
  async applyPublicDeployAccountsSnapshot() {
154
- await this.snapshotManager.snapshot('public_deploy_accounts', ()=>ensureAccountsPubliclyDeployed(this.aliceWallet, this.wallets));
154
+ await this.snapshotManager.snapshot('public_deploy_accounts', ()=>ensureAccountContractsPublished(this.wallet, this.accounts));
155
155
  }
156
156
  async applySetupFeeJuiceSnapshot() {
157
- await this.snapshotManager.snapshot('setup_fee_juice', async (context)=>{
158
- await setupCanonicalFeeJuice(context.pxe);
159
- }, async (_data, context)=>{
157
+ await this.snapshotManager.snapshot('setup_fee_juice', async ()=>{}, async (_data, context)=>{
160
158
  this.context = context;
161
- this.feeJuiceContract = await FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.aliceWallet);
162
- this.getGasBalanceFn = getBalancesFn('⛽', this.feeJuiceContract.methods.balance_of_public, this.logger);
163
- const { publicClient, walletClient } = createL1Clients(context.aztecNodeConfig.l1RpcUrls, MNEMONIC);
159
+ this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.wallet);
160
+ this.getGasBalanceFn = getBalancesFn('⛽', this.feeJuiceContract.methods.balance_of_public, this.aliceAddress, this.logger);
164
161
  this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
165
162
  aztecNode: context.aztecNode,
166
- pxeService: context.pxe,
167
- publicClient: publicClient,
168
- walletClient: walletClient,
169
- wallet: this.aliceWallet,
163
+ aztecNodeAdmin: context.aztecNode,
164
+ l1Client: context.deployL1ContractsValues.l1Client,
165
+ wallet: this.wallet,
170
166
  logger: this.logger
171
167
  });
172
168
  });
173
169
  }
174
170
  async applyDeployBananaTokenSnapshot() {
175
171
  await this.snapshotManager.snapshot('deploy_banana_token', async ()=>{
176
- const bananaCoin = await BananaCoin.deploy(this.aliceWallet, this.aliceAddress, 'BC', 'BC', 18n).send().deployed();
172
+ const bananaCoin = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
173
+ from: this.aliceAddress
174
+ }).deployed();
177
175
  this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
178
176
  return {
179
177
  bananaCoinAddress: bananaCoin.address
180
178
  };
181
- }, async ({ bananaCoinAddress })=>{
182
- this.bananaCoin = await BananaCoin.at(bananaCoinAddress, this.aliceWallet);
179
+ }, ({ bananaCoinAddress })=>{
180
+ this.bananaCoin = BananaCoin.at(bananaCoinAddress, this.wallet);
181
+ const logger = this.logger;
182
+ this.getBananaPublicBalanceFn = getBalancesFn('🍌.public', this.bananaCoin.methods.balance_of_public, this.aliceAddress, logger);
183
+ this.getBananaPrivateBalanceFn = getBalancesFn('🍌.private', this.bananaCoin.methods.balance_of_private, this.aliceAddress, logger);
184
+ return Promise.resolve();
183
185
  });
184
186
  }
185
187
  async applyFPCSetupSnapshot() {
186
188
  await this.snapshotManager.snapshot('fpc_setup', async (context)=>{
187
189
  const feeJuiceContract = this.feeJuiceBridgeTestHarness.feeJuice;
188
- expect((await context.pxe.getContractMetadata(feeJuiceContract.address)).isContractPubliclyDeployed).toBe(true);
190
+ expect((await context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
189
191
  const bananaCoin = this.bananaCoin;
190
- const bananaFPC = await FPCContract.deploy(this.aliceWallet, bananaCoin.address, this.fpcAdmin).send().deployed();
192
+ const bananaFPC = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
193
+ from: this.aliceAddress
194
+ }).deployed();
191
195
  this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
192
- await this.feeJuiceBridgeTestHarness.bridgeFromL1ToL2(FEE_FUNDING_FOR_TESTER_ACCOUNT, bananaFPC.address);
196
+ await this.feeJuiceBridgeTestHarness.bridgeFromL1ToL2(bananaFPC.address, this.aliceAddress);
193
197
  return {
194
198
  bananaFPCAddress: bananaFPC.address,
195
199
  feeJuiceAddress: feeJuiceContract.address,
196
200
  l1FeeJuiceAddress: this.feeJuiceBridgeTestHarness.l1FeeJuiceAddress,
197
201
  rollupAddress: context.deployL1ContractsValues.l1ContractAddresses.rollupAddress
198
202
  };
199
- }, async (data, context)=>{
200
- const bananaFPC = await FPCContract.at(data.bananaFPCAddress, this.aliceWallet);
203
+ }, (data, context)=>{
204
+ const bananaFPC = FPCContract.at(data.bananaFPCAddress, this.wallet);
201
205
  this.bananaFPC = bananaFPC;
202
- const logger = this.logger;
203
- this.getBananaPublicBalanceFn = getBalancesFn('🍌.public', this.bananaCoin.methods.balance_of_public, logger);
204
- this.getBananaPrivateBalanceFn = getBalancesFn('🍌.private', this.bananaCoin.methods.balance_of_private, logger);
205
206
  this.getCoinbaseBalance = async ()=>{
206
- const { walletClient } = createL1Clients(context.aztecNodeConfig.l1RpcUrls, MNEMONIC);
207
+ const l1Client = createExtendedL1Client(context.aztecNodeConfig.l1RpcUrls, MNEMONIC);
207
208
  const gasL1 = getContract({
208
209
  address: data.l1FeeJuiceAddress.toString(),
209
210
  abi: TestERC20Abi,
210
- client: walletClient
211
+ client: l1Client
211
212
  });
212
213
  return await gasL1.read.balanceOf([
213
214
  this.coinbase.toString()
214
215
  ]);
215
216
  };
216
217
  this.getCoinbaseSequencerRewards = async ()=>{
217
- const { walletClient } = createL1Clients(context.aztecNodeConfig.l1RpcUrls, MNEMONIC);
218
- const rollup = getContract({
219
- address: data.rollupAddress.toString(),
220
- abi: RollupAbi,
221
- client: walletClient
222
- });
223
- return await rollup.read.getSequencerRewards([
224
- this.coinbase.toString()
225
- ]);
218
+ return await this.rollupContract.getSequencerRewards(this.coinbase);
226
219
  };
227
220
  this.getProverFee = async (blockNumber)=>{
228
- const { walletClient } = createL1Clients(context.aztecNodeConfig.l1RpcUrls, MNEMONIC);
229
- const rollup = getContract({
230
- address: data.rollupAddress.toString(),
231
- abi: RollupAbi,
232
- client: walletClient
233
- });
234
- const provingCostPerMana = await rollup.read.getProvingCostPerManaInFeeAsset();
235
- const block = await this.pxe.getBlock(blockNumber);
221
+ const block = await this.aztecNode.getBlock(blockNumber);
222
+ // @todo @lherskind As we deal with #13601
223
+ // Right now the value is from `FeeLib.sol`
224
+ const L1_GAS_PER_EPOCH_VERIFIED = 1000000n;
225
+ // We round up
226
+ const mulDiv = (a, b, c)=>a * b / c + (a * b % c > 0n ? 1n : 0n);
227
+ const { baseFee } = await this.rollupContract.getL1FeesAt(block.header.globalVariables.timestamp);
228
+ const proverCost = mulDiv(mulDiv(L1_GAS_PER_EPOCH_VERIFIED, baseFee, await this.rollupContract.getEpochDuration()), 1n, await this.rollupContract.getManaTarget()) + await this.rollupContract.getProvingCostPerMana();
229
+ const price = await this.rollupContract.getFeeAssetPerEth();
236
230
  const mana = block.header.totalManaUsed.toBigInt();
237
- return mana * provingCostPerMana;
231
+ return mulDiv(mana * proverCost, price, 10n ** 9n);
238
232
  };
233
+ return Promise.resolve();
234
+ });
235
+ }
236
+ async applySponsoredFPCSetupSnapshot() {
237
+ await this.snapshotManager.snapshot('sponsored_fpc_setup', async (context)=>{
238
+ const feeJuiceContract = this.feeJuiceBridgeTestHarness.feeJuice;
239
+ expect((await context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
240
+ const sponsoredFPC = await setupSponsoredFPC(this.wallet);
241
+ this.logger.info(`SponsoredFPC at ${sponsoredFPC.address}`);
242
+ return {
243
+ sponsoredFPCAddress: sponsoredFPC.address
244
+ };
245
+ }, (data)=>{
246
+ this.sponsoredFPC = SponsoredFPCContract.at(data.sponsoredFPCAddress, this.wallet);
247
+ return Promise.resolve();
239
248
  });
240
249
  }
241
250
  async applyFundAliceWithBananas() {
242
251
  await this.snapshotManager.snapshot('fund_alice', async ()=>{
243
252
  await this.mintPrivateBananas(this.ALICE_INITIAL_BANANAS, this.aliceAddress);
244
- await this.bananaCoin.methods.mint_to_public(this.aliceAddress, this.ALICE_INITIAL_BANANAS).send().wait();
253
+ await this.bananaCoin.methods.mint_to_public(this.aliceAddress, this.ALICE_INITIAL_BANANAS).send({
254
+ from: this.aliceAddress
255
+ }).wait();
245
256
  }, ()=>Promise.resolve());
246
257
  }
247
258
  async applyFundAliceWithPrivateBananas() {
@@ -249,21 +260,4 @@ const { E2E_DATA_PATH: dataPath } = process.env;
249
260
  await this.mintPrivateBananas(this.ALICE_INITIAL_BANANAS, this.aliceAddress);
250
261
  }, ()=>Promise.resolve());
251
262
  }
252
- async applySetupSubscription() {
253
- await this.snapshotManager.snapshot('setup_subscription', async ()=>{
254
- const counterContract = await CounterContract.deploy(this.bobWallet, 0, this.bobAddress).send().deployed();
255
- // Deploy subscription contract, that allows subscriptions for SUBSCRIPTION_AMOUNT of bananas
256
- const subscriptionContract = await AppSubscriptionContract.deploy(this.bobWallet, counterContract.address, this.bobAddress, this.bananaCoin.address, this.SUBSCRIPTION_AMOUNT, this.APP_SPONSORED_TX_GAS_LIMIT).send().deployed();
257
- // Mint some Fee Juice to the subscription contract
258
- // Could also use bridgeFromL1ToL2 from the harness, but this is more direct
259
- await this.mintAndBridgeFeeJuice(subscriptionContract.address, FEE_FUNDING_FOR_TESTER_ACCOUNT);
260
- return {
261
- counterContractAddress: counterContract.address,
262
- subscriptionContractAddress: subscriptionContract.address
263
- };
264
- }, async ({ counterContractAddress, subscriptionContractAddress })=>{
265
- this.counterContract = await CounterContract.at(counterContractAddress, this.bobWallet);
266
- this.subscriptionContract = await AppSubscriptionContract.at(subscriptionContractAddress, this.bobWallet);
267
- });
268
- }
269
263
  }
@@ -0,0 +1,10 @@
1
+ import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import type { L2Block } from '@aztec/aztec.js/block';
3
+ import { Fr } from '@aztec/aztec.js/fields';
4
+ import { BatchedBlob, Blob } from '@aztec/blob-lib';
5
+ /**
6
+ * Creates a json object that can be used to test the solidity contract.
7
+ * The json object must be put into
8
+ */
9
+ export declare function writeJson(fileName: string, block: L2Block, l1ToL2Content: Fr[], blobs: Blob[], batchedBlob: BatchedBlob, recipientAddress: AztecAddress, deployerAddress: `0x${string}`): Promise<void>;
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVfanNvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2UyZV9sMV9wdWJsaXNoZXIvd3JpdGVfanNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUE2RCxNQUFNLGlCQUFpQixDQUFDO0FBTy9HOzs7R0FHRztBQUNILHdCQUFzQixTQUFTLENBQzdCLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLEtBQUssRUFBRSxPQUFPLEVBQ2QsYUFBYSxFQUFFLEVBQUUsRUFBRSxFQUNuQixLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQ2IsV0FBVyxFQUFFLFdBQVcsRUFDeEIsZ0JBQWdCLEVBQUUsWUFBWSxFQUM5QixlQUFlLEVBQUUsS0FBSyxNQUFNLEVBQUUsR0FDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQXNEZiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write_json.d.ts","sourceRoot":"","sources":["../../src/e2e_l1_publisher/write_json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,IAAI,EAA6D,MAAM,iBAAiB,CAAC;AAO/G;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,EAAE,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EACb,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,YAAY,EAC9B,eAAe,EAAE,KAAK,MAAM,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAsDf"}
@@ -0,0 +1,58 @@
1
+ import { getEthBlobEvaluationInputs, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
2
+ import { writeFile } from 'fs/promises';
3
+ const AZTEC_GENERATE_TEST_DATA = !!process.env.AZTEC_GENERATE_TEST_DATA;
4
+ /**
5
+ * Creates a json object that can be used to test the solidity contract.
6
+ * The json object must be put into
7
+ */ export async function writeJson(fileName, block, l1ToL2Content, blobs, batchedBlob, recipientAddress, deployerAddress) {
8
+ if (!AZTEC_GENERATE_TEST_DATA) {
9
+ return;
10
+ }
11
+ // Path relative to the package.json in the end-to-end folder
12
+ const path = `../../l1-contracts/test/fixtures/${fileName}.json`;
13
+ const asHex = (value, size = 64)=>{
14
+ const buffer = Buffer.isBuffer(value) ? value : value.toBuffer();
15
+ return `0x${buffer.toString('hex').padStart(size, '0')}`;
16
+ };
17
+ const jsonObject = {
18
+ populate: {
19
+ l1ToL2Content: l1ToL2Content.map((value)=>asHex(value)),
20
+ recipient: asHex(recipientAddress.toField()),
21
+ sender: deployerAddress
22
+ },
23
+ messages: {
24
+ l2ToL1Messages: block.body.txEffects.flatMap((txEffect)=>txEffect.l2ToL1Msgs).map((value)=>asHex(value))
25
+ },
26
+ checkpoint: {
27
+ // The json formatting in forge is a bit brittle, so we convert Fr to a number in the few values below.
28
+ // This should not be a problem for testing as long as the values are not larger than u32.
29
+ archive: asHex(block.archive.root),
30
+ blobCommitments: getPrefixedEthBlobCommitments(blobs),
31
+ batchedBlobInputs: getEthBlobEvaluationInputs(batchedBlob),
32
+ checkpointNumber: block.number,
33
+ body: `0x${block.body.toBuffer().toString('hex')}`,
34
+ header: {
35
+ lastArchiveRoot: asHex(block.header.lastArchive.root),
36
+ blockHeadersHash: asHex(block.header.blockHeadersHash),
37
+ contentCommitment: {
38
+ blobsHash: asHex(block.header.contentCommitment.blobsHash),
39
+ inHash: asHex(block.header.contentCommitment.inHash),
40
+ outHash: asHex(block.header.contentCommitment.outHash)
41
+ },
42
+ slotNumber: Number(block.header.globalVariables.slotNumber),
43
+ timestamp: Number(block.header.globalVariables.timestamp),
44
+ coinbase: asHex(block.header.globalVariables.coinbase, 40),
45
+ feeRecipient: asHex(block.header.globalVariables.feeRecipient),
46
+ gasFees: {
47
+ feePerDaGas: Number(block.header.globalVariables.gasFees.feePerDaGas),
48
+ feePerL2Gas: Number(block.header.globalVariables.gasFees.feePerL2Gas)
49
+ },
50
+ totalManaUsed: block.header.totalManaUsed.toNumber()
51
+ },
52
+ headerHash: asHex(block.getCheckpointHeader().hash()),
53
+ numTxs: block.body.txEffects.length
54
+ }
55
+ };
56
+ const output = JSON.stringify(jsonObject, null, 2);
57
+ await writeFile(path, output, 'utf8');
58
+ }
@@ -0,0 +1,12 @@
1
+ import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { EthAddress } from '@aztec/foundation/eth-address';
3
+ import type { EthPrivateKey } from '@aztec/node-keystore';
4
+ export declare function createJSONRPCSigner(keyLookup: Map<string, EthPrivateKey>, stats: Map<string, number>): import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
5
+ export declare function createKeyFile1(fileName: string, mnemonic: string, validatorIndex: number, publisher1Key: EthPrivateKey, publisher2Key: EthPrivateKey, coinbase: EthAddress, feeRecipient: AztecAddress): Promise<void>;
6
+ export declare function createKeyFile2(fileName: string, validatorKey: EthPrivateKey, publisherMnemonic: string, publisher1Index: number, coinbase: EthAddress, feeRecipient: AztecAddress): Promise<void>;
7
+ export declare function createKeyFile3(fileName: string, validatorAddress: EthAddress, publisher1Key: EthPrivateKey, publisher2Key: EthPrivateKey, coinbase: EthAddress, remoteSignerUrl: string, feeRecipient: AztecAddress): Promise<void>;
8
+ export declare function createKeyFile4(fileName: string, validator1Address: EthAddress, validator2Address: EthAddress, publisher1Index: number, publisher2Key: EthPrivateKey, mnemonic: string, publisher3Key: EthPrivateKey, coinbase1: EthAddress, coinbase2: EthAddress, remoteSignerUrl: string, feeRecipient1: AztecAddress, feeRecipient2: AztecAddress): Promise<void>;
9
+ export declare function createKeyFile5(fileName: string, proverAddress: EthAddress, remoteSignerUrl: string): Promise<void>;
10
+ export declare function createKeyFile6(fileName: string, mnemonic: string, validator1Index: number, coinbase: EthAddress, feeRecipient: AztecAddress): Promise<void>;
11
+ export declare function addressForPrivateKey(privateKey: EthPrivateKey): EthAddress;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lMmVfbXVsdGlfdmFsaWRhdG9yL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFXMUQsd0JBQWdCLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxzR0EwRXBHO0FBR0Qsd0JBQXNCLGNBQWMsQ0FDbEMsUUFBUSxFQUFFLE1BQU0sRUFDaEIsUUFBUSxFQUFFLE1BQU0sRUFDaEIsY0FBYyxFQUFFLE1BQU0sRUFDdEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsUUFBUSxFQUFFLFVBQVUsRUFDcEIsWUFBWSxFQUFFLFlBQVksaUJBbUIzQjtBQUVELHdCQUFzQixjQUFjLENBQ2xDLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLFlBQVksRUFBRSxhQUFhLEVBQzNCLGlCQUFpQixFQUFFLE1BQU0sRUFDekIsZUFBZSxFQUFFLE1BQU0sRUFDdkIsUUFBUSxFQUFFLFVBQVUsRUFDcEIsWUFBWSxFQUFFLFlBQVksaUJBbUIzQjtBQUVELHdCQUFzQixjQUFjLENBQ2xDLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsUUFBUSxFQUFFLFVBQVUsRUFDcEIsZUFBZSxFQUFFLE1BQU0sRUFDdkIsWUFBWSxFQUFFLFlBQVksaUJBaUIzQjtBQUVELHdCQUFzQixjQUFjLENBQ2xDLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLGlCQUFpQixFQUFFLFVBQVUsRUFDN0IsaUJBQWlCLEVBQUUsVUFBVSxFQUM3QixlQUFlLEVBQUUsTUFBTSxFQUN2QixhQUFhLEVBQUUsYUFBYSxFQUM1QixRQUFRLEVBQUUsTUFBTSxFQUNoQixhQUFhLEVBQUUsYUFBYSxFQUM1QixTQUFTLEVBQUUsVUFBVSxFQUNyQixTQUFTLEVBQUUsVUFBVSxFQUNyQixlQUFlLEVBQUUsTUFBTSxFQUN2QixhQUFhLEVBQUUsWUFBWSxFQUMzQixhQUFhLEVBQUUsWUFBWSxpQkE0QjVCO0FBRUQsd0JBQXNCLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBY3hHO0FBRUQsd0JBQXNCLGNBQWMsQ0FDbEMsUUFBUSxFQUFFLE1BQU0sRUFDaEIsUUFBUSxFQUFFLE1BQU0sRUFDaEIsZUFBZSxFQUFFLE1BQU0sRUFDdkIsUUFBUSxFQUFFLFVBQVUsRUFDcEIsWUFBWSxFQUFFLFlBQVksaUJBa0IzQjtBQUVELHdCQUFnQixvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxHQUFHLFVBQVUsQ0FFMUUifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/e2e_multi_validator/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAW1D,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,sGA0EpG;AAGD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,YAAY,iBAmB3B;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,aAAa,EAC3B,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,YAAY,iBAmB3B;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,UAAU,EAC5B,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,UAAU,EACpB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,YAAY,iBAiB3B;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,UAAU,EAC7B,iBAAiB,EAAE,UAAU,EAC7B,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU,EACrB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,YAAY,EAC3B,aAAa,EAAE,YAAY,iBA4B5B;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAcxG;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,YAAY,iBAkB3B;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,aAAa,GAAG,UAAU,CAE1E"}