@aztec/end-to-end 0.0.1-commit.c2eed6949 → 0.0.1-commit.c52d6e7
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/README.md +229 -14
- package/dest/automine/automine_test_context.d.ts +85 -0
- package/dest/automine/automine_test_context.d.ts.map +1 -0
- package/dest/automine/automine_test_context.js +98 -0
- package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
- package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
- package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.d.ts +1 -1
- package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
- package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
- package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
- package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
- package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
- package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
- package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +23 -36
- package/dest/automine/token/token_contract_test.d.ts +40 -0
- package/dest/automine/token/token_contract_test.d.ts.map +1 -0
- package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +24 -39
- package/dest/automine/token/token_test_helpers.d.ts +73 -0
- package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
- package/dest/automine/token/token_test_helpers.js +97 -0
- 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 +19 -0
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +6 -6
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +56 -58
- package/dest/bench/client_flows/data_extractor.js +1 -0
- package/dest/bench/utils.d.ts +3 -3
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +97 -6
- package/dest/composed/ha/ha_full_setup.d.ts +77 -0
- package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
- package/dest/composed/ha/ha_full_setup.js +383 -0
- package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
- package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
- package/dest/fixtures/authwit_proxy.d.ts +1 -1
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
- package/dest/fixtures/authwit_proxy.js +4 -0
- package/dest/fixtures/e2e_prover_test.d.ts +12 -9
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +53 -35
- package/dest/fixtures/fixtures.d.ts +79 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +80 -0
- package/dest/fixtures/get_acvm_config.d.ts +1 -1
- package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
- package/dest/fixtures/get_acvm_config.js +2 -2
- package/dest/fixtures/get_bb_config.d.ts +1 -1
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +2 -2
- package/dest/fixtures/ha_setup.d.ts +4 -4
- package/dest/fixtures/ha_setup.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.js +5 -2
- package/dest/fixtures/index.d.ts +2 -1
- package/dest/fixtures/index.d.ts.map +1 -1
- package/dest/fixtures/index.js +1 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
- package/dest/fixtures/setup.d.ts +81 -42
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +289 -198
- package/dest/fixtures/setup_p2p_test.d.ts +10 -6
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +11 -11
- package/dest/fixtures/standard_contracts_genesis.d.ts +16 -0
- package/dest/fixtures/standard_contracts_genesis.d.ts.map +1 -0
- package/dest/fixtures/standard_contracts_genesis.js +25 -0
- package/dest/fixtures/timing.d.ts +42 -0
- package/dest/fixtures/timing.d.ts.map +1 -0
- package/dest/fixtures/timing.js +72 -0
- package/dest/fixtures/token_utils.d.ts +22 -4
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +23 -6
- 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/fixtures/wait_helpers.d.ts +135 -0
- package/dest/fixtures/wait_helpers.d.ts.map +1 -0
- package/dest/fixtures/wait_helpers.js +154 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
- package/dest/forward-compatibility/wallet_service.d.ts +3 -0
- package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_service.js +109 -0
- 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 +3 -0
- package/dest/legacy-jest-resolver.d.cts.map +1 -0
- package/dest/multi-node/block-production/setup.d.ts +97 -0
- package/dest/multi-node/block-production/setup.d.ts.map +1 -0
- package/dest/multi-node/block-production/setup.js +158 -0
- package/dest/multi-node/governance/setup.d.ts +67 -0
- package/dest/multi-node/governance/setup.d.ts.map +1 -0
- package/dest/multi-node/governance/setup.js +126 -0
- package/dest/multi-node/multi_node_test_context.d.ts +212 -0
- package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
- package/dest/multi-node/multi_node_test_context.js +347 -0
- package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
- package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
- package/dest/multi-node/slashing/inactivity_setup.js +111 -0
- package/dest/multi-node/slashing/setup.d.ts +167 -0
- package/dest/multi-node/slashing/setup.d.ts.map +1 -0
- package/dest/multi-node/slashing/setup.js +275 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +19 -10
- package/dest/p2p/p2p_network.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.js +82 -38
- package/dest/p2p/reqresp/utils.d.ts +19 -0
- package/dest/p2p/reqresp/utils.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/reqresp/utils.js +32 -29
- package/dest/p2p/shared.d.ts +72 -0
- package/dest/p2p/shared.d.ts.map +1 -0
- package/dest/p2p/shared.js +212 -0
- package/dest/shared/cross_chain_test_harness.d.ts +6 -4
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +33 -21
- package/dest/shared/gas_portal_test_harness.d.ts +9 -6
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +26 -15
- package/dest/shared/submit-transactions.d.ts +1 -1
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +12 -5
- package/dest/shared/timing_env.d.js +5 -0
- package/dest/shared/timing_env.js +365 -0
- 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 -37
- 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 +24 -12
- package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
- package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
- package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
- package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
- package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
- package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
- package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
- package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
- package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
- package/dest/single-node/fees/fees_test.d.ts +95 -0
- package/dest/single-node/fees/fees_test.d.ts.map +1 -0
- package/dest/single-node/fees/fees_test.js +344 -0
- package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
- package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
- package/dest/single-node/l1-reorgs/setup.js +57 -0
- package/dest/single-node/partial-proofs/setup.d.ts +5 -0
- package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
- package/dest/single-node/partial-proofs/setup.js +5 -0
- package/dest/single-node/proving/setup.d.ts +5 -0
- package/dest/single-node/proving/setup.d.ts.map +1 -0
- package/dest/single-node/proving/setup.js +5 -0
- package/dest/single-node/recovery/setup.d.ts +5 -0
- package/dest/single-node/recovery/setup.d.ts.map +1 -0
- package/dest/single-node/recovery/setup.js +5 -0
- package/dest/single-node/setup.d.ts +49 -0
- package/dest/single-node/setup.d.ts.map +1 -0
- package/dest/single-node/setup.js +56 -0
- package/dest/single-node/single_node_test_context.d.ts +374 -0
- package/dest/single-node/single_node_test_context.d.ts.map +1 -0
- package/dest/single-node/single_node_test_context.js +847 -0
- 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 +84 -50
- package/dest/spartan/tx_metrics.d.ts +27 -4
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +105 -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 +39 -10
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +166 -59
- package/dest/test-wallet/utils.d.ts +38 -3
- package/dest/test-wallet/utils.d.ts.map +1 -1
- package/dest/test-wallet/utils.js +65 -10
- package/dest/test-wallet/wallet_worker_script.js +12 -4
- package/dest/test-wallet/worker_wallet.d.ts +9 -8
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet.js +10 -4
- package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet_schema.js +15 -2
- package/package.json +47 -42
- package/src/automine/README.md +60 -0
- package/src/automine/automine_test_context.ts +153 -0
- package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
- package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
- package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +24 -47
- package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +25 -48
- package/src/automine/token/token_test_helpers.ts +138 -0
- package/src/bench/client_flows/benchmark.ts +21 -0
- package/src/bench/client_flows/client_flows_benchmark.ts +106 -80
- package/src/bench/client_flows/data_extractor.ts +1 -0
- package/src/bench/utils.ts +110 -6
- package/src/composed/ha/ha_full_setup.ts +466 -0
- package/src/fixtures/authwit_proxy.ts +4 -0
- package/src/fixtures/e2e_prover_test.ts +68 -52
- package/src/fixtures/fixtures.ts +100 -0
- package/src/fixtures/get_acvm_config.ts +2 -8
- package/src/fixtures/get_bb_config.ts +1 -2
- package/src/fixtures/ha_setup.ts +11 -5
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
- package/src/fixtures/setup.ts +361 -256
- package/src/fixtures/setup_p2p_test.ts +15 -11
- package/src/fixtures/standard_contracts_genesis.ts +28 -0
- package/src/fixtures/timing.ts +97 -0
- package/src/fixtures/token_utils.ts +40 -8
- package/src/fixtures/utils.ts +2 -3
- package/src/fixtures/wait_helpers.ts +333 -0
- package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
- package/src/forward-compatibility/wallet_service.ts +106 -0
- package/src/guides/up_quick_start.sh +5 -2
- package/src/infra/README.md +12 -0
- package/src/install_legacy_contracts.cjs +75 -0
- package/src/legacy-jest-resolver.cjs +112 -0
- package/src/multi-node/README.md +96 -0
- package/src/multi-node/block-production/setup.ts +272 -0
- package/src/multi-node/governance/setup.ts +172 -0
- package/src/multi-node/multi_node_test_context.ts +447 -0
- package/src/multi-node/slashing/inactivity_setup.ts +139 -0
- package/src/multi-node/slashing/setup.ts +433 -0
- package/src/p2p/README.md +78 -0
- package/src/{e2e_p2p → p2p}/p2p_network.ts +95 -50
- package/src/{e2e_p2p → p2p}/reqresp/utils.ts +35 -28
- package/src/p2p/shared.ts +329 -0
- package/src/shared/cross_chain_test_harness.ts +36 -17
- package/src/shared/gas_portal_test_harness.ts +34 -17
- package/src/shared/submit-transactions.ts +13 -5
- package/src/shared/timing_env.d.mts +39 -0
- package/src/shared/timing_env.mjs +363 -0
- package/src/shared/uniswap_l1_l2.ts +80 -43
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +28 -14
- package/src/single-node/README.md +66 -0
- package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
- package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
- package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
- package/src/single-node/fees/fees_test.ts +434 -0
- package/src/single-node/l1-reorgs/setup.ts +93 -0
- package/src/single-node/partial-proofs/setup.ts +8 -0
- package/src/single-node/proving/setup.ts +15 -0
- package/src/single-node/recovery/setup.ts +8 -0
- package/src/single-node/setup.ts +63 -0
- package/src/single-node/single_node_test_context.ts +1058 -0
- package/src/spartan/setup_test_wallets.ts +87 -47
- package/src/spartan/tx_metrics.ts +107 -23
- package/src/spartan/utils/nodes.ts +2 -2
- package/src/test-wallet/test_wallet.ts +185 -60
- package/src/test-wallet/utils.ts +104 -11
- package/src/test-wallet/wallet_worker_script.ts +11 -5
- package/src/test-wallet/worker_wallet.ts +19 -16
- package/src/test-wallet/worker_wallet_schema.ts +4 -3
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
- package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
- package/dest/e2e_deploy_contract/deploy_test.js +0 -50
- package/dest/e2e_epochs/epochs_test.d.ts +0 -104
- package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
- package/dest/e2e_epochs/epochs_test.js +0 -389
- package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
- package/dest/e2e_fees/fees_test.d.ts +0 -88
- package/dest/e2e_fees/fees_test.d.ts.map +0 -1
- package/dest/e2e_fees/fees_test.js +0 -255
- package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
- package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
- package/dest/e2e_l1_publisher/write_json.js +0 -56
- package/dest/e2e_multi_validator/utils.d.ts +0 -12
- package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +0 -54
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
- package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
- package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.d.ts +0 -66
- package/dest/e2e_p2p/shared.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.js +0 -212
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
- package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
- package/src/e2e_deploy_contract/deploy_test.ts +0 -85
- package/src/e2e_epochs/epochs_test.ts +0 -499
- package/src/e2e_fees/fees_test.ts +0 -331
- package/src/e2e_l1_publisher/write_json.ts +0 -77
- package/src/e2e_nested_contract/nested_contract_test.ts +0 -75
- package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
- package/src/e2e_p2p/shared.ts +0 -343
- /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
- /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
- /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
- /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
|
@@ -4,6 +4,7 @@ import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
|
4
4
|
import { type FeePaymentMethod, PrivateFeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
5
5
|
import { type Logger, createLogger } from '@aztec/aztec.js/log';
|
|
6
6
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
7
|
+
import { FeeJuiceContract } from '@aztec/aztec.js/protocol';
|
|
7
8
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
8
9
|
import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
|
|
9
10
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
@@ -13,23 +14,26 @@ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
|
13
14
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
14
15
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
15
16
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
17
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
16
18
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
17
19
|
import { TestERC20Abi } from '@aztec/l1-artifacts/TestERC20Abi';
|
|
18
20
|
import { TestERC20Bytecode } from '@aztec/l1-artifacts/TestERC20Bytecode';
|
|
19
21
|
import { AMMContract } from '@aztec/noir-contracts.js/AMM';
|
|
20
22
|
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
21
|
-
import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
|
|
22
23
|
import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
|
|
23
|
-
import {
|
|
24
|
-
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
25
|
-
import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
24
|
+
import { TestTokenContract as BananaCoin, TestTokenContract } from '@aztec/noir-test-contracts.js/TestToken';
|
|
26
25
|
import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
|
|
27
26
|
import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
28
|
-
import { GasSettings } from '@aztec/stdlib/gas';
|
|
29
|
-
import {
|
|
27
|
+
import { Gas, GasSettings } from '@aztec/stdlib/gas';
|
|
28
|
+
import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
|
|
30
29
|
|
|
31
|
-
import {
|
|
32
|
-
|
|
30
|
+
import {
|
|
31
|
+
AUTOMINE_E2E_OPTS,
|
|
32
|
+
L1_DIRECT_WRITE_ACCOUNT_INDEX,
|
|
33
|
+
MNEMONIC,
|
|
34
|
+
getPaddedMaxFeesPerGas,
|
|
35
|
+
} from '../../fixtures/fixtures.js';
|
|
36
|
+
import { type EndToEndContext, type SetupOptions, setup, teardown } from '../../fixtures/setup.js';
|
|
33
37
|
import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
|
|
34
38
|
import { setupSponsoredFPC } from '../../fixtures/utils.js';
|
|
35
39
|
import { CrossChainTestHarness } from '../../shared/cross_chain_test_harness.js';
|
|
@@ -71,13 +75,13 @@ export class ClientFlowsBenchmark {
|
|
|
71
75
|
public bananaFPC!: FPCContract;
|
|
72
76
|
public bananaFPCInstance!: ContractInstanceWithAddress;
|
|
73
77
|
// Random asset we want to trade
|
|
74
|
-
public candyBarCoin!:
|
|
78
|
+
public candyBarCoin!: TestTokenContract;
|
|
75
79
|
public candyBarCoinInstance!: ContractInstanceWithAddress;
|
|
76
80
|
// AMM contract
|
|
77
81
|
public amm!: AMMContract;
|
|
78
82
|
public ammInstance!: ContractInstanceWithAddress;
|
|
79
83
|
// Liquidity token for AMM
|
|
80
|
-
public liquidityToken!:
|
|
84
|
+
public liquidityToken!: TestTokenContract;
|
|
81
85
|
public liquidityTokenInstance!: ContractInstanceWithAddress;
|
|
82
86
|
// Sponsored FPC contract
|
|
83
87
|
public sponsoredFPC!: SponsoredFPCContract;
|
|
@@ -88,33 +92,35 @@ export class ClientFlowsBenchmark {
|
|
|
88
92
|
|
|
89
93
|
public realProofs = ['true', '1'].includes(process.env.REAL_PROOFS ?? '');
|
|
90
94
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
95
|
+
// `apps` is the number of private function calls contributed by this payment method.
|
|
96
|
+
// Each app produces one execution step at proving time; the orchestrator additionally produces
|
|
97
|
+
// one kernel step per batch of N apps (see `expectedExecutionSteps` in `benchmark.ts`).
|
|
98
|
+
public paymentMethods: Record<BenchmarkingFeePaymentMethod, { forWallet: FeePaymentMethodGetter; apps: number }> = {
|
|
99
|
+
// eslint-disable-next-line camelcase
|
|
100
|
+
bridged_fee_juice: {
|
|
101
|
+
forWallet: this.getBridgedFeeJuicePaymentMethodForWallet.bind(this),
|
|
102
|
+
apps: 1, // FeeJuice claim
|
|
103
|
+
},
|
|
104
|
+
// eslint-disable-next-line camelcase
|
|
105
|
+
private_fpc: {
|
|
106
|
+
forWallet: this.getPrivateFPCPaymentMethodForWallet.bind(this),
|
|
107
|
+
apps:
|
|
108
|
+
1 + // FPC entrypoint
|
|
109
|
+
1 + // BananaCoin transfer_to_public
|
|
110
|
+
1 + // Account verify_private_authwit
|
|
111
|
+
1, // BananaCoin prepare_private_balance_increase
|
|
112
|
+
},
|
|
113
|
+
// eslint-disable-next-line camelcase
|
|
114
|
+
sponsored_fpc: {
|
|
115
|
+
forWallet: this.getSponsoredFPCPaymentMethodForWallet.bind(this),
|
|
116
|
+
apps: 1, // Sponsored FPC sponsor_unconditionally
|
|
117
|
+
},
|
|
118
|
+
// eslint-disable-next-line camelcase
|
|
119
|
+
fee_juice: {
|
|
120
|
+
forWallet: () => Promise.resolve(undefined),
|
|
121
|
+
apps: 0,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
118
124
|
|
|
119
125
|
public config: ClientFlowsConfig;
|
|
120
126
|
|
|
@@ -123,7 +129,7 @@ export class ClientFlowsBenchmark {
|
|
|
123
129
|
|
|
124
130
|
constructor(testName?: string, setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {}) {
|
|
125
131
|
this.logger = createLogger(`bench:client_flows${testName ? `:${testName}` : ''}`);
|
|
126
|
-
this.setupOptions = { startProverNode: true, ...setupOptions };
|
|
132
|
+
this.setupOptions = { ...AUTOMINE_E2E_OPTS, startProverNode: true, ...setupOptions };
|
|
127
133
|
this.config = BENCHMARK_CONFIG === 'key_flows' ? KEY_FLOWS_CONFIG : FULL_FLOWS_CONFIG;
|
|
128
134
|
ProxyLogger.create();
|
|
129
135
|
this.proxyLogger = ProxyLogger.getInstance();
|
|
@@ -132,11 +138,11 @@ export class ClientFlowsBenchmark {
|
|
|
132
138
|
async setup() {
|
|
133
139
|
this.logger.info('Setting up subsystems from fresh');
|
|
134
140
|
// Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
|
|
135
|
-
|
|
136
|
-
|
|
141
|
+
// BananaCoin is the codegen'd TestToken here, so the allowlist must key on its class, not canonical Token's.
|
|
142
|
+
const tokenAllowList = await getTokenAllowedSetupFunctions(BananaCoin.artifact);
|
|
143
|
+
this.context = await setup(2, {
|
|
137
144
|
...this.setupOptions,
|
|
138
145
|
fundSponsoredFPC: true,
|
|
139
|
-
skipAccountDeployment: true,
|
|
140
146
|
l1ContractsArgs: this.setupOptions,
|
|
141
147
|
txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
|
|
142
148
|
});
|
|
@@ -184,7 +190,7 @@ export class ClientFlowsBenchmark {
|
|
|
184
190
|
|
|
185
191
|
let benchysPrivateSigningKey;
|
|
186
192
|
if (type === 'schnorr') {
|
|
187
|
-
benchysPrivateSigningKey =
|
|
193
|
+
benchysPrivateSigningKey = GrumpkinScalar.random();
|
|
188
194
|
return wallet.createSchnorrAccount(benchysSecret, salt, benchysPrivateSigningKey);
|
|
189
195
|
} else if (type === 'ecdsar1') {
|
|
190
196
|
benchysPrivateSigningKey = randomBytes(32);
|
|
@@ -201,15 +207,7 @@ export class ClientFlowsBenchmark {
|
|
|
201
207
|
|
|
202
208
|
async applyInitialAccounts() {
|
|
203
209
|
this.logger.info('Applying initial accounts setup');
|
|
204
|
-
const
|
|
205
|
-
2,
|
|
206
|
-
this.logger,
|
|
207
|
-
)({
|
|
208
|
-
wallet: this.context.wallet,
|
|
209
|
-
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
const [{ address: adminAddress }, { address: sequencerAddress }] = deployedAccounts;
|
|
210
|
+
const [adminAddress, sequencerAddress] = this.context.accounts;
|
|
213
211
|
|
|
214
212
|
this.adminWallet = this.context.wallet;
|
|
215
213
|
this.aztecNode = this.context.aztecNodeService;
|
|
@@ -218,8 +216,7 @@ export class ClientFlowsBenchmark {
|
|
|
218
216
|
this.adminAddress = adminAddress;
|
|
219
217
|
this.sequencerAddress = sequencerAddress;
|
|
220
218
|
|
|
221
|
-
|
|
222
|
-
this.feeJuiceContract = FeeJuiceContract.at(canonicalFeeJuice.address, this.adminWallet);
|
|
219
|
+
this.feeJuiceContract = FeeJuiceContract.withWallet(this.adminWallet);
|
|
223
220
|
this.coinbase = EthAddress.random();
|
|
224
221
|
|
|
225
222
|
const userPXEConfig = getPXEConfig();
|
|
@@ -232,17 +229,38 @@ export class ClientFlowsBenchmark {
|
|
|
232
229
|
loggers: {
|
|
233
230
|
prover: this.proxyLogger.createLogger('pxe:bb:wasm:bundle:proxied'),
|
|
234
231
|
},
|
|
232
|
+
// The benchmark measures steady-state app cost, not first-send discovery cost. Reproduce the pre-handshake-default
|
|
233
|
+
// behavior of unconstrained delivery: derive the tagging secret from the (sender, recipient) key pair via ECDH
|
|
234
|
+
// instead of taking the current default (a non-interactive handshake, which injects two extra private app
|
|
235
|
+
// executions and a nullifier per cold chain). Constrained delivery is unaffected: the Noir circuit rejects
|
|
236
|
+
// address-derived for constrained, so the hook falls through to a handshake there.
|
|
237
|
+
hooks: {
|
|
238
|
+
resolveTaggingSecretStrategy: ({ deliveryMode }) =>
|
|
239
|
+
Promise.resolve(
|
|
240
|
+
deliveryMode === AppTaggingSecretKind.UNCONSTRAINED
|
|
241
|
+
? { type: 'address-derived' }
|
|
242
|
+
: { type: 'non-interactive-handshake' },
|
|
243
|
+
),
|
|
244
|
+
},
|
|
235
245
|
});
|
|
236
246
|
}
|
|
237
247
|
|
|
238
248
|
async applySetupFeeJuice() {
|
|
239
249
|
this.logger.info('Applying fee juice setup');
|
|
240
|
-
this.feeJuiceContract = FeeJuiceContract.
|
|
250
|
+
this.feeJuiceContract = FeeJuiceContract.withWallet(this.adminWallet);
|
|
241
251
|
|
|
242
252
|
this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
|
|
243
253
|
aztecNode: this.context.aztecNodeService,
|
|
244
254
|
aztecNodeAdmin: this.context.aztecNodeService,
|
|
245
|
-
|
|
255
|
+
// Bridge from a dedicated L1 account so its direct writes don't race the sequencer publisher's
|
|
256
|
+
// txs on the deployer account (see L1_DIRECT_WRITE_ACCOUNT_INDEX).
|
|
257
|
+
l1Client: createExtendedL1Client(
|
|
258
|
+
this.context.config.l1RpcUrls,
|
|
259
|
+
MNEMONIC,
|
|
260
|
+
undefined,
|
|
261
|
+
undefined,
|
|
262
|
+
L1_DIRECT_WRITE_ACCOUNT_INDEX,
|
|
263
|
+
),
|
|
246
264
|
wallet: this.adminWallet,
|
|
247
265
|
logger: this.logger,
|
|
248
266
|
});
|
|
@@ -250,11 +268,14 @@ export class ClientFlowsBenchmark {
|
|
|
250
268
|
|
|
251
269
|
async applyDeployBananaToken() {
|
|
252
270
|
this.logger.info('Applying banana token deployment');
|
|
253
|
-
const {
|
|
254
|
-
|
|
255
|
-
|
|
271
|
+
const { contract: bananaCoin, instance: bananaCoinInstance } = await BananaCoin.deploy(
|
|
272
|
+
this.adminWallet,
|
|
273
|
+
this.adminAddress,
|
|
274
|
+
'BC',
|
|
275
|
+
'BC',
|
|
276
|
+
18n,
|
|
277
|
+
).send({
|
|
256
278
|
from: this.adminAddress,
|
|
257
|
-
wait: { returnReceipt: true },
|
|
258
279
|
});
|
|
259
280
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
260
281
|
this.bananaCoin = bananaCoin;
|
|
@@ -263,11 +284,14 @@ export class ClientFlowsBenchmark {
|
|
|
263
284
|
|
|
264
285
|
async applyDeployCandyBarToken() {
|
|
265
286
|
this.logger.info('Applying candy bar token deployment');
|
|
266
|
-
const {
|
|
267
|
-
|
|
268
|
-
|
|
287
|
+
const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TestTokenContract.deploy(
|
|
288
|
+
this.adminWallet,
|
|
289
|
+
this.adminAddress,
|
|
290
|
+
'CBC',
|
|
291
|
+
'CBC',
|
|
292
|
+
18n,
|
|
293
|
+
).send({
|
|
269
294
|
from: this.adminAddress,
|
|
270
|
-
wait: { returnReceipt: true },
|
|
271
295
|
});
|
|
272
296
|
this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
|
|
273
297
|
this.candyBarCoin = candyBarCoin;
|
|
@@ -280,11 +304,12 @@ export class ClientFlowsBenchmark {
|
|
|
280
304
|
expect((await this.context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
|
|
281
305
|
|
|
282
306
|
const bananaCoin = this.bananaCoin;
|
|
283
|
-
const {
|
|
284
|
-
|
|
285
|
-
|
|
307
|
+
const { contract: bananaFPC, instance: bananaFPCInstance } = await FPCContract.deploy(
|
|
308
|
+
this.adminWallet,
|
|
309
|
+
bananaCoin.address,
|
|
310
|
+
this.adminAddress,
|
|
311
|
+
).send({
|
|
286
312
|
from: this.adminAddress,
|
|
287
|
-
wait: { returnReceipt: true },
|
|
288
313
|
});
|
|
289
314
|
|
|
290
315
|
this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
|
|
@@ -329,7 +354,6 @@ export class ClientFlowsBenchmark {
|
|
|
329
354
|
|
|
330
355
|
public async createAndFundBenchmarkingAccountOnUserWallet(accountType: AccountType) {
|
|
331
356
|
const benchysAccountManager = await this.createBenchmarkingAccountManager(this.adminWallet, accountType);
|
|
332
|
-
const benchysAccount = await benchysAccountManager.getAccount();
|
|
333
357
|
const benchysAddress = benchysAccountManager.address;
|
|
334
358
|
const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(benchysAddress);
|
|
335
359
|
const behchysDeployMethod = await benchysAccountManager.getDeployMethod();
|
|
@@ -339,8 +363,8 @@ export class ClientFlowsBenchmark {
|
|
|
339
363
|
});
|
|
340
364
|
// Register benchy on the user's Wallet, where we're going to be interacting from
|
|
341
365
|
const accountManager = await this.userWallet.createAccount({
|
|
342
|
-
secret:
|
|
343
|
-
salt: new Fr(
|
|
366
|
+
secret: benchysAccountManager.getSecretKey(),
|
|
367
|
+
salt: new Fr(benchysAccountManager.getInstance().salt),
|
|
344
368
|
contract: benchysAccountManager.getAccountContract(),
|
|
345
369
|
});
|
|
346
370
|
return accountManager.address;
|
|
@@ -348,20 +372,21 @@ export class ClientFlowsBenchmark {
|
|
|
348
372
|
|
|
349
373
|
public async applyDeployAmm() {
|
|
350
374
|
this.logger.info('Applying AMM deployment');
|
|
351
|
-
const {
|
|
352
|
-
|
|
353
|
-
|
|
375
|
+
const { contract: liquidityToken, instance: liquidityTokenInstance } = await TestTokenContract.deploy(
|
|
376
|
+
this.adminWallet,
|
|
377
|
+
this.adminAddress,
|
|
378
|
+
'LPT',
|
|
379
|
+
'LPT',
|
|
380
|
+
18n,
|
|
381
|
+
).send({
|
|
354
382
|
from: this.adminAddress,
|
|
355
|
-
wait: { returnReceipt: true },
|
|
356
383
|
});
|
|
357
|
-
const {
|
|
358
|
-
receipt: { contract: amm, instance: ammInstance },
|
|
359
|
-
} = await AMMContract.deploy(
|
|
384
|
+
const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
|
|
360
385
|
this.adminWallet,
|
|
361
386
|
this.bananaCoin.address,
|
|
362
387
|
this.candyBarCoin.address,
|
|
363
388
|
liquidityToken.address,
|
|
364
|
-
).send({ from: this.adminAddress
|
|
389
|
+
).send({ from: this.adminAddress });
|
|
365
390
|
this.logger.info(`AMM deployed at ${amm.address}`);
|
|
366
391
|
await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
|
|
367
392
|
this.liquidityToken = liquidityToken;
|
|
@@ -378,8 +403,9 @@ export class ClientFlowsBenchmark {
|
|
|
378
403
|
public async getPrivateFPCPaymentMethodForWallet(wallet: Wallet, sender: AztecAddress) {
|
|
379
404
|
// The private fee paying method assembled on the app side requires knowledge of the maximum
|
|
380
405
|
// fee the user is willing to pay
|
|
381
|
-
const maxFeesPerGas =
|
|
382
|
-
const
|
|
406
|
+
const maxFeesPerGas = await getPaddedMaxFeesPerGas(this.aztecNode);
|
|
407
|
+
const gasLimits = Gas.from((await this.aztecNode.getNodeInfo()).txsLimits.gas);
|
|
408
|
+
const gasSettings = GasSettings.fallback({ gasLimits, maxFeesPerGas });
|
|
383
409
|
return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
|
|
384
410
|
}
|
|
385
411
|
|
package/src/bench/utils.ts
CHANGED
|
@@ -2,8 +2,10 @@ import type { AztecNodeService } from '@aztec/aztec-node';
|
|
|
2
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
3
|
import { BatchCall, NO_WAIT, type WaitOpts } from '@aztec/aztec.js/contracts';
|
|
4
4
|
import { waitForTx } from '@aztec/aztec.js/node';
|
|
5
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
5
6
|
import { mean, stdDev, times } from '@aztec/foundation/collection';
|
|
6
7
|
import { BenchmarkingContract } from '@aztec/noir-test-contracts.js/Benchmarking';
|
|
8
|
+
import { type Sequencer, type SequencerEvents, SequencerState } from '@aztec/sequencer-client';
|
|
7
9
|
import type { TxHash } from '@aztec/stdlib/tx';
|
|
8
10
|
import type { MetricDefinition } from '@aztec/telemetry-client';
|
|
9
11
|
import type { BenchmarkDataPoint, BenchmarkMetricsType, BenchmarkTelemetryClient } from '@aztec/telemetry-client/bench';
|
|
@@ -11,10 +13,16 @@ import type { BenchmarkDataPoint, BenchmarkMetricsType, BenchmarkTelemetryClient
|
|
|
11
13
|
import { mkdirSync, writeFileSync } from 'fs';
|
|
12
14
|
import path from 'path';
|
|
13
15
|
|
|
16
|
+
import { PIPELINING_SETUP_OPTS } from '../fixtures/fixtures.js';
|
|
14
17
|
import { type EndToEndContext, type SetupOptions, setup } from '../fixtures/utils.js';
|
|
15
18
|
|
|
19
|
+
const MAX_BENCH_WAIT_BLOCKS = 6;
|
|
20
|
+
const BENCH_FINAL_WAIT_TIMEOUT_SECONDS = 10;
|
|
21
|
+
const SEQUENCER_IDLE_TIMEOUT_MS = 60_000;
|
|
22
|
+
const DEFAULT_L1_PUBLISHING_TIME_SECONDS = 12;
|
|
23
|
+
|
|
16
24
|
/**
|
|
17
|
-
* Setup for benchmarks. Initializes a remote node with a
|
|
25
|
+
* Setup for benchmarks. Initializes a remote node with a funded hardcoded account and deploys a benchmark contract.
|
|
18
26
|
*/
|
|
19
27
|
export async function benchmarkSetup(
|
|
20
28
|
opts: Partial<SetupOptions> & {
|
|
@@ -23,11 +31,19 @@ export async function benchmarkSetup(
|
|
|
23
31
|
benchOutput?: string;
|
|
24
32
|
},
|
|
25
33
|
) {
|
|
26
|
-
const context = await setup(1, {
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
const context = await setup(1, {
|
|
35
|
+
...PIPELINING_SETUP_OPTS,
|
|
36
|
+
...opts,
|
|
37
|
+
telemetryConfig: { benchmark: true },
|
|
38
|
+
});
|
|
39
|
+
const [defaultAccountAddress] = context.accounts;
|
|
40
|
+
const sequencer = getSequencerClient(context);
|
|
41
|
+
await waitForSequencerIdle(sequencer.getSequencer());
|
|
42
|
+
const deployment = BenchmarkingContract.deploy(context.wallet);
|
|
43
|
+
const { txHash } = await deployment.send({ from: defaultAccountAddress, wait: NO_WAIT });
|
|
44
|
+
await waitTxs([txHash], context);
|
|
45
|
+
const contract = await deployment.register();
|
|
29
46
|
context.logger.info(`Deployed benchmarking contract at ${contract.address}`);
|
|
30
|
-
const sequencer = (context.aztecNode as AztecNodeService).getSequencer()!;
|
|
31
47
|
const telemetry = context.telemetryClient as BenchmarkTelemetryClient;
|
|
32
48
|
context.logger.warn(`Cleared benchmark data points from setup`);
|
|
33
49
|
telemetry.clear();
|
|
@@ -48,6 +64,14 @@ export async function benchmarkSetup(
|
|
|
48
64
|
return { telemetry, context, contract, sequencer };
|
|
49
65
|
}
|
|
50
66
|
|
|
67
|
+
function getSequencerClient(context: EndToEndContext) {
|
|
68
|
+
const sequencer = (context.aztecNode as AztecNodeService).getSequencer();
|
|
69
|
+
if (!sequencer) {
|
|
70
|
+
throw new Error('Benchmark setup requires a local sequencer');
|
|
71
|
+
}
|
|
72
|
+
return sequencer;
|
|
73
|
+
}
|
|
74
|
+
|
|
51
75
|
type MetricFilter = {
|
|
52
76
|
source: MetricDefinition;
|
|
53
77
|
transform: (value: number) => number;
|
|
@@ -159,10 +183,90 @@ export async function sendTxs(
|
|
|
159
183
|
|
|
160
184
|
export async function waitTxs(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts) {
|
|
161
185
|
context.logger.info(`Awaiting ${txs.length} txs to be mined`);
|
|
162
|
-
await
|
|
186
|
+
await waitTxsWithBlockMining(txs, context, txWaitOpts);
|
|
163
187
|
context.logger.info(`${txs.length} txs have been mined`);
|
|
164
188
|
}
|
|
165
189
|
|
|
190
|
+
async function waitTxsWithBlockMining(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts) {
|
|
191
|
+
const sequencer = getSequencerClient(context).getSequencer();
|
|
192
|
+
for (let attempt = 0; attempt <= MAX_BENCH_WAIT_BLOCKS; attempt++) {
|
|
193
|
+
if (await haveAllTxsMined(txs, context, txWaitOpts)) {
|
|
194
|
+
await waitForSequencerIdle(sequencer);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
await waitForSequencerIdle(sequencer);
|
|
198
|
+
context.logger.info('Mining next benchmark block while waiting for txs', {
|
|
199
|
+
attempt,
|
|
200
|
+
txs: txs.length,
|
|
201
|
+
});
|
|
202
|
+
await mineNextBenchmarkBlock(context, sequencer);
|
|
203
|
+
}
|
|
204
|
+
await Promise.all(
|
|
205
|
+
txs.map(txHash =>
|
|
206
|
+
waitForTx(context.aztecNode, txHash, {
|
|
207
|
+
...txWaitOpts,
|
|
208
|
+
timeout: txWaitOpts?.timeout ?? BENCH_FINAL_WAIT_TIMEOUT_SECONDS,
|
|
209
|
+
}),
|
|
210
|
+
),
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async function haveAllTxsMined(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts): Promise<boolean> {
|
|
215
|
+
const receipts = await Promise.all(txs.map(txHash => context.aztecNode.getTxReceipt(txHash)));
|
|
216
|
+
for (const receipt of receipts) {
|
|
217
|
+
if (receipt.isDropped()) {
|
|
218
|
+
throw new Error(`Transaction ${receipt.txHash.toString()} was dropped. Reason: ${receipt.error ?? 'unknown'}`);
|
|
219
|
+
}
|
|
220
|
+
if (!receipt.isMined()) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
if (!receipt.hasExecutionSucceeded() && !txWaitOpts?.dontThrowOnRevert) {
|
|
224
|
+
throw new Error(
|
|
225
|
+
`Transaction ${receipt.txHash.toString()} reverted: ${receipt.executionResult}. Reason: ${
|
|
226
|
+
receipt.error ?? 'unknown'
|
|
227
|
+
}`,
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async function mineNextBenchmarkBlock(context: EndToEndContext, sequencer: Sequencer) {
|
|
235
|
+
const l1PublishingTime = BigInt(context.config.l1PublishingTime ?? DEFAULT_L1_PUBLISHING_TIME_SECONDS);
|
|
236
|
+
const currentTimestamp = BigInt(await context.cheatCodes.eth.lastBlockTimestamp());
|
|
237
|
+
let targetSlot = SlotNumber((await context.cheatCodes.rollup.getSlot()) + 1);
|
|
238
|
+
let targetTimestamp = await context.cheatCodes.rollup.getTimestampForSlot(targetSlot);
|
|
239
|
+
while (targetTimestamp - l1PublishingTime - 1n <= currentTimestamp) {
|
|
240
|
+
targetSlot = SlotNumber(targetSlot + 1);
|
|
241
|
+
targetTimestamp = await context.cheatCodes.rollup.getTimestampForSlot(targetSlot);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const triggerTimestamp = targetTimestamp - l1PublishingTime - 1n;
|
|
245
|
+
await context.cheatCodes.eth.warp(triggerTimestamp, { resetBlockInterval: true });
|
|
246
|
+
await context.aztecNode.mineBlock();
|
|
247
|
+
await waitForSequencerIdle(sequencer);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function waitForSequencerIdle(sequencer: Sequencer, timeout = SEQUENCER_IDLE_TIMEOUT_MS): Promise<void> {
|
|
251
|
+
if (sequencer.status().state === SequencerState.IDLE) {
|
|
252
|
+
return Promise.resolve();
|
|
253
|
+
}
|
|
254
|
+
return new Promise((resolve, reject) => {
|
|
255
|
+
const timer = setTimeout(() => {
|
|
256
|
+
sequencer.off('state-changed', handler);
|
|
257
|
+
reject(new Error('Timeout waiting for sequencer IDLE state'));
|
|
258
|
+
}, timeout);
|
|
259
|
+
const handler = (args: Parameters<SequencerEvents['state-changed']>[0]) => {
|
|
260
|
+
if (args.newState === SequencerState.IDLE) {
|
|
261
|
+
clearTimeout(timer);
|
|
262
|
+
sequencer.off('state-changed', handler);
|
|
263
|
+
resolve();
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
sequencer.on('state-changed', handler);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
166
270
|
function randomBytesAsBigInts(length: number): bigint[] {
|
|
167
271
|
return [...Array(length)].map(_ => BigInt(Math.floor(Math.random() * 255)));
|
|
168
272
|
}
|