@aztec/end-to-end 0.0.1-commit.b6e433891 → 0.0.1-commit.b8a057fa
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/{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/onchain_delivery_harness.d.ts +17 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
- package/dest/automine/delivery/onchain_delivery_harness.js +123 -0
- package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
- package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
- package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +23 -36
- package/dest/automine/token/token_contract_test.d.ts +40 -0
- package/dest/automine/token/token_contract_test.d.ts.map +1 -0
- package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +24 -39
- package/dest/automine/token/token_test_helpers.d.ts +73 -0
- package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
- package/dest/automine/token/token_test_helpers.js +97 -0
- package/dest/bench/client_flows/benchmark.d.ts +15 -1
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +19 -0
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +5 -5
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +53 -52
- package/dest/bench/client_flows/data_extractor.js +1 -0
- package/dest/bench/utils.d.ts +3 -3
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +97 -6
- package/dest/composed/ha/ha_full_setup.d.ts +77 -0
- package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
- package/dest/composed/ha/ha_full_setup.js +383 -0
- package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
- package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
- package/dest/fixtures/authwit_proxy.d.ts +1 -1
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
- package/dest/fixtures/authwit_proxy.js +4 -0
- package/dest/fixtures/e2e_prover_test.d.ts +15 -11
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +55 -40
- package/dest/fixtures/fixtures.d.ts +78 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +78 -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 +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 +71 -41
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +283 -201
- 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/timing.d.ts +42 -0
- package/dest/fixtures/timing.d.ts.map +1 -0
- package/dest/fixtures/timing.js +72 -0
- package/dest/fixtures/token_utils.d.ts +22 -4
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +23 -6
- package/dest/fixtures/utils.d.ts +2 -2
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +1 -1
- package/dest/fixtures/wait_helpers.d.ts +135 -0
- package/dest/fixtures/wait_helpers.d.ts.map +1 -0
- package/dest/fixtures/wait_helpers.js +154 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
- package/dest/forward-compatibility/wallet_service.d.ts +3 -0
- package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_service.js +109 -0
- package/dest/install_legacy_contracts.d.cts +10 -0
- package/dest/install_legacy_contracts.d.cts.map +1 -0
- package/dest/legacy-jest-resolver.d.cts +3 -0
- package/dest/legacy-jest-resolver.d.cts.map +1 -0
- package/dest/multi-node/block-production/setup.d.ts +97 -0
- package/dest/multi-node/block-production/setup.d.ts.map +1 -0
- package/dest/multi-node/block-production/setup.js +158 -0
- package/dest/multi-node/governance/setup.d.ts +67 -0
- package/dest/multi-node/governance/setup.d.ts.map +1 -0
- package/dest/multi-node/governance/setup.js +126 -0
- package/dest/multi-node/multi_node_test_context.d.ts +212 -0
- package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
- package/dest/multi-node/multi_node_test_context.js +347 -0
- package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
- package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
- package/dest/multi-node/slashing/inactivity_setup.js +111 -0
- package/dest/multi-node/slashing/setup.d.ts +167 -0
- package/dest/multi-node/slashing/setup.d.ts.map +1 -0
- package/dest/multi-node/slashing/setup.js +275 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +19 -10
- package/dest/p2p/p2p_network.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.js +81 -38
- package/dest/p2p/reqresp/utils.d.ts +19 -0
- package/dest/p2p/reqresp/utils.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/reqresp/utils.js +32 -29
- package/dest/p2p/shared.d.ts +72 -0
- package/dest/p2p/shared.d.ts.map +1 -0
- package/dest/p2p/shared.js +212 -0
- package/dest/shared/cross_chain_test_harness.d.ts +6 -4
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +25 -20
- 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 +24 -12
- package/dest/shared/submit-transactions.d.ts +1 -1
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +12 -5
- package/dest/shared/timing_env.d.js +5 -0
- package/dest/shared/timing_env.js +365 -0
- package/dest/shared/uniswap_l1_l2.d.ts +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +50 -37
- package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
- package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
- package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
- package/dest/simulators/lending_simulator.d.ts +10 -3
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +25 -13
- package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
- package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
- package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
- package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
- package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
- package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
- package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
- package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
- package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
- package/dest/single-node/fees/fees_test.d.ts +93 -0
- package/dest/single-node/fees/fees_test.d.ts.map +1 -0
- package/dest/{e2e_fees → single-node/fees}/fees_test.js +78 -59
- 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 +1 -1
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +83 -49
- package/dest/spartan/tx_metrics.d.ts +27 -4
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +105 -20
- package/dest/spartan/utils/config.d.ts +9 -35
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +2 -2
- package/dest/test-wallet/test_wallet.d.ts +38 -9
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +186 -77
- 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 +10 -2
- package/dest/test-wallet/worker_wallet.d.ts +7 -6
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet.js +6 -2
- package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet_schema.js +14 -2
- package/package.json +47 -42
- package/src/automine/README.md +60 -0
- package/src/automine/automine_test_context.ts +153 -0
- package/src/automine/delivery/onchain_delivery_harness.ts +177 -0
- package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +24 -47
- package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +25 -48
- package/src/automine/token/token_test_helpers.ts +138 -0
- package/src/bench/client_flows/benchmark.ts +21 -0
- package/src/bench/client_flows/client_flows_benchmark.ts +103 -73
- package/src/bench/client_flows/data_extractor.ts +1 -0
- package/src/bench/utils.ts +110 -6
- package/src/composed/ha/ha_full_setup.ts +466 -0
- package/src/fixtures/authwit_proxy.ts +4 -0
- package/src/fixtures/e2e_prover_test.ts +66 -63
- package/src/fixtures/fixtures.ts +98 -0
- package/src/fixtures/get_bb_config.ts +7 -6
- 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 +342 -258
- package/src/fixtures/setup_p2p_test.ts +15 -11
- package/src/fixtures/timing.ts +97 -0
- package/src/fixtures/token_utils.ts +40 -8
- package/src/fixtures/utils.ts +2 -3
- package/src/fixtures/wait_helpers.ts +333 -0
- package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
- package/src/forward-compatibility/wallet_service.ts +106 -0
- package/src/guides/up_quick_start.sh +5 -2
- package/src/infra/README.md +12 -0
- package/src/install_legacy_contracts.cjs +75 -0
- package/src/legacy-jest-resolver.cjs +112 -0
- package/src/multi-node/README.md +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 +92 -49
- package/src/{e2e_p2p → p2p}/reqresp/utils.ts +35 -28
- package/src/p2p/shared.ts +329 -0
- package/src/shared/cross_chain_test_harness.ts +35 -14
- package/src/shared/gas_portal_test_harness.ts +32 -14
- package/src/shared/submit-transactions.ts +13 -5
- package/src/shared/timing_env.d.mts +39 -0
- package/src/shared/timing_env.mjs +363 -0
- package/src/shared/uniswap_l1_l2.ts +80 -43
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +29 -13
- package/src/single-node/README.md +60 -0
- package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
- package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
- package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
- package/src/{e2e_fees → single-node/fees}/fees_test.ts +103 -66
- 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 +79 -44
- package/src/spartan/tx_metrics.ts +107 -23
- package/src/spartan/utils/nodes.ts +2 -2
- package/src/test-wallet/test_wallet.ts +213 -78
- package/src/test-wallet/utils.ts +104 -11
- package/src/test-wallet/wallet_worker_script.ts +8 -2
- package/src/test-wallet/worker_wallet.ts +12 -11
- package/src/test-wallet/worker_wallet_schema.ts +4 -3
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
- package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
- package/dest/e2e_deploy_contract/deploy_test.js +0 -50
- package/dest/e2e_epochs/epochs_test.d.ts +0 -104
- package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
- package/dest/e2e_epochs/epochs_test.js +0 -389
- package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
- package/dest/e2e_fees/fees_test.d.ts +0 -88
- package/dest/e2e_fees/fees_test.d.ts.map +0 -1
- package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
- package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
- package/dest/e2e_l1_publisher/write_json.js +0 -56
- package/dest/e2e_multi_validator/utils.d.ts +0 -12
- package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +0 -54
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
- package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
- package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.d.ts +0 -66
- package/dest/e2e_p2p/shared.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.js +0 -212
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
- package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
- package/src/e2e_deploy_contract/deploy_test.ts +0 -85
- package/src/e2e_epochs/epochs_test.ts +0 -499
- package/src/e2e_l1_publisher/write_json.ts +0 -77
- package/src/e2e_nested_contract/nested_contract_test.ts +0 -75
- package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
- package/src/e2e_p2p/shared.ts +0 -343
- /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
- /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
- /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
- /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
-
import {
|
|
2
|
+
import { createLogger } from '@aztec/aztec.js/log';
|
|
3
3
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
4
4
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
5
5
|
import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
@@ -7,19 +7,23 @@ import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAcc
|
|
|
7
7
|
|
|
8
8
|
import { jest } from '@jest/globals';
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
import { mintTokensToPrivate } from '
|
|
12
|
-
import { TokenSimulator } from '
|
|
13
|
-
import type
|
|
10
|
+
import { ensureAuthRegistryPublished } from '../../fixtures/setup.js';
|
|
11
|
+
import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
|
|
12
|
+
import { TokenSimulator } from '../../simulators/token_simulator.js';
|
|
13
|
+
import { AutomineTestContext, type AutomineTestOpts } from '../automine_test_context.js';
|
|
14
14
|
|
|
15
15
|
const { METRICS_PORT: metricsPort } = process.env;
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Token-domain harness over the automine topology: extends {@link AutomineTestContext} with a
|
|
19
|
+
* {@link TokenSimulator}, the USDC Token deploy plus a bad-account and authwit proxy, and an optional
|
|
20
|
+
* mint. Base setup is opt-in via {@link applyBaseSnapshots} (run during `setup()`); {@link applyMint}
|
|
21
|
+
* is called explicitly after `setup()`.
|
|
22
|
+
*/
|
|
23
|
+
export class TokenContractTest extends AutomineTestContext {
|
|
18
24
|
static TOKEN_NAME = 'USDC';
|
|
19
25
|
static TOKEN_SYMBOL = 'USD';
|
|
20
26
|
static TOKEN_DECIMALS = 18n;
|
|
21
|
-
context!: EndToEndContext;
|
|
22
|
-
logger: Logger;
|
|
23
27
|
metricsPort?: number;
|
|
24
28
|
asset!: TokenContract;
|
|
25
29
|
tokenSim!: TokenSimulator;
|
|
@@ -27,16 +31,16 @@ export class TokenContractTest {
|
|
|
27
31
|
|
|
28
32
|
badAccount!: InvalidAccountContract;
|
|
29
33
|
authwitProxy!: GenericProxyContract;
|
|
30
|
-
wallet!: TestWallet;
|
|
31
34
|
adminAddress!: AztecAddress;
|
|
32
|
-
|
|
35
|
+
otherAddress!: AztecAddress;
|
|
33
36
|
account2Address!: AztecAddress;
|
|
34
37
|
|
|
35
38
|
private shouldApplyBaseSetup = false;
|
|
36
|
-
private
|
|
39
|
+
private testName: string;
|
|
37
40
|
|
|
38
41
|
constructor(testName: string) {
|
|
39
|
-
|
|
42
|
+
super();
|
|
43
|
+
this.testName = testName;
|
|
40
44
|
this.metricsPort = metricsPort ? parseInt(metricsPort) : undefined;
|
|
41
45
|
}
|
|
42
46
|
|
|
@@ -48,14 +52,6 @@ export class TokenContractTest {
|
|
|
48
52
|
this.shouldApplyBaseSetup = true;
|
|
49
53
|
}
|
|
50
54
|
|
|
51
|
-
/**
|
|
52
|
-
* Registers that mint should be applied during setup().
|
|
53
|
-
* Call this before setup() to mint tokens to the admin account.
|
|
54
|
-
*/
|
|
55
|
-
applyMintSnapshot() {
|
|
56
|
-
this.shouldApplyMint = true;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
55
|
/**
|
|
60
56
|
* Applies base setup: deploys 3 accounts, publicly deploys accounts, token contract and a "bad account".
|
|
61
57
|
*/
|
|
@@ -63,22 +59,12 @@ export class TokenContractTest {
|
|
|
63
59
|
// Adding a timeout of 2 minutes in here such that it is propagated to the underlying tests
|
|
64
60
|
jest.setTimeout(120_000);
|
|
65
61
|
|
|
66
|
-
this.logger.info('Applying base setup - deploying 3 accounts');
|
|
67
|
-
const { deployedAccounts } = await deployAccounts(
|
|
68
|
-
3,
|
|
69
|
-
this.logger,
|
|
70
|
-
)({
|
|
71
|
-
wallet: this.context.wallet,
|
|
72
|
-
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
73
|
-
});
|
|
74
|
-
|
|
75
62
|
this.node = this.context.aztecNodeService;
|
|
76
63
|
this.wallet = this.context.wallet;
|
|
77
|
-
[this.adminAddress, this.
|
|
64
|
+
[this.adminAddress, this.otherAddress, this.account2Address] = this.context.accounts;
|
|
78
65
|
|
|
79
66
|
this.logger.info('Applying base setup - deploying token contract');
|
|
80
|
-
this.
|
|
81
|
-
await publicDeployAccounts(this.wallet, [this.adminAddress, this.account1Address]);
|
|
67
|
+
await ensureAuthRegistryPublished(this.wallet, this.adminAddress);
|
|
82
68
|
|
|
83
69
|
this.logger.verbose(`Deploying TokenContract...`);
|
|
84
70
|
({ contract: this.asset } = await TokenContract.deploy(
|
|
@@ -107,7 +93,7 @@ export class TokenContractTest {
|
|
|
107
93
|
|
|
108
94
|
this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
|
|
109
95
|
this.adminAddress,
|
|
110
|
-
this.
|
|
96
|
+
this.otherAddress,
|
|
111
97
|
]);
|
|
112
98
|
|
|
113
99
|
expect((await this.asset.methods.get_admin().simulate({ from: this.adminAddress })).result).toBe(
|
|
@@ -115,27 +101,18 @@ export class TokenContractTest {
|
|
|
115
101
|
);
|
|
116
102
|
}
|
|
117
103
|
|
|
118
|
-
async setup() {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
skipAccountDeployment: true,
|
|
123
|
-
});
|
|
104
|
+
override async setup(opts: AutomineTestOpts = {}) {
|
|
105
|
+
await super.setup({ numberOfAccounts: 3, metricsPort: this.metricsPort, ...opts });
|
|
106
|
+
// hydrateFromContext repoints `this.logger` at the context logger; restore the harness-named one.
|
|
107
|
+
this.logger = createLogger(`e2e:automine:token:${this.testName}`);
|
|
124
108
|
|
|
125
109
|
if (this.shouldApplyBaseSetup) {
|
|
126
110
|
await this.applyBaseSetup();
|
|
127
111
|
}
|
|
128
|
-
|
|
129
|
-
if (this.shouldApplyMint) {
|
|
130
|
-
await this.applyMint();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async teardown() {
|
|
135
|
-
await teardown(this.context);
|
|
136
112
|
}
|
|
137
113
|
|
|
138
|
-
private
|
|
114
|
+
/** Mints an initial public and private balance to the admin account. Call after {@link setup}. */
|
|
115
|
+
async applyMint() {
|
|
139
116
|
this.logger.info('Applying mint setup');
|
|
140
117
|
const { asset, adminAddress, tokenSim } = this;
|
|
141
118
|
const amount = 10000n;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import type { ContractFunctionInteraction } from '@aztec/aztec.js/contracts';
|
|
3
|
+
import type { Logger } from '@aztec/aztec.js/log';
|
|
4
|
+
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
5
|
+
import { AMMContract } from '@aztec/noir-contracts.js/AMM';
|
|
6
|
+
import type { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
7
|
+
|
|
8
|
+
import { sendThroughAuthwitProxy } from '../../fixtures/authwit_proxy.js';
|
|
9
|
+
import { DUPLICATE_NULLIFIER_ERROR } from '../../fixtures/fixtures.js';
|
|
10
|
+
import { type AnyTokenContract, mintTokensToPrivate } from '../../fixtures/token_utils.js';
|
|
11
|
+
import type { TestWallet } from '../../test-wallet/test_wallet.js';
|
|
12
|
+
|
|
13
|
+
/** Whether an amount / balance is read from the private or public balance of the token. */
|
|
14
|
+
export type BalanceKind = 'private' | 'public';
|
|
15
|
+
|
|
16
|
+
/** The invalid-authwit-nonce assertion the contract raises when `from == msg_sender` but nonce != 0. */
|
|
17
|
+
export const INVALID_AUTHWIT_NONCE_ERROR =
|
|
18
|
+
"Assertion failed: Invalid authwit nonce. When 'from' and 'msg_sender' are the same, 'authwit_nonce' must be zero";
|
|
19
|
+
|
|
20
|
+
/** Minimal token shape needed to read balances — satisfied structurally by Token/TestToken/TokenBlacklist. */
|
|
21
|
+
export interface BalanceReadable {
|
|
22
|
+
methods: {
|
|
23
|
+
balance_of_private(owner: AztecAddress): { simulate(opts: { from: AztecAddress }): Promise<{ result: bigint }> };
|
|
24
|
+
balance_of_public(owner: AztecAddress): { simulate(opts: { from: AztecAddress }): Promise<{ result: bigint }> };
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Reads the private or public balance of an account, simulating from that account's own scope. */
|
|
29
|
+
export async function balanceOf(asset: BalanceReadable, kind: BalanceKind, account: AztecAddress): Promise<bigint> {
|
|
30
|
+
const interaction =
|
|
31
|
+
kind === 'private' ? asset.methods.balance_of_private(account) : asset.methods.balance_of_public(account);
|
|
32
|
+
return (await interaction.simulate({ from: account })).result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Returns half of an account's balance, asserting it is non-zero so the operation under test is meaningful. */
|
|
36
|
+
export async function halfBalanceOf(asset: BalanceReadable, kind: BalanceKind, owner: AztecAddress): Promise<bigint> {
|
|
37
|
+
const amount = (await balanceOf(asset, kind, owner)) / 2n;
|
|
38
|
+
expect(amount).toBeGreaterThan(0n);
|
|
39
|
+
return amount;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Returns an amount just above an account's balance (balance + delta), asserting it is non-zero. */
|
|
43
|
+
export async function amountAboveBalance(
|
|
44
|
+
asset: BalanceReadable,
|
|
45
|
+
kind: BalanceKind,
|
|
46
|
+
owner: AztecAddress,
|
|
47
|
+
delta = 1n,
|
|
48
|
+
): Promise<bigint> {
|
|
49
|
+
const amount = (await balanceOf(asset, kind, owner)) + delta;
|
|
50
|
+
expect(amount).toBeGreaterThan(0n);
|
|
51
|
+
return amount;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Grants a public authwit for `caller` to run `action` on behalf of `owner`, executes it from `caller`,
|
|
56
|
+
* then asserts a replay of the same call reverts as unauthorized (the authwit is single-use).
|
|
57
|
+
*
|
|
58
|
+
* `onExecuted` runs after the successful execution (before the replay attempt) so callers can update
|
|
59
|
+
* their {@link TokenSimulator} to match the state change the executed action produced.
|
|
60
|
+
*/
|
|
61
|
+
export async function assertPublicAuthwitReplayRejected(
|
|
62
|
+
wallet: TestWallet,
|
|
63
|
+
owner: AztecAddress,
|
|
64
|
+
action: ContractFunctionInteraction,
|
|
65
|
+
caller: AztecAddress,
|
|
66
|
+
onExecuted?: () => void,
|
|
67
|
+
): Promise<void> {
|
|
68
|
+
const grant = await wallet.setPublicAuthWit(owner, { caller, action }, true);
|
|
69
|
+
await grant.send();
|
|
70
|
+
|
|
71
|
+
await action.send({ from: caller });
|
|
72
|
+
onExecuted?.();
|
|
73
|
+
|
|
74
|
+
await expect(action.simulate({ from: caller })).rejects.toThrow(/unauthorized/);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Creates a private authwit for `owner`, executes `action` through the authwit proxy (so `msg_sender`
|
|
79
|
+
* differs from the note owner), then asserts a replay reverts with a duplicate-nullifier error.
|
|
80
|
+
*
|
|
81
|
+
* `onExecuted` runs after the successful execution (before the replay attempt) so callers can update
|
|
82
|
+
* their {@link TokenSimulator} to match the state change the executed action produced.
|
|
83
|
+
*/
|
|
84
|
+
export async function assertAuthwitProxyReplayRejected(
|
|
85
|
+
proxy: GenericProxyContract,
|
|
86
|
+
wallet: TestWallet,
|
|
87
|
+
owner: AztecAddress,
|
|
88
|
+
action: ContractFunctionInteraction,
|
|
89
|
+
onExecuted?: () => void,
|
|
90
|
+
): Promise<void> {
|
|
91
|
+
const witness = await wallet.createAuthWit(owner, { caller: proxy.address, action });
|
|
92
|
+
|
|
93
|
+
await sendThroughAuthwitProxy(proxy, action, { from: owner, authWitnesses: [witness] });
|
|
94
|
+
onExecuted?.();
|
|
95
|
+
|
|
96
|
+
await expect(sendThroughAuthwitProxy(proxy, action, { from: owner, authWitnesses: [witness] })).rejects.toThrow(
|
|
97
|
+
DUPLICATE_NULLIFIER_ERROR,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Deploys an {@link AMMContract} over three freshly deployed tokens (token0, token1, and the liquidity
|
|
103
|
+
* token), makes the AMM the liquidity token's minter, and mints `initialBalance` of token0 and token1 to
|
|
104
|
+
* each liquidity provider plus token0 to the swapper. `deploy` selects the token flavour (Token vs
|
|
105
|
+
* TestToken), so the concrete token type flows through to the caller.
|
|
106
|
+
*/
|
|
107
|
+
export async function deployAmmWithTokens<T extends AnyTokenContract>(
|
|
108
|
+
wallet: Wallet,
|
|
109
|
+
admin: AztecAddress,
|
|
110
|
+
deploy: (wallet: Wallet, admin: AztecAddress, initialBalance: bigint, logger: Logger) => Promise<{ contract: T }>,
|
|
111
|
+
opts: { liquidityProviders: AztecAddress[]; swapper: AztecAddress; initialBalance: bigint; logger: Logger },
|
|
112
|
+
): Promise<{ token0: T; token1: T; liquidityToken: T; amm: AMMContract }> {
|
|
113
|
+
const { liquidityProviders, swapper, initialBalance, logger } = opts;
|
|
114
|
+
|
|
115
|
+
const { contract: token0 } = await deploy(wallet, admin, 0n, logger);
|
|
116
|
+
const { contract: token1 } = await deploy(wallet, admin, 0n, logger);
|
|
117
|
+
const { contract: liquidityToken } = await deploy(wallet, admin, 0n, logger);
|
|
118
|
+
|
|
119
|
+
const { contract: amm } = await AMMContract.deploy(
|
|
120
|
+
wallet,
|
|
121
|
+
token0.address,
|
|
122
|
+
token1.address,
|
|
123
|
+
liquidityToken.address,
|
|
124
|
+
).send({ from: admin });
|
|
125
|
+
|
|
126
|
+
// TODO(#9480): consider deploying the token by some factory when the AMM is deployed, and making the AMM be the
|
|
127
|
+
// minter there.
|
|
128
|
+
await liquidityToken.methods.set_minter(amm.address, true).send({ from: admin });
|
|
129
|
+
|
|
130
|
+
for (const lp of liquidityProviders) {
|
|
131
|
+
await mintTokensToPrivate(token0, admin, lp, initialBalance);
|
|
132
|
+
await mintTokensToPrivate(token1, admin, lp, initialBalance);
|
|
133
|
+
}
|
|
134
|
+
// Note that the swapper only holds token0, not token1.
|
|
135
|
+
await mintTokensToPrivate(token0, admin, swapper, initialBalance);
|
|
136
|
+
|
|
137
|
+
return { token0, token1, liquidityToken, amm };
|
|
138
|
+
}
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
type ProfileInteractionOptions,
|
|
6
6
|
} from '@aztec/aztec.js/contracts';
|
|
7
7
|
import type { Logger } from '@aztec/aztec.js/log';
|
|
8
|
+
import { MAX_APPS_PER_KERNEL } from '@aztec/constants';
|
|
8
9
|
import { createLogger } from '@aztec/foundation/log';
|
|
9
10
|
import { type PrivateExecutionStep, serializePrivateExecutionSteps } from '@aztec/stdlib/kernel';
|
|
10
11
|
import type {
|
|
@@ -320,6 +321,26 @@ export function convertProfileToGHBenchmark(benchmark: ClientFlowBenchmark): Git
|
|
|
320
321
|
return benches;
|
|
321
322
|
}
|
|
322
323
|
|
|
324
|
+
/**
|
|
325
|
+
* Computes the expected number of `PrivateExecutionStep` entries the orchestrator will produce
|
|
326
|
+
* for a tx with `apps` private function calls.
|
|
327
|
+
*
|
|
328
|
+
* Step layout: `apps` app circuits + kernel iterations + 1 final reset + 1 tail + 1 hiding kernel.
|
|
329
|
+
* Each kernel iteration absorbs up to `MAX_APPS_PER_KERNEL` apps via the `init_K` / `inner_K`
|
|
330
|
+
* variants, so the kernel count is `ceil(apps / MAX_APPS_PER_KERNEL)`.
|
|
331
|
+
*
|
|
332
|
+
* Caveat: this assumes no mid-flow reset is triggered, which would split a batch into two kernels
|
|
333
|
+
* separated by a reset. For the flows currently exercised in this benchmark suite that holds, but
|
|
334
|
+
* a future flow that grows large enough to overflow per-tx limits before consuming all apps will
|
|
335
|
+
* not match this formula.
|
|
336
|
+
*/
|
|
337
|
+
export function expectedExecutionSteps(apps: number): number {
|
|
338
|
+
const kernels = Math.ceil(apps / MAX_APPS_PER_KERNEL);
|
|
339
|
+
// The final reset and tail are proved as a single circuit (reset_tail or reset_tail_to_public),
|
|
340
|
+
// so they share one execution step.
|
|
341
|
+
return apps + kernels + 1 /* reset+tail */ + 1 /* hiding */;
|
|
342
|
+
}
|
|
343
|
+
|
|
323
344
|
export async function captureProfile(
|
|
324
345
|
label: string,
|
|
325
346
|
interaction: ContractFunctionInteraction | DeployMethod,
|
|
@@ -1,3 +1,4 @@
|
|
|
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';
|
|
@@ -19,16 +20,22 @@ import { AMMContract } from '@aztec/noir-contracts.js/AMM';
|
|
|
19
20
|
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
20
21
|
import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
|
|
21
22
|
import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
|
|
22
|
-
import {
|
|
23
|
+
import { TestTokenContract as BananaCoin, TestTokenContract } from '@aztec/noir-test-contracts.js/TestToken';
|
|
23
24
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
24
25
|
import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
25
26
|
import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
|
|
26
27
|
import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
27
|
-
import { GasSettings } from '@aztec/stdlib/gas';
|
|
28
|
+
import { Gas, GasSettings } from '@aztec/stdlib/gas';
|
|
28
29
|
import { deriveSigningKey } from '@aztec/stdlib/keys';
|
|
30
|
+
import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
|
|
29
31
|
|
|
30
|
-
import {
|
|
31
|
-
|
|
32
|
+
import {
|
|
33
|
+
AUTOMINE_E2E_OPTS,
|
|
34
|
+
L1_DIRECT_WRITE_ACCOUNT_INDEX,
|
|
35
|
+
MNEMONIC,
|
|
36
|
+
getPaddedMaxFeesPerGas,
|
|
37
|
+
} from '../../fixtures/fixtures.js';
|
|
38
|
+
import { type EndToEndContext, type SetupOptions, setup, teardown } from '../../fixtures/setup.js';
|
|
32
39
|
import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
|
|
33
40
|
import { setupSponsoredFPC } from '../../fixtures/utils.js';
|
|
34
41
|
import { CrossChainTestHarness } from '../../shared/cross_chain_test_harness.js';
|
|
@@ -70,13 +77,13 @@ export class ClientFlowsBenchmark {
|
|
|
70
77
|
public bananaFPC!: FPCContract;
|
|
71
78
|
public bananaFPCInstance!: ContractInstanceWithAddress;
|
|
72
79
|
// Random asset we want to trade
|
|
73
|
-
public candyBarCoin!:
|
|
80
|
+
public candyBarCoin!: TestTokenContract;
|
|
74
81
|
public candyBarCoinInstance!: ContractInstanceWithAddress;
|
|
75
82
|
// AMM contract
|
|
76
83
|
public amm!: AMMContract;
|
|
77
84
|
public ammInstance!: ContractInstanceWithAddress;
|
|
78
85
|
// Liquidity token for AMM
|
|
79
|
-
public liquidityToken!:
|
|
86
|
+
public liquidityToken!: TestTokenContract;
|
|
80
87
|
public liquidityTokenInstance!: ContractInstanceWithAddress;
|
|
81
88
|
// Sponsored FPC contract
|
|
82
89
|
public sponsoredFPC!: SponsoredFPCContract;
|
|
@@ -87,33 +94,35 @@ export class ClientFlowsBenchmark {
|
|
|
87
94
|
|
|
88
95
|
public realProofs = ['true', '1'].includes(process.env.REAL_PROOFS ?? '');
|
|
89
96
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
//
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
97
|
+
// `apps` is the number of private function calls contributed by this payment method.
|
|
98
|
+
// Each app produces one execution step at proving time; the orchestrator additionally produces
|
|
99
|
+
// one kernel step per batch of N apps (see `expectedExecutionSteps` in `benchmark.ts`).
|
|
100
|
+
public paymentMethods: Record<BenchmarkingFeePaymentMethod, { forWallet: FeePaymentMethodGetter; apps: number }> = {
|
|
101
|
+
// eslint-disable-next-line camelcase
|
|
102
|
+
bridged_fee_juice: {
|
|
103
|
+
forWallet: this.getBridgedFeeJuicePaymentMethodForWallet.bind(this),
|
|
104
|
+
apps: 1, // FeeJuice claim
|
|
105
|
+
},
|
|
106
|
+
// eslint-disable-next-line camelcase
|
|
107
|
+
private_fpc: {
|
|
108
|
+
forWallet: this.getPrivateFPCPaymentMethodForWallet.bind(this),
|
|
109
|
+
apps:
|
|
110
|
+
1 + // FPC entrypoint
|
|
111
|
+
1 + // BananaCoin transfer_to_public
|
|
112
|
+
1 + // Account verify_private_authwit
|
|
113
|
+
1, // BananaCoin prepare_private_balance_increase
|
|
114
|
+
},
|
|
115
|
+
// eslint-disable-next-line camelcase
|
|
116
|
+
sponsored_fpc: {
|
|
117
|
+
forWallet: this.getSponsoredFPCPaymentMethodForWallet.bind(this),
|
|
118
|
+
apps: 1, // Sponsored FPC sponsor_unconditionally
|
|
119
|
+
},
|
|
120
|
+
// eslint-disable-next-line camelcase
|
|
121
|
+
fee_juice: {
|
|
122
|
+
forWallet: () => Promise.resolve(undefined),
|
|
123
|
+
apps: 0,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
117
126
|
|
|
118
127
|
public config: ClientFlowsConfig;
|
|
119
128
|
|
|
@@ -122,7 +131,7 @@ export class ClientFlowsBenchmark {
|
|
|
122
131
|
|
|
123
132
|
constructor(testName?: string, setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {}) {
|
|
124
133
|
this.logger = createLogger(`bench:client_flows${testName ? `:${testName}` : ''}`);
|
|
125
|
-
this.setupOptions = { startProverNode: true, ...setupOptions };
|
|
134
|
+
this.setupOptions = { ...AUTOMINE_E2E_OPTS, startProverNode: true, ...setupOptions };
|
|
126
135
|
this.config = BENCHMARK_CONFIG === 'key_flows' ? KEY_FLOWS_CONFIG : FULL_FLOWS_CONFIG;
|
|
127
136
|
ProxyLogger.create();
|
|
128
137
|
this.proxyLogger = ProxyLogger.getInstance();
|
|
@@ -131,11 +140,11 @@ export class ClientFlowsBenchmark {
|
|
|
131
140
|
async setup() {
|
|
132
141
|
this.logger.info('Setting up subsystems from fresh');
|
|
133
142
|
// Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
|
|
134
|
-
|
|
135
|
-
|
|
143
|
+
// BananaCoin is the codegen'd TestToken here, so the allowlist must key on its class, not canonical Token's.
|
|
144
|
+
const tokenAllowList = await getTokenAllowedSetupFunctions(BananaCoin.artifact);
|
|
145
|
+
this.context = await setup(2, {
|
|
136
146
|
...this.setupOptions,
|
|
137
147
|
fundSponsoredFPC: true,
|
|
138
|
-
skipAccountDeployment: true,
|
|
139
148
|
l1ContractsArgs: this.setupOptions,
|
|
140
149
|
txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
|
|
141
150
|
});
|
|
@@ -200,15 +209,7 @@ export class ClientFlowsBenchmark {
|
|
|
200
209
|
|
|
201
210
|
async applyInitialAccounts() {
|
|
202
211
|
this.logger.info('Applying initial accounts setup');
|
|
203
|
-
const
|
|
204
|
-
2,
|
|
205
|
-
this.logger,
|
|
206
|
-
)({
|
|
207
|
-
wallet: this.context.wallet,
|
|
208
|
-
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
const [{ address: adminAddress }, { address: sequencerAddress }] = deployedAccounts;
|
|
212
|
+
const [adminAddress, sequencerAddress] = this.context.accounts;
|
|
212
213
|
|
|
213
214
|
this.adminWallet = this.context.wallet;
|
|
214
215
|
this.aztecNode = this.context.aztecNodeService;
|
|
@@ -231,6 +232,19 @@ export class ClientFlowsBenchmark {
|
|
|
231
232
|
loggers: {
|
|
232
233
|
prover: this.proxyLogger.createLogger('pxe:bb:wasm:bundle:proxied'),
|
|
233
234
|
},
|
|
235
|
+
// The benchmark measures steady-state app cost, not first-send discovery cost. Reproduce the pre-handshake-default
|
|
236
|
+
// behavior of unconstrained delivery: derive the tagging secret from the (sender, recipient) key pair via ECDH
|
|
237
|
+
// instead of taking the current default (a non-interactive handshake, which injects two extra private app
|
|
238
|
+
// executions and a nullifier per cold chain). Constrained delivery is unaffected: the Noir circuit rejects
|
|
239
|
+
// address-derived for constrained, so the hook falls through to a handshake there.
|
|
240
|
+
hooks: {
|
|
241
|
+
resolveTaggingSecretStrategy: ({ deliveryMode }) =>
|
|
242
|
+
Promise.resolve(
|
|
243
|
+
deliveryMode === AppTaggingSecretKind.UNCONSTRAINED
|
|
244
|
+
? { type: 'address-derived' }
|
|
245
|
+
: { type: 'non-interactive-handshake' },
|
|
246
|
+
),
|
|
247
|
+
},
|
|
234
248
|
});
|
|
235
249
|
}
|
|
236
250
|
|
|
@@ -241,7 +255,15 @@ export class ClientFlowsBenchmark {
|
|
|
241
255
|
this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
|
|
242
256
|
aztecNode: this.context.aztecNodeService,
|
|
243
257
|
aztecNodeAdmin: this.context.aztecNodeService,
|
|
244
|
-
|
|
258
|
+
// Bridge from a dedicated L1 account so its direct writes don't race the sequencer publisher's
|
|
259
|
+
// txs on the deployer account (see L1_DIRECT_WRITE_ACCOUNT_INDEX).
|
|
260
|
+
l1Client: createExtendedL1Client(
|
|
261
|
+
this.context.config.l1RpcUrls,
|
|
262
|
+
MNEMONIC,
|
|
263
|
+
undefined,
|
|
264
|
+
undefined,
|
|
265
|
+
L1_DIRECT_WRITE_ACCOUNT_INDEX,
|
|
266
|
+
),
|
|
245
267
|
wallet: this.adminWallet,
|
|
246
268
|
logger: this.logger,
|
|
247
269
|
});
|
|
@@ -249,11 +271,14 @@ export class ClientFlowsBenchmark {
|
|
|
249
271
|
|
|
250
272
|
async applyDeployBananaToken() {
|
|
251
273
|
this.logger.info('Applying banana token deployment');
|
|
252
|
-
const {
|
|
253
|
-
|
|
254
|
-
|
|
274
|
+
const { contract: bananaCoin, instance: bananaCoinInstance } = await BananaCoin.deploy(
|
|
275
|
+
this.adminWallet,
|
|
276
|
+
this.adminAddress,
|
|
277
|
+
'BC',
|
|
278
|
+
'BC',
|
|
279
|
+
18n,
|
|
280
|
+
).send({
|
|
255
281
|
from: this.adminAddress,
|
|
256
|
-
wait: { returnReceipt: true },
|
|
257
282
|
});
|
|
258
283
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
259
284
|
this.bananaCoin = bananaCoin;
|
|
@@ -262,11 +287,14 @@ export class ClientFlowsBenchmark {
|
|
|
262
287
|
|
|
263
288
|
async applyDeployCandyBarToken() {
|
|
264
289
|
this.logger.info('Applying candy bar token deployment');
|
|
265
|
-
const {
|
|
266
|
-
|
|
267
|
-
|
|
290
|
+
const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TestTokenContract.deploy(
|
|
291
|
+
this.adminWallet,
|
|
292
|
+
this.adminAddress,
|
|
293
|
+
'CBC',
|
|
294
|
+
'CBC',
|
|
295
|
+
18n,
|
|
296
|
+
).send({
|
|
268
297
|
from: this.adminAddress,
|
|
269
|
-
wait: { returnReceipt: true },
|
|
270
298
|
});
|
|
271
299
|
this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
|
|
272
300
|
this.candyBarCoin = candyBarCoin;
|
|
@@ -279,11 +307,12 @@ export class ClientFlowsBenchmark {
|
|
|
279
307
|
expect((await this.context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
|
|
280
308
|
|
|
281
309
|
const bananaCoin = this.bananaCoin;
|
|
282
|
-
const {
|
|
283
|
-
|
|
284
|
-
|
|
310
|
+
const { contract: bananaFPC, instance: bananaFPCInstance } = await FPCContract.deploy(
|
|
311
|
+
this.adminWallet,
|
|
312
|
+
bananaCoin.address,
|
|
313
|
+
this.adminAddress,
|
|
314
|
+
).send({
|
|
285
315
|
from: this.adminAddress,
|
|
286
|
-
wait: { returnReceipt: true },
|
|
287
316
|
});
|
|
288
317
|
|
|
289
318
|
this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
|
|
@@ -328,18 +357,17 @@ export class ClientFlowsBenchmark {
|
|
|
328
357
|
|
|
329
358
|
public async createAndFundBenchmarkingAccountOnUserWallet(accountType: AccountType) {
|
|
330
359
|
const benchysAccountManager = await this.createBenchmarkingAccountManager(this.adminWallet, accountType);
|
|
331
|
-
const benchysAccount = await benchysAccountManager.getAccount();
|
|
332
360
|
const benchysAddress = benchysAccountManager.address;
|
|
333
361
|
const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(benchysAddress);
|
|
334
362
|
const behchysDeployMethod = await benchysAccountManager.getDeployMethod();
|
|
335
363
|
await behchysDeployMethod.send({
|
|
336
|
-
from:
|
|
364
|
+
from: NO_FROM,
|
|
337
365
|
fee: { paymentMethod: new FeeJuicePaymentMethodWithClaim(benchysAddress, claim) },
|
|
338
366
|
});
|
|
339
367
|
// Register benchy on the user's Wallet, where we're going to be interacting from
|
|
340
368
|
const accountManager = await this.userWallet.createAccount({
|
|
341
|
-
secret:
|
|
342
|
-
salt: new Fr(
|
|
369
|
+
secret: benchysAccountManager.getSecretKey(),
|
|
370
|
+
salt: new Fr(benchysAccountManager.getInstance().salt),
|
|
343
371
|
contract: benchysAccountManager.getAccountContract(),
|
|
344
372
|
});
|
|
345
373
|
return accountManager.address;
|
|
@@ -347,20 +375,21 @@ export class ClientFlowsBenchmark {
|
|
|
347
375
|
|
|
348
376
|
public async applyDeployAmm() {
|
|
349
377
|
this.logger.info('Applying AMM deployment');
|
|
350
|
-
const {
|
|
351
|
-
|
|
352
|
-
|
|
378
|
+
const { contract: liquidityToken, instance: liquidityTokenInstance } = await TestTokenContract.deploy(
|
|
379
|
+
this.adminWallet,
|
|
380
|
+
this.adminAddress,
|
|
381
|
+
'LPT',
|
|
382
|
+
'LPT',
|
|
383
|
+
18n,
|
|
384
|
+
).send({
|
|
353
385
|
from: this.adminAddress,
|
|
354
|
-
wait: { returnReceipt: true },
|
|
355
386
|
});
|
|
356
|
-
const {
|
|
357
|
-
receipt: { contract: amm, instance: ammInstance },
|
|
358
|
-
} = await AMMContract.deploy(
|
|
387
|
+
const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
|
|
359
388
|
this.adminWallet,
|
|
360
389
|
this.bananaCoin.address,
|
|
361
390
|
this.candyBarCoin.address,
|
|
362
391
|
liquidityToken.address,
|
|
363
|
-
).send({ from: this.adminAddress
|
|
392
|
+
).send({ from: this.adminAddress });
|
|
364
393
|
this.logger.info(`AMM deployed at ${amm.address}`);
|
|
365
394
|
await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
|
|
366
395
|
this.liquidityToken = liquidityToken;
|
|
@@ -377,8 +406,9 @@ export class ClientFlowsBenchmark {
|
|
|
377
406
|
public async getPrivateFPCPaymentMethodForWallet(wallet: Wallet, sender: AztecAddress) {
|
|
378
407
|
// The private fee paying method assembled on the app side requires knowledge of the maximum
|
|
379
408
|
// fee the user is willing to pay
|
|
380
|
-
const maxFeesPerGas =
|
|
381
|
-
const
|
|
409
|
+
const maxFeesPerGas = await getPaddedMaxFeesPerGas(this.aztecNode);
|
|
410
|
+
const gasLimits = Gas.from((await this.aztecNode.getNodeInfo()).txsLimits.gas);
|
|
411
|
+
const gasSettings = GasSettings.fallback({ gasLimits, maxFeesPerGas });
|
|
382
412
|
return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
|
|
383
413
|
}
|
|
384
414
|
|