@aztec/end-to-end 0.0.1-commit.d431d1c → 0.0.1-commit.d58ff9d0
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/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 +50 -54
- 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 +44 -49
- 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 +68 -44
- 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 +7 -6
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +108 -12
- 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 +85 -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 +83 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +86 -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 +113 -60
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +330 -326
- package/dest/fixtures/setup_p2p_test.d.ts +22 -11
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +46 -35
- 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 +28 -7
- 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 +99 -35
- package/dest/p2p/reqresp/utils.d.ts +19 -0
- package/dest/p2p/reqresp/utils.d.ts.map +1 -0
- package/dest/p2p/reqresp/utils.js +193 -0
- 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 +8 -7
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +44 -39
- 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 +27 -15
- 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 +4 -4
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +19 -14
- 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 +67 -55
- 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 +29 -17
- 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 +18 -5
- 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 +96 -70
- 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 +153 -49
- package/dest/spartan/tx_metrics.d.ts +64 -5
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +280 -21
- package/dest/spartan/utils/bot.d.ts +28 -0
- package/dest/spartan/utils/bot.d.ts.map +1 -0
- package/dest/spartan/utils/bot.js +142 -0
- package/dest/spartan/utils/chaos.d.ts +79 -0
- package/dest/spartan/utils/chaos.d.ts.map +1 -0
- package/dest/spartan/utils/chaos.js +142 -0
- package/dest/spartan/utils/clients.d.ts +39 -0
- package/dest/spartan/utils/clients.d.ts.map +1 -0
- package/dest/spartan/utils/clients.js +90 -0
- package/dest/spartan/utils/config.d.ts +19 -0
- package/dest/spartan/utils/config.d.ts.map +1 -0
- package/dest/spartan/utils/config.js +23 -0
- package/dest/spartan/utils/health.d.ts +63 -0
- package/dest/spartan/utils/health.d.ts.map +1 -0
- package/dest/spartan/utils/health.js +202 -0
- package/dest/spartan/utils/helm.d.ts +15 -0
- package/dest/spartan/utils/helm.d.ts.map +1 -0
- package/dest/spartan/utils/helm.js +47 -0
- package/dest/spartan/utils/index.d.ts +11 -0
- package/dest/spartan/utils/index.d.ts.map +1 -0
- package/dest/spartan/utils/index.js +22 -0
- package/dest/spartan/utils/k8s.d.ts +128 -0
- package/dest/spartan/utils/k8s.d.ts.map +1 -0
- package/dest/spartan/utils/k8s.js +381 -0
- package/dest/spartan/utils/nodes.d.ts +40 -0
- package/dest/spartan/utils/nodes.d.ts.map +1 -0
- package/dest/spartan/utils/nodes.js +461 -0
- 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 +30 -0
- package/dest/spartan/utils/scripts.d.ts.map +1 -0
- package/dest/spartan/utils/scripts.js +81 -0
- package/dest/spartan/utils.d.ts +2 -260
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +1 -942
- 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 +320 -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 +157 -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 +23 -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/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 +56 -69
- package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +51 -59
- 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 +111 -90
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/client_flows/data_extractor.ts +1 -0
- package/src/bench/utils.ts +123 -12
- 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 +102 -103
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +110 -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 +421 -444
- package/src/fixtures/setup_p2p_test.ts +54 -54
- package/src/fixtures/timing.ts +97 -0
- package/src/fixtures/token_utils.ts +46 -10
- 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 +132 -57
- package/src/p2p/reqresp/utils.ts +263 -0
- package/src/p2p/shared.ts +329 -0
- package/src/shared/cross_chain_test_harness.ts +52 -41
- package/src/shared/gas_portal_test_harness.ts +34 -16
- 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 +22 -19
- package/src/shared/timing_env.d.mts +39 -0
- package/src/shared/timing_env.mjs +363 -0
- package/src/shared/uniswap_l1_l2.ts +109 -74
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +35 -17
- 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 +20 -9
- package/src/{e2e_fees → single-node/fees}/fees_test.ts +120 -95
- 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 +208 -34
- package/src/spartan/tx_metrics.ts +255 -26
- package/src/spartan/utils/bot.ts +188 -0
- package/src/spartan/utils/chaos.ts +253 -0
- package/src/spartan/utils/clients.ts +100 -0
- package/src/spartan/utils/config.ts +29 -0
- package/src/spartan/utils/health.ts +255 -0
- package/src/spartan/utils/helm.ts +84 -0
- package/src/spartan/utils/index.ts +71 -0
- package/src/spartan/utils/k8s.ts +535 -0
- package/src/spartan/utils/nodes.ts +543 -0
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/spartan/utils/scripts.ts +99 -0
- package/src/spartan/utils.ts +1 -1246
- package/src/test-wallet/test_wallet.ts +426 -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 +216 -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 -94
- package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
- package/dest/e2e_epochs/epochs_test.js +0 -339
- 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 -10
- package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
- package/dest/e2e_l1_publisher/write_json.js +0 -62
- 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/shared.d.ts +0 -46
- package/dest/e2e_p2p/shared.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.js +0 -184
- 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 -451
- package/src/e2e_l1_publisher/write_json.ts +0 -82
- 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 -290
- /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
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import type { InitialAccountData } from '@aztec/accounts/testing';
|
|
2
|
+
import type { Archiver } from '@aztec/archiver';
|
|
3
|
+
import type { AztecNodeService } from '@aztec/aztec-node';
|
|
4
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
5
|
+
import { NO_WAIT, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
6
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
7
|
+
import type { Logger } from '@aztec/aztec.js/log';
|
|
8
|
+
import { TxHash } from '@aztec/aztec.js/tx';
|
|
9
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
10
|
+
import { timesAsync } from '@aztec/foundation/collection';
|
|
11
|
+
import { Signature } from '@aztec/foundation/eth-signature';
|
|
12
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
13
|
+
import type { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
14
|
+
import { TestContract, TestContractArtifact } from '@aztec/noir-test-contracts.js/Test';
|
|
15
|
+
import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
|
|
16
|
+
import type { SequencerClient } from '@aztec/sequencer-client';
|
|
17
|
+
import { CheckpointAttestation, ConsensusPayload, type TopicType } from '@aztec/stdlib/p2p';
|
|
18
|
+
|
|
19
|
+
import { expect } from '@jest/globals';
|
|
20
|
+
|
|
21
|
+
import { shouldCollectMetrics } from '../fixtures/fixtures.js';
|
|
22
|
+
import { SchnorrHardcodedKeyAccountContract } from '../fixtures/schnorr_hardcoded_account_contract.js';
|
|
23
|
+
import { createNodes } from '../fixtures/setup_p2p_test.js';
|
|
24
|
+
import { waitForTxs } from '../fixtures/wait_helpers.js';
|
|
25
|
+
import { type AlertConfig, GrafanaClient } from '../quality_of_service/grafana_client.js';
|
|
26
|
+
import { submitTxsTo } from '../shared/submit-transactions.js';
|
|
27
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
28
|
+
import { type ProvenTx, proveInteraction } from '../test-wallet/utils.js';
|
|
29
|
+
import { type P2PNetworkTest, WAIT_FOR_TX_TIMEOUT } from './p2p_network.js';
|
|
30
|
+
|
|
31
|
+
/** One published checkpoint as returned by the archiver, including its attestations. */
|
|
32
|
+
type PublishedCheckpoint = Awaited<ReturnType<Archiver['getCheckpoints']>>[number];
|
|
33
|
+
|
|
34
|
+
// submits a set of transactions to the provided Private eXecution Environment (PXE)
|
|
35
|
+
export const submitComplexTxsTo = async (
|
|
36
|
+
logger: Logger,
|
|
37
|
+
from: AztecAddress,
|
|
38
|
+
spamContract: SpamContract,
|
|
39
|
+
numTxs: number,
|
|
40
|
+
opts: { callPublic?: boolean } = {},
|
|
41
|
+
) => {
|
|
42
|
+
const txs: TxHash[] = [];
|
|
43
|
+
|
|
44
|
+
const seed = 1234n;
|
|
45
|
+
const spamCount = 15;
|
|
46
|
+
for (let i = 0; i < numTxs; i++) {
|
|
47
|
+
const method = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic);
|
|
48
|
+
const { txHash } = await method.send({ from, wait: NO_WAIT });
|
|
49
|
+
logger.info(`Tx sent with hash ${txHash.toString()}`);
|
|
50
|
+
txs.push(txHash);
|
|
51
|
+
}
|
|
52
|
+
return txs;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// creates a wallet and submit a given number of transactions through it.
|
|
56
|
+
export const submitTransactions = async (
|
|
57
|
+
logger: Logger,
|
|
58
|
+
node: AztecNodeService,
|
|
59
|
+
numTxs: number,
|
|
60
|
+
fundedAccount: InitialAccountData,
|
|
61
|
+
): Promise<TxHash[]> => {
|
|
62
|
+
const rpcConfig = getRpcConfig();
|
|
63
|
+
rpcConfig.proverEnabled = false;
|
|
64
|
+
const wallet = await TestWallet.create(
|
|
65
|
+
node,
|
|
66
|
+
// Use checkpointed chain tip to avoid anchoring on provisional blocks that the archiver can prune
|
|
67
|
+
// when their slot ends without a checkpoint landing on L1.
|
|
68
|
+
{ ...getPXEConfig(), proverEnabled: false, syncChainTip: 'checkpointed' },
|
|
69
|
+
{ loggerActorLabel: 'pxe-tx' },
|
|
70
|
+
);
|
|
71
|
+
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
72
|
+
const fundedAccountManager = await wallet.createAccount({
|
|
73
|
+
secret: fundedAccount.secret,
|
|
74
|
+
salt: fundedAccount.salt,
|
|
75
|
+
contract,
|
|
76
|
+
});
|
|
77
|
+
return submitTxsTo(wallet, fundedAccountManager.address, numTxs, logger);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export async function prepareTransactions(
|
|
81
|
+
logger: Logger,
|
|
82
|
+
node: AztecNodeService,
|
|
83
|
+
numTxs: number,
|
|
84
|
+
fundedAccount: InitialAccountData,
|
|
85
|
+
): Promise<ProvenTx[]> {
|
|
86
|
+
const rpcConfig = getRpcConfig();
|
|
87
|
+
rpcConfig.proverEnabled = false;
|
|
88
|
+
|
|
89
|
+
const wallet = await TestWallet.create(
|
|
90
|
+
node,
|
|
91
|
+
{ ...getPXEConfig(), proverEnabled: false, syncChainTip: 'checkpointed' },
|
|
92
|
+
{ loggerActorLabel: 'pxe-tx' },
|
|
93
|
+
);
|
|
94
|
+
const accountContract = new SchnorrHardcodedKeyAccountContract();
|
|
95
|
+
const fundedAccountManager = await wallet.createAccount({
|
|
96
|
+
secret: fundedAccount.secret,
|
|
97
|
+
salt: fundedAccount.salt,
|
|
98
|
+
contract: accountContract,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const testContractInstance = await getContractInstanceFromInstantiationParams(TestContractArtifact, {
|
|
102
|
+
salt: Fr.random(),
|
|
103
|
+
});
|
|
104
|
+
await wallet.registerContract(testContractInstance, TestContractArtifact);
|
|
105
|
+
const contract = TestContract.at(testContractInstance.address, wallet);
|
|
106
|
+
|
|
107
|
+
return timesAsync(numTxs, async () => {
|
|
108
|
+
const tx = await proveInteraction(wallet, contract.methods.emit_nullifier(Fr.random()), {
|
|
109
|
+
from: fundedAccountManager.address,
|
|
110
|
+
});
|
|
111
|
+
logger.info(`Tx prepared with hash ${tx.getTxHash()}`);
|
|
112
|
+
return tx;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const CHECK_ALERTS = process.env.CHECK_ALERTS === 'true';
|
|
117
|
+
|
|
118
|
+
const qosAlerts: AlertConfig[] = [
|
|
119
|
+
{
|
|
120
|
+
alert: 'SequencerTimeToCollectAttestations',
|
|
121
|
+
expr: 'aztec_sequencer_time_to_collect_attestations > 3500',
|
|
122
|
+
labels: { severity: 'error' },
|
|
123
|
+
for: '10m',
|
|
124
|
+
annotations: {},
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
/** Runs the shared p2p QoS Grafana alert check when CHECK_ALERTS=true; a no-op otherwise. */
|
|
129
|
+
export async function maybeCheckQosAlerts(logger: Logger): Promise<void> {
|
|
130
|
+
if (CHECK_ALERTS) {
|
|
131
|
+
const checker = new GrafanaClient(logger);
|
|
132
|
+
await checker.runAlertCheck(qosAlerts);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Waits until every node's synced block number reaches the initial node's current tip. */
|
|
137
|
+
export async function waitForNodesToSync(t: P2PNetworkTest, nodes: AztecNodeService[]): Promise<void> {
|
|
138
|
+
const targetBlock = await t.ctx.aztecNode.getBlockNumber();
|
|
139
|
+
t.logger.warn(`Waiting for all nodes to sync to block number ${targetBlock}`);
|
|
140
|
+
await retryUntil(
|
|
141
|
+
async () => {
|
|
142
|
+
const blockNumbers = await Promise.all(nodes.map(node => node.getBlockNumber()));
|
|
143
|
+
const checkpointNumber = (await t.monitor.run()).checkpointNumber;
|
|
144
|
+
t.logger.info(`Current block numbers ${blockNumbers} (checkpoint number on L1 is ${checkpointNumber})`);
|
|
145
|
+
return blockNumbers.every(bn => bn >= targetBlock);
|
|
146
|
+
},
|
|
147
|
+
`nodes to sync to block number ${targetBlock}`,
|
|
148
|
+
30,
|
|
149
|
+
0.5,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Reads the published checkpoint containing the block that mined the given tx. */
|
|
154
|
+
export async function getPublishedCheckpointForTx(
|
|
155
|
+
node: AztecNodeService,
|
|
156
|
+
txHash: TxHash,
|
|
157
|
+
): Promise<PublishedCheckpoint> {
|
|
158
|
+
const receipt = await node.getTxReceipt(txHash);
|
|
159
|
+
const blockNumber = receipt.blockNumber!;
|
|
160
|
+
const dataStore = node.getBlockSource() as Archiver;
|
|
161
|
+
const blockData = await dataStore.getBlockData({ number: BlockNumber(blockNumber) });
|
|
162
|
+
const [publishedCheckpoint] = await dataStore.getCheckpoints({ from: blockData!.checkpointNumber, limit: 1 });
|
|
163
|
+
return publishedCheckpoint;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Polls until the archiver has indexed the first published checkpoint, then returns it. */
|
|
167
|
+
export async function waitForFirstPublishedCheckpoint(
|
|
168
|
+
t: P2PNetworkTest,
|
|
169
|
+
nodes: AztecNodeService[],
|
|
170
|
+
timeoutSeconds = 120,
|
|
171
|
+
): Promise<PublishedCheckpoint> {
|
|
172
|
+
const dataStore = nodes[0].getBlockSource() as Archiver;
|
|
173
|
+
t.logger.warn('Waiting for first checkpoint to be published and indexed by the archiver');
|
|
174
|
+
return await retryUntil(
|
|
175
|
+
async () => {
|
|
176
|
+
const blockNumbers = await Promise.all(nodes.map(node => node.getBlockNumber()));
|
|
177
|
+
const checkpointNumber = (await t.monitor.run()).checkpointNumber;
|
|
178
|
+
t.logger.info(`Current block numbers ${blockNumbers} (checkpoint number on L1 is ${checkpointNumber})`);
|
|
179
|
+
const [checkpoint] = await dataStore.getCheckpoints({ from: CheckpointNumber(1), limit: 1 });
|
|
180
|
+
return checkpoint;
|
|
181
|
+
},
|
|
182
|
+
'published checkpoint to be indexed',
|
|
183
|
+
timeoutSeconds,
|
|
184
|
+
1,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Recovers the attestation signers from a published checkpoint and asserts each one belongs to the
|
|
190
|
+
* validator set formed by the given nodes. Returns the recovered signer addresses so callers can add
|
|
191
|
+
* scenario-specific assertions (e.g. an exact signer count).
|
|
192
|
+
*/
|
|
193
|
+
export async function verifyAttestationSigners(
|
|
194
|
+
t: P2PNetworkTest,
|
|
195
|
+
nodes: AztecNodeService[],
|
|
196
|
+
publishedCheckpoint: PublishedCheckpoint,
|
|
197
|
+
): Promise<string[]> {
|
|
198
|
+
const signatureContext = {
|
|
199
|
+
chainId: t.ctx.aztecNodeConfig.l1ChainId,
|
|
200
|
+
rollupAddress: t.ctx.deployL1ContractsValues.l1ContractAddresses.rollupAddress,
|
|
201
|
+
};
|
|
202
|
+
const payload = ConsensusPayload.fromCheckpoint(publishedCheckpoint.checkpoint, signatureContext);
|
|
203
|
+
const attestations = publishedCheckpoint.attestations
|
|
204
|
+
.filter(a => !a.signature.isEmpty())
|
|
205
|
+
.map(a => new CheckpointAttestation(payload, a.signature, Signature.empty()));
|
|
206
|
+
const signers = await Promise.all(attestations.map(att => att.getSender()!.toString()));
|
|
207
|
+
t.logger.info(`Attestation signers`, { signers });
|
|
208
|
+
|
|
209
|
+
// Check that the signers found are part of the proposer nodes to ensure the archiver fetched them right
|
|
210
|
+
const validatorAddresses = nodes.flatMap(node =>
|
|
211
|
+
(node.getSequencer() as SequencerClient).validatorAddresses?.map(a => a.toString()),
|
|
212
|
+
);
|
|
213
|
+
t.logger.info(`Validator addresses`, { addresses: validatorAddresses });
|
|
214
|
+
for (const signer of signers) {
|
|
215
|
+
expect(validatorAddresses).toContain(signer);
|
|
216
|
+
}
|
|
217
|
+
return signers;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Options that parameterize {@link runGossipScenario}. */
|
|
221
|
+
export interface GossipScenarioOptions {
|
|
222
|
+
/** The initialized P2P network test (setup() + validator registration already done). */
|
|
223
|
+
t: P2PNetworkTest;
|
|
224
|
+
/** Number of validator nodes forming the committee. */
|
|
225
|
+
numValidators: number;
|
|
226
|
+
/** Base UDP port for the validator nodes. */
|
|
227
|
+
bootNodePort: number;
|
|
228
|
+
/** Transactions submitted per validator node; 0 skips tx submission entirely (e.g. the oracle test). */
|
|
229
|
+
txsPerNode: number;
|
|
230
|
+
/** Submit tx batches sequentially instead of concurrently. */
|
|
231
|
+
submitSequentially?: boolean;
|
|
232
|
+
/** Overrides for the P2P mesh-connectivity wait; unset fields fall back to waitForP2PMeshConnectivity defaults. */
|
|
233
|
+
mesh?: {
|
|
234
|
+
expectedNodeCount?: number;
|
|
235
|
+
timeoutSeconds?: number;
|
|
236
|
+
checkIntervalSeconds?: number;
|
|
237
|
+
topics?: TopicType[];
|
|
238
|
+
minMeshPeerCount?: number;
|
|
239
|
+
};
|
|
240
|
+
/** Which published checkpoint the attestation signers are read from (defaults to the first tx's block). */
|
|
241
|
+
checkpointSource?: 'first-tx' | 'first-published';
|
|
242
|
+
/** Runs after validator registration but before the validator nodes are created. */
|
|
243
|
+
beforeCreateNodes?: () => Promise<void>;
|
|
244
|
+
/** Creates extra non-validator nodes (prover/monitor) once the validator nodes exist. */
|
|
245
|
+
createExtraNodes?: (nodes: AztecNodeService[]) => Promise<void>;
|
|
246
|
+
/** Runs after the account is registered but before txs are submitted (sync waits, checkpoint waits, sleeps). */
|
|
247
|
+
beforeSubmit?: (nodes: AztecNodeService[]) => Promise<void>;
|
|
248
|
+
/** Scenario-specific verification run after attestation-signer verification (proven block, price convergence). */
|
|
249
|
+
afterVerify?: (nodes: AztecNodeService[]) => Promise<void>;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Shared skeleton for the p2p gossip tests: create the validator nodes and any extra nodes, wait for
|
|
254
|
+
* the mesh to form, register the account, optionally submit and mine txs, then verify the attestation
|
|
255
|
+
* signers of a published checkpoint. Each varying part (validator registration, extra nodes, pre-submit
|
|
256
|
+
* waits, scenario-specific verification) is supplied via the callbacks in {@link GossipScenarioOptions}.
|
|
257
|
+
* Returns the validator nodes so the caller can track them for teardown.
|
|
258
|
+
*/
|
|
259
|
+
export async function runGossipScenario(opts: GossipScenarioOptions): Promise<AztecNodeService[]> {
|
|
260
|
+
const { t, numValidators, bootNodePort, txsPerNode } = opts;
|
|
261
|
+
|
|
262
|
+
if (!t.bootstrapNodeEnr) {
|
|
263
|
+
throw new Error('Bootstrap node ENR is not available');
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
await opts.beforeCreateNodes?.();
|
|
267
|
+
|
|
268
|
+
t.logger.info('Creating validator nodes');
|
|
269
|
+
const nodes = await createNodes(
|
|
270
|
+
t.ctx.aztecNodeConfig,
|
|
271
|
+
t.ctx.dateProvider,
|
|
272
|
+
t.bootstrapNodeEnr,
|
|
273
|
+
numValidators,
|
|
274
|
+
bootNodePort,
|
|
275
|
+
t.genesis,
|
|
276
|
+
t.dataDirFor('validator'),
|
|
277
|
+
shouldCollectMetrics(),
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
await opts.createExtraNodes?.(nodes);
|
|
281
|
+
|
|
282
|
+
t.logger.info('Waiting for nodes to connect');
|
|
283
|
+
await t.waitForP2PMeshConnectivity(
|
|
284
|
+
nodes,
|
|
285
|
+
opts.mesh?.expectedNodeCount ?? numValidators,
|
|
286
|
+
opts.mesh?.timeoutSeconds,
|
|
287
|
+
opts.mesh?.checkIntervalSeconds,
|
|
288
|
+
opts.mesh?.topics,
|
|
289
|
+
opts.mesh?.minMeshPeerCount,
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
// We need to create the nodes before we setup the account, because those nodes form the committee
|
|
293
|
+
// and blocks cannot be built without them (targetCommitteeSize is set to the number of nodes).
|
|
294
|
+
await t.setupAccount();
|
|
295
|
+
|
|
296
|
+
await opts.beforeSubmit?.(nodes);
|
|
297
|
+
|
|
298
|
+
let firstTxHash: TxHash | undefined;
|
|
299
|
+
if (txsPerNode > 0) {
|
|
300
|
+
t.logger.info('Submitting transactions');
|
|
301
|
+
const submitOne = (node: AztecNodeService) => submitTransactions(t.logger, node, txsPerNode, t.fundedAccount);
|
|
302
|
+
// Each submitTransactions call builds its own wallet/PXE, so submissions are independent. When run
|
|
303
|
+
// concurrently, Promise.all preserves node order so submitted[i] stays aligned with nodes[i].
|
|
304
|
+
const submitted: TxHash[][] = [];
|
|
305
|
+
if (opts.submitSequentially) {
|
|
306
|
+
for (const node of nodes) {
|
|
307
|
+
submitted.push(await submitOne(node));
|
|
308
|
+
}
|
|
309
|
+
} else {
|
|
310
|
+
submitted.push(...(await Promise.all(nodes.map(submitOne))));
|
|
311
|
+
}
|
|
312
|
+
firstTxHash = submitted[0][0];
|
|
313
|
+
|
|
314
|
+
t.logger.info('Waiting for transactions to be mined');
|
|
315
|
+
await waitForTxs(nodes[0], submitted.flat(), { timeout: WAIT_FOR_TX_TIMEOUT });
|
|
316
|
+
t.logger.info('All transactions mined');
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const publishedCheckpoint =
|
|
320
|
+
opts.checkpointSource === 'first-published'
|
|
321
|
+
? await waitForFirstPublishedCheckpoint(t, nodes)
|
|
322
|
+
: await getPublishedCheckpointForTx(nodes[0], firstTxHash!);
|
|
323
|
+
|
|
324
|
+
await verifyAttestationSigners(t, nodes, publishedCheckpoint);
|
|
325
|
+
|
|
326
|
+
await opts.afterVerify?.(nodes);
|
|
327
|
+
|
|
328
|
+
return nodes;
|
|
329
|
+
}
|
|
@@ -13,19 +13,20 @@ import type { AztecNode } from '@aztec/aztec.js/node';
|
|
|
13
13
|
import type { SiblingPath } from '@aztec/aztec.js/trees';
|
|
14
14
|
import type { TxReceipt } from '@aztec/aztec.js/tx';
|
|
15
15
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
16
|
+
import { OutboxContract } from '@aztec/ethereum/contracts';
|
|
16
17
|
import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
17
18
|
import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
|
|
18
19
|
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
19
20
|
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
20
|
-
import { retryUntil } from '@aztec/foundation/retry';
|
|
21
|
-
import type { FieldsOf } from '@aztec/foundation/types';
|
|
22
21
|
import { TestERC20Abi, TokenPortalAbi, TokenPortalBytecode } from '@aztec/l1-artifacts';
|
|
23
22
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
24
23
|
import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
|
|
25
24
|
|
|
26
25
|
import { type Hex, getContract } from 'viem';
|
|
27
26
|
|
|
27
|
+
import { testSpan } from '../fixtures/timing.js';
|
|
28
28
|
import { mintTokensToPrivate } from '../fixtures/token_utils.js';
|
|
29
|
+
import { waitForL1ToL2MessageSeen } from './wait_for_l1_to_l2_message.js';
|
|
29
30
|
|
|
30
31
|
/**
|
|
31
32
|
* Deploy L1 token and portal, initialize portal, deploy a non native l2 token contract, its L2 bridge contract and attach is to the portal.
|
|
@@ -43,6 +44,7 @@ export async function deployAndInitializeTokenAndBridgeContracts(
|
|
|
43
44
|
rollupRegistryAddress: EthAddress,
|
|
44
45
|
owner: AztecAddress,
|
|
45
46
|
underlyingERC20Address: EthAddress,
|
|
47
|
+
predeployedTokenPortalAddress?: EthAddress,
|
|
46
48
|
): Promise<{
|
|
47
49
|
/**
|
|
48
50
|
* The L2 token contract instance.
|
|
@@ -65,8 +67,9 @@ export async function deployAndInitializeTokenAndBridgeContracts(
|
|
|
65
67
|
*/
|
|
66
68
|
underlyingERC20: any;
|
|
67
69
|
}> {
|
|
68
|
-
//
|
|
69
|
-
const
|
|
70
|
+
// Deploy the token portal, unless it was already deployed before the node started (under automine).
|
|
71
|
+
const tokenPortalAddress =
|
|
72
|
+
predeployedTokenPortalAddress ?? (await deployL1Contract(l1Client, TokenPortalAbi, TokenPortalBytecode)).address;
|
|
70
73
|
const tokenPortal = getContract({
|
|
71
74
|
address: tokenPortalAddress.toString(),
|
|
72
75
|
abi: TokenPortalAbi,
|
|
@@ -74,26 +77,30 @@ export async function deployAndInitializeTokenAndBridgeContracts(
|
|
|
74
77
|
});
|
|
75
78
|
|
|
76
79
|
// deploy l2 token
|
|
77
|
-
const token = await
|
|
78
|
-
.
|
|
79
|
-
|
|
80
|
+
const { contract: token } = await testSpan('deploy:token', () =>
|
|
81
|
+
TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18).send({
|
|
82
|
+
from: owner,
|
|
83
|
+
}),
|
|
84
|
+
);
|
|
80
85
|
|
|
81
86
|
// deploy l2 token bridge and attach to the portal
|
|
82
|
-
const bridge = await
|
|
83
|
-
.
|
|
84
|
-
|
|
87
|
+
const { contract: bridge } = await testSpan('deploy:bridge', () =>
|
|
88
|
+
TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress).send({
|
|
89
|
+
from: owner,
|
|
90
|
+
}),
|
|
91
|
+
);
|
|
85
92
|
|
|
86
|
-
if ((await token.methods.get_admin().simulate({ from: owner })) !== owner.toBigInt()) {
|
|
93
|
+
if ((await token.methods.get_admin().simulate({ from: owner })).result !== owner.toBigInt()) {
|
|
87
94
|
throw new Error(`Token admin is not ${owner}`);
|
|
88
95
|
}
|
|
89
96
|
|
|
90
|
-
if (!(await bridge.methods.get_config().simulate({ from: owner })).token.equals(token.address)) {
|
|
97
|
+
if (!(await bridge.methods.get_config().simulate({ from: owner })).result.token.equals(token.address)) {
|
|
91
98
|
throw new Error(`Bridge token is not ${token.address}`);
|
|
92
99
|
}
|
|
93
100
|
|
|
94
101
|
// make the bridge a minter on the token:
|
|
95
|
-
await token.methods.set_minter(bridge.address, true).send({ from: owner })
|
|
96
|
-
if ((await token.methods.is_minter(bridge.address).simulate({ from: owner })) === 1n) {
|
|
102
|
+
await token.methods.set_minter(bridge.address, true).send({ from: owner });
|
|
103
|
+
if ((await token.methods.is_minter(bridge.address).simulate({ from: owner })).result === 1n) {
|
|
97
104
|
throw new Error(`Bridge is not a minter`);
|
|
98
105
|
}
|
|
99
106
|
|
|
@@ -135,6 +142,7 @@ export class CrossChainTestHarness {
|
|
|
135
142
|
ownerAddress: AztecAddress,
|
|
136
143
|
logger: Logger,
|
|
137
144
|
underlyingERC20Address: EthAddress,
|
|
145
|
+
predeployedTokenPortalAddress?: EthAddress,
|
|
138
146
|
): Promise<CrossChainTestHarness> {
|
|
139
147
|
const ethAccount = EthAddress.fromString((await l1Client.getAddresses())[0]);
|
|
140
148
|
const l1ContractAddresses = (await aztecNode.getNodeInfo()).l1ContractAddresses;
|
|
@@ -147,6 +155,7 @@ export class CrossChainTestHarness {
|
|
|
147
155
|
l1ContractAddresses.registryAddress,
|
|
148
156
|
ownerAddress,
|
|
149
157
|
underlyingERC20Address,
|
|
158
|
+
predeployedTokenPortalAddress,
|
|
150
159
|
);
|
|
151
160
|
logger.info('Deployed and initialized token, portal and its bridge.');
|
|
152
161
|
|
|
@@ -167,6 +176,7 @@ export class CrossChainTestHarness {
|
|
|
167
176
|
|
|
168
177
|
private readonly l1TokenManager: L1TokenManager;
|
|
169
178
|
private readonly l1TokenPortalManager: L1TokenPortalManager;
|
|
179
|
+
public readonly outboxContract: OutboxContract;
|
|
170
180
|
|
|
171
181
|
constructor(
|
|
172
182
|
/** Aztec node instance. */
|
|
@@ -207,6 +217,7 @@ export class CrossChainTestHarness {
|
|
|
207
217
|
this.logger,
|
|
208
218
|
);
|
|
209
219
|
this.l1TokenManager = this.l1TokenPortalManager.getTokenManager();
|
|
220
|
+
this.outboxContract = new OutboxContract(this.l1Client, this.l1ContractAddresses.outboxAddress);
|
|
210
221
|
}
|
|
211
222
|
|
|
212
223
|
async mintTokensOnL1(amount: bigint) {
|
|
@@ -235,19 +246,20 @@ export class CrossChainTestHarness {
|
|
|
235
246
|
|
|
236
247
|
async mintTokensPublicOnL2(amount: bigint) {
|
|
237
248
|
this.logger.info('Minting tokens on L2 publicly');
|
|
238
|
-
await
|
|
249
|
+
await testSpan('tx:mint', () =>
|
|
250
|
+
this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send({ from: this.ownerAddress }),
|
|
251
|
+
);
|
|
239
252
|
}
|
|
240
253
|
|
|
241
254
|
async mintTokensPrivateOnL2(amount: bigint) {
|
|
242
|
-
await mintTokensToPrivate(this.l2Token, this.ownerAddress, this.ownerAddress, amount);
|
|
255
|
+
await testSpan('tx:mint', () => mintTokensToPrivate(this.l2Token, this.ownerAddress, this.ownerAddress, amount));
|
|
243
256
|
}
|
|
244
257
|
|
|
245
258
|
async sendL2PublicTransfer(transferAmount: bigint, receiverAddress: AztecAddress) {
|
|
246
259
|
// send a transfer tx to force through rollup with the message included
|
|
247
260
|
await this.l2Token.methods
|
|
248
261
|
.transfer_in_public(this.ownerAddress, receiverAddress, transferAmount, 0)
|
|
249
|
-
.send({ from: this.ownerAddress })
|
|
250
|
-
.wait();
|
|
262
|
+
.send({ from: this.ownerAddress });
|
|
251
263
|
}
|
|
252
264
|
|
|
253
265
|
async consumeMessageOnAztecAndMintPrivately(
|
|
@@ -257,8 +269,7 @@ export class CrossChainTestHarness {
|
|
|
257
269
|
const { recipient, claimAmount, claimSecret: secretForL2MessageConsumption, messageLeafIndex } = claim;
|
|
258
270
|
await this.l2Bridge.methods
|
|
259
271
|
.claim_private(recipient, claimAmount, secretForL2MessageConsumption, messageLeafIndex)
|
|
260
|
-
.send({ from: this.ownerAddress })
|
|
261
|
-
.wait();
|
|
272
|
+
.send({ from: this.ownerAddress });
|
|
262
273
|
}
|
|
263
274
|
|
|
264
275
|
async consumeMessageOnAztecAndMintPublicly(
|
|
@@ -268,34 +279,31 @@ export class CrossChainTestHarness {
|
|
|
268
279
|
const { claimAmount, claimSecret, messageLeafIndex } = claim;
|
|
269
280
|
await this.l2Bridge.methods
|
|
270
281
|
.claim_public(this.ownerAddress, claimAmount, claimSecret, messageLeafIndex)
|
|
271
|
-
.send({ from: this.ownerAddress })
|
|
272
|
-
.wait();
|
|
282
|
+
.send({ from: this.ownerAddress });
|
|
273
283
|
}
|
|
274
284
|
|
|
275
285
|
async withdrawPrivateFromAztecToL1(
|
|
276
286
|
withdrawAmount: bigint,
|
|
277
287
|
authwitNonce: Fr = Fr.ZERO,
|
|
278
288
|
authWitness: AuthWitness,
|
|
279
|
-
): Promise<
|
|
280
|
-
const withdrawReceipt = await this.l2Bridge.methods
|
|
289
|
+
): Promise<TxReceipt> {
|
|
290
|
+
const { receipt: withdrawReceipt } = await this.l2Bridge.methods
|
|
281
291
|
.exit_to_l1_private(this.l2Token.address, this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
|
|
282
|
-
.send({ authWitnesses: [authWitness], from: this.ownerAddress })
|
|
283
|
-
.wait();
|
|
292
|
+
.send({ authWitnesses: [authWitness], from: this.ownerAddress });
|
|
284
293
|
|
|
285
294
|
return withdrawReceipt;
|
|
286
295
|
}
|
|
287
296
|
|
|
288
|
-
async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<
|
|
289
|
-
const withdrawReceipt = await this.l2Bridge.methods
|
|
297
|
+
async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<TxReceipt> {
|
|
298
|
+
const { receipt: withdrawReceipt } = await this.l2Bridge.methods
|
|
290
299
|
.exit_to_l1_public(this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
|
|
291
|
-
.send({ from: this.ownerAddress })
|
|
292
|
-
.wait();
|
|
300
|
+
.send({ from: this.ownerAddress });
|
|
293
301
|
|
|
294
302
|
return withdrawReceipt;
|
|
295
303
|
}
|
|
296
304
|
|
|
297
305
|
async getL2PrivateBalanceOf(owner: AztecAddress) {
|
|
298
|
-
return await this.l2Token.methods.balance_of_private(owner).simulate({ from: owner });
|
|
306
|
+
return (await this.l2Token.methods.balance_of_private(owner).simulate({ from: owner })).result;
|
|
299
307
|
}
|
|
300
308
|
|
|
301
309
|
async expectPrivateBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
|
|
@@ -305,7 +313,7 @@ export class CrossChainTestHarness {
|
|
|
305
313
|
}
|
|
306
314
|
|
|
307
315
|
async getL2PublicBalanceOf(owner: AztecAddress) {
|
|
308
|
-
return await this.l2Token.methods.balance_of_public(owner).simulate({ from: this.ownerAddress });
|
|
316
|
+
return (await this.l2Token.methods.balance_of_public(owner).simulate({ from: this.ownerAddress })).result;
|
|
309
317
|
}
|
|
310
318
|
|
|
311
319
|
async expectPublicBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
|
|
@@ -325,26 +333,30 @@ export class CrossChainTestHarness {
|
|
|
325
333
|
withdrawFundsFromBridgeOnL1(
|
|
326
334
|
amount: bigint,
|
|
327
335
|
epochNumber: EpochNumber,
|
|
336
|
+
numCheckpointsInEpoch: number,
|
|
328
337
|
messageIndex: bigint,
|
|
329
338
|
siblingPath: SiblingPath<number>,
|
|
330
339
|
) {
|
|
331
|
-
return this.l1TokenPortalManager.withdrawFunds(
|
|
340
|
+
return this.l1TokenPortalManager.withdrawFunds(
|
|
341
|
+
amount,
|
|
342
|
+
this.ethAccount,
|
|
343
|
+
epochNumber,
|
|
344
|
+
numCheckpointsInEpoch,
|
|
345
|
+
messageIndex,
|
|
346
|
+
siblingPath,
|
|
347
|
+
);
|
|
332
348
|
}
|
|
333
349
|
|
|
334
350
|
async transferToPrivateOnL2(shieldAmount: bigint) {
|
|
335
351
|
this.logger.info('Transferring to private on L2');
|
|
336
|
-
await this.l2Token.methods
|
|
337
|
-
.transfer_to_private(this.ownerAddress, shieldAmount)
|
|
338
|
-
.send({ from: this.ownerAddress })
|
|
339
|
-
.wait();
|
|
352
|
+
await this.l2Token.methods.transfer_to_private(this.ownerAddress, shieldAmount).send({ from: this.ownerAddress });
|
|
340
353
|
}
|
|
341
354
|
|
|
342
355
|
async transferToPublicOnL2(amount: bigint, authwitNonce = Fr.ZERO) {
|
|
343
356
|
this.logger.info('Transferring tokens to public');
|
|
344
357
|
await this.l2Token.methods
|
|
345
358
|
.transfer_to_public(this.ownerAddress, this.ownerAddress, amount, authwitNonce)
|
|
346
|
-
.send({ from: this.ownerAddress })
|
|
347
|
-
.wait();
|
|
359
|
+
.send({ from: this.ownerAddress });
|
|
348
360
|
}
|
|
349
361
|
|
|
350
362
|
/**
|
|
@@ -356,8 +368,7 @@ export class CrossChainTestHarness {
|
|
|
356
368
|
*/
|
|
357
369
|
async makeMessageConsumable(msgHash: Fr | Hex) {
|
|
358
370
|
const frMsgHash = typeof msgHash === 'string' ? Fr.fromHexString(msgHash) : msgHash;
|
|
359
|
-
|
|
360
|
-
await retryUntil(async () => await this.aztecNode.isL1ToL2MessageSynced(frMsgHash), 'message sync', 10);
|
|
371
|
+
await waitForL1ToL2MessageSeen(this.aztecNode, frMsgHash, { timeoutSeconds: 10 });
|
|
361
372
|
|
|
362
373
|
await this.mintTokensPublicOnL2(0n);
|
|
363
374
|
await this.mintTokensPublicOnL2(0n);
|
|
@@ -8,7 +8,13 @@ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
|
8
8
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
9
9
|
import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
|
|
10
10
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
11
|
-
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
11
|
+
import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
|
|
12
|
+
|
|
13
|
+
import { testSpan } from '../fixtures/timing.js';
|
|
14
|
+
import { waitForL1ToL2MessageSeen } from './wait_for_l1_to_l2_message.js';
|
|
15
|
+
|
|
16
|
+
/** Aztec node that may expose the debug mining API in local e2e setups. */
|
|
17
|
+
type MiningAztecNode = AztecNode & Partial<AztecNodeDebug>;
|
|
12
18
|
|
|
13
19
|
export interface IGasBridgingTestHarness {
|
|
14
20
|
getL1FeeJuiceBalance(address: EthAddress): Promise<bigint>;
|
|
@@ -19,7 +25,7 @@ export interface IGasBridgingTestHarness {
|
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
export interface FeeJuicePortalTestingHarnessFactoryConfig {
|
|
22
|
-
aztecNode:
|
|
28
|
+
aztecNode: MiningAztecNode;
|
|
23
29
|
aztecNodeAdmin?: AztecNodeAdmin;
|
|
24
30
|
l1Client: ExtendedViemWalletClient;
|
|
25
31
|
wallet: Wallet;
|
|
@@ -75,7 +81,7 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
75
81
|
|
|
76
82
|
constructor(
|
|
77
83
|
/** Aztec node */
|
|
78
|
-
public aztecNode:
|
|
84
|
+
public aztecNode: MiningAztecNode,
|
|
79
85
|
/** Aztec node admin interface */
|
|
80
86
|
public aztecNodeAdmin: AztecNodeAdmin | undefined,
|
|
81
87
|
/** Wallet. */
|
|
@@ -127,11 +133,11 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
127
133
|
async consumeMessageOnAztecAndClaimPrivately(owner: AztecAddress, claimer: AztecAddress, claim: L2AmountClaim) {
|
|
128
134
|
this.logger.info('Consuming messages on L2 Privately');
|
|
129
135
|
const { claimAmount, claimSecret, messageLeafIndex } = claim;
|
|
130
|
-
await this.feeJuice.methods.claim(owner, claimAmount, claimSecret, messageLeafIndex).send({ from: claimer })
|
|
136
|
+
await this.feeJuice.methods.claim(owner, claimAmount, claimSecret, messageLeafIndex).send({ from: claimer });
|
|
131
137
|
}
|
|
132
138
|
|
|
133
139
|
async getL2PublicBalanceOf(owner: AztecAddress) {
|
|
134
|
-
return await this.feeJuice.methods.balance_of_public(owner).simulate({ from: owner });
|
|
140
|
+
return (await this.feeJuice.methods.balance_of_public(owner).simulate({ from: owner })).result;
|
|
135
141
|
}
|
|
136
142
|
|
|
137
143
|
async expectPublicBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
|
|
@@ -144,8 +150,7 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
144
150
|
await this.mintTokensOnL1();
|
|
145
151
|
const claim = await this.sendTokensToPortalPublic(bridgeAmount, owner);
|
|
146
152
|
|
|
147
|
-
|
|
148
|
-
await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 1);
|
|
153
|
+
await waitForL1ToL2MessageSeen(this.aztecNode, Fr.fromHexString(claim.messageHash), { timeoutSeconds: 24 });
|
|
149
154
|
|
|
150
155
|
// Progress by 2 L2 blocks so that the l1ToL2Message added above will be available to use on L2.
|
|
151
156
|
await this.advanceL2Block();
|
|
@@ -155,14 +160,21 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
155
160
|
}
|
|
156
161
|
|
|
157
162
|
async bridgeFromL1ToL2(owner: AztecAddress, claimer: AztecAddress) {
|
|
158
|
-
|
|
159
|
-
|
|
163
|
+
await testSpan('setup:bridge', async () => {
|
|
164
|
+
// Prepare the tokens on the L1 side
|
|
165
|
+
const claim = await this.prepareTokensOnL1(owner);
|
|
160
166
|
|
|
161
|
-
|
|
162
|
-
|
|
167
|
+
// Consume L1 -> L2 message and claim tokens privately on L2
|
|
168
|
+
await this.consumeMessageOnAztecAndClaimPrivately(owner, claimer, claim);
|
|
169
|
+
});
|
|
163
170
|
}
|
|
164
171
|
|
|
165
172
|
private async advanceL2Block() {
|
|
173
|
+
if (this.aztecNode.mineBlock) {
|
|
174
|
+
await this.aztecNode.mineBlock();
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
166
178
|
const initialBlockNumber = await this.aztecNode.getBlockNumber();
|
|
167
179
|
|
|
168
180
|
let minTxsPerBlock = undefined;
|
|
@@ -171,11 +183,17 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
171
183
|
await this.aztecNodeAdmin.setConfig({ minTxsPerBlock: 0 }); // Set to 0 to ensure we can advance the block
|
|
172
184
|
}
|
|
173
185
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
186
|
+
try {
|
|
187
|
+
await retryUntil(
|
|
188
|
+
async () => (await this.aztecNode.getBlockNumber()) >= initialBlockNumber + 1,
|
|
189
|
+
'gas portal block advance',
|
|
190
|
+
0,
|
|
191
|
+
0.25,
|
|
192
|
+
);
|
|
193
|
+
} finally {
|
|
194
|
+
if (this.aztecNodeAdmin && minTxsPerBlock !== undefined) {
|
|
195
|
+
await this.aztecNodeAdmin.setConfig({ minTxsPerBlock });
|
|
196
|
+
}
|
|
178
197
|
}
|
|
179
198
|
}
|
|
180
199
|
}
|
|
181
|
-
// docs:end:cross_chain_test_harness
|