@aztec/end-to-end 5.0.0-rc.1 → 5.0.0
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 +17 -24
- 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 -28
- 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 +25 -10
- package/dest/bench/utils.d.ts +1 -1
- 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 +10 -7
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +33 -14
- package/dest/fixtures/fixtures.d.ts +8 -5
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +12 -4
- 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 +35 -9
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +175 -142
- 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/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 +1 -1
- 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 +36 -9
- 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 -15
- 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/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/{e2e_cross_chain_messaging → single-node/cross-chain}/cross_chain_messaging_test.js +77 -27
- 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 +124 -46
- 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 +373 -0
- package/dest/single-node/single_node_test_context.d.ts.map +1 -0
- package/dest/single-node/single_node_test_context.js +845 -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 +18 -8
- 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 -4
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +20 -4
- 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 +2 -2
- 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 +19 -39
- package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +24 -43
- 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 +39 -12
- package/src/composed/ha/ha_full_setup.ts +466 -0
- package/src/fixtures/e2e_prover_test.ts +40 -23
- package/src/fixtures/fixtures.ts +14 -4
- package/src/fixtures/ha_setup.ts +7 -3
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/setup.ts +217 -146
- 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/wait_helpers.ts +333 -0
- package/src/forward-compatibility/wallet_service.ts +2 -2
- 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 +36 -7
- package/src/{e2e_p2p → p2p}/reqresp/utils.ts +5 -14
- 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/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/{e2e_cross_chain_messaging → single-node/cross-chain}/cross_chain_messaging_test.ts +110 -39
- 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 +141 -48
- 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 +1054 -0
- package/src/spartan/setup_test_wallets.ts +23 -8
- package/src/spartan/tx_metrics.ts +26 -0
- package/src/test-wallet/test_wallet.ts +28 -6
- 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 +5 -9
- package/src/test-wallet/worker_wallet_schema.ts +1 -1
- 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_deploy_contract/deploy_test.d.ts +0 -36
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
- package/dest/e2e_deploy_contract/deploy_test.js +0 -42
- package/dest/e2e_epochs/epochs_test.d.ts +0 -137
- package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
- package/dest/e2e_epochs/epochs_test.js +0 -485
- package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
- package/dest/e2e_fees/fees_test.d.ts +0 -89
- 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 -22
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +0 -40
- 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 -138
- 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_deploy_contract/deploy_test.ts +0 -73
- package/src/e2e_epochs/epochs_test.ts +0 -596
- package/src/e2e_l1_publisher/write_json.ts +0 -77
- package/src/e2e_nested_contract/nested_contract_test.ts +0 -51
- package/src/e2e_p2p/inactivity_slash_test.ts +0 -181
- 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,19 @@
|
|
|
1
|
+
import { type InitialAccountData } from '@aztec/accounts/testing';
|
|
2
|
+
import type { AztecAddress, CompleteAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import type { ResolveCustomRequest, ResolveTaggingSecretStrategy } from '@aztec/pxe/config';
|
|
4
|
+
import { TestWallet } from '../../test-wallet/test_wallet.js';
|
|
5
|
+
export type CustomRequestResponder = (recipient: TestWallet, recipientAccount: InitialAccountData, recipientCompleteAddress: CompleteAddress) => ResolveCustomRequest;
|
|
6
|
+
export type Mode = 'constrained' | 'unconstrained';
|
|
7
|
+
export type DeliveryMode = Mode | {
|
|
8
|
+
events: Mode;
|
|
9
|
+
notes: Mode;
|
|
10
|
+
};
|
|
11
|
+
export declare function buildMessageDeliveryTest(opts: {
|
|
12
|
+
strategy: string;
|
|
13
|
+
mode: DeliveryMode;
|
|
14
|
+
senderHook: ResolveTaggingSecretStrategy;
|
|
15
|
+
recipientRegistration?: (recipient: TestWallet, recipientAddress: AztecAddress, sender: AztecAddress) => Promise<void>;
|
|
16
|
+
customRequestResponder?: CustomRequestResponder;
|
|
17
|
+
additionalTests?: () => void;
|
|
18
|
+
}): void;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25jaGFpbl9kZWxpdmVyeV9oYXJuZXNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXV0b21pbmUvZGVsaXZlcnkvb25jaGFpbl9kZWxpdmVyeV9oYXJuZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUEyQixNQUFNLHlCQUF5QixDQUFDO0FBRzNGLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUsvRSxPQUFPLEtBQUssRUFBaUIsb0JBQW9CLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQU8zRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFJOUQsTUFBTSxNQUFNLHNCQUFzQixHQUFHLENBQ25DLFNBQVMsRUFBRSxVQUFVLEVBQ3JCLGdCQUFnQixFQUFFLGtCQUFrQixFQUNwQyx3QkFBd0IsRUFBRSxlQUFlLEtBQ3RDLG9CQUFvQixDQUFDO0FBRTFCLE1BQU0sTUFBTSxJQUFJLEdBQUcsYUFBYSxHQUFHLGVBQWUsQ0FBQztBQUluRCxNQUFNLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRztJQUFFLE1BQU0sRUFBRSxJQUFJLENBQUM7SUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFBO0NBQUUsQ0FBQztBQVloRSx3QkFBZ0Isd0JBQXdCLENBQUMsSUFBSSxFQUFFO0lBRzdDLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDakIsSUFBSSxFQUFFLFlBQVksQ0FBQztJQUVuQixVQUFVLEVBQUUsNEJBQTRCLENBQUM7SUFFekMscUJBQXFCLENBQUMsRUFBRSxDQUN0QixTQUFTLEVBQUUsVUFBVSxFQUNyQixnQkFBZ0IsRUFBRSxZQUFZLEVBQzlCLE1BQU0sRUFBRSxZQUFZLEtBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUduQixzQkFBc0IsQ0FBQyxFQUFFLHNCQUFzQixDQUFDO0lBSWhELGVBQWUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDO0NBQzlCLFFBdUpBIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onchain_delivery_harness.d.ts","sourceRoot":"","sources":["../../../src/automine/delivery/onchain_delivery_harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAA2B,MAAM,yBAAyB,CAAC;AAG3F,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAK/E,OAAO,KAAK,EAAiB,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAO3G,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAI9D,MAAM,MAAM,sBAAsB,GAAG,CACnC,SAAS,EAAE,UAAU,EACrB,gBAAgB,EAAE,kBAAkB,EACpC,wBAAwB,EAAE,eAAe,KACtC,oBAAoB,CAAC;AAE1B,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG,eAAe,CAAC;AAInD,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;AAYhE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAG7C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IAEnB,UAAU,EAAE,4BAA4B,CAAC;IAEzC,qBAAqB,CAAC,EAAE,CACtB,SAAS,EAAE,UAAU,EACrB,gBAAgB,EAAE,YAAY,EAC9B,MAAM,EAAE,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IAGnB,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAIhD,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B,QAuJA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
3
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { OnchainDeliveryTestContract } from '@aztec/noir-test-contracts.js/OnchainDeliveryTest';
|
|
5
|
+
import { jest } from '@jest/globals';
|
|
6
|
+
import { AUTOMINE_E2E_OPTS } from '../../fixtures/fixtures.js';
|
|
7
|
+
import { ensureHandshakeRegistryPublished, setup, setupPXEAndGetWallet } from '../../fixtures/setup.js';
|
|
8
|
+
const formatMode = (mode)=>typeof mode === 'string' ? mode : `${mode.events}->${mode.notes}`;
|
|
9
|
+
// Onchain private delivery has two orthogonal axes: the delivery MODE (constrained = nullifier-chained sequence;
|
|
10
|
+
// unconstrained = no nullifier, windowed scan) and the tagging-secret SOURCE, which the wallet's
|
|
11
|
+
// `resolveTaggingSecretStrategy` hook selects. This harness exercises (strategy, mode) cells end to end across two
|
|
12
|
+
// PXEs that share only a node: the sender PXE sends, the recipient PXE discovers purely from onchain logs plus the
|
|
13
|
+
// HandshakeRegistry.
|
|
14
|
+
//
|
|
15
|
+
// Cross-PXE is the meaningful setup: the recipient PXE holds no sender state, so a cell only "discovers" a message if
|
|
16
|
+
// the source truly reached it.
|
|
17
|
+
export function buildMessageDeliveryTest(opts) {
|
|
18
|
+
const { strategy, mode, senderHook, recipientRegistration, customRequestResponder, additionalTests } = opts;
|
|
19
|
+
const description = `${strategy} x ${formatMode(mode)}`;
|
|
20
|
+
describe(description, ()=>{
|
|
21
|
+
jest.setTimeout(300_000);
|
|
22
|
+
const eventValues = [
|
|
23
|
+
10n,
|
|
24
|
+
20n,
|
|
25
|
+
30n
|
|
26
|
+
];
|
|
27
|
+
const noteValues = [
|
|
28
|
+
40n,
|
|
29
|
+
50n,
|
|
30
|
+
60n
|
|
31
|
+
];
|
|
32
|
+
let aztecNode;
|
|
33
|
+
let walletSender;
|
|
34
|
+
let walletRecipient;
|
|
35
|
+
let sender;
|
|
36
|
+
let recipient;
|
|
37
|
+
let contractSender;
|
|
38
|
+
let teardownSender;
|
|
39
|
+
let teardownRecipient;
|
|
40
|
+
// Discovery results captured in beforeAll, so the assertions in the actual tests below stay pure.
|
|
41
|
+
// A failure during delivery fails beforeAll loudly instead of being swallowed as an expected red.
|
|
42
|
+
let discoveredEvents;
|
|
43
|
+
let readNotes;
|
|
44
|
+
const { events: eventMode, notes: noteMode } = typeof mode === 'string' ? {
|
|
45
|
+
events: mode,
|
|
46
|
+
notes: mode
|
|
47
|
+
} : mode;
|
|
48
|
+
const sendEvent = (value)=>eventMode === 'constrained' ? contractSender.methods.emit_event(recipient, value) : contractSender.methods.emit_event_unconstrained(recipient, value);
|
|
49
|
+
const sendNote = (value)=>noteMode === 'constrained' ? contractSender.methods.emit_note(recipient, value) : contractSender.methods.emit_note_unconstrained(recipient, value);
|
|
50
|
+
let additionallyFundedAccounts;
|
|
51
|
+
let recipientAccount;
|
|
52
|
+
let customRequestCount = 0;
|
|
53
|
+
beforeAll(async ()=>{
|
|
54
|
+
// The sender PXE holds the sender and carries this cell's tagging-secret-strategy hook. The recipient is funded
|
|
55
|
+
// at genesis here but created and deployed on the isolated recipient PXE below, so it carries no sender state
|
|
56
|
+
// from other cells.
|
|
57
|
+
({ aztecNode, additionallyFundedAccounts, wallet: walletSender, accounts: [sender], teardown: teardownSender } = await setup(1, {
|
|
58
|
+
...AUTOMINE_E2E_OPTS,
|
|
59
|
+
additionallyFundedAccounts: await generateSchnorrAccounts(1, 'schnorr'),
|
|
60
|
+
pxeCreationOptions: {
|
|
61
|
+
hooks: {
|
|
62
|
+
resolveTaggingSecretStrategy: senderHook,
|
|
63
|
+
resolveCustomRequest: async (request)=>{
|
|
64
|
+
if (!customRequestResponder) {
|
|
65
|
+
throw new Error('A custom request arrived but this test cell has no customRequestResponder configured');
|
|
66
|
+
}
|
|
67
|
+
if (!recipientAccount) {
|
|
68
|
+
throw new Error('A custom request arrived before the recipient wallet was created');
|
|
69
|
+
}
|
|
70
|
+
customRequestCount++;
|
|
71
|
+
const respond = customRequestResponder(walletRecipient, additionallyFundedAccounts[0], await recipientAccount.getCompleteAddress());
|
|
72
|
+
return respond(request);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}));
|
|
77
|
+
({ wallet: walletRecipient, teardown: teardownRecipient } = await setupPXEAndGetWallet(aztecNode, aztecNode, {}, undefined, 'pxe-recipient'));
|
|
78
|
+
recipientAccount = await walletRecipient.createSchnorrAccount(additionallyFundedAccounts[0].secret, additionallyFundedAccounts[0].salt, additionallyFundedAccounts[0].signingKey);
|
|
79
|
+
await (await recipientAccount.getDeployMethod()).send({
|
|
80
|
+
from: NO_FROM
|
|
81
|
+
});
|
|
82
|
+
recipient = recipientAccount.address;
|
|
83
|
+
await ensureHandshakeRegistryPublished(walletSender, sender);
|
|
84
|
+
const { contract: deployed, instance } = await OnchainDeliveryTestContract.deploy(walletSender).send({
|
|
85
|
+
from: sender
|
|
86
|
+
});
|
|
87
|
+
contractSender = deployed;
|
|
88
|
+
await ensureHandshakeRegistryPublished(walletRecipient, recipient);
|
|
89
|
+
await walletRecipient.registerContract(instance, OnchainDeliveryTestContract.artifact);
|
|
90
|
+
await recipientRegistration?.(walletRecipient, recipient, sender);
|
|
91
|
+
// Constrained sends to one pair are strictly ordered, so deliver one tx at a time. The first send bootstraps the
|
|
92
|
+
// handshake (when the source is a handshake); the rest reuse it.
|
|
93
|
+
const blockNumbers = [];
|
|
94
|
+
for (const value of eventValues){
|
|
95
|
+
const { receipt } = await sendEvent(value).send({
|
|
96
|
+
from: sender
|
|
97
|
+
});
|
|
98
|
+
blockNumbers.push(receipt.blockNumber);
|
|
99
|
+
}
|
|
100
|
+
for (const value of noteValues){
|
|
101
|
+
await sendNote(value).send({
|
|
102
|
+
from: sender
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
await walletRecipient.sync();
|
|
106
|
+
const events = await walletRecipient.getPrivateEvents(OnchainDeliveryTestContract.events.DeliveryEvent, {
|
|
107
|
+
contractAddress: contractSender.address,
|
|
108
|
+
fromBlock: BlockNumber(Math.min(...blockNumbers)),
|
|
109
|
+
toBlock: BlockNumber(Math.max(...blockNumbers) + 1),
|
|
110
|
+
scopes: [
|
|
111
|
+
recipient
|
|
112
|
+
]
|
|
113
|
+
});
|
|
114
|
+
discoveredEvents = events.map((e)=>e.event.value);
|
|
115
|
+
const contractRecipient = OnchainDeliveryTestContract.at(contractSender.address, walletRecipient);
|
|
116
|
+
const { result } = await contractRecipient.methods.get_note_values(recipient).simulate({
|
|
117
|
+
from: recipient
|
|
118
|
+
});
|
|
119
|
+
readNotes = result.storage.slice(0, Number(result.len));
|
|
120
|
+
});
|
|
121
|
+
afterAll(async ()=>{
|
|
122
|
+
await teardownRecipient();
|
|
123
|
+
await teardownSender();
|
|
124
|
+
});
|
|
125
|
+
it('the recipient PXE discovers the events delivered by the sender PXE', ()=>{
|
|
126
|
+
expect(discoveredEvents.length).toBe(eventValues.length);
|
|
127
|
+
for (const value of eventValues){
|
|
128
|
+
expect(discoveredEvents).toContainEqual(value);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
it('the recipient PXE reads back the notes delivered by the sender PXE', ()=>{
|
|
132
|
+
expect(readNotes).toEqual(noteValues);
|
|
133
|
+
});
|
|
134
|
+
if (customRequestResponder) {
|
|
135
|
+
it('the custom request hook fires exactly once, on the send that bootstraps the tagging secret', ()=>{
|
|
136
|
+
expect(customRequestCount).toBe(1);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
additionalTests?.();
|
|
140
|
+
});
|
|
141
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
3
|
+
import type { TxHash } from '@aztec/aztec.js/tx';
|
|
4
|
+
import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist';
|
|
5
|
+
import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
6
|
+
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
7
|
+
import { TokenSimulator } from '../../simulators/token_simulator.js';
|
|
8
|
+
import { AutomineTestContext, type AutomineTestOpts } from '../automine_test_context.js';
|
|
9
|
+
export declare class Role {
|
|
10
|
+
private isAdmin;
|
|
11
|
+
private isMinter;
|
|
12
|
+
private isBlacklisted;
|
|
13
|
+
withAdmin(): this;
|
|
14
|
+
withMinter(): this;
|
|
15
|
+
withBlacklisted(): this;
|
|
16
|
+
toNoirStruct(): {
|
|
17
|
+
is_admin: boolean;
|
|
18
|
+
is_minter: boolean;
|
|
19
|
+
is_blacklisted: boolean;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* TokenBlacklist-domain harness over the automine topology: extends {@link AutomineTestContext} with a
|
|
24
|
+
* {@link TokenSimulator}, the {@link Role} helper, the TokenBlacklist deploy plus a bad-account and
|
|
25
|
+
* authwit proxy, and the role-change-delay warp. Base setup and mint run in {@link setup}.
|
|
26
|
+
*/
|
|
27
|
+
export declare class BlacklistTokenContractTest extends AutomineTestContext {
|
|
28
|
+
static CHANGE_ROLES_DELAY: number;
|
|
29
|
+
asset: TokenBlacklistContract;
|
|
30
|
+
tokenSim: TokenSimulator;
|
|
31
|
+
badAccount: InvalidAccountContract;
|
|
32
|
+
authwitProxy: GenericProxyContract;
|
|
33
|
+
adminAddress: AztecAddress;
|
|
34
|
+
otherAddress: AztecAddress;
|
|
35
|
+
blacklistedAddress: AztecAddress;
|
|
36
|
+
private testName;
|
|
37
|
+
constructor(testName: string);
|
|
38
|
+
crossTimestampOfChange(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Applies base setup:
|
|
41
|
+
* 1. Add 3 accounts.
|
|
42
|
+
* 2. Publicly deploy accounts, deploy token contract and a "bad account".
|
|
43
|
+
*/
|
|
44
|
+
applyBaseSetup(): Promise<void>;
|
|
45
|
+
setup(opts?: AutomineTestOpts): Promise<void>;
|
|
46
|
+
addPendingShieldNoteToPXE(contract: TokenBlacklistContract, recipient: AztecAddress, amount: bigint, secretHash: Fr, txHash: TxHash): Promise<void>;
|
|
47
|
+
applyMint(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxhY2tsaXN0X3Rva2VuX2NvbnRyYWN0X3Rlc3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRvbWluZS90b2tlbi9ibGFja2xpc3RfdG9rZW5fY29udHJhY3RfdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVDLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBS3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXpGLHFCQUFhLElBQUk7SUFDZixPQUFPLENBQUMsT0FBTyxDQUFTO0lBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQVM7SUFDekIsT0FBTyxDQUFDLGFBQWEsQ0FBUztJQUU5QixTQUFTLFNBR1I7SUFFRCxVQUFVLFNBR1Q7SUFFRCxlQUFlLFNBR2Q7SUFFRCxZQUFZOzs7O01BSVg7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxxQkFBYSwwQkFBMkIsU0FBUSxtQkFBbUI7SUFFakUsTUFBTSxDQUFDLGtCQUFrQixTQUFTO0lBRWxDLEtBQUssRUFBRyxzQkFBc0IsQ0FBQztJQUMvQixRQUFRLEVBQUcsY0FBYyxDQUFDO0lBQzFCLFVBQVUsRUFBRyxzQkFBc0IsQ0FBQztJQUNwQyxZQUFZLEVBQUcsb0JBQW9CLENBQUM7SUFFcEMsWUFBWSxFQUFHLFlBQVksQ0FBQztJQUM1QixZQUFZLEVBQUcsWUFBWSxDQUFDO0lBQzVCLGtCQUFrQixFQUFHLFlBQVksQ0FBQztJQUVsQyxPQUFPLENBQUMsUUFBUSxDQUFTO0lBRXpCLFlBQVksUUFBUSxFQUFFLE1BQU0sRUFHM0I7SUFFSyxzQkFBc0Isa0JBRTNCO0lBRUQ7Ozs7T0FJRztJQUNHLGNBQWMsa0JBZ0RuQjtJQUVjLEtBQUssQ0FBQyxJQUFJLEdBQUUsZ0JBQXFCLGlCQUsvQztJQUVLLHlCQUF5QixDQUM3QixRQUFRLEVBQUUsc0JBQXNCLEVBQ2hDLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLE1BQU0sRUFBRSxNQUFNLEVBQ2QsVUFBVSxFQUFFLEVBQUUsRUFDZCxNQUFNLEVBQUUsTUFBTSxpQkFjZjtJQUVLLFNBQVMsa0JBbURkO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blacklist_token_contract_test.d.ts","sourceRoot":"","sources":["../../../src/automine/token/blacklist_token_contract_test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAKtF,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEzF,qBAAa,IAAI;IACf,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAS;IAE9B,SAAS,SAGR;IAED,UAAU,SAGT;IAED,eAAe,SAGd;IAED,YAAY;;;;MAIX;CACF;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,mBAAmB;IAEjE,MAAM,CAAC,kBAAkB,SAAS;IAElC,KAAK,EAAG,sBAAsB,CAAC;IAC/B,QAAQ,EAAG,cAAc,CAAC;IAC1B,UAAU,EAAG,sBAAsB,CAAC;IACpC,YAAY,EAAG,oBAAoB,CAAC;IAEpC,YAAY,EAAG,YAAY,CAAC;IAC5B,YAAY,EAAG,YAAY,CAAC;IAC5B,kBAAkB,EAAG,YAAY,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,QAAQ,EAAE,MAAM,EAG3B;IAEK,sBAAsB,kBAE3B;IAED;;;;OAIG;IACG,cAAc,kBAgDnB;IAEc,KAAK,CAAC,IAAI,GAAE,gBAAqB,iBAK/C;IAEK,yBAAyB,CAC7B,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,EAAE,EACd,MAAM,EAAE,MAAM,iBAcf;IAEK,SAAS,kBAmDd;CACF"}
|
package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js
RENAMED
|
@@ -5,8 +5,9 @@ import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist'
|
|
|
5
5
|
import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
6
6
|
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
7
7
|
import { jest } from '@jest/globals';
|
|
8
|
-
import { ensureAuthRegistryPublished
|
|
9
|
-
import { TokenSimulator } from '
|
|
8
|
+
import { ensureAuthRegistryPublished } from '../../fixtures/setup.js';
|
|
9
|
+
import { TokenSimulator } from '../../simulators/token_simulator.js';
|
|
10
|
+
import { AutomineTestContext } from '../automine_test_context.js';
|
|
10
11
|
export class Role {
|
|
11
12
|
isAdmin = false;
|
|
12
13
|
isMinter = false;
|
|
@@ -33,33 +34,27 @@ export class Role {
|
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
+
/**
|
|
38
|
+
* TokenBlacklist-domain harness over the automine topology: extends {@link AutomineTestContext} with a
|
|
39
|
+
* {@link TokenSimulator}, the {@link Role} helper, the TokenBlacklist deploy plus a bad-account and
|
|
40
|
+
* authwit proxy, and the role-change-delay warp. Base setup and mint run in {@link setup}.
|
|
41
|
+
*/ export class BlacklistTokenContractTest extends AutomineTestContext {
|
|
37
42
|
// This value MUST match the same value that we have in the contract
|
|
38
43
|
static CHANGE_ROLES_DELAY = 86400;
|
|
39
|
-
context;
|
|
40
|
-
logger;
|
|
41
|
-
wallet;
|
|
42
44
|
asset;
|
|
43
45
|
tokenSim;
|
|
44
46
|
badAccount;
|
|
45
47
|
authwitProxy;
|
|
46
|
-
cheatCodes;
|
|
47
|
-
sequencer;
|
|
48
|
-
aztecNode;
|
|
49
48
|
adminAddress;
|
|
50
49
|
otherAddress;
|
|
51
50
|
blacklistedAddress;
|
|
51
|
+
testName;
|
|
52
52
|
constructor(testName){
|
|
53
|
-
|
|
53
|
+
super();
|
|
54
|
+
this.testName = testName;
|
|
54
55
|
}
|
|
55
56
|
async crossTimestampOfChange() {
|
|
56
|
-
|
|
57
|
-
// submitted. Mark current pending checkpoints as proven first so the rollup contract's
|
|
58
|
-
// pruning window doesn't reset the chain tip to genesis (which would make the warp's
|
|
59
|
-
// own empty-checkpoint propose fail with Rollup__InvalidArchive). See the AutomineSequencer
|
|
60
|
-
// README "Epoch proving caveat" and the equivalent pattern in lending_simulator.progressSlots.
|
|
61
|
-
await this.cheatCodes.rollup.markAsProven();
|
|
62
|
-
await this.cheatCodes.warpL2TimeAtLeastBy(this.aztecNode, BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
|
|
57
|
+
await this.markProvenAndWarp(BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
|
|
63
58
|
}
|
|
64
59
|
/**
|
|
65
60
|
* Applies base setup:
|
|
@@ -105,16 +100,14 @@ export class BlacklistTokenContractTest {
|
|
|
105
100
|
})).result).toEqual(new Role().withAdmin().toNoirStruct());
|
|
106
101
|
}
|
|
107
102
|
async setup(opts = {}) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
...opts
|
|
111
|
-
fundSponsoredFPC: true
|
|
103
|
+
await super.setup({
|
|
104
|
+
numberOfAccounts: 3,
|
|
105
|
+
...opts
|
|
112
106
|
});
|
|
107
|
+
// hydrateFromContext repoints `this.logger` at the context logger; restore the harness-named one.
|
|
108
|
+
this.logger = createLogger(`e2e:automine:blacklist:${this.testName}`);
|
|
113
109
|
await this.applyBaseSetup();
|
|
114
110
|
}
|
|
115
|
-
async teardown() {
|
|
116
|
-
await teardown(this.context);
|
|
117
|
-
}
|
|
118
111
|
async addPendingShieldNoteToPXE(contract, recipient, amount, secretHash, txHash) {
|
|
119
112
|
const txEffects = await this.aztecNode.getTxEffect(txHash);
|
|
120
113
|
await contract.methods.process_transparent_note(contract.address, amount, secretHash, txHash.hash, txEffects.data.noteHashes, txEffects.data.nullifiers[0], recipient).simulate({
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
3
|
+
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
4
|
+
import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
5
|
+
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
6
|
+
import { TokenSimulator } from '../../simulators/token_simulator.js';
|
|
7
|
+
import { AutomineTestContext, type AutomineTestOpts } from '../automine_test_context.js';
|
|
8
|
+
/**
|
|
9
|
+
* Token-domain harness over the automine topology: extends {@link AutomineTestContext} with a
|
|
10
|
+
* {@link TokenSimulator}, the USDC Token deploy plus a bad-account and authwit proxy, and an optional
|
|
11
|
+
* mint. Base setup is opt-in via {@link applyBaseSnapshots} (run during `setup()`); {@link applyMint}
|
|
12
|
+
* is called explicitly after `setup()`.
|
|
13
|
+
*/
|
|
14
|
+
export declare class TokenContractTest extends AutomineTestContext {
|
|
15
|
+
static TOKEN_NAME: string;
|
|
16
|
+
static TOKEN_SYMBOL: string;
|
|
17
|
+
static TOKEN_DECIMALS: bigint;
|
|
18
|
+
metricsPort?: number;
|
|
19
|
+
asset: TokenContract;
|
|
20
|
+
tokenSim: TokenSimulator;
|
|
21
|
+
node: AztecNode;
|
|
22
|
+
badAccount: InvalidAccountContract;
|
|
23
|
+
authwitProxy: GenericProxyContract;
|
|
24
|
+
adminAddress: AztecAddress;
|
|
25
|
+
otherAddress: AztecAddress;
|
|
26
|
+
account2Address: AztecAddress;
|
|
27
|
+
private shouldApplyBaseSetup;
|
|
28
|
+
private testName;
|
|
29
|
+
constructor(testName: string);
|
|
30
|
+
/**
|
|
31
|
+
* Registers that base setup should be applied during setup().
|
|
32
|
+
* Call this before setup() to deploy 3 accounts, publicly deploy accounts, token contract and a "bad account".
|
|
33
|
+
*/
|
|
34
|
+
applyBaseSnapshots(): void;
|
|
35
|
+
private applyBaseSetup;
|
|
36
|
+
setup(opts?: AutomineTestOpts): Promise<void>;
|
|
37
|
+
/** Mints an initial public and private balance to the admin account. Call after {@link setup}. */
|
|
38
|
+
applyMint(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5fY29udHJhY3RfdGVzdC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F1dG9taW5lL3Rva2VuL3Rva2VuX2NvbnRyYWN0X3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQU10RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLEtBQUssZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUl6Rjs7Ozs7R0FLRztBQUNILHFCQUFhLGlCQUFrQixTQUFRLG1CQUFtQjtJQUN4RCxNQUFNLENBQUMsVUFBVSxTQUFVO0lBQzNCLE1BQU0sQ0FBQyxZQUFZLFNBQVM7SUFDNUIsTUFBTSxDQUFDLGNBQWMsU0FBTztJQUM1QixXQUFXLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDckIsS0FBSyxFQUFHLGFBQWEsQ0FBQztJQUN0QixRQUFRLEVBQUcsY0FBYyxDQUFDO0lBQzFCLElBQUksRUFBRyxTQUFTLENBQUM7SUFFakIsVUFBVSxFQUFHLHNCQUFzQixDQUFDO0lBQ3BDLFlBQVksRUFBRyxvQkFBb0IsQ0FBQztJQUNwQyxZQUFZLEVBQUcsWUFBWSxDQUFDO0lBQzVCLFlBQVksRUFBRyxZQUFZLENBQUM7SUFDNUIsZUFBZSxFQUFHLFlBQVksQ0FBQztJQUUvQixPQUFPLENBQUMsb0JBQW9CLENBQVM7SUFDckMsT0FBTyxDQUFDLFFBQVEsQ0FBUztJQUV6QixZQUFZLFFBQVEsRUFBRSxNQUFNLEVBSTNCO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLFNBRWpCO1lBS2EsY0FBYztJQThDYixLQUFLLENBQUMsSUFBSSxHQUFFLGdCQUFxQixpQkFRL0M7SUFFRCxrR0FBa0c7SUFDNUYsU0FBUyxrQkE4QmQ7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token_contract_test.d.ts","sourceRoot":"","sources":["../../../src/automine/token/token_contract_test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAMtF,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAIzF;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,mBAAmB;IACxD,MAAM,CAAC,UAAU,SAAU;IAC3B,MAAM,CAAC,YAAY,SAAS;IAC5B,MAAM,CAAC,cAAc,SAAO;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAG,aAAa,CAAC;IACtB,QAAQ,EAAG,cAAc,CAAC;IAC1B,IAAI,EAAG,SAAS,CAAC;IAEjB,UAAU,EAAG,sBAAsB,CAAC;IACpC,YAAY,EAAG,oBAAoB,CAAC;IACpC,YAAY,EAAG,YAAY,CAAC;IAC5B,YAAY,EAAG,YAAY,CAAC;IAC5B,eAAe,EAAG,YAAY,CAAC;IAE/B,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,QAAQ,EAAE,MAAM,EAI3B;IAED;;;OAGG;IACH,kBAAkB,SAEjB;YAKa,cAAc;IA8Cb,KAAK,CAAC,IAAI,GAAE,gBAAqB,iBAQ/C;IAED,kGAAkG;IAC5F,SAAS,kBA8Bd;CACF"}
|
|
@@ -3,30 +3,34 @@ import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
|
3
3
|
import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
4
4
|
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
5
5
|
import { jest } from '@jest/globals';
|
|
6
|
-
import { ensureAuthRegistryPublished
|
|
7
|
-
import { mintTokensToPrivate } from '
|
|
8
|
-
import { TokenSimulator } from '
|
|
6
|
+
import { ensureAuthRegistryPublished } from '../../fixtures/setup.js';
|
|
7
|
+
import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
|
|
8
|
+
import { TokenSimulator } from '../../simulators/token_simulator.js';
|
|
9
|
+
import { AutomineTestContext } from '../automine_test_context.js';
|
|
9
10
|
const { METRICS_PORT: metricsPort } = process.env;
|
|
10
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Token-domain harness over the automine topology: extends {@link AutomineTestContext} with a
|
|
13
|
+
* {@link TokenSimulator}, the USDC Token deploy plus a bad-account and authwit proxy, and an optional
|
|
14
|
+
* mint. Base setup is opt-in via {@link applyBaseSnapshots} (run during `setup()`); {@link applyMint}
|
|
15
|
+
* is called explicitly after `setup()`.
|
|
16
|
+
*/ export class TokenContractTest extends AutomineTestContext {
|
|
11
17
|
static TOKEN_NAME = 'USDC';
|
|
12
18
|
static TOKEN_SYMBOL = 'USD';
|
|
13
19
|
static TOKEN_DECIMALS = 18n;
|
|
14
|
-
context;
|
|
15
|
-
logger;
|
|
16
20
|
metricsPort;
|
|
17
21
|
asset;
|
|
18
22
|
tokenSim;
|
|
19
23
|
node;
|
|
20
24
|
badAccount;
|
|
21
25
|
authwitProxy;
|
|
22
|
-
wallet;
|
|
23
26
|
adminAddress;
|
|
24
|
-
|
|
27
|
+
otherAddress;
|
|
25
28
|
account2Address;
|
|
26
29
|
shouldApplyBaseSetup = false;
|
|
27
|
-
|
|
30
|
+
testName;
|
|
28
31
|
constructor(testName){
|
|
29
|
-
|
|
32
|
+
super();
|
|
33
|
+
this.testName = testName;
|
|
30
34
|
this.metricsPort = metricsPort ? parseInt(metricsPort) : undefined;
|
|
31
35
|
}
|
|
32
36
|
/**
|
|
@@ -36,19 +40,13 @@ export class TokenContractTest {
|
|
|
36
40
|
this.shouldApplyBaseSetup = true;
|
|
37
41
|
}
|
|
38
42
|
/**
|
|
39
|
-
* Registers that mint should be applied during setup().
|
|
40
|
-
* Call this before setup() to mint tokens to the admin account.
|
|
41
|
-
*/ applyMintSnapshot() {
|
|
42
|
-
this.shouldApplyMint = true;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
43
|
* Applies base setup: deploys 3 accounts, publicly deploys accounts, token contract and a "bad account".
|
|
46
44
|
*/ async applyBaseSetup() {
|
|
47
45
|
// Adding a timeout of 2 minutes in here such that it is propagated to the underlying tests
|
|
48
46
|
jest.setTimeout(120_000);
|
|
49
47
|
this.node = this.context.aztecNodeService;
|
|
50
48
|
this.wallet = this.context.wallet;
|
|
51
|
-
[this.adminAddress, this.
|
|
49
|
+
[this.adminAddress, this.otherAddress, this.account2Address] = this.context.accounts;
|
|
52
50
|
this.logger.info('Applying base setup - deploying token contract');
|
|
53
51
|
await ensureAuthRegistryPublished(this.wallet, this.adminAddress);
|
|
54
52
|
this.logger.verbose(`Deploying TokenContract...`);
|
|
@@ -71,29 +69,25 @@ export class TokenContractTest {
|
|
|
71
69
|
this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
|
|
72
70
|
this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
|
|
73
71
|
this.adminAddress,
|
|
74
|
-
this.
|
|
72
|
+
this.otherAddress
|
|
75
73
|
]);
|
|
76
74
|
expect((await this.asset.methods.get_admin().simulate({
|
|
77
75
|
from: this.adminAddress
|
|
78
76
|
})).result).toBe(this.adminAddress.toBigInt());
|
|
79
77
|
}
|
|
80
78
|
async setup(opts = {}) {
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
await super.setup({
|
|
80
|
+
numberOfAccounts: 3,
|
|
83
81
|
metricsPort: this.metricsPort,
|
|
84
|
-
|
|
82
|
+
...opts
|
|
85
83
|
});
|
|
84
|
+
// hydrateFromContext repoints `this.logger` at the context logger; restore the harness-named one.
|
|
85
|
+
this.logger = createLogger(`e2e:automine:token:${this.testName}`);
|
|
86
86
|
if (this.shouldApplyBaseSetup) {
|
|
87
87
|
await this.applyBaseSetup();
|
|
88
88
|
}
|
|
89
|
-
if (this.shouldApplyMint) {
|
|
90
|
-
await this.applyMint();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
async teardown() {
|
|
94
|
-
await teardown(this.context);
|
|
95
89
|
}
|
|
96
|
-
async applyMint() {
|
|
90
|
+
/** Mints an initial public and private balance to the admin account. Call after {@link setup}. */ async applyMint() {
|
|
97
91
|
this.logger.info('Applying mint setup');
|
|
98
92
|
const { asset, adminAddress, tokenSim } = this;
|
|
99
93
|
const amount = 10000n;
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
import { type AnyTokenContract } from '../../fixtures/token_utils.js';
|
|
8
|
+
import type { TestWallet } from '../../test-wallet/test_wallet.js';
|
|
9
|
+
/** Whether an amount / balance is read from the private or public balance of the token. */
|
|
10
|
+
export type BalanceKind = 'private' | 'public';
|
|
11
|
+
/** The invalid-authwit-nonce assertion the contract raises when `from == msg_sender` but nonce != 0. */
|
|
12
|
+
export declare const INVALID_AUTHWIT_NONCE_ERROR = "Assertion failed: Invalid authwit nonce. When 'from' and 'msg_sender' are the same, 'authwit_nonce' must be zero";
|
|
13
|
+
/** Minimal token shape needed to read balances — satisfied structurally by Token/TestToken/TokenBlacklist. */
|
|
14
|
+
export interface BalanceReadable {
|
|
15
|
+
methods: {
|
|
16
|
+
balance_of_private(owner: AztecAddress): {
|
|
17
|
+
simulate(opts: {
|
|
18
|
+
from: AztecAddress;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
result: bigint;
|
|
21
|
+
}>;
|
|
22
|
+
};
|
|
23
|
+
balance_of_public(owner: AztecAddress): {
|
|
24
|
+
simulate(opts: {
|
|
25
|
+
from: AztecAddress;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
result: bigint;
|
|
28
|
+
}>;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Reads the private or public balance of an account, simulating from that account's own scope. */
|
|
33
|
+
export declare function balanceOf(asset: BalanceReadable, kind: BalanceKind, account: AztecAddress): Promise<bigint>;
|
|
34
|
+
/** Returns half of an account's balance, asserting it is non-zero so the operation under test is meaningful. */
|
|
35
|
+
export declare function halfBalanceOf(asset: BalanceReadable, kind: BalanceKind, owner: AztecAddress): Promise<bigint>;
|
|
36
|
+
/** Returns an amount just above an account's balance (balance + delta), asserting it is non-zero. */
|
|
37
|
+
export declare function amountAboveBalance(asset: BalanceReadable, kind: BalanceKind, owner: AztecAddress, delta?: bigint): Promise<bigint>;
|
|
38
|
+
/**
|
|
39
|
+
* Grants a public authwit for `caller` to run `action` on behalf of `owner`, executes it from `caller`,
|
|
40
|
+
* then asserts a replay of the same call reverts as unauthorized (the authwit is single-use).
|
|
41
|
+
*
|
|
42
|
+
* `onExecuted` runs after the successful execution (before the replay attempt) so callers can update
|
|
43
|
+
* their {@link TokenSimulator} to match the state change the executed action produced.
|
|
44
|
+
*/
|
|
45
|
+
export declare function assertPublicAuthwitReplayRejected(wallet: TestWallet, owner: AztecAddress, action: ContractFunctionInteraction, caller: AztecAddress, onExecuted?: () => void): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Creates a private authwit for `owner`, executes `action` through the authwit proxy (so `msg_sender`
|
|
48
|
+
* differs from the note owner), then asserts a replay reverts with a duplicate-nullifier error.
|
|
49
|
+
*
|
|
50
|
+
* `onExecuted` runs after the successful execution (before the replay attempt) so callers can update
|
|
51
|
+
* their {@link TokenSimulator} to match the state change the executed action produced.
|
|
52
|
+
*/
|
|
53
|
+
export declare function assertAuthwitProxyReplayRejected(proxy: GenericProxyContract, wallet: TestWallet, owner: AztecAddress, action: ContractFunctionInteraction, onExecuted?: () => void): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Deploys an {@link AMMContract} over three freshly deployed tokens (token0, token1, and the liquidity
|
|
56
|
+
* token), makes the AMM the liquidity token's minter, and mints `initialBalance` of token0 and token1 to
|
|
57
|
+
* each liquidity provider plus token0 to the swapper. `deploy` selects the token flavour (Token vs
|
|
58
|
+
* TestToken), so the concrete token type flows through to the caller.
|
|
59
|
+
*/
|
|
60
|
+
export declare function deployAmmWithTokens<T extends AnyTokenContract>(wallet: Wallet, admin: AztecAddress, deploy: (wallet: Wallet, admin: AztecAddress, initialBalance: bigint, logger: Logger) => Promise<{
|
|
61
|
+
contract: T;
|
|
62
|
+
}>, opts: {
|
|
63
|
+
liquidityProviders: AztecAddress[];
|
|
64
|
+
swapper: AztecAddress;
|
|
65
|
+
initialBalance: bigint;
|
|
66
|
+
logger: Logger;
|
|
67
|
+
}): Promise<{
|
|
68
|
+
token0: T;
|
|
69
|
+
token1: T;
|
|
70
|
+
liquidityToken: T;
|
|
71
|
+
amm: AMMContract;
|
|
72
|
+
}>;
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5fdGVzdF9oZWxwZXJzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXV0b21pbmUvdG9rZW4vdG9rZW5fdGVzdF9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0UsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFJdkYsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLEVBQXVCLE1BQU0sK0JBQStCLENBQUM7QUFDM0YsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFbkUsMkZBQTJGO0FBQzNGLE1BQU0sTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUUvQyx3R0FBd0c7QUFDeEcsZUFBTyxNQUFNLDJCQUEyQixxSEFDNEUsQ0FBQztBQUVySCxnSEFBOEc7QUFDOUcsTUFBTSxXQUFXLGVBQWU7SUFDOUIsT0FBTyxFQUFFO1FBQ1Asa0JBQWtCLENBQUMsS0FBSyxFQUFFLFlBQVksR0FBRztZQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Z0JBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQTthQUFFLEdBQUcsT0FBTyxDQUFDO2dCQUFFLE1BQU0sRUFBRSxNQUFNLENBQUE7YUFBRSxDQUFDLENBQUE7U0FBRSxDQUFDO1FBQ2pILGlCQUFpQixDQUFDLEtBQUssRUFBRSxZQUFZLEdBQUc7WUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUFFLElBQUksRUFBRSxZQUFZLENBQUE7YUFBRSxHQUFHLE9BQU8sQ0FBQztnQkFBRSxNQUFNLEVBQUUsTUFBTSxDQUFBO2FBQUUsQ0FBQyxDQUFBO1NBQUUsQ0FBQztLQUNqSCxDQUFDO0NBQ0g7QUFFRCxtR0FBbUc7QUFDbkcsd0JBQXNCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBSWpIO0FBRUQsZ0hBQWdIO0FBQ2hILHdCQUFzQixhQUFhLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUluSDtBQUVELHFHQUFxRztBQUNyRyx3QkFBc0Isa0JBQWtCLENBQ3RDLEtBQUssRUFBRSxlQUFlLEVBQ3RCLElBQUksRUFBRSxXQUFXLEVBQ2pCLEtBQUssRUFBRSxZQUFZLEVBQ25CLEtBQUssU0FBSyxHQUNULE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FJakI7QUFFRDs7Ozs7O0dBTUc7QUFDSCx3QkFBc0IsaUNBQWlDLENBQ3JELE1BQU0sRUFBRSxVQUFVLEVBQ2xCLEtBQUssRUFBRSxZQUFZLEVBQ25CLE1BQU0sRUFBRSwyQkFBMkIsRUFDbkMsTUFBTSxFQUFFLFlBQVksRUFDcEIsVUFBVSxDQUFDLEVBQUUsTUFBTSxJQUFJLEdBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FRZjtBQUVEOzs7Ozs7R0FNRztBQUNILHdCQUFzQixnQ0FBZ0MsQ0FDcEQsS0FBSyxFQUFFLG9CQUFvQixFQUMzQixNQUFNLEVBQUUsVUFBVSxFQUNsQixLQUFLLEVBQUUsWUFBWSxFQUNuQixNQUFNLEVBQUUsMkJBQTJCLEVBQ25DLFVBQVUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxHQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLENBU2Y7QUFFRDs7Ozs7R0FLRztBQUNILHdCQUFzQixtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLEVBQ2xFLE1BQU0sRUFBRSxNQUFNLEVBQ2QsS0FBSyxFQUFFLFlBQVksRUFDbkIsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sS0FBSyxPQUFPLENBQUM7SUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0NBQUUsQ0FBQyxFQUNqSCxJQUFJLEVBQUU7SUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7SUFBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQTtDQUFFLEdBQzFHLE9BQU8sQ0FBQztJQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUFDLEdBQUcsRUFBRSxXQUFXLENBQUE7Q0FBRSxDQUFDLENBMEJ4RSJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token_test_helpers.d.ts","sourceRoot":"","sources":["../../../src/automine/token/token_test_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAIvF,OAAO,EAAE,KAAK,gBAAgB,EAAuB,MAAM,+BAA+B,CAAC;AAC3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,2FAA2F;AAC3F,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE/C,wGAAwG;AACxG,eAAO,MAAM,2BAA2B,qHAC4E,CAAC;AAErH,gHAA8G;AAC9G,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QACP,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG;YAAE,QAAQ,CAAC,IAAI,EAAE;gBAAE,IAAI,EAAE,YAAY,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC;QACjH,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG;YAAE,QAAQ,CAAC,IAAI,EAAE;gBAAE,IAAI,EAAE,YAAY,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC;KACjH,CAAC;CACH;AAED,mGAAmG;AACnG,wBAAsB,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAIjH;AAED,gHAAgH;AAChH,wBAAsB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAInH;AAED,qGAAqG;AACrG,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,YAAY,EACnB,KAAK,SAAK,GACT,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;;GAMG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,2BAA2B,EACnC,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,MAAM,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;GAMG;AACH,wBAAsB,gCAAgC,CACpD,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,2BAA2B,EACnC,UAAU,CAAC,EAAE,MAAM,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,SAAS,gBAAgB,EAClE,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,QAAQ,EAAE,CAAC,CAAA;CAAE,CAAC,EACjH,IAAI,EAAE;IAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1G,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,cAAc,EAAE,CAAC,CAAC;IAAC,GAAG,EAAE,WAAW,CAAA;CAAE,CAAC,CA0BxE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { AMMContract } from '@aztec/noir-contracts.js/AMM';
|
|
2
|
+
import { sendThroughAuthwitProxy } from '../../fixtures/authwit_proxy.js';
|
|
3
|
+
import { DUPLICATE_NULLIFIER_ERROR } from '../../fixtures/fixtures.js';
|
|
4
|
+
import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
|
|
5
|
+
/** The invalid-authwit-nonce assertion the contract raises when `from == msg_sender` but nonce != 0. */ export const INVALID_AUTHWIT_NONCE_ERROR = "Assertion failed: Invalid authwit nonce. When 'from' and 'msg_sender' are the same, 'authwit_nonce' must be zero";
|
|
6
|
+
/** Reads the private or public balance of an account, simulating from that account's own scope. */ export async function balanceOf(asset, kind, account) {
|
|
7
|
+
const interaction = kind === 'private' ? asset.methods.balance_of_private(account) : asset.methods.balance_of_public(account);
|
|
8
|
+
return (await interaction.simulate({
|
|
9
|
+
from: account
|
|
10
|
+
})).result;
|
|
11
|
+
}
|
|
12
|
+
/** Returns half of an account's balance, asserting it is non-zero so the operation under test is meaningful. */ export async function halfBalanceOf(asset, kind, owner) {
|
|
13
|
+
const amount = await balanceOf(asset, kind, owner) / 2n;
|
|
14
|
+
expect(amount).toBeGreaterThan(0n);
|
|
15
|
+
return amount;
|
|
16
|
+
}
|
|
17
|
+
/** Returns an amount just above an account's balance (balance + delta), asserting it is non-zero. */ export async function amountAboveBalance(asset, kind, owner, delta = 1n) {
|
|
18
|
+
const amount = await balanceOf(asset, kind, owner) + delta;
|
|
19
|
+
expect(amount).toBeGreaterThan(0n);
|
|
20
|
+
return amount;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Grants a public authwit for `caller` to run `action` on behalf of `owner`, executes it from `caller`,
|
|
24
|
+
* then asserts a replay of the same call reverts as unauthorized (the authwit is single-use).
|
|
25
|
+
*
|
|
26
|
+
* `onExecuted` runs after the successful execution (before the replay attempt) so callers can update
|
|
27
|
+
* their {@link TokenSimulator} to match the state change the executed action produced.
|
|
28
|
+
*/ export async function assertPublicAuthwitReplayRejected(wallet, owner, action, caller, onExecuted) {
|
|
29
|
+
const grant = await wallet.setPublicAuthWit(owner, {
|
|
30
|
+
caller,
|
|
31
|
+
action
|
|
32
|
+
}, true);
|
|
33
|
+
await grant.send();
|
|
34
|
+
await action.send({
|
|
35
|
+
from: caller
|
|
36
|
+
});
|
|
37
|
+
onExecuted?.();
|
|
38
|
+
await expect(action.simulate({
|
|
39
|
+
from: caller
|
|
40
|
+
})).rejects.toThrow(/unauthorized/);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Creates a private authwit for `owner`, executes `action` through the authwit proxy (so `msg_sender`
|
|
44
|
+
* differs from the note owner), then asserts a replay reverts with a duplicate-nullifier error.
|
|
45
|
+
*
|
|
46
|
+
* `onExecuted` runs after the successful execution (before the replay attempt) so callers can update
|
|
47
|
+
* their {@link TokenSimulator} to match the state change the executed action produced.
|
|
48
|
+
*/ export async function assertAuthwitProxyReplayRejected(proxy, wallet, owner, action, onExecuted) {
|
|
49
|
+
const witness = await wallet.createAuthWit(owner, {
|
|
50
|
+
caller: proxy.address,
|
|
51
|
+
action
|
|
52
|
+
});
|
|
53
|
+
await sendThroughAuthwitProxy(proxy, action, {
|
|
54
|
+
from: owner,
|
|
55
|
+
authWitnesses: [
|
|
56
|
+
witness
|
|
57
|
+
]
|
|
58
|
+
});
|
|
59
|
+
onExecuted?.();
|
|
60
|
+
await expect(sendThroughAuthwitProxy(proxy, action, {
|
|
61
|
+
from: owner,
|
|
62
|
+
authWitnesses: [
|
|
63
|
+
witness
|
|
64
|
+
]
|
|
65
|
+
})).rejects.toThrow(DUPLICATE_NULLIFIER_ERROR);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Deploys an {@link AMMContract} over three freshly deployed tokens (token0, token1, and the liquidity
|
|
69
|
+
* token), makes the AMM the liquidity token's minter, and mints `initialBalance` of token0 and token1 to
|
|
70
|
+
* each liquidity provider plus token0 to the swapper. `deploy` selects the token flavour (Token vs
|
|
71
|
+
* TestToken), so the concrete token type flows through to the caller.
|
|
72
|
+
*/ export async function deployAmmWithTokens(wallet, admin, deploy, opts) {
|
|
73
|
+
const { liquidityProviders, swapper, initialBalance, logger } = opts;
|
|
74
|
+
const { contract: token0 } = await deploy(wallet, admin, 0n, logger);
|
|
75
|
+
const { contract: token1 } = await deploy(wallet, admin, 0n, logger);
|
|
76
|
+
const { contract: liquidityToken } = await deploy(wallet, admin, 0n, logger);
|
|
77
|
+
const { contract: amm } = await AMMContract.deploy(wallet, token0.address, token1.address, liquidityToken.address).send({
|
|
78
|
+
from: admin
|
|
79
|
+
});
|
|
80
|
+
// TODO(#9480): consider deploying the token by some factory when the AMM is deployed, and making the AMM be the
|
|
81
|
+
// minter there.
|
|
82
|
+
await liquidityToken.methods.set_minter(amm.address, true).send({
|
|
83
|
+
from: admin
|
|
84
|
+
});
|
|
85
|
+
for (const lp of liquidityProviders){
|
|
86
|
+
await mintTokensToPrivate(token0, admin, lp, initialBalance);
|
|
87
|
+
await mintTokensToPrivate(token1, admin, lp, initialBalance);
|
|
88
|
+
}
|
|
89
|
+
// Note that the swapper only holds token0, not token1.
|
|
90
|
+
await mintTokensToPrivate(token0, admin, swapper, initialBalance);
|
|
91
|
+
return {
|
|
92
|
+
token0,
|
|
93
|
+
token1,
|
|
94
|
+
liquidityToken,
|
|
95
|
+
amm
|
|
96
|
+
};
|
|
97
|
+
}
|