@aztec/end-to-end 0.0.1-commit.2f68f620 → 0.0.1-commit.321f6a9
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 +215 -27
- package/dest/automine/automine_test_context.d.ts +85 -0
- package/dest/automine/automine_test_context.d.ts.map +1 -0
- package/dest/automine/automine_test_context.js +98 -0
- package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
- package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
- package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.d.ts +1 -1
- package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
- package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
- package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
- package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
- package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
- package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
- package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +18 -40
- 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 +22 -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 +1 -1
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +3 -1
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +4 -4
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +31 -19
- 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 +95 -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/e2e_prover_test.d.ts +12 -9
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +48 -28
- package/dest/fixtures/fixtures.d.ts +19 -10
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +26 -11
- package/dest/fixtures/ha_setup.d.ts +3 -3
- package/dest/fixtures/ha_setup.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.js +4 -1
- 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/setup.d.ts +48 -42
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +194 -229
- package/dest/fixtures/setup_p2p_test.d.ts +1 -1
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +3 -3
- package/dest/fixtures/standard_contracts_genesis.d.ts +16 -0
- package/dest/fixtures/standard_contracts_genesis.d.ts.map +1 -0
- package/dest/fixtures/standard_contracts_genesis.js +25 -0
- package/dest/fixtures/timing.d.ts +42 -0
- package/dest/fixtures/timing.d.ts.map +1 -0
- package/dest/fixtures/timing.js +72 -0
- package/dest/fixtures/token_utils.d.ts +22 -4
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +21 -1
- 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_service.js +3 -3
- 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 +10 -2
- package/dest/p2p/p2p_network.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.js +41 -16
- 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 +4 -17
- 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 +3 -3
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +24 -16
- package/dest/shared/gas_portal_test_harness.d.ts +1 -1
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +8 -5
- 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 +1 -6
- package/dest/shared/wait_for_l1_to_l2_message.js +1 -1
- package/dest/simulators/lending_simulator.js +1 -1
- package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
- package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
- package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
- package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
- package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
- package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
- package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
- package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
- package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
- package/dest/single-node/fees/fees_test.d.ts +95 -0
- package/dest/single-node/fees/fees_test.d.ts.map +1 -0
- package/dest/{e2e_fees → single-node/fees}/fees_test.js +126 -60
- package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
- package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
- package/dest/single-node/l1-reorgs/setup.js +57 -0
- package/dest/single-node/partial-proofs/setup.d.ts +5 -0
- package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
- package/dest/single-node/partial-proofs/setup.js +5 -0
- package/dest/single-node/proving/setup.d.ts +5 -0
- package/dest/single-node/proving/setup.d.ts.map +1 -0
- package/dest/single-node/proving/setup.js +5 -0
- package/dest/single-node/recovery/setup.d.ts +5 -0
- package/dest/single-node/recovery/setup.d.ts.map +1 -0
- package/dest/single-node/recovery/setup.js +5 -0
- package/dest/single-node/setup.d.ts +49 -0
- package/dest/single-node/setup.d.ts.map +1 -0
- package/dest/single-node/setup.js +56 -0
- package/dest/single-node/single_node_test_context.d.ts +374 -0
- package/dest/single-node/single_node_test_context.d.ts.map +1 -0
- package/dest/single-node/single_node_test_context.js +847 -0
- package/dest/spartan/setup_test_wallets.d.ts +1 -1
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +19 -9
- package/dest/spartan/tx_metrics.d.ts +10 -1
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +32 -0
- package/dest/test-wallet/test_wallet.d.ts +23 -3
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +56 -9
- package/dest/test-wallet/utils.d.ts +36 -1
- package/dest/test-wallet/utils.d.ts.map +1 -1
- package/dest/test-wallet/utils.js +64 -4
- package/dest/test-wallet/wallet_worker_script.js +5 -2
- package/dest/test-wallet/worker_wallet.d.ts +5 -5
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet.js +5 -3
- package/dest/test-wallet/worker_wallet_schema.d.ts +3 -159
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet_schema.js +2 -1
- package/package.json +41 -41
- package/src/automine/README.md +60 -0
- package/src/automine/automine_test_context.ts +153 -0
- package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
- package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
- package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +20 -57
- package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +24 -57
- package/src/automine/token/token_test_helpers.ts +138 -0
- package/src/bench/client_flows/benchmark.ts +3 -1
- package/src/bench/client_flows/client_flows_benchmark.ts +45 -26
- package/src/bench/client_flows/data_extractor.ts +1 -0
- package/src/bench/utils.ts +109 -6
- package/src/composed/ha/ha_full_setup.ts +466 -0
- package/src/fixtures/e2e_prover_test.ts +60 -47
- package/src/fixtures/fixtures.ts +28 -11
- package/src/fixtures/ha_setup.ts +7 -3
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/setup.ts +245 -290
- package/src/fixtures/setup_p2p_test.ts +3 -3
- package/src/fixtures/standard_contracts_genesis.ts +28 -0
- package/src/fixtures/timing.ts +97 -0
- package/src/fixtures/token_utils.ts +39 -4
- package/src/fixtures/utils.ts +0 -3
- package/src/fixtures/wait_helpers.ts +333 -0
- package/src/forward-compatibility/wallet_service.ts +6 -4
- package/src/guides/up_quick_start.sh +5 -0
- package/src/infra/README.md +12 -0
- package/src/multi-node/README.md +96 -0
- package/src/multi-node/block-production/setup.ts +272 -0
- package/src/multi-node/governance/setup.ts +172 -0
- package/src/multi-node/multi_node_test_context.ts +447 -0
- package/src/multi-node/slashing/inactivity_setup.ts +139 -0
- package/src/multi-node/slashing/setup.ts +433 -0
- package/src/p2p/README.md +78 -0
- package/src/{e2e_p2p → p2p}/p2p_network.ts +40 -13
- package/src/{e2e_p2p → p2p}/reqresp/utils.ts +5 -16
- package/src/p2p/shared.ts +329 -0
- package/src/shared/cross_chain_test_harness.ts +22 -13
- package/src/shared/gas_portal_test_harness.ts +13 -5
- 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 +1 -8
- package/src/shared/wait_for_l1_to_l2_message.ts +1 -1
- package/src/simulators/lending_simulator.ts +1 -1
- package/src/single-node/README.md +66 -0
- package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
- package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
- package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
- package/src/{e2e_fees → single-node/fees}/fees_test.ts +143 -70
- package/src/single-node/l1-reorgs/setup.ts +93 -0
- package/src/single-node/partial-proofs/setup.ts +8 -0
- package/src/single-node/proving/setup.ts +15 -0
- package/src/single-node/recovery/setup.ts +8 -0
- package/src/single-node/setup.ts +63 -0
- package/src/single-node/single_node_test_context.ts +1058 -0
- package/src/spartan/setup_test_wallets.ts +24 -9
- package/src/spartan/tx_metrics.ts +26 -0
- package/src/test-wallet/test_wallet.ts +60 -10
- package/src/test-wallet/utils.ts +102 -5
- package/src/test-wallet/wallet_worker_script.ts +6 -3
- package/src/test-wallet/worker_wallet.ts +10 -12
- package/src/test-wallet/worker_wallet_schema.ts +3 -2
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -56
- 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 -58
- 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 -161
- 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 -51
- package/dest/e2e_epochs/epochs_test.d.ts +0 -125
- package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
- package/dest/e2e_epochs/epochs_test.js +0 -460
- package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
- package/dest/e2e_fees/fees_test.d.ts +0 -91
- 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 -55
- 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 -137
- 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 -75
- package/dest/e2e_p2p/shared.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.js +0 -217
- 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 -231
- package/src/e2e_deploy_contract/deploy_test.ts +0 -86
- package/src/e2e_epochs/epochs_test.ts +0 -575
- package/src/e2e_l1_publisher/write_json.ts +0 -77
- package/src/e2e_nested_contract/nested_contract_test.ts +0 -77
- package/src/e2e_p2p/inactivity_slash_test.ts +0 -180
- package/src/e2e_p2p/shared.ts +0 -332
- /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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { ContractArtifact } from '@aztec/aztec.js/abi';
|
|
2
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import { type ContractBase, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
4
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
5
|
+
import type { PublicKeys } from '@aztec/aztec.js/keys';
|
|
6
|
+
import type { Logger } from '@aztec/aztec.js/log';
|
|
7
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
8
|
+
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
9
|
+
import type { CheatCodes } from '@aztec/aztec/testing';
|
|
10
|
+
import { ChildContract } from '@aztec/noir-test-contracts.js/Child';
|
|
11
|
+
import { ParentContract } from '@aztec/noir-test-contracts.js/Parent';
|
|
12
|
+
import type { StatefulTestContract } from '@aztec/noir-test-contracts.js/StatefulTest';
|
|
13
|
+
import type { PXEConfig } from '@aztec/pxe/config';
|
|
14
|
+
import type { SequencerClient } from '@aztec/sequencer-client';
|
|
15
|
+
import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
|
|
16
|
+
|
|
17
|
+
import { AUTOMINE_E2E_OPTS } from '../fixtures/fixtures.js';
|
|
18
|
+
import { type EndToEndContext, type SetupOptions, setup, teardown } from '../fixtures/setup.js';
|
|
19
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
20
|
+
|
|
21
|
+
export type AutomineTestOpts = Partial<SetupOptions> & {
|
|
22
|
+
/** Number of accounts to create and deploy during setup. */
|
|
23
|
+
numberOfAccounts?: number;
|
|
24
|
+
/** Options forwarded to PXE creation. */
|
|
25
|
+
pxeOpts?: Partial<PXEConfig>;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Base class for the automine-sequencer test topology: a single in-process node running the
|
|
30
|
+
* deterministic {@link AUTOMINE_E2E_OPTS} preset (one block per submitted tx, synchronous L1 publish,
|
|
31
|
+
* no committee, no prover, no validator client). Owns the environment (in-proc anvil in automine mode
|
|
32
|
+
* plus the L1 deploy) and exposes the handles every automine test uses (`wallet`, `aztecNode`,
|
|
33
|
+
* `cheatCodes`, `sequencer`, `accounts`, `logger`).
|
|
34
|
+
*
|
|
35
|
+
* The sibling of {@link SingleNodeTestContext}: both wrap the same underlying `fixtures/setup.ts:setup()`
|
|
36
|
+
* but fix opposite sequencer topologies. Making {@link AUTOMINE_E2E_OPTS} the base default removes the
|
|
37
|
+
* per-test-file spread every automine test would otherwise repeat.
|
|
38
|
+
*
|
|
39
|
+
* Domain harnesses (the token simulators) compose on top by extending this base and overriding
|
|
40
|
+
* {@link setup} to run their domain steps after `super.setup()`.
|
|
41
|
+
*/
|
|
42
|
+
export class AutomineTestContext {
|
|
43
|
+
public context!: EndToEndContext;
|
|
44
|
+
public logger!: Logger;
|
|
45
|
+
public wallet!: TestWallet;
|
|
46
|
+
public aztecNode!: AztecNode & AztecNodeDebug;
|
|
47
|
+
public aztecNodeAdmin!: AztecNodeAdmin;
|
|
48
|
+
public cheatCodes!: CheatCodes;
|
|
49
|
+
public sequencer!: SequencerClient;
|
|
50
|
+
public accounts!: AztecAddress[];
|
|
51
|
+
public defaultAccountAddress!: AztecAddress;
|
|
52
|
+
|
|
53
|
+
public parentContract!: ParentContract;
|
|
54
|
+
public childContract!: ChildContract;
|
|
55
|
+
|
|
56
|
+
public static async setup<T extends AutomineTestContext>(this: new () => T, opts: AutomineTestOpts = {}): Promise<T> {
|
|
57
|
+
const test = new this();
|
|
58
|
+
await test.setup(opts);
|
|
59
|
+
return test;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public async setup(opts: AutomineTestOpts = {}): Promise<void> {
|
|
63
|
+
const { numberOfAccounts = 1, pxeOpts, ...setupOpts } = opts;
|
|
64
|
+
const context = await setup(
|
|
65
|
+
numberOfAccounts,
|
|
66
|
+
{
|
|
67
|
+
...AUTOMINE_E2E_OPTS,
|
|
68
|
+
fundSponsoredFPC: true,
|
|
69
|
+
...setupOpts,
|
|
70
|
+
},
|
|
71
|
+
pxeOpts,
|
|
72
|
+
);
|
|
73
|
+
await this.hydrateFromContext(context);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Populates the context-derived handles from an already-built {@link EndToEndContext}. Split out of
|
|
78
|
+
* {@link setup} so domain harnesses that build the environment with their own bespoke `setup(...)`
|
|
79
|
+
* opts can still reuse the shared handle wiring.
|
|
80
|
+
*/
|
|
81
|
+
protected hydrateFromContext(context: EndToEndContext): Promise<void> {
|
|
82
|
+
this.context = context;
|
|
83
|
+
this.logger = context.logger;
|
|
84
|
+
this.wallet = context.wallet;
|
|
85
|
+
this.aztecNode = context.aztecNodeService;
|
|
86
|
+
this.aztecNodeAdmin = context.aztecNodeService;
|
|
87
|
+
this.cheatCodes = context.cheatCodes;
|
|
88
|
+
this.sequencer = context.sequencer!;
|
|
89
|
+
this.accounts = context.accounts;
|
|
90
|
+
this.defaultAccountAddress = context.accounts[0];
|
|
91
|
+
return Promise.resolve();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public async teardown(): Promise<void> {
|
|
95
|
+
await teardown(this.context);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Marks the current pending checkpoints as proven, then warps the L2 clock forward by `seconds`.
|
|
100
|
+
*
|
|
101
|
+
* Under {@link AUTOMINE_E2E_OPTS} a long warp crosses many epochs with no proofs being submitted, so
|
|
102
|
+
* without a prior `markAsProven()` the rollup contract's pruning window resets the chain tip to genesis
|
|
103
|
+
* and the warp's own empty-checkpoint propose fails with `Rollup__InvalidArchive`. Marking proven before
|
|
104
|
+
* warping keeps the pending chain alive. Composes the existing `cheatCodes.rollup.markAsProven` and
|
|
105
|
+
* `warpL2TimeAtLeastBy` with that required ordering.
|
|
106
|
+
*/
|
|
107
|
+
public async markProvenAndWarp(seconds: number | bigint): Promise<void> {
|
|
108
|
+
await this.cheatCodes.rollup.markAsProven();
|
|
109
|
+
await this.cheatCodes.warpL2TimeAtLeastBy(this.aztecNode, seconds);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Computes and registers a contract instance in the wallet without deploying it on-chain. */
|
|
113
|
+
public async registerContract<T extends ContractBase>(
|
|
114
|
+
wallet: Wallet,
|
|
115
|
+
contractArtifact: ContractArtifactClass<T>,
|
|
116
|
+
opts: {
|
|
117
|
+
salt?: Fr;
|
|
118
|
+
publicKeys?: PublicKeys;
|
|
119
|
+
initArgs?: any[];
|
|
120
|
+
constructorName?: string;
|
|
121
|
+
deployer?: AztecAddress;
|
|
122
|
+
} = {},
|
|
123
|
+
): Promise<T> {
|
|
124
|
+
const { salt, publicKeys, initArgs, constructorName, deployer } = opts;
|
|
125
|
+
const instance = await getContractInstanceFromInstantiationParams(contractArtifact.artifact, {
|
|
126
|
+
constructorArgs: initArgs ?? [],
|
|
127
|
+
constructorArtifact: constructorName,
|
|
128
|
+
salt: salt ?? Fr.random(),
|
|
129
|
+
publicKeys,
|
|
130
|
+
deployer,
|
|
131
|
+
});
|
|
132
|
+
await wallet.registerContract(instance, contractArtifact.artifact);
|
|
133
|
+
return contractArtifact.at(instance.address, wallet);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Deploys a Parent and a Child contract from the default account for the nested-call tests. */
|
|
137
|
+
public async applyManualParentChild(): Promise<void> {
|
|
138
|
+
this.logger.info('Deploying parent and child contracts');
|
|
139
|
+
({ contract: this.parentContract } = await ParentContract.deploy(this.wallet).send({
|
|
140
|
+
from: this.defaultAccountAddress,
|
|
141
|
+
}));
|
|
142
|
+
({ contract: this.childContract } = await ChildContract.deploy(this.wallet).send({
|
|
143
|
+
from: this.defaultAccountAddress,
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export type StatefulContractCtorArgs = Parameters<StatefulTestContract['methods']['constructor']>;
|
|
149
|
+
|
|
150
|
+
export type ContractArtifactClass<T extends ContractBase> = {
|
|
151
|
+
at(address: AztecAddress, wallet: Wallet): T;
|
|
152
|
+
artifact: ContractArtifact;
|
|
153
|
+
};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { AztecAddress, type CompleteAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import { DomainSeparator } from '@aztec/constants';
|
|
3
|
+
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
4
|
+
import { Schnorr, type SchnorrSignature } from '@aztec/foundation/crypto/schnorr';
|
|
5
|
+
import { Fq, Fr } from '@aztec/foundation/curves/bn254';
|
|
6
|
+
import type { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
7
|
+
import type { CustomRequest } from '@aztec/pxe/config';
|
|
8
|
+
import {
|
|
9
|
+
INTERACTIVE_HANDSHAKE_REQUEST_KIND,
|
|
10
|
+
STANDARD_HANDSHAKE_REGISTRY_ADDRESS,
|
|
11
|
+
} from '@aztec/standard-contracts/handshake-registry/constants';
|
|
12
|
+
import { type PublicKeys, derivePublicKeyFromSecretKey } from '@aztec/stdlib/keys';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The decoded payload of the registry's interactive-handshake signature request. Note it never carries the sender,
|
|
16
|
+
* so the recipient authorizes the handshake without learning who initiated it.
|
|
17
|
+
*/
|
|
18
|
+
export type InteractiveHandshakeRequest = {
|
|
19
|
+
/** The account whose authorization is being requested. */
|
|
20
|
+
recipient: AztecAddress;
|
|
21
|
+
chainId: Fr;
|
|
22
|
+
version: Fr;
|
|
23
|
+
/** The x-coordinate of the handshake's ephemeral public key (its y-coordinate is positive by construction). */
|
|
24
|
+
ephPkX: Fr;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The recipient's signed authorization for an interactive handshake. Mirrors the registry contract's
|
|
29
|
+
* `RecipientSignature` struct field for field.
|
|
30
|
+
*/
|
|
31
|
+
export type RecipientSignature = {
|
|
32
|
+
/** The recipient's master public keys, bound in-circuit to the recipient's address via `partialAddress`. */
|
|
33
|
+
publicKeys: PublicKeys;
|
|
34
|
+
partialAddress: Fr;
|
|
35
|
+
/** The x-coordinate of the recipient's master message-signing public key. */
|
|
36
|
+
mspkX: Fr;
|
|
37
|
+
/** Whether that key's y-coordinate is positive, so the circuit can reconstruct the point from `mspkX`. */
|
|
38
|
+
mspkYIsPositive: boolean;
|
|
39
|
+
/** The schnorr signature over the handshake message. */
|
|
40
|
+
signature: SchnorrSignature;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Parses and validates the registry's interactive-handshake signature request.
|
|
45
|
+
*
|
|
46
|
+
* @throws If the request kind is not {@link INTERACTIVE_HANDSHAKE_REQUEST_KIND}, the issuing contract is not the
|
|
47
|
+
* standard HandshakeRegistry, or the payload does not have the expected shape.
|
|
48
|
+
*/
|
|
49
|
+
export function parseInteractiveHandshakeRequest(request: CustomRequest): InteractiveHandshakeRequest {
|
|
50
|
+
if (!request.kind.equals(INTERACTIVE_HANDSHAKE_REQUEST_KIND)) {
|
|
51
|
+
throw new Error(`Not an interactive-handshake signature request: unexpected kind ${request.kind}`);
|
|
52
|
+
}
|
|
53
|
+
if (!request.contractAddress.equals(STANDARD_HANDSHAKE_REGISTRY_ADDRESS)) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
`Interactive-handshake signature request issued by ${request.contractAddress}, expected the standard HandshakeRegistry at ${STANDARD_HANDSHAKE_REGISTRY_ADDRESS}`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
if (request.payload.length !== 4) {
|
|
59
|
+
throw new Error(`Interactive-handshake signature request payload has ${request.payload.length} fields, expected 4`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const [recipient, chainId, version, ephPkX] = request.payload;
|
|
63
|
+
return { recipient: new AztecAddress(recipient), chainId, version, ephPkX };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Produces the recipient's signed authorization for an interactive handshake, signing with the master
|
|
68
|
+
* message-signing secret key.
|
|
69
|
+
*/
|
|
70
|
+
export async function signInteractiveHandshake(
|
|
71
|
+
request: InteractiveHandshakeRequest,
|
|
72
|
+
completeAddress: CompleteAddress,
|
|
73
|
+
masterMessageSigningSecretKey: GrumpkinScalar,
|
|
74
|
+
): Promise<RecipientSignature> {
|
|
75
|
+
const mspk = await derivePublicKeyFromSecretKey(masterMessageSigningSecretKey);
|
|
76
|
+
const [mspkX, mspkYIsPositive] = mspk.toXAndSign();
|
|
77
|
+
|
|
78
|
+
const message = await computeInteractiveHandshakeSignatureMessage({
|
|
79
|
+
chainId: request.chainId,
|
|
80
|
+
version: request.version,
|
|
81
|
+
registry: STANDARD_HANDSHAKE_REGISTRY_ADDRESS,
|
|
82
|
+
ephPkX: request.ephPkX,
|
|
83
|
+
});
|
|
84
|
+
const signature = await new Schnorr().constructSignature(message, masterMessageSigningSecretKey);
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
publicKeys: completeAddress.publicKeys,
|
|
88
|
+
partialAddress: completeAddress.partialAddress,
|
|
89
|
+
mspkX,
|
|
90
|
+
mspkYIsPositive,
|
|
91
|
+
signature,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Serializes a {@link RecipientSignature} to the field layout the registry's in-circuit deserialization expects. */
|
|
96
|
+
export function recipientSignatureToFields(recipientSignature: RecipientSignature): Fr[] {
|
|
97
|
+
const s = Fq.fromBuffer(recipientSignature.signature.s);
|
|
98
|
+
const e = Fq.fromBuffer(recipientSignature.signature.e);
|
|
99
|
+
return [
|
|
100
|
+
...recipientSignature.publicKeys.toFields(),
|
|
101
|
+
recipientSignature.partialAddress,
|
|
102
|
+
recipientSignature.mspkX,
|
|
103
|
+
new Fr(recipientSignature.mspkYIsPositive),
|
|
104
|
+
s.lo,
|
|
105
|
+
s.hi,
|
|
106
|
+
e.lo,
|
|
107
|
+
e.hi,
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The message an interactive-handshake authorization signs: the handshake's ephemeral key and chain context under
|
|
113
|
+
* `DomainSeparator.INTERACTIVE_HANDSHAKE_SIGNATURE`, exactly as the registry recomputes it in-circuit.
|
|
114
|
+
*/
|
|
115
|
+
function computeInteractiveHandshakeSignatureMessage(args: {
|
|
116
|
+
chainId: Fr;
|
|
117
|
+
version: Fr;
|
|
118
|
+
registry: AztecAddress;
|
|
119
|
+
ephPkX: Fr;
|
|
120
|
+
}): Promise<Fr> {
|
|
121
|
+
return poseidon2HashWithSeparator(
|
|
122
|
+
[args.chainId, args.version, args.registry, args.ephPkX],
|
|
123
|
+
DomainSeparator.INTERACTIVE_HANDSHAKE_SIGNATURE,
|
|
124
|
+
);
|
|
125
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
|
+
import type { FieldLike } from '@aztec/aztec.js/abi';
|
|
3
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
4
|
+
import type { AztecAddress, CompleteAddress } from '@aztec/aztec.js/addresses';
|
|
5
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
6
|
+
import type { AccountManager } from '@aztec/aztec.js/wallet';
|
|
7
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
8
|
+
import { type DeliveryEvent, OnchainDeliveryTestContract } from '@aztec/noir-test-contracts.js/OnchainDeliveryTest';
|
|
9
|
+
import type { CustomRequest, ResolveCustomRequest, ResolveTaggingSecretStrategy } from '@aztec/pxe/config';
|
|
10
|
+
import type { AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
|
|
11
|
+
|
|
12
|
+
import { jest } from '@jest/globals';
|
|
13
|
+
|
|
14
|
+
import { AUTOMINE_E2E_OPTS } from '../../fixtures/fixtures.js';
|
|
15
|
+
import { ensureHandshakeRegistryPublished, setup, setupPXEAndGetWallet } from '../../fixtures/setup.js';
|
|
16
|
+
import { TestWallet } from '../../test-wallet/test_wallet.js';
|
|
17
|
+
|
|
18
|
+
// Builds the hook serving custom requests issued during the sender's simulations. Installed on the sender PXE at
|
|
19
|
+
// creation but built only once the recipient exists, since serving typically needs the recipient's wallet and keys.
|
|
20
|
+
export type CustomRequestResponder = (
|
|
21
|
+
recipient: TestWallet,
|
|
22
|
+
recipientAccount: InitialAccountData,
|
|
23
|
+
recipientCompleteAddress: CompleteAddress,
|
|
24
|
+
) => ResolveCustomRequest;
|
|
25
|
+
|
|
26
|
+
export type Mode = 'constrained' | 'unconstrained';
|
|
27
|
+
|
|
28
|
+
// A single mode applies to both the event and note sends; `{ events, notes }` sends each in its own mode, which
|
|
29
|
+
// exercises cross-mode handshake reuse: bootstrap in one mode, deliver in the other on the same handshake.
|
|
30
|
+
export type DeliveryMode = Mode | { events: Mode; notes: Mode };
|
|
31
|
+
|
|
32
|
+
const formatMode = (mode: DeliveryMode): string => (typeof mode === 'string' ? mode : `${mode.events}->${mode.notes}`);
|
|
33
|
+
|
|
34
|
+
// Onchain private delivery has two orthogonal axes: the delivery MODE (constrained = nullifier-chained sequence;
|
|
35
|
+
// unconstrained = no nullifier, windowed scan) and the tagging-secret SOURCE, which the wallet's
|
|
36
|
+
// `resolveTaggingSecretStrategy` hook selects. This harness exercises (strategy, mode) cells end to end across two
|
|
37
|
+
// PXEs that share only a node: the sender PXE sends, the recipient PXE discovers purely from onchain logs plus the
|
|
38
|
+
// HandshakeRegistry.
|
|
39
|
+
//
|
|
40
|
+
// Cross-PXE is the meaningful setup: the recipient PXE holds no sender state, so a cell only "discovers" a message if
|
|
41
|
+
// the source truly reached it.
|
|
42
|
+
export function buildMessageDeliveryTest(opts: {
|
|
43
|
+
// Names the tagging-secret source, e.g. 'non-interactive handshake' or 'arbitrary secret'. The describe title is
|
|
44
|
+
// derived as `${strategy} x ${mode}`.
|
|
45
|
+
strategy: string;
|
|
46
|
+
mode: DeliveryMode;
|
|
47
|
+
// Required: every cell states its source explicitly rather than leaning on the PXE default (covered by unit tests).
|
|
48
|
+
senderHook: ResolveTaggingSecretStrategy;
|
|
49
|
+
// Recipient-side setup the source requires (e.g. registering a raw arbitrary secret); runs once after deployment.
|
|
50
|
+
recipientRegistration?: (
|
|
51
|
+
recipient: TestWallet,
|
|
52
|
+
recipientAddress: AztecAddress,
|
|
53
|
+
sender: AztecAddress,
|
|
54
|
+
) => Promise<void>;
|
|
55
|
+
// Serves the custom requests issued during the sender's simulations (e.g. the registry's interactive-handshake
|
|
56
|
+
// signature request).
|
|
57
|
+
customRequestResponder?: CustomRequestResponder;
|
|
58
|
+
// Extra `it()`s to register in this cell's suite, e.g. assertions against state a custom `senderHook` recorded.
|
|
59
|
+
// Called inside the same `describe`, after the two baseline assertions below, so it shares their `beforeAll`
|
|
60
|
+
// instead of depending on Jest's cross-`describe` execution order.
|
|
61
|
+
additionalTests?: () => void;
|
|
62
|
+
}) {
|
|
63
|
+
const { strategy, mode, senderHook, recipientRegistration, customRequestResponder, additionalTests } = opts;
|
|
64
|
+
const description = `${strategy} x ${formatMode(mode)}`;
|
|
65
|
+
|
|
66
|
+
describe(description, () => {
|
|
67
|
+
jest.setTimeout(300_000);
|
|
68
|
+
|
|
69
|
+
const eventValues = [10n, 20n, 30n];
|
|
70
|
+
const noteValues = [40n, 50n, 60n];
|
|
71
|
+
|
|
72
|
+
let aztecNode: AztecNode & AztecNodeDebug;
|
|
73
|
+
let walletSender: TestWallet;
|
|
74
|
+
let walletRecipient: TestWallet;
|
|
75
|
+
let sender: AztecAddress;
|
|
76
|
+
let recipient: AztecAddress;
|
|
77
|
+
let contractSender: OnchainDeliveryTestContract;
|
|
78
|
+
let teardownSender: () => Promise<void>;
|
|
79
|
+
let teardownRecipient: () => Promise<void>;
|
|
80
|
+
// Discovery results captured in beforeAll, so the assertions in the actual tests below stay pure.
|
|
81
|
+
// A failure during delivery fails beforeAll loudly instead of being swallowed as an expected red.
|
|
82
|
+
let discoveredEvents: FieldLike[];
|
|
83
|
+
let readNotes: bigint[];
|
|
84
|
+
|
|
85
|
+
const { events: eventMode, notes: noteMode } = typeof mode === 'string' ? { events: mode, notes: mode } : mode;
|
|
86
|
+
const sendEvent = (value: bigint) =>
|
|
87
|
+
eventMode === 'constrained'
|
|
88
|
+
? contractSender.methods.emit_event(recipient, value)
|
|
89
|
+
: contractSender.methods.emit_event_unconstrained(recipient, value);
|
|
90
|
+
const sendNote = (value: bigint) =>
|
|
91
|
+
noteMode === 'constrained'
|
|
92
|
+
? contractSender.methods.emit_note(recipient, value)
|
|
93
|
+
: contractSender.methods.emit_note_unconstrained(recipient, value);
|
|
94
|
+
|
|
95
|
+
let additionallyFundedAccounts: InitialAccountData[];
|
|
96
|
+
let recipientAccount: AccountManager | undefined;
|
|
97
|
+
let customRequestCount = 0;
|
|
98
|
+
|
|
99
|
+
beforeAll(async () => {
|
|
100
|
+
// The sender PXE holds the sender and carries this cell's tagging-secret-strategy hook. The recipient is funded
|
|
101
|
+
// at genesis here but created and deployed on the isolated recipient PXE below, so it carries no sender state
|
|
102
|
+
// from other cells.
|
|
103
|
+
({
|
|
104
|
+
aztecNode,
|
|
105
|
+
additionallyFundedAccounts,
|
|
106
|
+
wallet: walletSender,
|
|
107
|
+
accounts: [sender],
|
|
108
|
+
teardown: teardownSender,
|
|
109
|
+
} = await setup(1, {
|
|
110
|
+
...AUTOMINE_E2E_OPTS,
|
|
111
|
+
additionallyFundedAccounts: await generateSchnorrAccounts(1, 'schnorr'),
|
|
112
|
+
pxeCreationOptions: {
|
|
113
|
+
hooks: {
|
|
114
|
+
resolveTaggingSecretStrategy: senderHook,
|
|
115
|
+
resolveCustomRequest: async (request: CustomRequest) => {
|
|
116
|
+
if (!customRequestResponder) {
|
|
117
|
+
throw new Error('A custom request arrived but this test cell has no customRequestResponder configured');
|
|
118
|
+
}
|
|
119
|
+
if (!recipientAccount) {
|
|
120
|
+
throw new Error('A custom request arrived before the recipient wallet was created');
|
|
121
|
+
}
|
|
122
|
+
customRequestCount++;
|
|
123
|
+
const respond = customRequestResponder(
|
|
124
|
+
walletRecipient,
|
|
125
|
+
additionallyFundedAccounts[0],
|
|
126
|
+
await recipientAccount.getCompleteAddress(),
|
|
127
|
+
);
|
|
128
|
+
return respond(request);
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
}));
|
|
133
|
+
|
|
134
|
+
({ wallet: walletRecipient, teardown: teardownRecipient } = await setupPXEAndGetWallet(
|
|
135
|
+
aztecNode,
|
|
136
|
+
aztecNode,
|
|
137
|
+
{},
|
|
138
|
+
undefined,
|
|
139
|
+
'pxe-recipient',
|
|
140
|
+
));
|
|
141
|
+
recipientAccount = await walletRecipient.createSchnorrAccount(
|
|
142
|
+
additionallyFundedAccounts[0].secret,
|
|
143
|
+
additionallyFundedAccounts[0].salt,
|
|
144
|
+
additionallyFundedAccounts[0].signingKey,
|
|
145
|
+
);
|
|
146
|
+
await (await recipientAccount.getDeployMethod()).send({ from: NO_FROM });
|
|
147
|
+
recipient = recipientAccount.address;
|
|
148
|
+
|
|
149
|
+
await ensureHandshakeRegistryPublished(walletSender, sender);
|
|
150
|
+
const { contract: deployed, instance } = await OnchainDeliveryTestContract.deploy(walletSender).send({
|
|
151
|
+
from: sender,
|
|
152
|
+
});
|
|
153
|
+
contractSender = deployed;
|
|
154
|
+
|
|
155
|
+
await ensureHandshakeRegistryPublished(walletRecipient, recipient);
|
|
156
|
+
await walletRecipient.registerContract(instance, OnchainDeliveryTestContract.artifact);
|
|
157
|
+
|
|
158
|
+
await recipientRegistration?.(walletRecipient, recipient, sender);
|
|
159
|
+
|
|
160
|
+
// Constrained sends to one pair are strictly ordered, so deliver one tx at a time. The first send bootstraps the
|
|
161
|
+
// handshake (when the source is a handshake); the rest reuse it.
|
|
162
|
+
const blockNumbers: number[] = [];
|
|
163
|
+
for (const value of eventValues) {
|
|
164
|
+
const { receipt } = await sendEvent(value).send({ from: sender });
|
|
165
|
+
blockNumbers.push(receipt.blockNumber!);
|
|
166
|
+
}
|
|
167
|
+
for (const value of noteValues) {
|
|
168
|
+
await sendNote(value).send({ from: sender });
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
await walletRecipient.sync();
|
|
172
|
+
|
|
173
|
+
const events = await walletRecipient.getPrivateEvents<DeliveryEvent>(
|
|
174
|
+
OnchainDeliveryTestContract.events.DeliveryEvent,
|
|
175
|
+
{
|
|
176
|
+
contractAddress: contractSender.address,
|
|
177
|
+
fromBlock: BlockNumber(Math.min(...blockNumbers)),
|
|
178
|
+
toBlock: BlockNumber(Math.max(...blockNumbers) + 1),
|
|
179
|
+
scopes: [recipient],
|
|
180
|
+
},
|
|
181
|
+
);
|
|
182
|
+
discoveredEvents = events.map(e => e.event.value);
|
|
183
|
+
|
|
184
|
+
const contractRecipient = OnchainDeliveryTestContract.at(contractSender.address, walletRecipient);
|
|
185
|
+
const { result } = await contractRecipient.methods.get_note_values(recipient).simulate({ from: recipient });
|
|
186
|
+
readNotes = result.storage.slice(0, Number(result.len));
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
afterAll(async () => {
|
|
190
|
+
await teardownRecipient();
|
|
191
|
+
await teardownSender();
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('the recipient PXE discovers the events delivered by the sender PXE', () => {
|
|
195
|
+
expect(discoveredEvents.length).toBe(eventValues.length);
|
|
196
|
+
for (const value of eventValues) {
|
|
197
|
+
expect(discoveredEvents).toContainEqual(value);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('the recipient PXE reads back the notes delivered by the sender PXE', () => {
|
|
202
|
+
expect(readNotes).toEqual(noteValues);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
if (customRequestResponder) {
|
|
206
|
+
it('the custom request hook fires exactly once, on the send that bootstraps the tagging secret', () => {
|
|
207
|
+
expect(customRequestCount).toBe(1);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
additionalTests?.();
|
|
212
|
+
});
|
|
213
|
+
}
|
package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts
RENAMED
|
@@ -1,30 +1,18 @@
|
|
|
1
1
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import { computeSecretHash } from '@aztec/aztec.js/crypto';
|
|
3
3
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
4
|
-
import {
|
|
5
|
-
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
4
|
+
import { createLogger } from '@aztec/aztec.js/log';
|
|
6
5
|
import type { TxHash } from '@aztec/aztec.js/tx';
|
|
7
|
-
import type { CheatCodes } from '@aztec/aztec/testing';
|
|
8
6
|
import type { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
9
7
|
import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist';
|
|
10
8
|
import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
11
9
|
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
12
|
-
import type { SequencerClient } from '@aztec/sequencer-client';
|
|
13
|
-
import type { AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
|
|
14
10
|
|
|
15
11
|
import { jest } from '@jest/globals';
|
|
16
12
|
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
deployAccounts,
|
|
21
|
-
ensureAuthRegistryPublished,
|
|
22
|
-
publicDeployAccounts,
|
|
23
|
-
setup,
|
|
24
|
-
teardown,
|
|
25
|
-
} from '../fixtures/setup.js';
|
|
26
|
-
import { TokenSimulator } from '../simulators/token_simulator.js';
|
|
27
|
-
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
13
|
+
import { ensureAuthRegistryPublished } from '../../fixtures/setup.js';
|
|
14
|
+
import { TokenSimulator } from '../../simulators/token_simulator.js';
|
|
15
|
+
import { AutomineTestContext, type AutomineTestOpts } from '../automine_test_context.js';
|
|
28
16
|
|
|
29
17
|
export class Role {
|
|
30
18
|
private isAdmin = false;
|
|
@@ -53,37 +41,33 @@ export class Role {
|
|
|
53
41
|
}
|
|
54
42
|
}
|
|
55
43
|
|
|
56
|
-
|
|
44
|
+
/**
|
|
45
|
+
* TokenBlacklist-domain harness over the automine topology: extends {@link AutomineTestContext} with a
|
|
46
|
+
* {@link TokenSimulator}, the {@link Role} helper, the TokenBlacklist deploy plus a bad-account and
|
|
47
|
+
* authwit proxy, and the role-change-delay warp. Base setup and mint run in {@link setup}.
|
|
48
|
+
*/
|
|
49
|
+
export class BlacklistTokenContractTest extends AutomineTestContext {
|
|
57
50
|
// This value MUST match the same value that we have in the contract
|
|
58
51
|
static CHANGE_ROLES_DELAY = 86400;
|
|
59
52
|
|
|
60
|
-
context!: EndToEndContext;
|
|
61
|
-
logger: Logger;
|
|
62
|
-
wallet!: TestWallet;
|
|
63
53
|
asset!: TokenBlacklistContract;
|
|
64
54
|
tokenSim!: TokenSimulator;
|
|
65
55
|
badAccount!: InvalidAccountContract;
|
|
66
56
|
authwitProxy!: GenericProxyContract;
|
|
67
|
-
cheatCodes!: CheatCodes;
|
|
68
|
-
sequencer!: SequencerClient;
|
|
69
|
-
aztecNode!: AztecNode & AztecNodeDebug;
|
|
70
57
|
|
|
71
58
|
adminAddress!: AztecAddress;
|
|
72
59
|
otherAddress!: AztecAddress;
|
|
73
60
|
blacklistedAddress!: AztecAddress;
|
|
74
61
|
|
|
62
|
+
private testName: string;
|
|
63
|
+
|
|
75
64
|
constructor(testName: string) {
|
|
76
|
-
|
|
65
|
+
super();
|
|
66
|
+
this.testName = testName;
|
|
77
67
|
}
|
|
78
68
|
|
|
79
69
|
async crossTimestampOfChange() {
|
|
80
|
-
|
|
81
|
-
// submitted. Mark current pending checkpoints as proven first so the rollup contract's
|
|
82
|
-
// pruning window doesn't reset the chain tip to genesis (which would make the warp's
|
|
83
|
-
// own empty-checkpoint propose fail with Rollup__InvalidArchive). See the AutomineSequencer
|
|
84
|
-
// README "Epoch proving caveat" and the equivalent pattern in lending_simulator.progressSlots.
|
|
85
|
-
await this.cheatCodes.rollup.markAsProven();
|
|
86
|
-
await this.cheatCodes.warpL2TimeAtLeastBy(this.aztecNode, BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
|
|
70
|
+
await this.markProvenAndWarp(BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
|
|
87
71
|
}
|
|
88
72
|
|
|
89
73
|
/**
|
|
@@ -96,28 +80,14 @@ export class BlacklistTokenContractTest {
|
|
|
96
80
|
// proxy deploys exceed the original window.
|
|
97
81
|
jest.setTimeout(600_000);
|
|
98
82
|
|
|
99
|
-
this.logger.info('Deploying 3 accounts');
|
|
100
|
-
const { deployedAccounts } = await deployAccounts(
|
|
101
|
-
3,
|
|
102
|
-
this.logger,
|
|
103
|
-
)({
|
|
104
|
-
wallet: this.context.wallet,
|
|
105
|
-
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
106
|
-
});
|
|
107
|
-
|
|
108
83
|
this.cheatCodes = this.context.cheatCodes;
|
|
109
84
|
this.aztecNode = this.context.aztecNodeService;
|
|
110
85
|
this.sequencer = this.context.sequencer!;
|
|
111
86
|
this.wallet = this.context.wallet;
|
|
112
|
-
this.adminAddress =
|
|
113
|
-
this.otherAddress = deployedAccounts[1].address;
|
|
114
|
-
this.blacklistedAddress = deployedAccounts[2].address;
|
|
87
|
+
[this.adminAddress, this.otherAddress, this.blacklistedAddress] = this.context.accounts;
|
|
115
88
|
|
|
116
89
|
this.logger.info('Setting up blacklist token contract');
|
|
117
90
|
await ensureAuthRegistryPublished(this.wallet, this.adminAddress);
|
|
118
|
-
// Create the token contract state.
|
|
119
|
-
this.logger.verbose(`Public deploy accounts...`);
|
|
120
|
-
await publicDeployAccounts(this.wallet, [this.adminAddress, this.otherAddress, this.blacklistedAddress]);
|
|
121
91
|
|
|
122
92
|
this.logger.verbose(`Deploying TokenContract...`);
|
|
123
93
|
({ contract: this.asset } = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
|
|
@@ -155,20 +125,13 @@ export class BlacklistTokenContractTest {
|
|
|
155
125
|
).toEqual(new Role().withAdmin().toNoirStruct());
|
|
156
126
|
}
|
|
157
127
|
|
|
158
|
-
async setup(opts:
|
|
159
|
-
|
|
160
|
-
this.context
|
|
161
|
-
|
|
162
|
-
fundSponsoredFPC: true,
|
|
163
|
-
skipAccountDeployment: true,
|
|
164
|
-
});
|
|
128
|
+
override async setup(opts: AutomineTestOpts = {}) {
|
|
129
|
+
await super.setup({ numberOfAccounts: 3, ...opts });
|
|
130
|
+
// hydrateFromContext repoints `this.logger` at the context logger; restore the harness-named one.
|
|
131
|
+
this.logger = createLogger(`e2e:automine:blacklist:${this.testName}`);
|
|
165
132
|
await this.applyBaseSetup();
|
|
166
133
|
}
|
|
167
134
|
|
|
168
|
-
async teardown() {
|
|
169
|
-
await teardown(this.context);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
135
|
async addPendingShieldNoteToPXE(
|
|
173
136
|
contract: TokenBlacklistContract,
|
|
174
137
|
recipient: AztecAddress,
|