@aztec/end-to-end 0.0.1-commit.2448fdb → 0.0.1-commit.2606882

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 (172) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +15 -1
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/benchmark.js +17 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +25 -35
  7. package/dest/bench/utils.d.ts +1 -1
  8. package/dest/bench/utils.d.ts.map +1 -1
  9. package/dest/bench/utils.js +2 -0
  10. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +3 -3
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +13 -4
  13. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +15 -4
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +39 -7
  16. package/dest/e2e_deploy_contract/deploy_test.d.ts +3 -3
  17. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  18. package/dest/e2e_deploy_contract/deploy_test.js +2 -1
  19. package/dest/e2e_epochs/epochs_test.d.ts +23 -2
  20. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  21. package/dest/e2e_epochs/epochs_test.js +83 -12
  22. package/dest/e2e_fees/fees_test.d.ts +5 -2
  23. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  24. package/dest/e2e_fees/fees_test.js +31 -5
  25. package/dest/e2e_nested_contract/nested_contract_test.d.ts +3 -3
  26. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  27. package/dest/e2e_nested_contract/nested_contract_test.js +2 -1
  28. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  29. package/dest/e2e_p2p/p2p_network.d.ts +11 -10
  30. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  31. package/dest/e2e_p2p/p2p_network.js +47 -28
  32. package/dest/e2e_p2p/reqresp/utils.d.ts +1 -1
  33. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
  34. package/dest/e2e_p2p/reqresp/utils.js +42 -13
  35. package/dest/e2e_p2p/shared.d.ts +23 -26
  36. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  37. package/dest/e2e_p2p/shared.js +62 -80
  38. package/dest/e2e_token_contract/token_contract_test.d.ts +3 -3
  39. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  40. package/dest/e2e_token_contract/token_contract_test.js +4 -2
  41. package/dest/fixtures/e2e_prover_test.d.ts +6 -5
  42. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  43. package/dest/fixtures/e2e_prover_test.js +9 -13
  44. package/dest/fixtures/elu_monitor.d.ts +21 -0
  45. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  46. package/dest/fixtures/elu_monitor.js +102 -0
  47. package/dest/fixtures/fixtures.d.ts +70 -1
  48. package/dest/fixtures/fixtures.d.ts.map +1 -1
  49. package/dest/fixtures/fixtures.js +65 -0
  50. package/dest/fixtures/get_bb_config.d.ts +1 -1
  51. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  52. package/dest/fixtures/get_bb_config.js +5 -5
  53. package/dest/fixtures/ha_setup.d.ts +2 -2
  54. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  55. package/dest/fixtures/ha_setup.js +1 -1
  56. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  57. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  58. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  59. package/dest/fixtures/setup.d.ts +44 -10
  60. package/dest/fixtures/setup.d.ts.map +1 -1
  61. package/dest/fixtures/setup.js +145 -19
  62. package/dest/fixtures/setup_p2p_test.d.ts +10 -6
  63. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  64. package/dest/fixtures/setup_p2p_test.js +8 -8
  65. package/dest/fixtures/token_utils.d.ts +1 -1
  66. package/dest/fixtures/token_utils.d.ts.map +1 -1
  67. package/dest/fixtures/token_utils.js +2 -5
  68. package/dest/fixtures/utils.d.ts +2 -2
  69. package/dest/fixtures/utils.d.ts.map +1 -1
  70. package/dest/fixtures/utils.js +1 -1
  71. package/dest/install_legacy_contracts.d.cts +1 -1
  72. package/dest/install_legacy_contracts.d.cts.map +1 -1
  73. package/dest/legacy-jest-resolver.d.cts +1 -1
  74. package/dest/legacy-jest-resolver.d.cts.map +1 -1
  75. package/dest/shared/cross_chain_test_harness.d.ts +4 -2
  76. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  77. package/dest/shared/cross_chain_test_harness.js +9 -5
  78. package/dest/shared/gas_portal_test_harness.d.ts +8 -5
  79. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  80. package/dest/shared/gas_portal_test_harness.js +17 -8
  81. package/dest/shared/jest_setup.js +41 -1
  82. package/dest/shared/submit-transactions.d.ts +1 -1
  83. package/dest/shared/submit-transactions.d.ts.map +1 -1
  84. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  85. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  86. package/dest/shared/uniswap_l1_l2.js +50 -32
  87. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  88. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  89. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  90. package/dest/simulators/lending_simulator.d.ts +10 -3
  91. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  92. package/dest/simulators/lending_simulator.js +23 -11
  93. package/dest/simulators/token_simulator.js +1 -1
  94. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  95. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  96. package/dest/spartan/setup_test_wallets.js +67 -43
  97. package/dest/spartan/tx_metrics.d.ts +18 -4
  98. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  99. package/dest/spartan/tx_metrics.js +74 -21
  100. package/dest/spartan/utils/config.d.ts +10 -30
  101. package/dest/spartan/utils/config.d.ts.map +1 -1
  102. package/dest/spartan/utils/config.js +3 -1
  103. package/dest/spartan/utils/index.d.ts +2 -1
  104. package/dest/spartan/utils/index.d.ts.map +1 -1
  105. package/dest/spartan/utils/index.js +2 -0
  106. package/dest/spartan/utils/nodes.d.ts +4 -5
  107. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  108. package/dest/spartan/utils/nodes.js +11 -11
  109. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  110. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  111. package/dest/spartan/utils/pod_logs.js +74 -0
  112. package/dest/test-wallet/test_wallet.d.ts +3 -2
  113. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  114. package/dest/test-wallet/test_wallet.js +52 -28
  115. package/dest/test-wallet/utils.d.ts +3 -3
  116. package/dest/test-wallet/utils.d.ts.map +1 -1
  117. package/dest/test-wallet/utils.js +2 -7
  118. package/dest/test-wallet/wallet_worker_script.js +7 -2
  119. package/dest/test-wallet/worker_wallet.d.ts +2 -1
  120. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  121. package/dest/test-wallet/worker_wallet.js +6 -2
  122. package/dest/test-wallet/worker_wallet_schema.d.ts +110 -224
  123. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  124. package/dest/test-wallet/worker_wallet_schema.js +14 -2
  125. package/package.json +48 -46
  126. package/src/bench/client_flows/benchmark.ts +19 -0
  127. package/src/bench/client_flows/client_flows_benchmark.ts +62 -51
  128. package/src/bench/utils.ts +2 -1
  129. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +21 -4
  130. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +49 -11
  131. package/src/e2e_deploy_contract/deploy_test.ts +3 -2
  132. package/src/e2e_epochs/epochs_test.ts +85 -9
  133. package/src/e2e_fees/fees_test.ts +37 -4
  134. package/src/e2e_nested_contract/nested_contract_test.ts +3 -1
  135. package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
  136. package/src/e2e_p2p/p2p_network.ts +58 -40
  137. package/src/e2e_p2p/reqresp/utils.ts +51 -12
  138. package/src/e2e_p2p/shared.ts +60 -113
  139. package/src/e2e_token_contract/token_contract_test.ts +12 -2
  140. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  141. package/src/fixtures/e2e_prover_test.ts +15 -18
  142. package/src/fixtures/elu_monitor.ts +126 -0
  143. package/src/fixtures/fixtures.ts +83 -0
  144. package/src/fixtures/get_bb_config.ts +7 -6
  145. package/src/fixtures/ha_setup.ts +4 -2
  146. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  147. package/src/fixtures/setup.ts +175 -24
  148. package/src/fixtures/setup_p2p_test.ts +13 -9
  149. package/src/fixtures/token_utils.ts +1 -4
  150. package/src/fixtures/utils.ts +2 -0
  151. package/src/guides/up_quick_start.sh +0 -2
  152. package/src/install_legacy_contracts.cjs +9 -5
  153. package/src/legacy-jest-resolver.cjs +15 -4
  154. package/src/shared/cross_chain_test_harness.ts +14 -4
  155. package/src/shared/gas_portal_test_harness.ts +20 -10
  156. package/src/shared/jest_setup.ts +51 -1
  157. package/src/shared/submit-transactions.ts +1 -4
  158. package/src/shared/uniswap_l1_l2.ts +84 -40
  159. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  160. package/src/simulators/lending_simulator.ts +27 -13
  161. package/src/simulators/token_simulator.ts +1 -1
  162. package/src/spartan/setup_test_wallets.ts +65 -40
  163. package/src/spartan/tx_metrics.ts +82 -24
  164. package/src/spartan/utils/config.ts +2 -0
  165. package/src/spartan/utils/index.ts +3 -0
  166. package/src/spartan/utils/nodes.ts +17 -12
  167. package/src/spartan/utils/pod_logs.ts +99 -0
  168. package/src/test-wallet/test_wallet.ts +49 -24
  169. package/src/test-wallet/utils.ts +3 -7
  170. package/src/test-wallet/wallet_worker_script.ts +5 -2
  171. package/src/test-wallet/worker_wallet.ts +7 -3
  172. package/src/test-wallet/worker_wallet_schema.ts +2 -2
@@ -1,13 +1,14 @@
1
1
  import { EthAddress } from '@aztec/aztec.js/addresses';
2
2
  import { L1TokenPortalManager } from '@aztec/aztec.js/ethereum';
3
3
  import { Fr } from '@aztec/aztec.js/fields';
4
+ import { OutboxContract } from '@aztec/ethereum/contracts';
4
5
  import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
5
- import { retryUntil } from '@aztec/foundation/retry';
6
6
  import { TestERC20Abi, TokenPortalAbi, TokenPortalBytecode } from '@aztec/l1-artifacts';
7
7
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
8
8
  import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
9
9
  import { getContract } from 'viem';
10
10
  import { mintTokensToPrivate } from '../fixtures/token_utils.js';
11
+ import { waitForL1ToL2MessageSeen } from './wait_for_l1_to_l2_message.js';
11
12
  /**
12
13
  * Deploy L1 token and portal, initialize portal, deploy a non native l2 token contract, its L2 bridge contract and attach is to the portal.
13
14
  * @param wallet - the wallet instance
@@ -97,6 +98,7 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
97
98
  }
98
99
  l1TokenManager;
99
100
  l1TokenPortalManager;
101
+ outboxContract;
100
102
  constructor(/** Aztec node instance. */ aztecNode, /** 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 to simulate and send txs from. */ wallet, /** Owner of the l2 token and bridge */ ownerAddress){
101
103
  this.aztecNode = aztecNode;
102
104
  this.logger = logger;
@@ -111,6 +113,7 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
111
113
  this.ownerAddress = ownerAddress;
112
114
  this.l1TokenPortalManager = new L1TokenPortalManager(this.tokenPortalAddress, this.underlyingERC20Address, this.l1ContractAddresses.feeAssetHandlerAddress, this.l1ContractAddresses.outboxAddress, this.l1Client, this.logger);
113
115
  this.l1TokenManager = this.l1TokenPortalManager.getTokenManager();
116
+ this.outboxContract = new OutboxContract(this.l1Client, this.l1ContractAddresses.outboxAddress);
114
117
  }
115
118
  async mintTokensOnL1(amount) {
116
119
  const contract = getContract({
@@ -203,8 +206,8 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
203
206
  async getL2ToL1MessageLeaf(withdrawAmount, callerOnL1 = EthAddress.ZERO) {
204
207
  return await this.l1TokenPortalManager.getL2ToL1MessageLeaf(withdrawAmount, this.ethAccount, this.l2Bridge.address, callerOnL1);
205
208
  }
206
- withdrawFundsFromBridgeOnL1(amount, epochNumber, messageIndex, siblingPath) {
207
- return this.l1TokenPortalManager.withdrawFunds(amount, this.ethAccount, epochNumber, messageIndex, siblingPath);
209
+ withdrawFundsFromBridgeOnL1(amount, epochNumber, numCheckpointsInEpoch, messageIndex, siblingPath) {
210
+ return this.l1TokenPortalManager.withdrawFunds(amount, this.ethAccount, epochNumber, numCheckpointsInEpoch, messageIndex, siblingPath);
208
211
  }
209
212
  async transferToPrivateOnL2(shieldAmount) {
210
213
  this.logger.info('Transferring to private on L2');
@@ -226,8 +229,9 @@ import { mintTokensToPrivate } from '../fixtures/token_utils.js';
226
229
  * it's included it becomes available for consumption in the next block because the l1 to l2 message tree.
227
230
  */ async makeMessageConsumable(msgHash) {
228
231
  const frMsgHash = typeof msgHash === 'string' ? Fr.fromHexString(msgHash) : msgHash;
229
- // We poll isL1ToL2MessageSynced endpoint until the message is available
230
- await retryUntil(async ()=>await this.aztecNode.isL1ToL2MessageSynced(frMsgHash), 'message sync', 10);
232
+ await waitForL1ToL2MessageSeen(this.aztecNode, frMsgHash, {
233
+ timeoutSeconds: 10
234
+ });
231
235
  await this.mintTokensPublicOnL2(0n);
232
236
  await this.mintTokensPublicOnL2(0n);
233
237
  }
@@ -5,7 +5,9 @@ import type { AztecNode } from '@aztec/aztec.js/node';
5
5
  import type { Wallet } from '@aztec/aztec.js/wallet';
6
6
  import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
7
7
  import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
8
- import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
8
+ import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
9
+ /** Aztec node that may expose the debug mining API in local e2e setups. */
10
+ type MiningAztecNode = AztecNode & Partial<AztecNodeDebug>;
9
11
  export interface IGasBridgingTestHarness {
10
12
  getL1FeeJuiceBalance(address: EthAddress): Promise<bigint>;
11
13
  prepareTokensOnL1(owner: AztecAddress): Promise<L2AmountClaim>;
@@ -14,7 +16,7 @@ export interface IGasBridgingTestHarness {
14
16
  l1FeeJuiceAddress: EthAddress;
15
17
  }
16
18
  export interface FeeJuicePortalTestingHarnessFactoryConfig {
17
- aztecNode: AztecNode;
19
+ aztecNode: MiningAztecNode;
18
20
  aztecNodeAdmin?: AztecNodeAdmin;
19
21
  l1Client: ExtendedViemWalletClient;
20
22
  wallet: Wallet;
@@ -33,7 +35,7 @@ export declare class FeeJuicePortalTestingHarnessFactory {
33
35
  */
34
36
  export declare class GasBridgingTestHarness implements IGasBridgingTestHarness {
35
37
  /** Aztec node */
36
- aztecNode: AztecNode;
38
+ aztecNode: MiningAztecNode;
37
39
  /** Aztec node admin interface */
38
40
  aztecNodeAdmin: AztecNodeAdmin | undefined;
39
41
  /** Wallet. */
@@ -56,7 +58,7 @@ export declare class GasBridgingTestHarness implements IGasBridgingTestHarness {
56
58
  readonly feeJuicePortalManager: L1FeeJuicePortalManager;
57
59
  constructor(
58
60
  /** Aztec node */
59
- aztecNode: AztecNode,
61
+ aztecNode: MiningAztecNode,
60
62
  /** Aztec node admin interface */
61
63
  aztecNodeAdmin: AztecNodeAdmin | undefined,
62
64
  /** Wallet. */
@@ -85,4 +87,5 @@ export declare class GasBridgingTestHarness implements IGasBridgingTestHarness {
85
87
  bridgeFromL1ToL2(owner: AztecAddress, claimer: AztecAddress): Promise<void>;
86
88
  private advanceL2Block;
87
89
  }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX3BvcnRhbF90ZXN0X2hhcm5lc3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFyZWQvZ2FzX3BvcnRhbF90ZXN0X2hhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxjQUFjLEVBQUUsS0FBSyxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU1RyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRFLE1BQU0sV0FBVyx1QkFBdUI7SUFDdEMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0QsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDL0QsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RSxRQUFRLEVBQUUsZ0JBQWdCLENBQUM7SUFDM0IsaUJBQWlCLEVBQUUsVUFBVSxDQUFDO0NBQy9CO0FBRUQsTUFBTSxXQUFXLHlDQUF5QztJQUN4RCxTQUFTLEVBQUUsU0FBUyxD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
90
+ export {};
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX3BvcnRhbF90ZXN0X2hhcm5lc3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFyZWQvZ2FzX3BvcnRhbF90ZXN0X2hhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxjQUFjLEVBQUUsS0FBSyxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU1RyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUl0RiwyRUFBMkU7QUFDM0UsS0FBSyxlQUFlLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUzRCxNQUFNLFdBQVcsdUJBQXVCO0lBQ3RDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELGlCQUFpQixDQUFDLEtBQUssRUFBRSxZQUFZLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9ELGdCQUFnQixDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUUsUUFBUSxFQUFFLGdCQUFnQixDQUFD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
@@ -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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"}
@@ -4,6 +4,7 @@ import { Fr } from '@aztec/aztec.js/fields';
4
4
  import { retryUntil } from '@aztec/foundation/retry';
5
5
  import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
6
6
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
7
+ import { waitForL1ToL2MessageSeen } from './wait_for_l1_to_l2_message.js';
7
8
  export class FeeJuicePortalTestingHarnessFactory {
8
9
  config;
9
10
  constructor(config){
@@ -87,8 +88,9 @@ export class FeeJuicePortalTestingHarnessFactory {
87
88
  const bridgeAmount = await this.l1TokenManager.getMintAmount();
88
89
  await this.mintTokensOnL1();
89
90
  const claim = await this.sendTokensToPortalPublic(bridgeAmount, owner);
90
- const isSynced = async ()=>await this.aztecNode.isL1ToL2MessageSynced(Fr.fromHexString(claim.messageHash));
91
- await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 1);
91
+ await waitForL1ToL2MessageSeen(this.aztecNode, Fr.fromHexString(claim.messageHash), {
92
+ timeoutSeconds: 24
93
+ });
92
94
  // Progress by 2 L2 blocks so that the l1ToL2Message added above will be available to use on L2.
93
95
  await this.advanceL2Block();
94
96
  await this.advanceL2Block();
@@ -101,6 +103,10 @@ export class FeeJuicePortalTestingHarnessFactory {
101
103
  await this.consumeMessageOnAztecAndClaimPrivately(owner, claimer, claim);
102
104
  }
103
105
  async advanceL2Block() {
106
+ if (this.aztecNode.mineBlock) {
107
+ await this.aztecNode.mineBlock();
108
+ return;
109
+ }
104
110
  const initialBlockNumber = await this.aztecNode.getBlockNumber();
105
111
  let minTxsPerBlock = undefined;
106
112
  if (this.aztecNodeAdmin) {
@@ -109,11 +115,14 @@ export class FeeJuicePortalTestingHarnessFactory {
109
115
  minTxsPerBlock: 0
110
116
  }); // Set to 0 to ensure we can advance the block
111
117
  }
112
- await retryUntil(async ()=>await this.aztecNode.getBlockNumber() >= initialBlockNumber + 1);
113
- if (this.aztecNodeAdmin && minTxsPerBlock !== undefined) {
114
- await this.aztecNodeAdmin.setConfig({
115
- minTxsPerBlock
116
- });
118
+ try {
119
+ await retryUntil(async ()=>await this.aztecNode.getBlockNumber() >= initialBlockNumber + 1);
120
+ } finally{
121
+ if (this.aztecNodeAdmin && minTxsPerBlock !== undefined) {
122
+ await this.aztecNodeAdmin.setConfig({
123
+ minTxsPerBlock
124
+ });
125
+ }
117
126
  }
118
127
  }
119
- } // docs:end:cross_chain_test_harness
128
+ }
@@ -1,6 +1,12 @@
1
1
  import { createLogger } from '@aztec/aztec.js/log';
2
- import { beforeEach, expect } from '@jest/globals';
2
+ import { afterAll, afterEach, beforeEach, expect } from '@jest/globals';
3
+ import { readlinkSync } from 'fs';
3
4
  import { basename } from 'path';
5
+ import { EluMonitor } from '../fixtures/elu_monitor.js';
6
+ const eluMonitor = process.env.ELU_MONITOR_FILE ? new EluMonitor(process.env.ELU_MONITOR_FILE, Number(process.env.ELU_MONITOR_INTERVAL_MS) || undefined) : undefined;
7
+ if (eluMonitor) {
8
+ process.on('exit', ()=>eluMonitor.stop());
9
+ }
4
10
  beforeEach(()=>{
5
11
  const { testPath, currentTestName } = expect.getState();
6
12
  if (!testPath || !currentTestName) {
@@ -8,4 +14,38 @@ beforeEach(()=>{
8
14
  }
9
15
  const logger = createLogger(`e2e:${basename(testPath).replace('.test.ts', '')}`);
10
16
  logger.info(`Running test: ${currentTestName}`);
17
+ eluMonitor?.startTest(currentTestName);
18
+ });
19
+ afterEach(()=>{
20
+ eluMonitor?.stopTest();
21
+ });
22
+ // Log leaked handles after all tests complete. This runs after test-level afterAll hooks,
23
+ // so any handles still alive at this point were not properly cleaned up during teardown.
24
+ // This diagnostic helps identify the source of exit hangs without masking them.
25
+ afterAll(()=>{
26
+ const handles = process._getActiveHandles();
27
+ if (handles.length > 0) {
28
+ const details = handles.map((h)=>{
29
+ const type = h?.constructor?.name ?? typeof h;
30
+ const fd = h?.fd ?? h?._handle?.fd ?? '?';
31
+ const destroyed = h?.destroyed ?? '?';
32
+ const hasRef = typeof h?.hasRef === 'function' ? h.hasRef() : '?';
33
+ const localAddr = h?.localAddress ?? '';
34
+ const remoteAddr = h?.remoteAddress ?? '';
35
+ const localPort = h?.localPort ?? '';
36
+ const remotePort = h?.remotePort ?? '';
37
+ const proto = Object.getPrototypeOf(h)?.constructor?.name ?? '?';
38
+ const keys = Object.keys(h).slice(0, 10).join(',');
39
+ let fdTarget = '';
40
+ if (typeof fd === 'number') {
41
+ try {
42
+ fdTarget = ` -> ${readlinkSync(`/proc/self/fd/${fd}`)}`;
43
+ } catch {
44
+ // ignore
45
+ }
46
+ }
47
+ return ` ${type}(fd=${fd}, destroyed=${destroyed}, hasRef=${hasRef}${fdTarget}) proto=${proto} addr=${localAddr}:${localPort}->${remoteAddr}:${remotePort} keys=[${keys}]`;
48
+ });
49
+ process.stderr.write(`\n[jest_setup] WARNING: ${handles.length} handle(s) still active after teardown:\n${details.join('\n')}\n` + `These may prevent Jest from exiting. Investigate and fix the leak.\n\n`);
50
+ }
11
51
  });
@@ -3,4 +3,4 @@ import type { Logger } from '@aztec/aztec.js/log';
3
3
  import { TxHash } from '@aztec/aztec.js/tx';
4
4
  import type { TestWallet } from '../test-wallet/test_wallet.js';
5
5
  export declare const submitTxsTo: (wallet: TestWallet, submitter: AztecAddress, numTxs: number, logger: Logger) => Promise<TxHash[]>;
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0LXRyYW5zYWN0aW9ucy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC9zdWJtaXQtdHJhbnNhY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd6RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUE0QixNQUFNLG9CQUFvQixDQUFDO0FBR3RFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLGVBQU8sTUFBTSxXQUFXLG9HQXdCdkIsQ0FBQyJ9
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0LXRyYW5zYWN0aW9ucy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC9zdWJtaXQtdHJhbnNhY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd6RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUE0QixNQUFNLG9CQUFvQixDQUFDO0FBR3RFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLGVBQU8sTUFBTSxXQUFXLG9HQXFCdkIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"submit-transactions.d.ts","sourceRoot":"","sources":["../../src/shared/submit-transactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAA4B,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,eAAO,MAAM,WAAW,oGAwBvB,CAAC"}
1
+ {"version":3,"file":"submit-transactions.d.ts","sourceRoot":"","sources":["../../src/shared/submit-transactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAA4B,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,eAAO,MAAM,WAAW,oGAqBvB,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { type EndToEndContext } from '../fixtures/utils.js';
2
2
  export declare const uniswapL1L2TestSuite: (setup: () => Promise<EndToEndContext>, cleanup: () => Promise<void>, expectedForkBlockNumber?: number) => void;
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pc3dhcF9sMV9sMi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC91bmlzd2FwX2wxX2wyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVCQSxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQW1DLE1BQU0sc0JBQXNCLENBQUM7QUFhN0YsZUFBTyxNQUFNLG9CQUFvQixpSEF1K0JoQyxDQUFDIn0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pc3dhcF9sMV9sMi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC91bmlzd2FwX2wxX2wyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVCQSxPQUFPLEVBQ0wsS0FBSyxlQUFlLEVBR3JCLE1BQU0sc0JBQXNCLENBQUM7QUFhOUIsZUFBTyxNQUFNLG9CQUFvQixpSEErZ0NoQyxDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"uniswap_l1_l2.d.ts","sourceRoot":"","sources":["../../src/shared/uniswap_l1_l2.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,KAAK,eAAe,EAAmC,MAAM,sBAAsB,CAAC;AAa7F,eAAO,MAAM,oBAAoB,iHAu+BhC,CAAC"}
1
+ {"version":3,"file":"uniswap_l1_l2.d.ts","sourceRoot":"","sources":["../../src/shared/uniswap_l1_l2.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,sBAAsB,CAAC;AAa9B,eAAO,MAAM,oBAAoB,iHA+gChC,CAAC"}
@@ -8,13 +8,13 @@ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
8
8
  import { extractEvent } from '@aztec/ethereum/utils';
9
9
  import { EpochNumber } from '@aztec/foundation/branded-types';
10
10
  import { sha256ToField } from '@aztec/foundation/crypto/sha256';
11
+ import { retryUntil } from '@aztec/foundation/retry';
11
12
  import { InboxAbi, UniswapPortalAbi, UniswapPortalBytecode } from '@aztec/l1-artifacts';
12
13
  import { UniswapContract } from '@aztec/noir-contracts.js/Uniswap';
13
14
  import { computeL2ToL1MessageHash } from '@aztec/stdlib/hash';
14
- import { computeL2ToL1MembershipWitness } from '@aztec/stdlib/messaging';
15
15
  import { jest } from '@jest/globals';
16
16
  import { getContract, parseEther, toFunctionSelector } from 'viem';
17
- import { ensureAccountContractsPublished } from '../fixtures/utils.js';
17
+ import { ensureAccountContractsPublished, ensureAuthRegistryPublished } from '../fixtures/utils.js';
18
18
  import { CrossChainTestHarness } from './cross_chain_test_harness.js';
19
19
  // PSA: This tests works on forked mainnet. There is a dump of the data in `dumpedState` such that we
20
20
  // don't need to burn through RPC requests.
@@ -22,7 +22,7 @@ import { CrossChainTestHarness } from './cross_chain_test_harness.js';
22
22
  // To start an actual fork, use the command:
23
23
  // anvil --fork-url https://mainnet.infura.io/v3/9928b52099854248b3a096be07a6b23c --fork-block-number 17514288 --chain-id 31337
24
24
  // For CI, this is configured in `run_tests.sh` and `docker-compose-images.yml`
25
- const TIMEOUT = 360_000;
25
+ const TIMEOUT = 15 * 60 * 1000;
26
26
  export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 17514288)=>{
27
27
  describe('uniswap_trade_on_l1_from_l2', ()=>{
28
28
  jest.setTimeout(TIMEOUT);
@@ -63,6 +63,7 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
63
63
  ownerAddress,
64
64
  sponsorAddress
65
65
  ]);
66
+ await ensureAuthRegistryPublished(wallet, ownerAddress);
66
67
  logger.info('Deploying DAI Portal, initializing and deploying l2 contract...');
67
68
  daiCrossChainHarness = await CrossChainTestHarness.new(aztecNode, deployL1ContractsValues.l1Client, wallet, ownerAddress, logger, DAI_ADDRESS);
68
69
  logger.info('Deploying WETH Portal, initializing and deploying l2 contract...');
@@ -98,7 +99,6 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
98
99
  afterAll(async ()=>{
99
100
  await cleanup();
100
101
  });
101
- // docs:start:uniswap_private
102
102
  it('should uniswap trade on L1 from L2 funds privately (swaps WETH -> DAI)', async ()=>{
103
103
  const wethL1BeforeBalance = await wethCrossChainHarness.getL1BalanceOf(ownerEthAddress);
104
104
  // 1. Approve and deposit weth to the portal and move to L2
@@ -165,28 +165,35 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
165
165
  await wethCrossChainHarness.expectPrivateBalanceOnL2(ownerAddress, wethL2BalanceBeforeSwap - wethAmountToBridge);
166
166
  // ensure that uniswap contract didn't eat the funds.
167
167
  await wethCrossChainHarness.expectPublicBalanceOnL2(uniswapL2Contract.address, 0n);
168
- // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
169
- const swapResult = await computeL2ToL1MembershipWitness(aztecNode, swapPrivateLeaf, l2UniswapInteractionReceipt.txHash);
170
- const { epochNumber: epoch } = swapResult;
171
- await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
168
+ // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch
169
+ // before we can ask the witness helper for a covering root.
170
+ const minedReceipt = await aztecNode.getTxReceipt(l2UniswapInteractionReceipt.txHash);
171
+ if (minedReceipt.epochNumber === undefined) {
172
+ throw new Error('L2 Uniswap interaction tx is not yet in an epoch');
173
+ }
174
+ await cheatCodes.rollup.advanceToEpoch(EpochNumber(minedReceipt.epochNumber + 1));
172
175
  await waitForProven(aztecNode, l2UniswapInteractionReceipt, {
173
176
  provenTimeout: 300
174
177
  });
175
178
  // 5. Consume L2 to L1 message by calling uniswapPortal.swap_private()
176
179
  logger.info('Execute withdraw and swap on the uniswapPortal!');
177
180
  const daiL1BalanceOfPortalBeforeSwap = await daiCrossChainHarness.getL1BalanceOf(daiCrossChainHarness.tokenPortalAddress);
178
- const withdrawResult = await computeL2ToL1MembershipWitness(aztecNode, withdrawLeaf, l2UniswapInteractionReceipt.txHash);
181
+ const swapResult = await retryUntil(()=>aztecNode.getL2ToL1MembershipWitness(minedReceipt.txHash, swapPrivateLeaf), 'swap private l2 to l1 witness', 60, 1);
182
+ const { epochNumber: epoch, numCheckpointsInEpoch } = swapResult;
183
+ const withdrawResult = await retryUntil(()=>aztecNode.getL2ToL1MembershipWitness(minedReceipt.txHash, withdrawLeaf), 'withdraw l2 to l1 witness', 60, 1);
179
184
  const swapPrivateL2MessageIndex = swapResult.leafIndex;
180
185
  const swapPrivateSiblingPath = swapResult.siblingPath;
181
186
  const withdrawL2MessageIndex = withdrawResult.leafIndex;
182
187
  const withdrawSiblingPath = withdrawResult.siblingPath;
183
188
  const withdrawMessageMetadata = {
184
189
  _epoch: BigInt(epoch),
190
+ _numCheckpointsInEpoch: BigInt(withdrawResult.numCheckpointsInEpoch),
185
191
  _leafIndex: BigInt(withdrawL2MessageIndex),
186
192
  _path: withdrawSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
187
193
  };
188
194
  const swapPrivateMessageMetadata = {
189
195
  _epoch: BigInt(epoch),
196
+ _numCheckpointsInEpoch: BigInt(numCheckpointsInEpoch),
190
197
  _leafIndex: BigInt(swapPrivateL2MessageIndex),
191
198
  _path: swapPrivateSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
192
199
  };
@@ -235,9 +242,7 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
235
242
  logger.info('WETH balance after swap : ', wethL2BalanceAfterSwap.toString());
236
243
  logger.info('DAI balance after swap : ', daiL2BalanceAfterSwap.toString());
237
244
  });
238
- // docs:end:uniswap_private
239
245
  // TODO(#7463): reenable look into this failure https://github.com/AztecProtocol/aztec-packages/actions/runs/9912612912/job/27388320150?pr=7462
240
- // // docs:start:uniswap_public
241
246
  // it('should uniswap trade on L1 from L2 funds publicly (swaps WETH -> DAI)', async () => {
242
247
  // const wethL1BeforeBalance = await wethCrossChainHarness.getL1BalanceOf(ownerEthAddress);
243
248
  // // 1. Approve and deposit weth to the portal and move to L2
@@ -440,7 +445,6 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
440
445
  // logger.info('WETH balance after swap : ', wethL2BalanceAfterSwap.toString());
441
446
  // logger.info('DAI balance after swap : ', daiL2BalanceAfterSwap.toString());
442
447
  // });
443
- // // docs:end:uniswap_public
444
448
  // Edge cases for the private flow:
445
449
  // note - tests for uniswapPortal.sol and minting asset on L2 are covered in other tests.
446
450
  it('swap_private reverts without transfer to public approval', async ()=>{
@@ -573,30 +577,37 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
573
577
  rollupVersion: new Fr(version),
574
578
  chainId: new Fr(l1Client.chain.id)
575
579
  });
576
- const swapResult = await computeL2ToL1MembershipWitness(aztecNode, swapPrivateLeaf, withdrawReceipt.txHash);
577
- const { epochNumber: epoch } = swapResult;
578
- const withdrawResult = await computeL2ToL1MembershipWitness(aztecNode, withdrawLeaf, withdrawReceipt.txHash);
580
+ // ensure that user's funds were burnt
581
+ await wethCrossChainHarness.expectPrivateBalanceOnL2(ownerAddress, wethL2BalanceBeforeSwap - wethAmountToBridge);
582
+ // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch
583
+ // before we can ask the witness helper for a covering root.
584
+ const minedReceipt = await aztecNode.getTxReceipt(withdrawReceipt.txHash);
585
+ if (minedReceipt.epochNumber === undefined) {
586
+ throw new Error('Withdraw tx is not yet in an epoch');
587
+ }
588
+ await cheatCodes.rollup.advanceToEpoch(EpochNumber(minedReceipt.epochNumber + 1));
589
+ await waitForProven(aztecNode, withdrawReceipt, {
590
+ provenTimeout: 300
591
+ });
592
+ const swapResult = await retryUntil(()=>aztecNode.getL2ToL1MembershipWitness(minedReceipt.txHash, swapPrivateLeaf), 'swap private l2 to l1 witness', 60, 1);
593
+ const { epochNumber: epoch, numCheckpointsInEpoch } = swapResult;
594
+ const withdrawResult = await retryUntil(()=>aztecNode.getL2ToL1MembershipWitness(minedReceipt.txHash, withdrawLeaf), 'withdraw l2 to l1 witness', 60, 1);
579
595
  const swapPrivateL2MessageIndex = swapResult.leafIndex;
580
596
  const swapPrivateSiblingPath = swapResult.siblingPath;
581
597
  const withdrawL2MessageIndex = withdrawResult.leafIndex;
582
598
  const withdrawSiblingPath = withdrawResult.siblingPath;
583
599
  const withdrawMessageMetadata = {
584
600
  _epoch: BigInt(epoch),
601
+ _numCheckpointsInEpoch: BigInt(withdrawResult.numCheckpointsInEpoch),
585
602
  _leafIndex: BigInt(withdrawL2MessageIndex),
586
603
  _path: withdrawSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
587
604
  };
588
605
  const swapPrivateMessageMetadata = {
589
606
  _epoch: BigInt(epoch),
607
+ _numCheckpointsInEpoch: BigInt(numCheckpointsInEpoch),
590
608
  _leafIndex: BigInt(swapPrivateL2MessageIndex),
591
609
  _path: swapPrivateSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
592
610
  };
593
- // ensure that user's funds were burnt
594
- await wethCrossChainHarness.expectPrivateBalanceOnL2(ownerAddress, wethL2BalanceBeforeSwap - wethAmountToBridge);
595
- // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
596
- await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
597
- await waitForProven(aztecNode, withdrawReceipt, {
598
- provenTimeout: 300
599
- });
600
611
  // On L1 call swap_public!
601
612
  logger.info('call swap_public on L1');
602
613
  const swapArgs = [
@@ -663,30 +674,37 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
663
674
  rollupVersion: new Fr(version),
664
675
  chainId: new Fr(l1Client.chain.id)
665
676
  });
666
- const swapResult = await computeL2ToL1MembershipWitness(aztecNode, swapPublicLeaf, withdrawReceipt.txHash);
667
- const { epochNumber: epoch } = swapResult;
668
- const withdrawResult = await computeL2ToL1MembershipWitness(aztecNode, withdrawLeaf, withdrawReceipt.txHash);
677
+ // check weth balance of owner on L2 (we first bridged `wethAmountToBridge` into L2 and now withdrew it!)
678
+ await wethCrossChainHarness.expectPublicBalanceOnL2(ownerAddress, 0n);
679
+ // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch
680
+ // before we can ask the witness helper for a covering root.
681
+ const minedReceipt = await aztecNode.getTxReceipt(withdrawReceipt.txHash);
682
+ if (minedReceipt.epochNumber === undefined) {
683
+ throw new Error('Withdraw tx is not yet in an epoch');
684
+ }
685
+ await cheatCodes.rollup.advanceToEpoch(EpochNumber(minedReceipt.epochNumber + 1));
686
+ await waitForProven(aztecNode, withdrawReceipt, {
687
+ provenTimeout: 300
688
+ });
689
+ const swapResult = await retryUntil(()=>aztecNode.getL2ToL1MembershipWitness(minedReceipt.txHash, swapPublicLeaf), 'swap public l2 to l1 witness', 60, 1);
690
+ const { epochNumber: epoch, numCheckpointsInEpoch } = swapResult;
691
+ const withdrawResult = await retryUntil(()=>aztecNode.getL2ToL1MembershipWitness(minedReceipt.txHash, withdrawLeaf), 'withdraw l2 to l1 witness', 60, 1);
669
692
  const swapPublicL2MessageIndex = swapResult.leafIndex;
670
693
  const swapPublicSiblingPath = swapResult.siblingPath;
671
694
  const withdrawL2MessageIndex = withdrawResult.leafIndex;
672
695
  const withdrawSiblingPath = withdrawResult.siblingPath;
673
696
  const withdrawMessageMetadata = {
674
697
  _epoch: BigInt(epoch),
698
+ _numCheckpointsInEpoch: BigInt(withdrawResult.numCheckpointsInEpoch),
675
699
  _leafIndex: BigInt(withdrawL2MessageIndex),
676
700
  _path: withdrawSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
677
701
  };
678
702
  const swapPublicMessageMetadata = {
679
703
  _epoch: BigInt(epoch),
704
+ _numCheckpointsInEpoch: BigInt(numCheckpointsInEpoch),
680
705
  _leafIndex: BigInt(swapPublicL2MessageIndex),
681
706
  _path: swapPublicSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
682
707
  };
683
- // check weth balance of owner on L2 (we first bridged `wethAmountToBridge` into L2 and now withdrew it!)
684
- await wethCrossChainHarness.expectPublicBalanceOnL2(ownerAddress, 0n);
685
- // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
686
- await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
687
- await waitForProven(aztecNode, withdrawReceipt, {
688
- provenTimeout: 300
689
- });
690
708
  // Call swap_private on L1
691
709
  logger.info('Execute withdraw and swap on the uniswapPortal!');
692
710
  const swapArgs = [
@@ -0,0 +1,13 @@
1
+ import type { Fr } from '@aztec/aztec.js/fields';
2
+ import type { AztecNode } from '@aztec/aztec.js/node';
3
+ /**
4
+ * Waits until the archiver has seen the L1 to L2 message and indexed it. Unlike
5
+ * {@link waitForL1ToL2MessageReady} from `@aztec/aztec.js/messaging`, this does not
6
+ * require the L2 chain to have advanced to the message's checkpoint — it only confirms
7
+ * the message has been picked up from L1. Use this in tests that explicitly produce L2
8
+ * blocks afterwards to make the message consumable.
9
+ */
10
+ export declare function waitForL1ToL2MessageSeen(node: Pick<AztecNode, 'getL1ToL2MessageCheckpoint'>, l1ToL2MessageHash: Fr, opts: {
11
+ timeoutSeconds: number;
12
+ }): Promise<boolean>;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdF9mb3JfbDFfdG9fbDJfbWVzc2FnZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC93YWl0X2Zvcl9sMV90b19sMl9tZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3REOzs7Ozs7R0FNRztBQUNILHdCQUFnQix3QkFBd0IsQ0FDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsNEJBQTRCLENBQUMsRUFDbkQsaUJBQWlCLEVBQUUsRUFBRSxFQUNyQixJQUFJLEVBQUU7SUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFBO0NBQUUsb0JBUWpDIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait_for_l1_to_l2_message.d.ts","sourceRoot":"","sources":["../../src/shared/wait_for_l1_to_l2_message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,EACnD,iBAAiB,EAAE,EAAE,EACrB,IAAI,EAAE;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,oBAQjC"}
@@ -0,0 +1,10 @@
1
+ import { retryUntil } from '@aztec/foundation/retry';
2
+ /**
3
+ * Waits until the archiver has seen the L1 to L2 message and indexed it. Unlike
4
+ * {@link waitForL1ToL2MessageReady} from `@aztec/aztec.js/messaging`, this does not
5
+ * require the L2 chain to have advanced to the message's checkpoint — it only confirms
6
+ * the message has been picked up from L1. Use this in tests that explicitly produce L2
7
+ * blocks afterwards to make the message consumable.
8
+ */ export function waitForL1ToL2MessageSeen(node, l1ToL2MessageHash, opts) {
9
+ return retryUntil(async ()=>await node.getL1ToL2MessageCheckpoint(l1ToL2MessageHash) !== undefined, `L1 to L2 message ${l1ToL2MessageHash.toString()} seen`, opts.timeoutSeconds, 1);
10
+ }
@@ -4,6 +4,7 @@ import { CheatCodes } from '@aztec/aztec/testing';
4
4
  import type { RollupContract } from '@aztec/ethereum/contracts';
5
5
  import type { TestDateProvider } from '@aztec/foundation/timer';
6
6
  import type { LendingContract } from '@aztec/noir-contracts.js/Lending';
7
+ import type { AztecNode, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
7
8
  import type { TokenSimulator } from './token_simulator.js';
8
9
  /**
9
10
  * Contains utilities to compute the "key" for private holdings in the public state.
@@ -53,8 +54,14 @@ export declare class LendingSimulator {
53
54
  collateralAsset: TokenSimulator,
54
55
  /** the stable-coin borrowed in the lending contract */
55
56
  stableCoin: TokenSimulator);
56
- prepare(): Promise<void>;
57
- progressSlots(diff: number, dateProvider?: TestDateProvider): Promise<void>;
57
+ prepare(): void;
58
+ /**
59
+ * Advances the simulator's accumulator and clock to match a block timestamp observed on chain.
60
+ * Call this BEFORE applying any accumulator-sensitive mutation (borrow/repay) so the mutation
61
+ * sees the same accumulator as the contract did during execution.
62
+ */
63
+ observeBlockTimestamp(ts: number): void;
64
+ progressSlots(diff: number, _dateProvider?: TestDateProvider, node?: AztecNode & AztecNodeDebug): Promise<void>;
58
65
  depositPrivate(from: AztecAddress, onBehalfOf: Fr, amount: bigint): void;
59
66
  depositPublic(from: AztecAddress, onBehalfOf: Fr, amount: bigint): void;
60
67
  private deposit;
@@ -66,4 +73,4 @@ export declare class LendingSimulator {
66
73
  mintStableCoinOutsideLoan(recipient: AztecAddress, amount: bigint, priv?: boolean): void;
67
74
  check(): Promise<void>;
68
75
  }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVuZGluZ19zaW11bGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaW11bGF0b3JzL2xlbmRpbmdfc2ltdWxhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR2hFLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFeEUsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0Q7O0dBRUc7QUFDSCxxQkFBYSxjQUFjO0lBQ3pCLHlDQUF5QztJQUN6QyxTQUFnQixPQUFPLEVBQUUsWUFBWSxDQUFDO0lBQ3RDLDJDQUEyQztJQUMzQyxTQUFnQixNQUFNLEVBQUUsRUFBRSxDQUFDO0lBRTNCLFlBQVksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUc1QztJQUVEOzs7T0FHRztJQUNJLEdBQUcsZ0JBRVQ7Q0FDRjtBQWdDRDs7R0FFRztBQUNILHFCQUFhLGdCQUFnQjtJQVl6QixPQUFPLENBQUMsRUFBRTtJQUNWLE9BQU8sQ0FBQyxPQUFPO0lBQ2YsT0FBTyxDQUFDLElBQUk7SUFDWixPQUFPLENBQUMsb0JBQW9CO0lBQzVCLDBCQUEwQjtJQUNuQixNQUFNLEVBQUUsY0FBYztJQUM3QiwyQkFBMkI7SUFDcEIsZUFBZSxFQUFFLGVBQWU7SUFDdkMsd0RBQXdEO0lBQ2pELGVBQWUsRUFBRSxjQUFjO0lBQ3RDLHVEQUF1RDtJQUNoRCxVQUFVLEVBQUUsY0FBYztJQXRCbkMsZ0NBQWdDO0lBQ3pCLFdBQVcsRUFBRSxNQUFNLENBQU07SUFDaEMsb0NBQW9DO0lBQzdCLElBQUksRUFBRSxNQUFNLENBQUs7SUFFeEIsT0FBTyxDQUFDLFVBQVUsQ0FBNkI7SUFDL0MsT0FBTyxDQUFDLFVBQVUsQ0FBNkI7SUFDL0MsT0FBTyxDQUFDLFFBQVEsQ0FBYztJQUM5QixPQUFPLENBQUMsYUFBYSxDQUFjO0lBRW5DLFlBQ1UsRUFBRSxFQUFFLFVBQVUsRUFDZCxPQUFPLEVBQUUsY0FBYyxFQUN2QixJQUFJLEVBQUUsTUFBTSxFQUNaLG9CQUFvQixFQUFFLE1BQU07SUFDcEMsMEJBQTBCO0lBQ25CLE1BQU0sRUFBRSxjQUFjO0lBQzdCLDJCQUEyQjtJQUNwQixlQUFlLEVBQUUsZUFBZTtJQUN2Qyx3REFBd0Q7SUFDakQsZUFBZSxFQUFFLGNBQWM7SUFDdEMsdURBQXVEO0lBQ2hELFVBQVUsRUFBRSxjQUFjLEVBQy9CO0lBRUUsT0FBTyxrQkFNWjtJQUVLLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLGdCQUFnQixpQkFrQmhFO0lBRUQsY0FBYyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUdoRTtJQUVELGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFHL0Q7SUFFRCxPQUFPLENBQUMsT0FBTztJQUtmLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFJMUQ7SUFFRCxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBT3hEO0lBRUQsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUc5RDtJQUVELFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFHN0Q7SUFFRCxPQUFPLENBQUMsS0FBSztJQVFiLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLFVBQVEsUUFPOUU7SUFFSyxLQUFLLGtCQTJCVjtDQUNGIn0=
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVuZGluZ19zaW11bGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaW11bGF0b3JzL2xlbmRpbmdfc2ltdWxhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR2hFLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWpGLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTNEOztHQUVHO0FBQ0gscUJBQWEsY0FBYztJQUN6Qix5Q0FBeUM7SUFDekMsU0FBZ0IsT0FBTyxFQUFFLFlBQVksQ0FBQztJQUN0QywyQ0FBMkM7SUFDM0MsU0FBZ0IsTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUUzQixZQUFZLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFHNUM7SUFFRDs7O09BR0c7SUFDSSxHQUFHLGdCQUVUO0NBQ0Y7QUFnQ0Q7O0dBRUc7QUFDSCxxQkFBYSxnQkFBZ0I7SUFZekIsT0FBTyxDQUFDLEVBQUU7SUFDVixPQUFPLENBQUMsT0FBTztJQUNmLE9BQU8sQ0FBQyxJQUFJO0lBQ1osT0FBTyxDQUFDLG9CQUFvQjtJQUM1QiwwQkFBMEI7SUFDbkIsTUFBTSxFQUFFLGNBQWM7SUFDN0IsMkJBQTJCO0lBQ3BCLGVBQWUsRUFBRSxlQUFlO0lBQ3ZDLHdEQUF3RDtJQUNqRCxlQUFlLEVBQUUsY0FBYztJQUN0Qyx1REFBdUQ7SUFDaEQsVUFBVSxFQUFFLGNBQWM7SUF0Qm5DLGdDQUFnQztJQUN6QixXQUFXLEVBQUUsTUFBTSxDQUFNO0lBQ2hDLG9DQUFvQztJQUM3QixJQUFJLEVBQUUsTUFBTSxDQUFLO0lBRXhCLE9BQU8sQ0FBQyxVQUFVLENBQTZCO0lBQy9DLE9BQU8sQ0FBQyxVQUFVLENBQTZCO0lBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQWM7SUFDOUIsT0FBTyxDQUFDLGFBQWEsQ0FBYztJQUVuQyxZQUNVLEVBQUUsRUFBRSxVQUFVLEVBQ2QsT0FBTyxFQUFFLGNBQWMsRUFDdkIsSUFBSSxFQUFFLE1BQU0sRUFDWixvQkFBb0IsRUFBRSxNQUFNO0lBQ3BDLDBCQUEwQjtJQUNuQixNQUFNLEVBQUUsY0FBYztJQUM3QiwyQkFBMkI7SUFDcEIsZUFBZSxFQUFFLGVBQWU7SUFDdkMsd0RBQXdEO0lBQ2pELGVBQWUsRUFBRSxjQUFjO0lBQ3RDLHVEQUF1RDtJQUNoRCxVQUFVLEVBQUUsY0FBYyxFQUMvQjtJQUVKLE9BQU8sU0FHTjtJQUVEOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsTUFBTSxRQU0vQjtJQUVLLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxFQUFFLFNBQVMsR0FBRyxjQUFjLGlCQXFCcEc7SUFFRCxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBR2hFO0lBRUQsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUcvRDtJQUVELE9BQU8sQ0FBQyxPQUFPO0lBS2YsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUkxRDtJQUVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFPeEQ7SUFFRCxZQUFZLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBRzlEO0lBRUQsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUc3RDtJQUVELE9BQU8sQ0FBQyxLQUFLO0lBUWIseUJBQXlCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksVUFBUSxRQU85RTtJQUVLLEtBQUssa0JBMkJWO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"lending_simulator.d.ts","sourceRoot":"","sources":["../../src/simulators/lending_simulator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;GAEG;AACH,qBAAa,cAAc;IACzB,yCAAyC;IACzC,SAAgB,OAAO,EAAE,YAAY,CAAC;IACtC,2CAA2C;IAC3C,SAAgB,MAAM,EAAE,EAAE,CAAC;IAE3B,YAAY,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAG5C;IAED;;;OAGG;IACI,GAAG,gBAET;CACF;AAgCD;;GAEG;AACH,qBAAa,gBAAgB;IAYzB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,oBAAoB;IAC5B,0BAA0B;IACnB,MAAM,EAAE,cAAc;IAC7B,2BAA2B;IACpB,eAAe,EAAE,eAAe;IACvC,wDAAwD;IACjD,eAAe,EAAE,cAAc;IACtC,uDAAuD;IAChD,UAAU,EAAE,cAAc;IAtBnC,gCAAgC;IACzB,WAAW,EAAE,MAAM,CAAM;IAChC,oCAAoC;IAC7B,IAAI,EAAE,MAAM,CAAK;IAExB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,aAAa,CAAc;IAEnC,YACU,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,oBAAoB,EAAE,MAAM;IACpC,0BAA0B;IACnB,MAAM,EAAE,cAAc;IAC7B,2BAA2B;IACpB,eAAe,EAAE,eAAe;IACvC,wDAAwD;IACjD,eAAe,EAAE,cAAc;IACtC,uDAAuD;IAChD,UAAU,EAAE,cAAc,EAC/B;IAEE,OAAO,kBAMZ;IAEK,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,gBAAgB,iBAkBhE;IAED,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAGhE;IAED,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAG/D;IAED,OAAO,CAAC,OAAO;IAKf,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAI1D;IAED,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAOxD;IAED,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAG9D;IAED,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAG7D;IAED,OAAO,CAAC,KAAK;IAQb,yBAAyB,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,UAAQ,QAO9E;IAEK,KAAK,kBA2BV;CACF"}
1
+ {"version":3,"file":"lending_simulator.d.ts","sourceRoot":"","sources":["../../src/simulators/lending_simulator.ts"],"names":[],"mappings":"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"}
@@ -76,27 +76,39 @@ const computeMultiplier = (rate, dt)=>{
76
76
  this.borrowed = 0n;
77
77
  this.mintedOutside = 0n;
78
78
  }
79
- async prepare() {
79
+ prepare() {
80
80
  this.accumulator = BASE;
81
- const slot = await this.rollup.getSlotAt(BigInt(await this.cc.eth.lastBlockTimestamp()) + BigInt(this.ethereumSlotDuration));
82
- this.time = Number(await this.rollup.getTimestampForSlot(slot));
81
+ this.time = 0;
83
82
  }
84
- async progressSlots(diff, dateProvider) {
83
+ /**
84
+ * Advances the simulator's accumulator and clock to match a block timestamp observed on chain.
85
+ * Call this BEFORE applying any accumulator-sensitive mutation (borrow/repay) so the mutation
86
+ * sees the same accumulator as the contract did during execution.
87
+ */ observeBlockTimestamp(ts) {
88
+ const diff = ts - this.time;
89
+ if (diff > 0) {
90
+ this.accumulator = muldivDown(this.accumulator, computeMultiplier(this.rate, BigInt(diff)), BASE);
91
+ }
92
+ this.time = ts;
93
+ }
94
+ async progressSlots(diff, _dateProvider, node) {
85
95
  if (diff <= 1) {
86
96
  return;
87
97
  }
88
98
  const slot = await this.rollup.getSlotAt(BigInt(await this.cc.eth.lastBlockTimestamp()));
89
99
  const targetSlot = SlotNumber(slot + diff);
90
100
  const ts = Number(await this.rollup.getTimestampForSlot(targetSlot));
91
- const timeDiff = ts - this.time;
92
- this.time = ts;
93
- // Mine ethereum blocks such that the next block will be in a new slot
94
- await this.cc.eth.warp(this.time - this.ethereumSlotDuration);
95
- if (dateProvider) {
96
- dateProvider.setTime(this.time * 1000);
101
+ // Queue-aware warp under AutomineSequencer: atomic warp + mineBlock that advances L2 time to the
102
+ // target slot. The cheat code routes through the AutomineSequencer queue when one is installed,
103
+ // and otherwise falls back to a manual warp + mineBlock loop.
104
+ if (node) {
105
+ await this.cc.warpL2TimeAtLeastTo(node, ts);
106
+ } else {
107
+ await this.cc.eth.warp(ts - this.ethereumSlotDuration);
97
108
  }
109
+ // Mark the latest checkpoint as proven so the rollup does not reorg pending checkpoints when
110
+ // time jumps far enough forward to cross an unproven epoch boundary.
98
111
  await this.cc.rollup.markAsProven(await this.rollup.getCheckpointNumber());
99
- this.accumulator = muldivDown(this.accumulator, computeMultiplier(this.rate, BigInt(timeDiff)), BASE);
100
112
  }
101
113
  depositPrivate(from, onBehalfOf, amount) {
102
114
  this.collateralAsset.transferToPublic(from, this.lendingContract.address, amount);
@@ -90,7 +90,7 @@ export class TokenSimulator {
90
90
  ];
91
91
  const results = (await Promise.all(chunk(calls, 5).map((batch)=>new BatchCall(this.defaultWallet, batch).simulate({
92
92
  from: this.defaultAddress
93
- })))).flat().map((r)=>r.result);
93
+ })))).flatMap((r)=>r.result).map((r)=>r.result);
94
94
  expect(results[0]).toEqual(this.totalSupply);
95
95
  // Check that all our balances match
96
96
  for(let i = 0; i < this.accounts.length; i++){