@aztec/end-to-end 0.0.1-commit.96dac018d → 0.0.1-commit.9a89641
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 +37 -50
- 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 +35 -50
- 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 +65 -59
- 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 +3 -3
- 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 +15 -11
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +60 -44
- 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 +6 -6
- 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 +88 -45
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +297 -202
- 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 +21 -11
- package/dest/p2p/p2p_network.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.js +95 -48
- 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 +45 -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 +44 -32
- 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 +28 -17
- package/dest/shared/jest_setup.js +32 -1
- 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 +55 -45
- 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 +2 -2
- 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 +4 -2
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +93 -46
- 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/config.d.ts +10 -30
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +3 -1
- package/dest/spartan/utils/index.d.ts +3 -1
- package/dest/spartan/utils/index.d.ts.map +1 -1
- package/dest/spartan/utils/index.js +4 -0
- package/dest/spartan/utils/nodes.js +3 -3
- 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/test-wallet/test_wallet.d.ts +47 -25
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +197 -91
- 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 +50 -47
- 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 +42 -61
- package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +41 -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 +105 -70
- package/src/bench/client_flows/data_extractor.ts +1 -0
- package/src/bench/utils.ts +116 -7
- 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 +80 -64
- package/src/fixtures/fixtures.ts +100 -0
- package/src/fixtures/get_acvm_config.ts +2 -8
- package/src/fixtures/get_bb_config.ts +8 -8
- 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 +379 -264
- 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 -6
- 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 +115 -66
- package/src/{e2e_p2p → p2p}/reqresp/utils.ts +56 -28
- package/src/p2p/shared.ts +329 -0
- package/src/shared/cross_chain_test_harness.ts +44 -21
- package/src/shared/gas_portal_test_harness.ts +35 -18
- package/src/shared/jest_setup.ts +36 -1
- package/src/shared/submit-transactions.ts +13 -8
- 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 -54
- 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 -2
- 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 +117 -45
- package/src/spartan/tx_metrics.ts +108 -24
- package/src/spartan/utils/config.ts +2 -0
- package/src/spartan/utils/index.ts +6 -0
- package/src/spartan/utils/nodes.ts +3 -3
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/test-wallet/test_wallet.ts +227 -107
- 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 -102
- package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
- package/dest/e2e_epochs/epochs_test.js +0 -386
- 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 -248
- 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 -181
- 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 -487
- package/src/e2e_fees/fees_test.ts +0 -324
- 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 -290
- /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
|
@@ -1,10 +1,12 @@
|
|
|
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';
|
|
7
|
+
import { FeeJuiceContract } from '@aztec/aztec.js/protocol';
|
|
6
8
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
7
|
-
import { CheatCodes } from '@aztec/aztec/testing';
|
|
9
|
+
import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
|
|
8
10
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
9
11
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
10
12
|
import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
@@ -12,23 +14,26 @@ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
|
12
14
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
13
15
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
14
16
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
17
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
15
18
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
16
19
|
import { TestERC20Abi } from '@aztec/l1-artifacts/TestERC20Abi';
|
|
17
20
|
import { TestERC20Bytecode } from '@aztec/l1-artifacts/TestERC20Bytecode';
|
|
18
21
|
import { AMMContract } from '@aztec/noir-contracts.js/AMM';
|
|
19
22
|
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
20
|
-
import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
|
|
21
23
|
import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
|
|
22
|
-
import {
|
|
23
|
-
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
24
|
-
import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
24
|
+
import { TestTokenContract as BananaCoin, TestTokenContract } from '@aztec/noir-test-contracts.js/TestToken';
|
|
25
25
|
import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
|
|
26
26
|
import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
27
|
-
import { GasSettings } from '@aztec/stdlib/gas';
|
|
28
|
-
import {
|
|
27
|
+
import { Gas, GasSettings } from '@aztec/stdlib/gas';
|
|
28
|
+
import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
|
|
29
29
|
|
|
30
|
-
import {
|
|
31
|
-
|
|
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';
|
|
32
37
|
import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
|
|
33
38
|
import { setupSponsoredFPC } from '../../fixtures/utils.js';
|
|
34
39
|
import { CrossChainTestHarness } from '../../shared/cross_chain_test_harness.js';
|
|
@@ -70,13 +75,13 @@ export class ClientFlowsBenchmark {
|
|
|
70
75
|
public bananaFPC!: FPCContract;
|
|
71
76
|
public bananaFPCInstance!: ContractInstanceWithAddress;
|
|
72
77
|
// Random asset we want to trade
|
|
73
|
-
public candyBarCoin!:
|
|
78
|
+
public candyBarCoin!: TestTokenContract;
|
|
74
79
|
public candyBarCoinInstance!: ContractInstanceWithAddress;
|
|
75
80
|
// AMM contract
|
|
76
81
|
public amm!: AMMContract;
|
|
77
82
|
public ammInstance!: ContractInstanceWithAddress;
|
|
78
83
|
// Liquidity token for AMM
|
|
79
|
-
public liquidityToken!:
|
|
84
|
+
public liquidityToken!: TestTokenContract;
|
|
80
85
|
public liquidityTokenInstance!: ContractInstanceWithAddress;
|
|
81
86
|
// Sponsored FPC contract
|
|
82
87
|
public sponsoredFPC!: SponsoredFPCContract;
|
|
@@ -87,33 +92,35 @@ export class ClientFlowsBenchmark {
|
|
|
87
92
|
|
|
88
93
|
public realProofs = ['true', '1'].includes(process.env.REAL_PROOFS ?? '');
|
|
89
94
|
|
|
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
|
-
|
|
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
|
+
};
|
|
117
124
|
|
|
118
125
|
public config: ClientFlowsConfig;
|
|
119
126
|
|
|
@@ -122,7 +129,7 @@ export class ClientFlowsBenchmark {
|
|
|
122
129
|
|
|
123
130
|
constructor(testName?: string, setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {}) {
|
|
124
131
|
this.logger = createLogger(`bench:client_flows${testName ? `:${testName}` : ''}`);
|
|
125
|
-
this.setupOptions = { startProverNode: true, ...setupOptions };
|
|
132
|
+
this.setupOptions = { ...AUTOMINE_E2E_OPTS, startProverNode: true, ...setupOptions };
|
|
126
133
|
this.config = BENCHMARK_CONFIG === 'key_flows' ? KEY_FLOWS_CONFIG : FULL_FLOWS_CONFIG;
|
|
127
134
|
ProxyLogger.create();
|
|
128
135
|
this.proxyLogger = ProxyLogger.getInstance();
|
|
@@ -130,11 +137,14 @@ export class ClientFlowsBenchmark {
|
|
|
130
137
|
|
|
131
138
|
async setup() {
|
|
132
139
|
this.logger.info('Setting up subsystems from fresh');
|
|
133
|
-
|
|
140
|
+
// Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
|
|
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, {
|
|
134
144
|
...this.setupOptions,
|
|
135
145
|
fundSponsoredFPC: true,
|
|
136
|
-
skipAccountDeployment: true,
|
|
137
146
|
l1ContractsArgs: this.setupOptions,
|
|
147
|
+
txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
|
|
138
148
|
});
|
|
139
149
|
await this.applyBaseSetup();
|
|
140
150
|
|
|
@@ -148,6 +158,7 @@ export class ClientFlowsBenchmark {
|
|
|
148
158
|
|
|
149
159
|
async teardown() {
|
|
150
160
|
await this.chainMonitor.stop();
|
|
161
|
+
await this.userWallet?.stop();
|
|
151
162
|
await teardown(this.context);
|
|
152
163
|
}
|
|
153
164
|
|
|
@@ -161,11 +172,15 @@ export class ClientFlowsBenchmark {
|
|
|
161
172
|
|
|
162
173
|
/** Admin mints bananaCoin tokens privately to the target address and redeems them. */
|
|
163
174
|
async mintPrivateBananas(amount: bigint, address: AztecAddress) {
|
|
164
|
-
const balanceBefore = await this.bananaCoin.methods
|
|
175
|
+
const { result: balanceBefore } = await this.bananaCoin.methods
|
|
176
|
+
.balance_of_private(address)
|
|
177
|
+
.simulate({ from: address });
|
|
165
178
|
|
|
166
179
|
await mintTokensToPrivate(this.bananaCoin, this.adminAddress, address, amount);
|
|
167
180
|
|
|
168
|
-
const balanceAfter = await this.bananaCoin.methods
|
|
181
|
+
const { result: balanceAfter } = await this.bananaCoin.methods
|
|
182
|
+
.balance_of_private(address)
|
|
183
|
+
.simulate({ from: address });
|
|
169
184
|
expect(balanceAfter).toEqual(balanceBefore + amount);
|
|
170
185
|
}
|
|
171
186
|
|
|
@@ -175,7 +190,7 @@ export class ClientFlowsBenchmark {
|
|
|
175
190
|
|
|
176
191
|
let benchysPrivateSigningKey;
|
|
177
192
|
if (type === 'schnorr') {
|
|
178
|
-
benchysPrivateSigningKey =
|
|
193
|
+
benchysPrivateSigningKey = GrumpkinScalar.random();
|
|
179
194
|
return wallet.createSchnorrAccount(benchysSecret, salt, benchysPrivateSigningKey);
|
|
180
195
|
} else if (type === 'ecdsar1') {
|
|
181
196
|
benchysPrivateSigningKey = randomBytes(32);
|
|
@@ -192,15 +207,7 @@ export class ClientFlowsBenchmark {
|
|
|
192
207
|
|
|
193
208
|
async applyInitialAccounts() {
|
|
194
209
|
this.logger.info('Applying initial accounts setup');
|
|
195
|
-
const
|
|
196
|
-
2,
|
|
197
|
-
this.logger,
|
|
198
|
-
)({
|
|
199
|
-
wallet: this.context.wallet,
|
|
200
|
-
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
const [{ address: adminAddress }, { address: sequencerAddress }] = deployedAccounts;
|
|
210
|
+
const [adminAddress, sequencerAddress] = this.context.accounts;
|
|
204
211
|
|
|
205
212
|
this.adminWallet = this.context.wallet;
|
|
206
213
|
this.aztecNode = this.context.aztecNodeService;
|
|
@@ -209,8 +216,7 @@ export class ClientFlowsBenchmark {
|
|
|
209
216
|
this.adminAddress = adminAddress;
|
|
210
217
|
this.sequencerAddress = sequencerAddress;
|
|
211
218
|
|
|
212
|
-
|
|
213
|
-
this.feeJuiceContract = FeeJuiceContract.at(canonicalFeeJuice.address, this.adminWallet);
|
|
219
|
+
this.feeJuiceContract = FeeJuiceContract.withWallet(this.adminWallet);
|
|
214
220
|
this.coinbase = EthAddress.random();
|
|
215
221
|
|
|
216
222
|
const userPXEConfig = getPXEConfig();
|
|
@@ -223,17 +229,38 @@ export class ClientFlowsBenchmark {
|
|
|
223
229
|
loggers: {
|
|
224
230
|
prover: this.proxyLogger.createLogger('pxe:bb:wasm:bundle:proxied'),
|
|
225
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
|
+
},
|
|
226
245
|
});
|
|
227
246
|
}
|
|
228
247
|
|
|
229
248
|
async applySetupFeeJuice() {
|
|
230
249
|
this.logger.info('Applying fee juice setup');
|
|
231
|
-
this.feeJuiceContract = FeeJuiceContract.
|
|
250
|
+
this.feeJuiceContract = FeeJuiceContract.withWallet(this.adminWallet);
|
|
232
251
|
|
|
233
252
|
this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
|
|
234
253
|
aztecNode: this.context.aztecNodeService,
|
|
235
254
|
aztecNodeAdmin: this.context.aztecNodeService,
|
|
236
|
-
|
|
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
|
+
),
|
|
237
264
|
wallet: this.adminWallet,
|
|
238
265
|
logger: this.logger,
|
|
239
266
|
});
|
|
@@ -247,7 +274,9 @@ export class ClientFlowsBenchmark {
|
|
|
247
274
|
'BC',
|
|
248
275
|
'BC',
|
|
249
276
|
18n,
|
|
250
|
-
).send({
|
|
277
|
+
).send({
|
|
278
|
+
from: this.adminAddress,
|
|
279
|
+
});
|
|
251
280
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
252
281
|
this.bananaCoin = bananaCoin;
|
|
253
282
|
this.bananaCoinInstance = bananaCoinInstance;
|
|
@@ -255,13 +284,15 @@ export class ClientFlowsBenchmark {
|
|
|
255
284
|
|
|
256
285
|
async applyDeployCandyBarToken() {
|
|
257
286
|
this.logger.info('Applying candy bar token deployment');
|
|
258
|
-
const { contract: candyBarCoin, instance: candyBarCoinInstance } = await
|
|
287
|
+
const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TestTokenContract.deploy(
|
|
259
288
|
this.adminWallet,
|
|
260
289
|
this.adminAddress,
|
|
261
290
|
'CBC',
|
|
262
291
|
'CBC',
|
|
263
292
|
18n,
|
|
264
|
-
).send({
|
|
293
|
+
).send({
|
|
294
|
+
from: this.adminAddress,
|
|
295
|
+
});
|
|
265
296
|
this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
|
|
266
297
|
this.candyBarCoin = candyBarCoin;
|
|
267
298
|
this.candyBarCoinInstance = candyBarCoinInstance;
|
|
@@ -277,7 +308,9 @@ export class ClientFlowsBenchmark {
|
|
|
277
308
|
this.adminWallet,
|
|
278
309
|
bananaCoin.address,
|
|
279
310
|
this.adminAddress,
|
|
280
|
-
).send({
|
|
311
|
+
).send({
|
|
312
|
+
from: this.adminAddress,
|
|
313
|
+
});
|
|
281
314
|
|
|
282
315
|
this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
|
|
283
316
|
|
|
@@ -321,18 +354,17 @@ export class ClientFlowsBenchmark {
|
|
|
321
354
|
|
|
322
355
|
public async createAndFundBenchmarkingAccountOnUserWallet(accountType: AccountType) {
|
|
323
356
|
const benchysAccountManager = await this.createBenchmarkingAccountManager(this.adminWallet, accountType);
|
|
324
|
-
const benchysAccount = await benchysAccountManager.getAccount();
|
|
325
357
|
const benchysAddress = benchysAccountManager.address;
|
|
326
358
|
const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(benchysAddress);
|
|
327
359
|
const behchysDeployMethod = await benchysAccountManager.getDeployMethod();
|
|
328
360
|
await behchysDeployMethod.send({
|
|
329
|
-
from:
|
|
361
|
+
from: NO_FROM,
|
|
330
362
|
fee: { paymentMethod: new FeeJuicePaymentMethodWithClaim(benchysAddress, claim) },
|
|
331
363
|
});
|
|
332
364
|
// Register benchy on the user's Wallet, where we're going to be interacting from
|
|
333
365
|
const accountManager = await this.userWallet.createAccount({
|
|
334
|
-
secret:
|
|
335
|
-
salt: new Fr(
|
|
366
|
+
secret: benchysAccountManager.getSecretKey(),
|
|
367
|
+
salt: new Fr(benchysAccountManager.getInstance().salt),
|
|
336
368
|
contract: benchysAccountManager.getAccountContract(),
|
|
337
369
|
});
|
|
338
370
|
return accountManager.address;
|
|
@@ -340,19 +372,21 @@ export class ClientFlowsBenchmark {
|
|
|
340
372
|
|
|
341
373
|
public async applyDeployAmm() {
|
|
342
374
|
this.logger.info('Applying AMM deployment');
|
|
343
|
-
const { contract: liquidityToken, instance: liquidityTokenInstance } = await
|
|
375
|
+
const { contract: liquidityToken, instance: liquidityTokenInstance } = await TestTokenContract.deploy(
|
|
344
376
|
this.adminWallet,
|
|
345
377
|
this.adminAddress,
|
|
346
378
|
'LPT',
|
|
347
379
|
'LPT',
|
|
348
380
|
18n,
|
|
349
|
-
).send({
|
|
381
|
+
).send({
|
|
382
|
+
from: this.adminAddress,
|
|
383
|
+
});
|
|
350
384
|
const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
|
|
351
385
|
this.adminWallet,
|
|
352
386
|
this.bananaCoin.address,
|
|
353
387
|
this.candyBarCoin.address,
|
|
354
388
|
liquidityToken.address,
|
|
355
|
-
).send({ from: this.adminAddress
|
|
389
|
+
).send({ from: this.adminAddress });
|
|
356
390
|
this.logger.info(`AMM deployed at ${amm.address}`);
|
|
357
391
|
await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
|
|
358
392
|
this.liquidityToken = liquidityToken;
|
|
@@ -369,8 +403,9 @@ export class ClientFlowsBenchmark {
|
|
|
369
403
|
public async getPrivateFPCPaymentMethodForWallet(wallet: Wallet, sender: AztecAddress) {
|
|
370
404
|
// The private fee paying method assembled on the app side requires knowledge of the maximum
|
|
371
405
|
// fee the user is willing to pay
|
|
372
|
-
const maxFeesPerGas =
|
|
373
|
-
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 });
|
|
374
409
|
return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
|
|
375
410
|
}
|
|
376
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;
|
|
@@ -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
|
}
|