@aztec/end-to-end 0.0.1-commit.b2a5d0dd1 → 0.0.1-commit.b3d3157a
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.
- package/dest/bench/client_flows/benchmark.d.ts +15 -1
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +17 -0
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +13 -9
- package/dest/bench/utils.d.ts +1 -1
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +2 -0
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +3 -3
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +13 -4
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +15 -4
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +39 -7
- package/dest/e2e_deploy_contract/deploy_test.d.ts +3 -3
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +2 -1
- package/dest/e2e_epochs/epochs_test.d.ts +8 -2
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +30 -7
- package/dest/e2e_fees/fees_test.d.ts +5 -2
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +29 -3
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +3 -3
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +2 -1
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +1 -0
- package/dest/e2e_p2p/reqresp/utils.d.ts +1 -1
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
- package/dest/e2e_p2p/reqresp/utils.js +28 -12
- package/dest/e2e_p2p/shared.d.ts +19 -8
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +33 -13
- package/dest/e2e_token_contract/token_contract_test.d.ts +3 -3
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +4 -2
- package/dest/fixtures/e2e_prover_test.d.ts +3 -3
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +2 -1
- package/dest/fixtures/fixtures.d.ts +59 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +55 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.js +2 -4
- package/dest/fixtures/setup.d.ts +30 -4
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +117 -7
- package/dest/fixtures/setup_p2p_test.d.ts +5 -1
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/utils.d.ts +2 -2
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +1 -1
- package/dest/install_legacy_contracts.d.cts +10 -0
- package/dest/install_legacy_contracts.d.cts.map +1 -0
- package/dest/legacy-jest-resolver.d.cts +1 -1
- package/dest/legacy-jest-resolver.d.cts.map +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts +4 -2
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +9 -5
- package/dest/shared/gas_portal_test_harness.d.ts +8 -5
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +16 -7
- package/dest/shared/uniswap_l1_l2.d.ts +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +50 -28
- package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
- package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
- package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
- package/dest/simulators/lending_simulator.d.ts +10 -3
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +23 -11
- package/dest/spartan/setup_test_wallets.d.ts +1 -1
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +9 -3
- package/dest/spartan/tx_metrics.d.ts +18 -4
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +73 -20
- package/dest/spartan/utils/config.d.ts +9 -35
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +2 -2
- package/dest/test-wallet/test_wallet.d.ts +3 -2
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +49 -27
- package/dest/test-wallet/utils.d.ts +3 -3
- package/dest/test-wallet/utils.d.ts.map +1 -1
- package/dest/test-wallet/utils.js +2 -7
- package/dest/test-wallet/wallet_worker_script.js +7 -2
- package/dest/test-wallet/worker_wallet.d.ts +2 -1
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet.js +6 -2
- package/dest/test-wallet/worker_wallet_schema.d.ts +110 -229
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet_schema.js +14 -2
- package/package.json +45 -41
- package/src/bench/client_flows/benchmark.ts +19 -0
- package/src/bench/client_flows/client_flows_benchmark.ts +32 -30
- package/src/bench/utils.ts +2 -1
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +21 -4
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +49 -11
- package/src/e2e_deploy_contract/deploy_test.ts +3 -2
- package/src/e2e_epochs/epochs_test.ts +32 -5
- package/src/e2e_fees/fees_test.ts +33 -2
- package/src/e2e_nested_contract/nested_contract_test.ts +3 -1
- package/src/e2e_p2p/inactivity_slash_test.ts +1 -0
- package/src/e2e_p2p/reqresp/utils.ts +29 -11
- package/src/e2e_p2p/shared.ts +31 -12
- package/src/e2e_token_contract/token_contract_test.ts +12 -2
- package/src/fixtures/e2e_prover_test.ts +3 -1
- package/src/fixtures/fixtures.ts +61 -0
- package/src/fixtures/schnorr_hardcoded_account_contract.ts +2 -2
- package/src/fixtures/setup.ts +134 -10
- package/src/fixtures/setup_p2p_test.ts +4 -0
- package/src/fixtures/utils.ts +2 -0
- package/src/install_legacy_contracts.cjs +75 -0
- package/src/legacy-jest-resolver.cjs +25 -48
- package/src/shared/cross_chain_test_harness.ts +14 -4
- package/src/shared/gas_portal_test_harness.ts +20 -9
- package/src/shared/uniswap_l1_l2.ts +84 -36
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +27 -13
- package/src/spartan/setup_test_wallets.ts +6 -4
- package/src/spartan/tx_metrics.ts +81 -23
- package/src/spartan/utils/nodes.ts +2 -2
- package/src/test-wallet/test_wallet.ts +46 -23
- package/src/test-wallet/utils.ts +3 -7
- package/src/test-wallet/wallet_worker_script.ts +5 -2
- package/src/test-wallet/worker_wallet.ts +7 -3
- package/src/test-wallet/worker_wallet_schema.ts +2 -2
|
@@ -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 =
|
|
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...');
|
|
@@ -164,28 +165,35 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
|
|
|
164
165
|
await wethCrossChainHarness.expectPrivateBalanceOnL2(ownerAddress, wethL2BalanceBeforeSwap - wethAmountToBridge);
|
|
165
166
|
// ensure that uniswap contract didn't eat the funds.
|
|
166
167
|
await wethCrossChainHarness.expectPublicBalanceOnL2(uniswapL2Contract.address, 0n);
|
|
167
|
-
// Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
|
|
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));
|
|
171
175
|
await waitForProven(aztecNode, l2UniswapInteractionReceipt, {
|
|
172
176
|
provenTimeout: 300
|
|
173
177
|
});
|
|
174
178
|
// 5. Consume L2 to L1 message by calling uniswapPortal.swap_private()
|
|
175
179
|
logger.info('Execute withdraw and swap on the uniswapPortal!');
|
|
176
180
|
const daiL1BalanceOfPortalBeforeSwap = await daiCrossChainHarness.getL1BalanceOf(daiCrossChainHarness.tokenPortalAddress);
|
|
177
|
-
const
|
|
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);
|
|
178
184
|
const swapPrivateL2MessageIndex = swapResult.leafIndex;
|
|
179
185
|
const swapPrivateSiblingPath = swapResult.siblingPath;
|
|
180
186
|
const withdrawL2MessageIndex = withdrawResult.leafIndex;
|
|
181
187
|
const withdrawSiblingPath = withdrawResult.siblingPath;
|
|
182
188
|
const withdrawMessageMetadata = {
|
|
183
189
|
_epoch: BigInt(epoch),
|
|
190
|
+
_numCheckpointsInEpoch: BigInt(withdrawResult.numCheckpointsInEpoch),
|
|
184
191
|
_leafIndex: BigInt(withdrawL2MessageIndex),
|
|
185
192
|
_path: withdrawSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
|
|
186
193
|
};
|
|
187
194
|
const swapPrivateMessageMetadata = {
|
|
188
195
|
_epoch: BigInt(epoch),
|
|
196
|
+
_numCheckpointsInEpoch: BigInt(numCheckpointsInEpoch),
|
|
189
197
|
_leafIndex: BigInt(swapPrivateL2MessageIndex),
|
|
190
198
|
_path: swapPrivateSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
|
|
191
199
|
};
|
|
@@ -569,30 +577,37 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
|
|
|
569
577
|
rollupVersion: new Fr(version),
|
|
570
578
|
chainId: new Fr(l1Client.chain.id)
|
|
571
579
|
});
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
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);
|
|
575
595
|
const swapPrivateL2MessageIndex = swapResult.leafIndex;
|
|
576
596
|
const swapPrivateSiblingPath = swapResult.siblingPath;
|
|
577
597
|
const withdrawL2MessageIndex = withdrawResult.leafIndex;
|
|
578
598
|
const withdrawSiblingPath = withdrawResult.siblingPath;
|
|
579
599
|
const withdrawMessageMetadata = {
|
|
580
600
|
_epoch: BigInt(epoch),
|
|
601
|
+
_numCheckpointsInEpoch: BigInt(withdrawResult.numCheckpointsInEpoch),
|
|
581
602
|
_leafIndex: BigInt(withdrawL2MessageIndex),
|
|
582
603
|
_path: withdrawSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
|
|
583
604
|
};
|
|
584
605
|
const swapPrivateMessageMetadata = {
|
|
585
606
|
_epoch: BigInt(epoch),
|
|
607
|
+
_numCheckpointsInEpoch: BigInt(numCheckpointsInEpoch),
|
|
586
608
|
_leafIndex: BigInt(swapPrivateL2MessageIndex),
|
|
587
609
|
_path: swapPrivateSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
|
|
588
610
|
};
|
|
589
|
-
// ensure that user's funds were burnt
|
|
590
|
-
await wethCrossChainHarness.expectPrivateBalanceOnL2(ownerAddress, wethL2BalanceBeforeSwap - wethAmountToBridge);
|
|
591
|
-
// Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
|
|
592
|
-
await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
|
|
593
|
-
await waitForProven(aztecNode, withdrawReceipt, {
|
|
594
|
-
provenTimeout: 300
|
|
595
|
-
});
|
|
596
611
|
// On L1 call swap_public!
|
|
597
612
|
logger.info('call swap_public on L1');
|
|
598
613
|
const swapArgs = [
|
|
@@ -659,30 +674,37 @@ export const uniswapL1L2TestSuite = (setup, cleanup, expectedForkBlockNumber = 1
|
|
|
659
674
|
rollupVersion: new Fr(version),
|
|
660
675
|
chainId: new Fr(l1Client.chain.id)
|
|
661
676
|
});
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
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);
|
|
665
692
|
const swapPublicL2MessageIndex = swapResult.leafIndex;
|
|
666
693
|
const swapPublicSiblingPath = swapResult.siblingPath;
|
|
667
694
|
const withdrawL2MessageIndex = withdrawResult.leafIndex;
|
|
668
695
|
const withdrawSiblingPath = withdrawResult.siblingPath;
|
|
669
696
|
const withdrawMessageMetadata = {
|
|
670
697
|
_epoch: BigInt(epoch),
|
|
698
|
+
_numCheckpointsInEpoch: BigInt(withdrawResult.numCheckpointsInEpoch),
|
|
671
699
|
_leafIndex: BigInt(withdrawL2MessageIndex),
|
|
672
700
|
_path: withdrawSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
|
|
673
701
|
};
|
|
674
702
|
const swapPublicMessageMetadata = {
|
|
675
703
|
_epoch: BigInt(epoch),
|
|
704
|
+
_numCheckpointsInEpoch: BigInt(numCheckpointsInEpoch),
|
|
676
705
|
_leafIndex: BigInt(swapPublicL2MessageIndex),
|
|
677
706
|
_path: swapPublicSiblingPath.toBufferArray().map((buf)=>`0x${buf.toString('hex')}`)
|
|
678
707
|
};
|
|
679
|
-
// check weth balance of owner on L2 (we first bridged `wethAmountToBridge` into L2 and now withdrew it!)
|
|
680
|
-
await wethCrossChainHarness.expectPublicBalanceOnL2(ownerAddress, 0n);
|
|
681
|
-
// Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
|
|
682
|
-
await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
|
|
683
|
-
await waitForProven(aztecNode, withdrawReceipt, {
|
|
684
|
-
provenTimeout: 300
|
|
685
|
-
});
|
|
686
708
|
// Call swap_private on L1
|
|
687
709
|
logger.info('Execute withdraw and swap on the uniswapPortal!');
|
|
688
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():
|
|
57
|
-
|
|
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,
|
|
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;
|
|
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
|
-
|
|
79
|
+
prepare() {
|
|
80
80
|
this.accumulator = BASE;
|
|
81
|
-
|
|
82
|
-
this.time = Number(await this.rollup.getTimestampForSlot(slot));
|
|
81
|
+
this.time = 0;
|
|
83
82
|
}
|
|
84
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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);
|
|
@@ -42,4 +42,4 @@ export type WorkerWalletWrapper = {
|
|
|
42
42
|
cleanup: () => Promise<void>;
|
|
43
43
|
};
|
|
44
44
|
export declare function createWorkerWalletClient(nodeUrl: string, proverEnabled: boolean, logger: Logger): Promise<WorkerWalletWrapper>;
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBfdGVzdF93YWxsZXRzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BhcnRhbi9zZXR1cF90ZXN0X3dhbGxldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSXpELE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUE2QixNQUFNLHFCQUFxQixDQUFDO0FBR3ZGLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBb0MsTUFBTSxzQkFBc0IsQ0FBQztBQUl4RixPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFRL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUvRCxNQUFNLFdBQVcsWUFBWTtJQUMzQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxVQUFVLENBQUM7SUFDbkIsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQ3pCLGFBQWEsRUFBRSxhQUFhLENBQUM7SUFDN0IsaUJBQWlCLEVBQUUsWUFBWSxDQUFDO0lBQ2hDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDO0lBQy9CLFlBQVksRUFBRSxZQUFZLENBQUM7Q0FDNUI7QUFFRCxNQUFNLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUMxQyxZQUFZLEVBQ1osY0FBYyxHQUFHLGVBQWUsR0FBRyxXQUFXLEdBQUcsbUJBQW1CLENBQ3JFLENBQUM7QUFNRix3QkFBc0IsMkJBQTJCLENBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQ2YsVUFBVSxFQUFFLE1BQU0sRUFDbEIsTUFBTSxFQUFFLE1BQU0sR0FDYixPQUFPLENBQUMsWUFBWSxDQUFDLENBeUJ2QjtBQUVELHdCQUFzQixxQ0FBcUMsQ0FDekQsTUFBTSxFQUFFLFVBQVUsRUFDbEIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsVUFBVSxFQUFFLE1BQU0sRUFDbEIsTUFBTSxFQUFFLE1BQU0sRUFDZCxxQkFBcUIsU0FBSSxHQUN4QixPQUFPLENBQUMsWUFBWSxDQUFDLENBK0N2QjtBQTZGRCx3QkFBc0IsMkJBQTJCLENBQy9DLE1BQU0sRUFBRSxVQUFVLEVBQ2xCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLE1BQU0sRUFBRSxNQUFNLEVBQ2QscUJBQXFCLFNBQUksRUFDekIsSUFBSSxDQUFDLEVBQUU7SUFBRSxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUE7Q0FBRSxHQUMvQixPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FpQ3BDO0FBRUQsd0JBQXNCLDRCQUE0QixDQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUNmLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFDbkIsb0JBQW9CLEVBQUUsTUFBTSxFQUM1QixVQUFVLEVBQUUsTUFBTSxFQUNsQixNQUFNLEVBQUUsTUFBTSxFQUNkLHFCQUFxQixTQUFJLEdBQ3hCLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0ErQ3ZCO0FBK0VELHdCQUFzQixnQkFBZ0IsQ0FBQyxFQUNyQyxNQUFNLEVBQ04sWUFBWSxFQUNaLE1BQU0sRUFDTixjQUFjLEVBQ2QsTUFBTSxFQUNOLGdCQUFnQixFQUNqQixFQUFFO0lBQ0QsTUFBTSxFQUFFLFVBQVUsQ0FBQztJQUNuQixZQUFZLEVBQUUsWUFBWSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDZixjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDZixnQkFBZ0IsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0NBQ3JDLGlCQXVCQTtBQUVELE1BQU0sTUFBTSxhQUFhLEdBQUc7SUFDMUIsTUFBTSxFQUFFLFVBQVUsQ0FBQztJQUNuQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3JCLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUM5QixDQUFDO0FBRUYsd0JBQXNCLDhCQUE4QixDQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUNmLGFBQWEsRUFBRSxPQUFPLEVBQ3RCLE1BQU0sRUFBRSxNQUFNLEdBQ2IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQXFCeEI7QUFFRCxNQUFNLE1BQU0sbUJBQW1CLEdBQUc7SUFDaEMsTUFBTSxFQUFFLFlBQVksQ0FBQztJQUNyQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3JCLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUM5QixDQUFDO0FBRUYsd0JBQXNCLHdCQUF3QixDQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUNmLGFBQWEsRUFBRSxPQUFPLEVBQ3RCLE1BQU0sRUFBRSxNQUFNLEdBQ2IsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBMkI5QiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup_test_wallets.d.ts","sourceRoot":"","sources":["../../src/spartan/setup_test_wallets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,OAAO,EAAE,KAAK,gBAAgB,EAA6B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup_test_wallets.d.ts","sourceRoot":"","sources":["../../src/spartan/setup_test_wallets.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,13 @@ import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
|
|
|
5
5
|
import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
6
6
|
import { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
7
7
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
8
|
+
import { waitForL1ToL2MessageReady } from '@aztec/aztec.js/messaging';
|
|
8
9
|
import { createAztecNodeClient, waitForTx } from '@aztec/aztec.js/node';
|
|
9
10
|
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
10
11
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
11
12
|
import { makeBackoff, retry, retryUntil } from '@aztec/foundation/retry';
|
|
12
13
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
14
|
+
import { TxStatus } from '@aztec/stdlib/tx';
|
|
13
15
|
import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
|
|
14
16
|
import { getACVMConfig } from '../fixtures/get_acvm_config.js';
|
|
15
17
|
import { getBBConfig } from '../fixtures/get_bb_config.js';
|
|
@@ -209,8 +211,9 @@ async function bridgeL1FeeJuice(l1RpcUrls, mnemonicOrPrivateKey, aztecNode, reci
|
|
|
209
211
|
const l1Client = createExtendedL1Client(chain.rpcUrls, mnemonicOrPrivateKey, chain.chainInfo);
|
|
210
212
|
const portal = await L1FeeJuicePortalManager.new(aztecNode, l1Client, log);
|
|
211
213
|
const claim = await portal.bridgeTokensPublic(recipient, amount, true);
|
|
212
|
-
|
|
213
|
-
|
|
214
|
+
await waitForL1ToL2MessageReady(aztecNode, Fr.fromHexString(claim.messageHash), {
|
|
215
|
+
timeoutSeconds: 24
|
|
216
|
+
});
|
|
214
217
|
log.info(`Created a claim for ${amount} L1 fee juice to ${recipient}.`, claim);
|
|
215
218
|
return claim;
|
|
216
219
|
}
|
|
@@ -270,9 +273,12 @@ export async function performTransfers({ wallet, testAccounts, rounds, transferA
|
|
|
270
273
|
});
|
|
271
274
|
});
|
|
272
275
|
const provenTxs = await Promise.all(txs);
|
|
276
|
+
// Wait only for the txs to be proposed, not checkpointed. This is enough to keep the chain
|
|
277
|
+
// loaded for the reorg scenario, and avoids each round blocking on the (slower) checkpoint lag.
|
|
273
278
|
await Promise.all(provenTxs.map((t)=>t.send({
|
|
274
279
|
wait: {
|
|
275
|
-
timeout: 600
|
|
280
|
+
timeout: 600,
|
|
281
|
+
waitForStatus: TxStatus.PROPOSED
|
|
276
282
|
}
|
|
277
283
|
})));
|
|
278
284
|
logger.info(`Completed round ${i + 1} / ${rounds}`);
|
|
@@ -38,9 +38,12 @@ export declare class ProvingMetrics {
|
|
|
38
38
|
}
|
|
39
39
|
export type TxInclusionData = {
|
|
40
40
|
txHash: string;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
/** Wall-clock at client when the tx was submitted, in ms (Date.now()). */
|
|
42
|
+
sentAtMs: number;
|
|
43
|
+
/** Wall-clock at client when the block containing the tx first became visible, in ms (Date.now()). -1 if never observed. */
|
|
44
|
+
minedAtMs: number;
|
|
45
|
+
/** Reserved for future attestation-observed-at signal; -1 today. */
|
|
46
|
+
attestedAtMs: number;
|
|
44
47
|
blocknumber: number;
|
|
45
48
|
priorityFee: number;
|
|
46
49
|
totalFee: number;
|
|
@@ -61,7 +64,18 @@ export declare class TxInclusionMetrics {
|
|
|
61
64
|
private mempoolMinedDelay;
|
|
62
65
|
constructor(aztecNode: AztecNode, logger?: Logger | undefined);
|
|
63
66
|
recordSentTx(tx: Tx, group: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Stamp mined-at metadata for any tracked tx contained in this block, using
|
|
69
|
+
* `observedAtMs` (caller-supplied wall-clock at the moment they first saw the
|
|
70
|
+
* block). Idempotent: existing minedAtMs is preserved so the first observer
|
|
71
|
+
* wins (typically the block-watcher; recordMinedTx is a fallback).
|
|
72
|
+
*/
|
|
73
|
+
observeBlockForMinedTxs(blockNumber: number, txHashes: ReadonlyArray<{
|
|
74
|
+
toString(): string;
|
|
75
|
+
}>, observedAtMs: number): void;
|
|
64
76
|
recordMinedTx(txReceipt: TxReceipt): Promise<void>;
|
|
77
|
+
/** Per-tx inclusion records for a group. Used to serialise out for downstream tooling. */
|
|
78
|
+
getInclusionRecords(group?: string): TxInclusionData[];
|
|
65
79
|
inclusionTimeInSeconds(group: string): {
|
|
66
80
|
count: number;
|
|
67
81
|
group: string;
|
|
@@ -85,4 +99,4 @@ export declare class TxInclusionMetrics {
|
|
|
85
99
|
extra?: string;
|
|
86
100
|
}>;
|
|
87
101
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NwYXJ0YW4vdHhfbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJdEQsb0RBQW9EO0FBQ3BELHFCQUFhLGNBQWM7SUFjYixPQUFPLENBQUMsTUFBTTtJQWIxQixPQUFPLENBQUMsYUFBYSxDQUFxQjtJQUMxQyxPQUFPLENBQUMsYUFBYSxDQUFxQjtJQUMxQyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFxQjtJQUN2QyxPQUFPLENBQUMsV0FBVyxDQUFxQjtJQUN4QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsb0JBQW9CLENBQXFCO0lBQ2pELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBcUI7SUFDL0MsT0FBTyxDQUFDLFlBQVksQ0FBcUI7SUFFekMsWUFBb0IsTUFBTSxFQUFFLE1BQU0sRUFBSTtJQUV0QyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFdkM7SUFFRCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFekM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFdEM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFF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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_metrics.d.ts","sourceRoot":"","sources":["../../src/spartan/tx_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAItD,oDAAoD;AACpD,qBAAa,cAAc;IAcb,OAAO,CAAC,MAAM;IAb1B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,YAAY,CAAqB;IAEzC,YAAoB,MAAM,EAAE,MAAM,EAAI;IAEtC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvC;IAED,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEnC;IAED,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEpC;IAED,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAElC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;IAED,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5C;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,2BAA2B,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CA0DlF;CACF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,
|
|
1
|
+
{"version":3,"file":"tx_metrics.d.ts","sourceRoot":"","sources":["../../src/spartan/tx_metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -180,9 +180,9 @@ export class TxInclusionMetrics {
|
|
|
180
180
|
}
|
|
181
181
|
this.data.set(txHash, {
|
|
182
182
|
txHash,
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
sentAtMs: Date.now(),
|
|
184
|
+
minedAtMs: -1,
|
|
185
|
+
attestedAtMs: -1,
|
|
186
186
|
blocknumber: -1,
|
|
187
187
|
priorityFee: Number(priorityFees.feePerDaGas + priorityFees.feePerL2Gas),
|
|
188
188
|
totalFee: -1,
|
|
@@ -191,6 +191,22 @@ export class TxInclusionMetrics {
|
|
|
191
191
|
});
|
|
192
192
|
this.groups.add(group);
|
|
193
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Stamp mined-at metadata for any tracked tx contained in this block, using
|
|
196
|
+
* `observedAtMs` (caller-supplied wall-clock at the moment they first saw the
|
|
197
|
+
* block). Idempotent: existing minedAtMs is preserved so the first observer
|
|
198
|
+
* wins (typically the block-watcher; recordMinedTx is a fallback).
|
|
199
|
+
*/ observeBlockForMinedTxs(blockNumber, txHashes, observedAtMs) {
|
|
200
|
+
txHashes.forEach((txHash, position)=>{
|
|
201
|
+
const data = this.data.get(txHash.toString());
|
|
202
|
+
if (!data || data.minedAtMs !== -1) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
data.blocknumber = blockNumber;
|
|
206
|
+
data.minedAtMs = observedAtMs;
|
|
207
|
+
data.positionInBlock = position;
|
|
208
|
+
});
|
|
209
|
+
}
|
|
194
210
|
async recordMinedTx(txReceipt) {
|
|
195
211
|
const { txHash, blockNumber } = txReceipt;
|
|
196
212
|
if (!txReceipt.isMined() || !txReceipt.hasExecutionSucceeded() || !blockNumber) {
|
|
@@ -201,17 +217,6 @@ export class TxInclusionMetrics {
|
|
|
201
217
|
});
|
|
202
218
|
return;
|
|
203
219
|
}
|
|
204
|
-
if (!this.blocks.has(blockNumber)) {
|
|
205
|
-
this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber));
|
|
206
|
-
}
|
|
207
|
-
const block = await this.blocks.get(blockNumber);
|
|
208
|
-
if (!block) {
|
|
209
|
-
this.logger?.warn('Failed to load block for mined tx receipt', {
|
|
210
|
-
txHash: txHash.toString(),
|
|
211
|
-
blockNumber
|
|
212
|
-
});
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
220
|
const data = this.data.get(txHash.toString());
|
|
216
221
|
if (!data) {
|
|
217
222
|
const message = `Missing sent tx record for mined tx ${txHash.toString()}`;
|
|
@@ -221,19 +226,67 @@ export class TxInclusionMetrics {
|
|
|
221
226
|
});
|
|
222
227
|
throw new Error(message);
|
|
223
228
|
}
|
|
224
|
-
data.blocknumber = blockNumber;
|
|
225
|
-
data.minedAt = Number(block.header.globalVariables.timestamp);
|
|
226
|
-
data.attestedAt = -1;
|
|
227
229
|
data.totalFee = Number(txReceipt.transactionFee ?? 0n);
|
|
228
|
-
|
|
230
|
+
// Fallback path for txs the block-watcher missed (e.g. observed only after
|
|
231
|
+
// the watcher stopped). Stamp with the block's L2 slot timestamp; this is
|
|
232
|
+
// earlier than the true client-observed time by attestation+propagation
|
|
233
|
+
// lag, but it's the only deterministic timestamp available post-hoc.
|
|
234
|
+
if (data.minedAtMs === -1) {
|
|
235
|
+
if (!this.blocks.has(blockNumber)) {
|
|
236
|
+
this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber, {
|
|
237
|
+
includeTransactions: true
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
const block = await this.blocks.get(blockNumber);
|
|
241
|
+
if (!block) {
|
|
242
|
+
this.logger?.warn('Failed to load block for mined tx receipt', {
|
|
243
|
+
txHash: txHash.toString(),
|
|
244
|
+
blockNumber
|
|
245
|
+
});
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
data.blocknumber = blockNumber;
|
|
249
|
+
data.minedAtMs = Number(block.header.globalVariables.timestamp) * 1000;
|
|
250
|
+
data.positionInBlock = block.body.txEffects.findIndex((txEffect)=>txEffect.txHash.equals(txHash));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/** Per-tx inclusion records for a group. Used to serialise out for downstream tooling. */ getInclusionRecords(group) {
|
|
254
|
+
const out = [];
|
|
255
|
+
for (const tx of this.data.values()){
|
|
256
|
+
if (group !== undefined && tx.group !== group) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
out.push({
|
|
260
|
+
...tx
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
229
264
|
}
|
|
230
265
|
inclusionTimeInSeconds(group) {
|
|
231
266
|
const histogram = createHistogram({});
|
|
267
|
+
let nonPositive = 0;
|
|
232
268
|
for (const tx of this.data.values()){
|
|
233
|
-
if (!tx.blocknumber || tx.group !== group || tx.
|
|
269
|
+
if (!tx.blocknumber || tx.group !== group || tx.minedAtMs === -1) {
|
|
234
270
|
continue;
|
|
235
271
|
}
|
|
236
|
-
|
|
272
|
+
// Both timestamps are client wall-clock (ms). A negative delta should be
|
|
273
|
+
// impossible since the watcher stamps minedAtMs strictly after sentAtMs,
|
|
274
|
+
// but the fallback path (recordMinedTx via L2 slot timestamp) can stamp
|
|
275
|
+
// earlier than sentAtMs. perf_hooks.createHistogram rejects <=0; skip
|
|
276
|
+
// those instead of crashing.
|
|
277
|
+
const deltaMs = tx.minedAtMs - tx.sentAtMs;
|
|
278
|
+
if (deltaMs <= 0) {
|
|
279
|
+
nonPositive++;
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
// Histogram is recorded in seconds (rounded) to match the existing
|
|
283
|
+
// toGithubActionBenchmarkJSON output unit; per-tx records carry the raw ms.
|
|
284
|
+
histogram.record(Math.max(1, Math.round(deltaMs / 1000)));
|
|
285
|
+
}
|
|
286
|
+
if (nonPositive > 0) {
|
|
287
|
+
this.logger?.debug(`Dropped ${nonPositive} tx inclusion samples with non-positive delta`, {
|
|
288
|
+
group
|
|
289
|
+
});
|
|
237
290
|
}
|
|
238
291
|
if (histogram.count === 0) {
|
|
239
292
|
return {
|