@aztec/end-to-end 0.0.1-commit.a072138 → 0.0.1-commit.a4600f49
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 +217 -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/automine/contracts/fixtures/storage_proof_fetcher.js +184 -0
- package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts +18 -0
- package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/automine/contracts/fixtures/storage_proof_fixture.js +120 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts +17 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
- package/dest/automine/delivery/onchain_delivery_harness.js +123 -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 +45 -48
- 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 +43 -48
- 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 +63 -54
- package/dest/bench/client_flows/config.d.ts +2 -2
- package/dest/bench/client_flows/config.d.ts.map +1 -1
- package/dest/bench/client_flows/config.js +18 -0
- 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 +102 -8
- 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 +15 -0
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
- package/dest/fixtures/authwit_proxy.js +34 -0
- package/dest/fixtures/e2e_prover_test.d.ts +18 -14
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +82 -74
- package/dest/fixtures/elu_monitor.d.ts +21 -0
- package/dest/fixtures/elu_monitor.d.ts.map +1 -0
- package/dest/fixtures/elu_monitor.js +102 -0
- package/dest/fixtures/fixtures.d.ts +82 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +84 -0
- 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 +5 -5
- package/dest/fixtures/ha_setup.d.ts +71 -0
- package/dest/fixtures/ha_setup.d.ts.map +1 -0
- package/dest/fixtures/ha_setup.js +119 -0
- package/dest/fixtures/index.d.ts +3 -1
- package/dest/fixtures/index.d.ts.map +1 -1
- package/dest/fixtures/index.js +2 -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 +111 -60
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +320 -327
- package/dest/fixtures/setup_p2p_test.d.ts +22 -10
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +26 -20
- 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 +26 -8
- 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 +22 -12
- package/dest/p2p/p2p_network.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.js +97 -37
- 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 +67 -27
- 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 +36 -31
- 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 +26 -14
- package/dest/shared/index.d.ts +2 -1
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/index.js +1 -0
- package/dest/shared/jest_setup.js +41 -1
- package/dest/shared/mock_state_view.d.ts +86 -0
- package/dest/shared/mock_state_view.d.ts.map +1 -0
- package/dest/shared/mock_state_view.js +186 -0
- package/dest/shared/submit-transactions.d.ts +2 -2
- 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 +56 -44
- 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 +27 -15
- package/dest/simulators/token_simulator.d.ts +1 -1
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +3 -24
- 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 +93 -0
- package/dest/single-node/fees/fees_test.d.ts.map +1 -0
- package/dest/{e2e_fees → single-node/fees}/fees_test.js +94 -68
- 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 +360 -0
- package/dest/single-node/single_node_test_context.d.ts.map +1 -0
- package/dest/single-node/single_node_test_context.js +833 -0
- package/dest/spartan/setup_test_wallets.d.ts +12 -3
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +118 -41
- 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 +106 -21
- package/dest/spartan/utils/bot.d.ts +3 -2
- package/dest/spartan/utils/bot.d.ts.map +1 -1
- package/dest/spartan/utils/bot.js +2 -1
- package/dest/spartan/utils/config.d.ts +11 -28
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +4 -1
- package/dest/spartan/utils/index.d.ts +5 -3
- package/dest/spartan/utils/index.d.ts.map +1 -1
- package/dest/spartan/utils/index.js +5 -1
- package/dest/spartan/utils/k8s.d.ts +3 -1
- package/dest/spartan/utils/k8s.d.ts.map +1 -1
- package/dest/spartan/utils/k8s.js +6 -0
- package/dest/spartan/utils/nodes.d.ts +4 -5
- package/dest/spartan/utils/nodes.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +11 -11
- package/dest/spartan/utils/pod_logs.d.ts +25 -0
- package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
- package/dest/spartan/utils/pod_logs.js +74 -0
- package/dest/spartan/utils/scripts.d.ts +18 -4
- package/dest/spartan/utils/scripts.d.ts.map +1 -1
- package/dest/spartan/utils/scripts.js +19 -4
- package/dest/test-wallet/test_wallet.d.ts +105 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +323 -0
- package/dest/test-wallet/utils.d.ts +76 -0
- package/dest/test-wallet/utils.d.ts.map +1 -0
- package/dest/test-wallet/utils.js +126 -0
- package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
- package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
- package/dest/test-wallet/wallet_worker_script.js +56 -0
- package/dest/test-wallet/worker_wallet.d.ts +53 -0
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet.js +155 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts +4 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet_schema.js +22 -0
- package/package.json +53 -46
- package/src/automine/README.md +60 -0
- package/src/automine/automine_test_context.ts +153 -0
- package/src/automine/contracts/fixtures/storage_proof.json +915 -0
- package/src/automine/contracts/fixtures/storage_proof_fetcher.ts +190 -0
- package/src/automine/contracts/fixtures/storage_proof_fixture.ts +173 -0
- package/src/automine/delivery/onchain_delivery_harness.ts +177 -0
- package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +51 -61
- package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +50 -56
- 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 +104 -70
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/client_flows/data_extractor.ts +1 -0
- package/src/bench/utils.ts +117 -8
- package/src/composed/ha/ha_full_setup.ts +466 -0
- package/src/fixtures/authwit_proxy.ts +54 -0
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/e2e_prover_test.ts +94 -95
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +108 -0
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/ha_setup.ts +192 -0
- package/src/fixtures/index.ts +2 -0
- package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
- package/src/fixtures/setup.ts +412 -442
- package/src/fixtures/setup_p2p_test.ts +39 -34
- package/src/fixtures/timing.ts +97 -0
- package/src/fixtures/token_utils.ts +42 -7
- 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 +7 -4
- 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 +95 -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 +121 -52
- package/src/{e2e_p2p → p2p}/reqresp/utils.ts +86 -30
- package/src/p2p/shared.ts +329 -0
- package/src/shared/cross_chain_test_harness.ts +42 -17
- package/src/shared/gas_portal_test_harness.ts +33 -15
- package/src/shared/index.ts +1 -0
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +15 -6
- package/src/shared/timing_env.d.mts +39 -0
- package/src/shared/timing_env.mjs +363 -0
- package/src/shared/uniswap_l1_l2.ts +98 -56
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +33 -15
- package/src/simulators/token_simulator.ts +6 -30
- package/src/single-node/README.md +60 -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/{e2e_fees → single-node/fees}/fees_test.ts +118 -89
- 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 +1041 -0
- package/src/spartan/setup_test_wallets.ts +156 -36
- package/src/spartan/tx_metrics.ts +108 -24
- package/src/spartan/utils/bot.ts +4 -1
- package/src/spartan/utils/config.ts +3 -0
- package/src/spartan/utils/index.ts +8 -1
- package/src/spartan/utils/k8s.ts +8 -0
- package/src/spartan/utils/nodes.ts +17 -12
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/spartan/utils/scripts.ts +43 -7
- package/src/test-wallet/test_wallet.ts +429 -0
- package/src/test-wallet/utils.ts +205 -0
- package/src/test-wallet/wallet_worker_script.ts +66 -0
- package/src/test-wallet/worker_wallet.ts +214 -0
- package/src/test-wallet/worker_wallet_schema.ts +14 -0
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -53
- 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 -128
- 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 -100
- package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
- package/dest/e2e_epochs/epochs_test.js +0 -361
- 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_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 -56
- 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 -46
- package/dest/e2e_p2p/shared.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.js +0 -177
- package/dest/e2e_token_contract/token_contract_test.d.ts +0 -42
- 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 -194
- package/src/e2e_deploy_contract/deploy_test.ts +0 -85
- package/src/e2e_epochs/epochs_test.ts +0 -477
- package/src/e2e_l1_publisher/write_json.ts +0 -77
- package/src/e2e_nested_contract/nested_contract_test.ts +0 -73
- package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
- package/src/e2e_p2p/shared.ts +0 -288
- /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
- /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
1
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
3
|
import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
3
4
|
import { type FeePaymentMethod, PrivateFeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
4
5
|
import { type Logger, createLogger } from '@aztec/aztec.js/log';
|
|
5
6
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
6
7
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
7
|
-
import { CheatCodes } from '@aztec/aztec/testing';
|
|
8
|
+
import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
|
|
8
9
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
9
10
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
10
11
|
import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
@@ -19,17 +20,22 @@ import { AMMContract } from '@aztec/noir-contracts.js/AMM';
|
|
|
19
20
|
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
20
21
|
import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
|
|
21
22
|
import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
|
|
22
|
-
import {
|
|
23
|
+
import { TestTokenContract as BananaCoin, TestTokenContract } from '@aztec/noir-test-contracts.js/TestToken';
|
|
23
24
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
24
25
|
import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
25
26
|
import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
|
|
26
27
|
import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
27
|
-
import { GasSettings } from '@aztec/stdlib/gas';
|
|
28
|
+
import { Gas, GasSettings } from '@aztec/stdlib/gas';
|
|
28
29
|
import { deriveSigningKey } from '@aztec/stdlib/keys';
|
|
29
|
-
import {
|
|
30
|
+
import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
|
|
30
31
|
|
|
31
|
-
import {
|
|
32
|
-
|
|
32
|
+
import {
|
|
33
|
+
AUTOMINE_E2E_OPTS,
|
|
34
|
+
L1_DIRECT_WRITE_ACCOUNT_INDEX,
|
|
35
|
+
MNEMONIC,
|
|
36
|
+
getPaddedMaxFeesPerGas,
|
|
37
|
+
} from '../../fixtures/fixtures.js';
|
|
38
|
+
import { type EndToEndContext, type SetupOptions, setup, teardown } from '../../fixtures/setup.js';
|
|
33
39
|
import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
|
|
34
40
|
import { setupSponsoredFPC } from '../../fixtures/utils.js';
|
|
35
41
|
import { CrossChainTestHarness } from '../../shared/cross_chain_test_harness.js';
|
|
@@ -37,6 +43,7 @@ import {
|
|
|
37
43
|
FeeJuicePortalTestingHarnessFactory,
|
|
38
44
|
type GasBridgingTestHarness,
|
|
39
45
|
} from '../../shared/gas_portal_test_harness.js';
|
|
46
|
+
import { TestWallet } from '../../test-wallet/test_wallet.js';
|
|
40
47
|
import { ProxyLogger } from './benchmark.js';
|
|
41
48
|
import { type ClientFlowsConfig, FULL_FLOWS_CONFIG, KEY_FLOWS_CONFIG } from './config.js';
|
|
42
49
|
|
|
@@ -70,13 +77,13 @@ export class ClientFlowsBenchmark {
|
|
|
70
77
|
public bananaFPC!: FPCContract;
|
|
71
78
|
public bananaFPCInstance!: ContractInstanceWithAddress;
|
|
72
79
|
// Random asset we want to trade
|
|
73
|
-
public candyBarCoin!:
|
|
80
|
+
public candyBarCoin!: TestTokenContract;
|
|
74
81
|
public candyBarCoinInstance!: ContractInstanceWithAddress;
|
|
75
82
|
// AMM contract
|
|
76
83
|
public amm!: AMMContract;
|
|
77
84
|
public ammInstance!: ContractInstanceWithAddress;
|
|
78
85
|
// Liquidity token for AMM
|
|
79
|
-
public liquidityToken!:
|
|
86
|
+
public liquidityToken!: TestTokenContract;
|
|
80
87
|
public liquidityTokenInstance!: ContractInstanceWithAddress;
|
|
81
88
|
// Sponsored FPC contract
|
|
82
89
|
public sponsoredFPC!: SponsoredFPCContract;
|
|
@@ -87,33 +94,35 @@ export class ClientFlowsBenchmark {
|
|
|
87
94
|
|
|
88
95
|
public realProofs = ['true', '1'].includes(process.env.REAL_PROOFS ?? '');
|
|
89
96
|
|
|
90
|
-
|
|
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
|
-
|
|
97
|
+
// `apps` is the number of private function calls contributed by this payment method.
|
|
98
|
+
// Each app produces one execution step at proving time; the orchestrator additionally produces
|
|
99
|
+
// one kernel step per batch of N apps (see `expectedExecutionSteps` in `benchmark.ts`).
|
|
100
|
+
public paymentMethods: Record<BenchmarkingFeePaymentMethod, { forWallet: FeePaymentMethodGetter; apps: number }> = {
|
|
101
|
+
// eslint-disable-next-line camelcase
|
|
102
|
+
bridged_fee_juice: {
|
|
103
|
+
forWallet: this.getBridgedFeeJuicePaymentMethodForWallet.bind(this),
|
|
104
|
+
apps: 1, // FeeJuice claim
|
|
105
|
+
},
|
|
106
|
+
// eslint-disable-next-line camelcase
|
|
107
|
+
private_fpc: {
|
|
108
|
+
forWallet: this.getPrivateFPCPaymentMethodForWallet.bind(this),
|
|
109
|
+
apps:
|
|
110
|
+
1 + // FPC entrypoint
|
|
111
|
+
1 + // BananaCoin transfer_to_public
|
|
112
|
+
1 + // Account verify_private_authwit
|
|
113
|
+
1, // BananaCoin prepare_private_balance_increase
|
|
114
|
+
},
|
|
115
|
+
// eslint-disable-next-line camelcase
|
|
116
|
+
sponsored_fpc: {
|
|
117
|
+
forWallet: this.getSponsoredFPCPaymentMethodForWallet.bind(this),
|
|
118
|
+
apps: 1, // Sponsored FPC sponsor_unconditionally
|
|
119
|
+
},
|
|
120
|
+
// eslint-disable-next-line camelcase
|
|
121
|
+
fee_juice: {
|
|
122
|
+
forWallet: () => Promise.resolve(undefined),
|
|
123
|
+
apps: 0,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
117
126
|
|
|
118
127
|
public config: ClientFlowsConfig;
|
|
119
128
|
|
|
@@ -122,7 +131,7 @@ export class ClientFlowsBenchmark {
|
|
|
122
131
|
|
|
123
132
|
constructor(testName?: string, setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {}) {
|
|
124
133
|
this.logger = createLogger(`bench:client_flows${testName ? `:${testName}` : ''}`);
|
|
125
|
-
this.setupOptions = { startProverNode: true, ...setupOptions };
|
|
134
|
+
this.setupOptions = { ...AUTOMINE_E2E_OPTS, startProverNode: true, ...setupOptions };
|
|
126
135
|
this.config = BENCHMARK_CONFIG === 'key_flows' ? KEY_FLOWS_CONFIG : FULL_FLOWS_CONFIG;
|
|
127
136
|
ProxyLogger.create();
|
|
128
137
|
this.proxyLogger = ProxyLogger.getInstance();
|
|
@@ -130,24 +139,28 @@ export class ClientFlowsBenchmark {
|
|
|
130
139
|
|
|
131
140
|
async setup() {
|
|
132
141
|
this.logger.info('Setting up subsystems from fresh');
|
|
133
|
-
|
|
142
|
+
// Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
|
|
143
|
+
// BananaCoin is the codegen'd TestToken here, so the allowlist must key on its class, not canonical Token's.
|
|
144
|
+
const tokenAllowList = await getTokenAllowedSetupFunctions(BananaCoin.artifact);
|
|
145
|
+
this.context = await setup(2, {
|
|
134
146
|
...this.setupOptions,
|
|
135
147
|
fundSponsoredFPC: true,
|
|
136
|
-
skipAccountDeployment: true,
|
|
137
148
|
l1ContractsArgs: this.setupOptions,
|
|
149
|
+
txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
|
|
138
150
|
});
|
|
139
151
|
await this.applyBaseSetup();
|
|
140
152
|
|
|
141
|
-
await this.context.aztecNodeService
|
|
153
|
+
await this.context.aztecNodeService.setConfig({ feeRecipient: this.sequencerAddress, coinbase: this.coinbase });
|
|
142
154
|
|
|
143
155
|
const rollupContract = RollupContract.getFromConfig(this.context.config);
|
|
144
|
-
this.chainMonitor = new ChainMonitor(rollupContract, this.context.dateProvider
|
|
156
|
+
this.chainMonitor = new ChainMonitor(rollupContract, this.context.dateProvider, this.logger, 200).start();
|
|
145
157
|
|
|
146
158
|
return this;
|
|
147
159
|
}
|
|
148
160
|
|
|
149
161
|
async teardown() {
|
|
150
162
|
await this.chainMonitor.stop();
|
|
163
|
+
await this.userWallet?.stop();
|
|
151
164
|
await teardown(this.context);
|
|
152
165
|
}
|
|
153
166
|
|
|
@@ -161,15 +174,15 @@ export class ClientFlowsBenchmark {
|
|
|
161
174
|
|
|
162
175
|
/** Admin mints bananaCoin tokens privately to the target address and redeems them. */
|
|
163
176
|
async mintPrivateBananas(amount: bigint, address: AztecAddress) {
|
|
164
|
-
const balanceBefore = await this.bananaCoin.methods
|
|
177
|
+
const { result: balanceBefore } = await this.bananaCoin.methods
|
|
165
178
|
.balance_of_private(address)
|
|
166
|
-
.simulate({ from:
|
|
179
|
+
.simulate({ from: address });
|
|
167
180
|
|
|
168
181
|
await mintTokensToPrivate(this.bananaCoin, this.adminAddress, address, amount);
|
|
169
182
|
|
|
170
|
-
const balanceAfter = await this.bananaCoin.methods
|
|
183
|
+
const { result: balanceAfter } = await this.bananaCoin.methods
|
|
171
184
|
.balance_of_private(address)
|
|
172
|
-
.simulate({ from:
|
|
185
|
+
.simulate({ from: address });
|
|
173
186
|
expect(balanceAfter).toEqual(balanceBefore + amount);
|
|
174
187
|
}
|
|
175
188
|
|
|
@@ -196,18 +209,10 @@ export class ClientFlowsBenchmark {
|
|
|
196
209
|
|
|
197
210
|
async applyInitialAccounts() {
|
|
198
211
|
this.logger.info('Applying initial accounts setup');
|
|
199
|
-
const
|
|
200
|
-
2,
|
|
201
|
-
this.logger,
|
|
202
|
-
)({
|
|
203
|
-
wallet: this.context.wallet,
|
|
204
|
-
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
const [{ address: adminAddress }, { address: sequencerAddress }] = deployedAccounts;
|
|
212
|
+
const [adminAddress, sequencerAddress] = this.context.accounts;
|
|
208
213
|
|
|
209
214
|
this.adminWallet = this.context.wallet;
|
|
210
|
-
this.aztecNode = this.context.aztecNodeService
|
|
215
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
211
216
|
this.cheatCodes = this.context.cheatCodes;
|
|
212
217
|
|
|
213
218
|
this.adminAddress = adminAddress;
|
|
@@ -227,6 +232,19 @@ export class ClientFlowsBenchmark {
|
|
|
227
232
|
loggers: {
|
|
228
233
|
prover: this.proxyLogger.createLogger('pxe:bb:wasm:bundle:proxied'),
|
|
229
234
|
},
|
|
235
|
+
// The benchmark measures steady-state app cost, not first-send discovery cost. Reproduce the pre-handshake-default
|
|
236
|
+
// behavior of unconstrained delivery: derive the tagging secret from the (sender, recipient) key pair via ECDH
|
|
237
|
+
// instead of taking the current default (a non-interactive handshake, which injects two extra private app
|
|
238
|
+
// executions and a nullifier per cold chain). Constrained delivery is unaffected: the Noir circuit rejects
|
|
239
|
+
// address-derived for constrained, so the hook falls through to a handshake there.
|
|
240
|
+
hooks: {
|
|
241
|
+
resolveTaggingSecretStrategy: ({ deliveryMode }) =>
|
|
242
|
+
Promise.resolve(
|
|
243
|
+
deliveryMode === AppTaggingSecretKind.UNCONSTRAINED
|
|
244
|
+
? { type: 'address-derived' }
|
|
245
|
+
: { type: 'non-interactive-handshake' },
|
|
246
|
+
),
|
|
247
|
+
},
|
|
230
248
|
});
|
|
231
249
|
}
|
|
232
250
|
|
|
@@ -235,9 +253,17 @@ export class ClientFlowsBenchmark {
|
|
|
235
253
|
this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.adminWallet);
|
|
236
254
|
|
|
237
255
|
this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
|
|
238
|
-
aztecNode: this.context.aztecNodeService
|
|
239
|
-
aztecNodeAdmin: this.context.aztecNodeService
|
|
240
|
-
|
|
256
|
+
aztecNode: this.context.aztecNodeService,
|
|
257
|
+
aztecNodeAdmin: this.context.aztecNodeService,
|
|
258
|
+
// Bridge from a dedicated L1 account so its direct writes don't race the sequencer publisher's
|
|
259
|
+
// txs on the deployer account (see L1_DIRECT_WRITE_ACCOUNT_INDEX).
|
|
260
|
+
l1Client: createExtendedL1Client(
|
|
261
|
+
this.context.config.l1RpcUrls,
|
|
262
|
+
MNEMONIC,
|
|
263
|
+
undefined,
|
|
264
|
+
undefined,
|
|
265
|
+
L1_DIRECT_WRITE_ACCOUNT_INDEX,
|
|
266
|
+
),
|
|
241
267
|
wallet: this.adminWallet,
|
|
242
268
|
logger: this.logger,
|
|
243
269
|
});
|
|
@@ -251,7 +277,9 @@ export class ClientFlowsBenchmark {
|
|
|
251
277
|
'BC',
|
|
252
278
|
'BC',
|
|
253
279
|
18n,
|
|
254
|
-
).send({
|
|
280
|
+
).send({
|
|
281
|
+
from: this.adminAddress,
|
|
282
|
+
});
|
|
255
283
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
256
284
|
this.bananaCoin = bananaCoin;
|
|
257
285
|
this.bananaCoinInstance = bananaCoinInstance;
|
|
@@ -259,13 +287,15 @@ export class ClientFlowsBenchmark {
|
|
|
259
287
|
|
|
260
288
|
async applyDeployCandyBarToken() {
|
|
261
289
|
this.logger.info('Applying candy bar token deployment');
|
|
262
|
-
const { contract: candyBarCoin, instance: candyBarCoinInstance } = await
|
|
290
|
+
const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TestTokenContract.deploy(
|
|
263
291
|
this.adminWallet,
|
|
264
292
|
this.adminAddress,
|
|
265
293
|
'CBC',
|
|
266
294
|
'CBC',
|
|
267
295
|
18n,
|
|
268
|
-
).send({
|
|
296
|
+
).send({
|
|
297
|
+
from: this.adminAddress,
|
|
298
|
+
});
|
|
269
299
|
this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
|
|
270
300
|
this.candyBarCoin = candyBarCoin;
|
|
271
301
|
this.candyBarCoinInstance = candyBarCoinInstance;
|
|
@@ -281,7 +311,9 @@ export class ClientFlowsBenchmark {
|
|
|
281
311
|
this.adminWallet,
|
|
282
312
|
bananaCoin.address,
|
|
283
313
|
this.adminAddress,
|
|
284
|
-
).send({
|
|
314
|
+
).send({
|
|
315
|
+
from: this.adminAddress,
|
|
316
|
+
});
|
|
285
317
|
|
|
286
318
|
this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
|
|
287
319
|
|
|
@@ -325,18 +357,17 @@ export class ClientFlowsBenchmark {
|
|
|
325
357
|
|
|
326
358
|
public async createAndFundBenchmarkingAccountOnUserWallet(accountType: AccountType) {
|
|
327
359
|
const benchysAccountManager = await this.createBenchmarkingAccountManager(this.adminWallet, accountType);
|
|
328
|
-
const benchysAccount = await benchysAccountManager.getAccount();
|
|
329
360
|
const benchysAddress = benchysAccountManager.address;
|
|
330
361
|
const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(benchysAddress);
|
|
331
362
|
const behchysDeployMethod = await benchysAccountManager.getDeployMethod();
|
|
332
363
|
await behchysDeployMethod.send({
|
|
333
|
-
from:
|
|
364
|
+
from: NO_FROM,
|
|
334
365
|
fee: { paymentMethod: new FeeJuicePaymentMethodWithClaim(benchysAddress, claim) },
|
|
335
366
|
});
|
|
336
367
|
// Register benchy on the user's Wallet, where we're going to be interacting from
|
|
337
368
|
const accountManager = await this.userWallet.createAccount({
|
|
338
|
-
secret:
|
|
339
|
-
salt: new Fr(
|
|
369
|
+
secret: benchysAccountManager.getSecretKey(),
|
|
370
|
+
salt: new Fr(benchysAccountManager.getInstance().salt),
|
|
340
371
|
contract: benchysAccountManager.getAccountContract(),
|
|
341
372
|
});
|
|
342
373
|
return accountManager.address;
|
|
@@ -344,19 +375,21 @@ export class ClientFlowsBenchmark {
|
|
|
344
375
|
|
|
345
376
|
public async applyDeployAmm() {
|
|
346
377
|
this.logger.info('Applying AMM deployment');
|
|
347
|
-
const { contract: liquidityToken, instance: liquidityTokenInstance } = await
|
|
378
|
+
const { contract: liquidityToken, instance: liquidityTokenInstance } = await TestTokenContract.deploy(
|
|
348
379
|
this.adminWallet,
|
|
349
380
|
this.adminAddress,
|
|
350
381
|
'LPT',
|
|
351
382
|
'LPT',
|
|
352
383
|
18n,
|
|
353
|
-
).send({
|
|
384
|
+
).send({
|
|
385
|
+
from: this.adminAddress,
|
|
386
|
+
});
|
|
354
387
|
const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
|
|
355
388
|
this.adminWallet,
|
|
356
389
|
this.bananaCoin.address,
|
|
357
390
|
this.candyBarCoin.address,
|
|
358
391
|
liquidityToken.address,
|
|
359
|
-
).send({ from: this.adminAddress
|
|
392
|
+
).send({ from: this.adminAddress });
|
|
360
393
|
this.logger.info(`AMM deployed at ${amm.address}`);
|
|
361
394
|
await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
|
|
362
395
|
this.liquidityToken = liquidityToken;
|
|
@@ -373,8 +406,9 @@ export class ClientFlowsBenchmark {
|
|
|
373
406
|
public async getPrivateFPCPaymentMethodForWallet(wallet: Wallet, sender: AztecAddress) {
|
|
374
407
|
// The private fee paying method assembled on the app side requires knowledge of the maximum
|
|
375
408
|
// fee the user is willing to pay
|
|
376
|
-
const maxFeesPerGas =
|
|
377
|
-
const
|
|
409
|
+
const maxFeesPerGas = await getPaddedMaxFeesPerGas(this.aztecNode);
|
|
410
|
+
const gasLimits = Gas.from((await this.aztecNode.getNodeInfo()).txsLimits.gas);
|
|
411
|
+
const gasSettings = GasSettings.fallback({ gasLimits, maxFeesPerGas });
|
|
378
412
|
return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
|
|
379
413
|
}
|
|
380
414
|
|
|
@@ -6,7 +6,7 @@ export type ClientFlowConfig = {
|
|
|
6
6
|
recursions?: number[];
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
-
type ClientFlows = 'accountDeployments' | 'deployments' | 'transfers' | 'bridging' | 'amm';
|
|
9
|
+
type ClientFlows = 'accountDeployments' | 'deployments' | 'transfers' | 'bridging' | 'amm' | 'storageProof';
|
|
10
10
|
|
|
11
11
|
export type ClientFlowsConfig = {
|
|
12
12
|
[key in ClientFlows]: ClientFlowConfig;
|
|
@@ -34,6 +34,10 @@ export const KEY_FLOWS_CONFIG: ClientFlowsConfig = {
|
|
|
34
34
|
feePaymentMethods: ['sponsored_fpc', 'private_fpc'],
|
|
35
35
|
recursions: [0, 1],
|
|
36
36
|
},
|
|
37
|
+
storageProof: {
|
|
38
|
+
accounts: ['ecdsar1'],
|
|
39
|
+
feePaymentMethods: ['sponsored_fpc'],
|
|
40
|
+
},
|
|
37
41
|
};
|
|
38
42
|
|
|
39
43
|
export const FULL_FLOWS_CONFIG: ClientFlowsConfig = {
|
|
@@ -58,4 +62,8 @@ export const FULL_FLOWS_CONFIG: ClientFlowsConfig = {
|
|
|
58
62
|
feePaymentMethods: ['sponsored_fpc', 'private_fpc'],
|
|
59
63
|
recursions: [0, 1, 2],
|
|
60
64
|
},
|
|
65
|
+
storageProof: {
|
|
66
|
+
accounts: ['ecdsar1', 'schnorr'],
|
|
67
|
+
feePaymentMethods: ['sponsored_fpc', 'private_fpc'],
|
|
68
|
+
},
|
|
61
69
|
};
|
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,12 +31,20 @@ 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
|
|
31
|
-
const telemetry = context.telemetryClient! as BenchmarkTelemetryClient;
|
|
47
|
+
const telemetry = context.telemetryClient as BenchmarkTelemetryClient;
|
|
32
48
|
context.logger.warn(`Cleared benchmark data points from setup`);
|
|
33
49
|
telemetry.clear();
|
|
34
50
|
const origTeardown = context.teardown.bind(context);
|
|
@@ -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;
|
|
@@ -149,15 +173,100 @@ export async function sendTxs(
|
|
|
149
173
|
context.logger.info(`Creating ${txCount} txs`);
|
|
150
174
|
const [from] = context.accounts;
|
|
151
175
|
context.logger.info(`Sending ${txCount} txs`);
|
|
152
|
-
return Promise.all(
|
|
176
|
+
return Promise.all(
|
|
177
|
+
calls.map(async call => {
|
|
178
|
+
const { txHash } = await call.send({ from, wait: NO_WAIT });
|
|
179
|
+
return txHash;
|
|
180
|
+
}),
|
|
181
|
+
);
|
|
153
182
|
}
|
|
154
183
|
|
|
155
184
|
export async function waitTxs(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts) {
|
|
156
185
|
context.logger.info(`Awaiting ${txs.length} txs to be mined`);
|
|
157
|
-
await
|
|
186
|
+
await waitTxsWithBlockMining(txs, context, txWaitOpts);
|
|
158
187
|
context.logger.info(`${txs.length} txs have been mined`);
|
|
159
188
|
}
|
|
160
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
|
+
|
|
161
270
|
function randomBytesAsBigInts(length: number): bigint[] {
|
|
162
271
|
return [...Array(length)].map(_ => BigInt(Math.floor(Math.random() * 255)));
|
|
163
272
|
}
|