@aztec/end-to-end 0.0.1-commit.24de95ac → 0.0.1-commit.2606882
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 +27 -0
- package/dest/bench/client_flows/benchmark.d.ts +17 -2
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +38 -1
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +23 -17
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +143 -136
- package/dest/bench/client_flows/config.d.ts +2 -2
- package/dest/bench/client_flows/config.d.ts.map +1 -1
- package/dest/bench/client_flows/config.js +18 -0
- package/dest/bench/client_flows/data_extractor.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.js +7 -27
- package/dest/bench/utils.d.ts +8 -7
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +33 -19
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +12 -10
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +120 -117
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +33 -16
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +124 -70
- package/dest/e2e_deploy_contract/deploy_test.d.ts +7 -6
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +20 -14
- package/dest/e2e_epochs/epochs_test.d.ts +49 -16
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +188 -64
- package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
- package/dest/e2e_fees/bridging_race.notest.js +5 -7
- package/dest/e2e_fees/fees_test.d.ts +25 -18
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +162 -141
- package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +18 -19
- package/dest/e2e_multi_validator/utils.d.ts +1 -1
- package/dest/e2e_multi_validator/utils.js +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +7 -10
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +32 -40
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +11 -9
- package/dest/e2e_p2p/p2p_network.d.ts +237 -28
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +176 -129
- package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
- package/dest/e2e_p2p/reqresp/utils.js +206 -0
- package/dest/e2e_p2p/shared.d.ts +44 -15
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +102 -68
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
- package/dest/e2e_token_contract/token_contract_test.d.ts +20 -11
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +103 -93
- package/dest/fixtures/authwit_proxy.d.ts +15 -0
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
- package/dest/fixtures/authwit_proxy.js +34 -0
- package/dest/fixtures/e2e_prover_test.d.ts +19 -24
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +126 -145
- package/dest/fixtures/elu_monitor.d.ts +21 -0
- package/dest/fixtures/elu_monitor.d.ts.map +1 -0
- package/dest/fixtures/elu_monitor.js +102 -0
- package/dest/fixtures/fixtures.d.ts +75 -3
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +73 -3
- package/dest/fixtures/get_acvm_config.d.ts +1 -1
- package/dest/fixtures/get_acvm_config.js +1 -1
- package/dest/fixtures/get_bb_config.d.ts +1 -1
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +5 -5
- package/dest/fixtures/ha_setup.d.ts +71 -0
- package/dest/fixtures/ha_setup.d.ts.map +1 -0
- package/dest/fixtures/ha_setup.js +116 -0
- 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/l1_to_l2_messaging.d.ts +4 -3
- package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
- package/dest/fixtures/l1_to_l2_messaging.js +2 -2
- package/dest/fixtures/logging.d.ts +1 -1
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
- package/dest/fixtures/setup.d.ts +272 -0
- package/dest/fixtures/setup.d.ts.map +1 -0
- package/dest/fixtures/setup.js +735 -0
- package/dest/fixtures/setup_p2p_test.d.ts +22 -11
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +57 -38
- package/dest/fixtures/token_utils.d.ts +6 -3
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +13 -9
- package/dest/fixtures/utils.d.ts +5 -192
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +4 -648
- package/dest/fixtures/web3signer.d.ts +1 -1
- package/dest/fixtures/web3signer.js +1 -1
- package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
- package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
- package/dest/fixtures/with_telemetry_utils.js +2 -2
- package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
- package/dest/forward-compatibility/wallet_service.d.ts +3 -0
- package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_service.js +109 -0
- package/dest/index.d.ts +1 -1
- package/dest/install_legacy_contracts.d.cts +10 -0
- package/dest/install_legacy_contracts.d.cts.map +1 -0
- package/dest/legacy-jest-resolver.d.cts +3 -0
- package/dest/legacy-jest-resolver.d.cts.map +1 -0
- package/dest/quality_of_service/grafana_client.d.ts +41 -0
- package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
- package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
- package/dest/quality_of_service/prometheus_client.d.ts +38 -0
- package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
- package/dest/quality_of_service/prometheus_client.js +67 -0
- package/dest/shared/cross_chain_test_harness.d.ts +9 -6
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +34 -30
- package/dest/shared/gas_portal_test_harness.d.ts +9 -6
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +21 -12
- package/dest/shared/index.d.ts +3 -2
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/index.js +1 -0
- package/dest/shared/jest_setup.d.ts +1 -1
- package/dest/shared/jest_setup.js +41 -1
- package/dest/shared/mock_state_view.d.ts +86 -0
- package/dest/shared/mock_state_view.d.ts.map +1 -0
- package/dest/shared/mock_state_view.js +186 -0
- package/dest/shared/submit-transactions.d.ts +4 -4
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +9 -11
- package/dest/shared/uniswap_l1_l2.d.ts +3 -27
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +87 -50
- package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
- package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
- package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
- package/dest/simulators/index.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts +11 -4
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +32 -18
- package/dest/simulators/token_simulator.d.ts +1 -1
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +3 -24
- package/dest/spartan/setup_test_wallets.d.ts +18 -6
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +159 -30
- package/dest/spartan/tx_metrics.d.ts +102 -0
- package/dest/spartan/tx_metrics.d.ts.map +1 -0
- package/dest/spartan/tx_metrics.js +475 -0
- package/dest/spartan/utils/bot.d.ts +28 -0
- package/dest/spartan/utils/bot.d.ts.map +1 -0
- package/dest/spartan/utils/bot.js +142 -0
- package/dest/spartan/utils/chaos.d.ts +79 -0
- package/dest/spartan/utils/chaos.d.ts.map +1 -0
- package/dest/spartan/utils/chaos.js +142 -0
- package/dest/spartan/utils/clients.d.ts +39 -0
- package/dest/spartan/utils/clients.d.ts.map +1 -0
- package/dest/spartan/utils/clients.js +90 -0
- package/dest/spartan/utils/config.d.ts +19 -0
- package/dest/spartan/utils/config.d.ts.map +1 -0
- package/dest/spartan/utils/config.js +23 -0
- package/dest/spartan/utils/health.d.ts +63 -0
- package/dest/spartan/utils/health.d.ts.map +1 -0
- package/dest/spartan/utils/health.js +202 -0
- package/dest/spartan/utils/helm.d.ts +15 -0
- package/dest/spartan/utils/helm.d.ts.map +1 -0
- package/dest/spartan/utils/helm.js +47 -0
- package/dest/spartan/utils/index.d.ts +11 -0
- package/dest/spartan/utils/index.d.ts.map +1 -0
- package/dest/spartan/utils/index.js +22 -0
- package/dest/spartan/utils/k8s.d.ts +128 -0
- package/dest/spartan/utils/k8s.d.ts.map +1 -0
- package/dest/spartan/utils/k8s.js +381 -0
- package/dest/spartan/utils/nodes.d.ts +40 -0
- package/dest/spartan/utils/nodes.d.ts.map +1 -0
- package/dest/spartan/utils/nodes.js +461 -0
- package/dest/spartan/utils/pod_logs.d.ts +25 -0
- package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
- package/dest/spartan/utils/pod_logs.js +74 -0
- package/dest/spartan/utils/scripts.d.ts +30 -0
- package/dest/spartan/utils/scripts.d.ts.map +1 -0
- package/dest/spartan/utils/scripts.js +81 -0
- package/dest/spartan/utils.d.ts +2 -218
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +1 -749
- package/dest/test-wallet/test_wallet.d.ts +85 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +273 -0
- package/dest/test-wallet/utils.d.ts +41 -0
- package/dest/test-wallet/utils.d.ts.map +1 -0
- package/dest/test-wallet/utils.js +66 -0
- package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
- package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
- package/dest/test-wallet/wallet_worker_script.js +53 -0
- package/dest/test-wallet/worker_wallet.d.ts +53 -0
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet.js +155 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts +160 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet_schema.js +22 -0
- package/package.json +56 -46
- package/src/bench/client_flows/benchmark.ts +43 -2
- package/src/bench/client_flows/client_flows_benchmark.ts +203 -206
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/client_flows/data_extractor.ts +6 -28
- package/src/bench/utils.ts +38 -22
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +141 -152
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +180 -127
- package/src/e2e_deploy_contract/deploy_test.ts +25 -17
- package/src/e2e_epochs/epochs_test.ts +254 -116
- package/src/e2e_fees/bridging_race.notest.ts +6 -12
- package/src/e2e_fees/fees_test.ts +215 -229
- package/src/e2e_l1_publisher/write_json.ts +20 -19
- package/src/e2e_multi_validator/utils.ts +1 -1
- package/src/e2e_nested_contract/nested_contract_test.ts +38 -56
- package/src/e2e_p2p/inactivity_slash_test.ts +12 -10
- package/src/e2e_p2p/p2p_network.ts +246 -201
- package/src/e2e_p2p/reqresp/utils.ts +274 -0
- package/src/e2e_p2p/shared.ts +132 -82
- package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
- package/src/e2e_token_contract/token_contract_test.ts +129 -117
- package/src/fixtures/authwit_proxy.ts +54 -0
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/e2e_prover_test.ts +154 -199
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +95 -5
- package/src/fixtures/get_acvm_config.ts +1 -1
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/ha_setup.ts +188 -0
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/l1_to_l2_messaging.ts +4 -2
- package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
- package/src/fixtures/setup.ts +1056 -0
- package/src/fixtures/setup_p2p_test.ts +70 -56
- package/src/fixtures/token_utils.ts +9 -8
- package/src/fixtures/utils.ts +29 -947
- package/src/fixtures/web3signer.ts +1 -1
- package/src/fixtures/with_telemetry_utils.ts +2 -2
- package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
- package/src/forward-compatibility/wallet_service.ts +104 -0
- package/src/guides/up_quick_start.sh +4 -6
- package/src/install_legacy_contracts.cjs +75 -0
- package/src/legacy-jest-resolver.cjs +112 -0
- package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
- package/src/quality_of_service/prometheus_client.ts +113 -0
- package/src/shared/cross_chain_test_harness.ts +37 -40
- package/src/shared/gas_portal_test_harness.ts +24 -14
- package/src/shared/index.ts +2 -1
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +11 -16
- package/src/shared/uniswap_l1_l2.ts +142 -114
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +39 -19
- package/src/simulators/token_simulator.ts +6 -30
- package/src/spartan/DEVELOP.md +7 -0
- package/src/spartan/setup_test_wallets.ts +234 -32
- package/src/spartan/tx_metrics.ts +434 -0
- package/src/spartan/utils/bot.ts +188 -0
- package/src/spartan/utils/chaos.ts +253 -0
- package/src/spartan/utils/clients.ts +100 -0
- package/src/spartan/utils/config.ts +29 -0
- package/src/spartan/utils/health.ts +255 -0
- package/src/spartan/utils/helm.ts +84 -0
- package/src/spartan/utils/index.ts +71 -0
- package/src/spartan/utils/k8s.ts +535 -0
- package/src/spartan/utils/nodes.ts +543 -0
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/spartan/utils/scripts.ts +99 -0
- package/src/spartan/utils.ts +1 -942
- package/src/test-wallet/test_wallet.ts +376 -0
- package/src/test-wallet/utils.ts +108 -0
- package/src/test-wallet/wallet_worker_script.ts +63 -0
- package/src/test-wallet/worker_wallet.ts +218 -0
- package/src/test-wallet/worker_wallet_schema.ts +13 -0
- package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
- package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
- package/dest/fixtures/setup_l1_contracts.js +0 -17
- package/dest/fixtures/snapshot_manager.d.ts +0 -95
- package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
- package/dest/fixtures/snapshot_manager.js +0 -505
- package/dest/quality_of_service/alert_checker.d.ts +0 -41
- package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
- package/src/fixtures/setup_l1_contracts.ts +0 -26
- package/src/fixtures/snapshot_manager.ts +0 -665
|
@@ -13,9 +13,11 @@ import type { AztecNode } from '@aztec/aztec.js/node';
|
|
|
13
13
|
import type { SiblingPath } from '@aztec/aztec.js/trees';
|
|
14
14
|
import type { TxReceipt } from '@aztec/aztec.js/tx';
|
|
15
15
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import type {
|
|
16
|
+
import { OutboxContract } from '@aztec/ethereum/contracts';
|
|
17
|
+
import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
18
|
+
import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
|
|
19
|
+
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
20
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
19
21
|
import { TestERC20Abi, TokenPortalAbi, TokenPortalBytecode } from '@aztec/l1-artifacts';
|
|
20
22
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
21
23
|
import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
|
|
@@ -23,6 +25,7 @@ import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
|
|
|
23
25
|
import { type Hex, getContract } from 'viem';
|
|
24
26
|
|
|
25
27
|
import { mintTokensToPrivate } from '../fixtures/token_utils.js';
|
|
28
|
+
import { waitForL1ToL2MessageSeen } from './wait_for_l1_to_l2_message.js';
|
|
26
29
|
|
|
27
30
|
/**
|
|
28
31
|
* Deploy L1 token and portal, initialize portal, deploy a non native l2 token contract, its L2 bridge contract and attach is to the portal.
|
|
@@ -71,26 +74,26 @@ export async function deployAndInitializeTokenAndBridgeContracts(
|
|
|
71
74
|
});
|
|
72
75
|
|
|
73
76
|
// deploy l2 token
|
|
74
|
-
const token = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
const { contract: token } = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18).send({
|
|
78
|
+
from: owner,
|
|
79
|
+
});
|
|
77
80
|
|
|
78
81
|
// deploy l2 token bridge and attach to the portal
|
|
79
|
-
const bridge = await TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
const { contract: bridge } = await TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress).send({
|
|
83
|
+
from: owner,
|
|
84
|
+
});
|
|
82
85
|
|
|
83
|
-
if ((await token.methods.get_admin().simulate({ from: owner })) !== owner.toBigInt()) {
|
|
86
|
+
if ((await token.methods.get_admin().simulate({ from: owner })).result !== owner.toBigInt()) {
|
|
84
87
|
throw new Error(`Token admin is not ${owner}`);
|
|
85
88
|
}
|
|
86
89
|
|
|
87
|
-
if (!(await bridge.methods.get_config().simulate({ from: owner })).token.equals(token.address)) {
|
|
90
|
+
if (!(await bridge.methods.get_config().simulate({ from: owner })).result.token.equals(token.address)) {
|
|
88
91
|
throw new Error(`Bridge token is not ${token.address}`);
|
|
89
92
|
}
|
|
90
93
|
|
|
91
94
|
// make the bridge a minter on the token:
|
|
92
|
-
await token.methods.set_minter(bridge.address, true).send({ from: owner })
|
|
93
|
-
if ((await token.methods.is_minter(bridge.address).simulate({ from: owner })) === 1n) {
|
|
95
|
+
await token.methods.set_minter(bridge.address, true).send({ from: owner });
|
|
96
|
+
if ((await token.methods.is_minter(bridge.address).simulate({ from: owner })).result === 1n) {
|
|
94
97
|
throw new Error(`Bridge is not a minter`);
|
|
95
98
|
}
|
|
96
99
|
|
|
@@ -164,6 +167,7 @@ export class CrossChainTestHarness {
|
|
|
164
167
|
|
|
165
168
|
private readonly l1TokenManager: L1TokenManager;
|
|
166
169
|
private readonly l1TokenPortalManager: L1TokenPortalManager;
|
|
170
|
+
public readonly outboxContract: OutboxContract;
|
|
167
171
|
|
|
168
172
|
constructor(
|
|
169
173
|
/** Aztec node instance. */
|
|
@@ -204,6 +208,7 @@ export class CrossChainTestHarness {
|
|
|
204
208
|
this.logger,
|
|
205
209
|
);
|
|
206
210
|
this.l1TokenManager = this.l1TokenPortalManager.getTokenManager();
|
|
211
|
+
this.outboxContract = new OutboxContract(this.l1Client, this.l1ContractAddresses.outboxAddress);
|
|
207
212
|
}
|
|
208
213
|
|
|
209
214
|
async mintTokensOnL1(amount: bigint) {
|
|
@@ -232,7 +237,7 @@ export class CrossChainTestHarness {
|
|
|
232
237
|
|
|
233
238
|
async mintTokensPublicOnL2(amount: bigint) {
|
|
234
239
|
this.logger.info('Minting tokens on L2 publicly');
|
|
235
|
-
await this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send({ from: this.ownerAddress })
|
|
240
|
+
await this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send({ from: this.ownerAddress });
|
|
236
241
|
}
|
|
237
242
|
|
|
238
243
|
async mintTokensPrivateOnL2(amount: bigint) {
|
|
@@ -243,8 +248,7 @@ export class CrossChainTestHarness {
|
|
|
243
248
|
// send a transfer tx to force through rollup with the message included
|
|
244
249
|
await this.l2Token.methods
|
|
245
250
|
.transfer_in_public(this.ownerAddress, receiverAddress, transferAmount, 0)
|
|
246
|
-
.send({ from: this.ownerAddress })
|
|
247
|
-
.wait();
|
|
251
|
+
.send({ from: this.ownerAddress });
|
|
248
252
|
}
|
|
249
253
|
|
|
250
254
|
async consumeMessageOnAztecAndMintPrivately(
|
|
@@ -254,8 +258,7 @@ export class CrossChainTestHarness {
|
|
|
254
258
|
const { recipient, claimAmount, claimSecret: secretForL2MessageConsumption, messageLeafIndex } = claim;
|
|
255
259
|
await this.l2Bridge.methods
|
|
256
260
|
.claim_private(recipient, claimAmount, secretForL2MessageConsumption, messageLeafIndex)
|
|
257
|
-
.send({ from: this.ownerAddress })
|
|
258
|
-
.wait();
|
|
261
|
+
.send({ from: this.ownerAddress });
|
|
259
262
|
}
|
|
260
263
|
|
|
261
264
|
async consumeMessageOnAztecAndMintPublicly(
|
|
@@ -265,34 +268,31 @@ export class CrossChainTestHarness {
|
|
|
265
268
|
const { claimAmount, claimSecret, messageLeafIndex } = claim;
|
|
266
269
|
await this.l2Bridge.methods
|
|
267
270
|
.claim_public(this.ownerAddress, claimAmount, claimSecret, messageLeafIndex)
|
|
268
|
-
.send({ from: this.ownerAddress })
|
|
269
|
-
.wait();
|
|
271
|
+
.send({ from: this.ownerAddress });
|
|
270
272
|
}
|
|
271
273
|
|
|
272
274
|
async withdrawPrivateFromAztecToL1(
|
|
273
275
|
withdrawAmount: bigint,
|
|
274
276
|
authwitNonce: Fr = Fr.ZERO,
|
|
275
277
|
authWitness: AuthWitness,
|
|
276
|
-
): Promise<
|
|
277
|
-
const withdrawReceipt = await this.l2Bridge.methods
|
|
278
|
+
): Promise<TxReceipt> {
|
|
279
|
+
const { receipt: withdrawReceipt } = await this.l2Bridge.methods
|
|
278
280
|
.exit_to_l1_private(this.l2Token.address, this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
|
|
279
|
-
.send({ authWitnesses: [authWitness], from: this.ownerAddress })
|
|
280
|
-
.wait();
|
|
281
|
+
.send({ authWitnesses: [authWitness], from: this.ownerAddress });
|
|
281
282
|
|
|
282
283
|
return withdrawReceipt;
|
|
283
284
|
}
|
|
284
285
|
|
|
285
|
-
async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<
|
|
286
|
-
const withdrawReceipt = await this.l2Bridge.methods
|
|
286
|
+
async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<TxReceipt> {
|
|
287
|
+
const { receipt: withdrawReceipt } = await this.l2Bridge.methods
|
|
287
288
|
.exit_to_l1_public(this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
|
|
288
|
-
.send({ from: this.ownerAddress })
|
|
289
|
-
.wait();
|
|
289
|
+
.send({ from: this.ownerAddress });
|
|
290
290
|
|
|
291
291
|
return withdrawReceipt;
|
|
292
292
|
}
|
|
293
293
|
|
|
294
294
|
async getL2PrivateBalanceOf(owner: AztecAddress) {
|
|
295
|
-
return await this.l2Token.methods.balance_of_private(owner).simulate({ from: owner });
|
|
295
|
+
return (await this.l2Token.methods.balance_of_private(owner).simulate({ from: owner })).result;
|
|
296
296
|
}
|
|
297
297
|
|
|
298
298
|
async expectPrivateBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
|
|
@@ -302,7 +302,7 @@ export class CrossChainTestHarness {
|
|
|
302
302
|
}
|
|
303
303
|
|
|
304
304
|
async getL2PublicBalanceOf(owner: AztecAddress) {
|
|
305
|
-
return await this.l2Token.methods.balance_of_public(owner).simulate({ from: this.ownerAddress });
|
|
305
|
+
return (await this.l2Token.methods.balance_of_public(owner).simulate({ from: this.ownerAddress })).result;
|
|
306
306
|
}
|
|
307
307
|
|
|
308
308
|
async expectPublicBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
|
|
@@ -321,14 +321,16 @@ export class CrossChainTestHarness {
|
|
|
321
321
|
|
|
322
322
|
withdrawFundsFromBridgeOnL1(
|
|
323
323
|
amount: bigint,
|
|
324
|
-
|
|
324
|
+
epochNumber: EpochNumber,
|
|
325
|
+
numCheckpointsInEpoch: number,
|
|
325
326
|
messageIndex: bigint,
|
|
326
327
|
siblingPath: SiblingPath<number>,
|
|
327
328
|
) {
|
|
328
329
|
return this.l1TokenPortalManager.withdrawFunds(
|
|
329
330
|
amount,
|
|
330
331
|
this.ethAccount,
|
|
331
|
-
|
|
332
|
+
epochNumber,
|
|
333
|
+
numCheckpointsInEpoch,
|
|
332
334
|
messageIndex,
|
|
333
335
|
siblingPath,
|
|
334
336
|
);
|
|
@@ -336,18 +338,14 @@ export class CrossChainTestHarness {
|
|
|
336
338
|
|
|
337
339
|
async transferToPrivateOnL2(shieldAmount: bigint) {
|
|
338
340
|
this.logger.info('Transferring to private on L2');
|
|
339
|
-
await this.l2Token.methods
|
|
340
|
-
.transfer_to_private(this.ownerAddress, shieldAmount)
|
|
341
|
-
.send({ from: this.ownerAddress })
|
|
342
|
-
.wait();
|
|
341
|
+
await this.l2Token.methods.transfer_to_private(this.ownerAddress, shieldAmount).send({ from: this.ownerAddress });
|
|
343
342
|
}
|
|
344
343
|
|
|
345
344
|
async transferToPublicOnL2(amount: bigint, authwitNonce = Fr.ZERO) {
|
|
346
345
|
this.logger.info('Transferring tokens to public');
|
|
347
346
|
await this.l2Token.methods
|
|
348
347
|
.transfer_to_public(this.ownerAddress, this.ownerAddress, amount, authwitNonce)
|
|
349
|
-
.send({ from: this.ownerAddress })
|
|
350
|
-
.wait();
|
|
348
|
+
.send({ from: this.ownerAddress });
|
|
351
349
|
}
|
|
352
350
|
|
|
353
351
|
/**
|
|
@@ -359,8 +357,7 @@ export class CrossChainTestHarness {
|
|
|
359
357
|
*/
|
|
360
358
|
async makeMessageConsumable(msgHash: Fr | Hex) {
|
|
361
359
|
const frMsgHash = typeof msgHash === 'string' ? Fr.fromHexString(msgHash) : msgHash;
|
|
362
|
-
|
|
363
|
-
await retryUntil(async () => await this.aztecNode.isL1ToL2MessageSynced(frMsgHash), 'message sync', 10);
|
|
360
|
+
await waitForL1ToL2MessageSeen(this.aztecNode, frMsgHash, { timeoutSeconds: 10 });
|
|
364
361
|
|
|
365
362
|
await this.mintTokensPublicOnL2(0n);
|
|
366
363
|
await this.mintTokensPublicOnL2(0n);
|
|
@@ -4,11 +4,16 @@ import { Fr } from '@aztec/aztec.js/fields';
|
|
|
4
4
|
import type { Logger } from '@aztec/aztec.js/log';
|
|
5
5
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
6
6
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
7
|
-
import type { ExtendedViemWalletClient } from '@aztec/ethereum';
|
|
7
|
+
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
8
8
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
9
9
|
import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
|
|
10
10
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
11
|
-
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
11
|
+
import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
|
|
12
|
+
|
|
13
|
+
import { waitForL1ToL2MessageSeen } from './wait_for_l1_to_l2_message.js';
|
|
14
|
+
|
|
15
|
+
/** Aztec node that may expose the debug mining API in local e2e setups. */
|
|
16
|
+
type MiningAztecNode = AztecNode & Partial<AztecNodeDebug>;
|
|
12
17
|
|
|
13
18
|
export interface IGasBridgingTestHarness {
|
|
14
19
|
getL1FeeJuiceBalance(address: EthAddress): Promise<bigint>;
|
|
@@ -19,7 +24,7 @@ export interface IGasBridgingTestHarness {
|
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
export interface FeeJuicePortalTestingHarnessFactoryConfig {
|
|
22
|
-
aztecNode:
|
|
27
|
+
aztecNode: MiningAztecNode;
|
|
23
28
|
aztecNodeAdmin?: AztecNodeAdmin;
|
|
24
29
|
l1Client: ExtendedViemWalletClient;
|
|
25
30
|
wallet: Wallet;
|
|
@@ -43,7 +48,7 @@ export class FeeJuicePortalTestingHarnessFactory {
|
|
|
43
48
|
throw new Error('Fee Juice portal not deployed on L1');
|
|
44
49
|
}
|
|
45
50
|
|
|
46
|
-
const gasL2 =
|
|
51
|
+
const gasL2 = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, wallet);
|
|
47
52
|
|
|
48
53
|
return new GasBridgingTestHarness(
|
|
49
54
|
aztecNode,
|
|
@@ -75,7 +80,7 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
75
80
|
|
|
76
81
|
constructor(
|
|
77
82
|
/** Aztec node */
|
|
78
|
-
public aztecNode:
|
|
83
|
+
public aztecNode: MiningAztecNode,
|
|
79
84
|
/** Aztec node admin interface */
|
|
80
85
|
public aztecNodeAdmin: AztecNodeAdmin | undefined,
|
|
81
86
|
/** Wallet. */
|
|
@@ -127,11 +132,11 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
127
132
|
async consumeMessageOnAztecAndClaimPrivately(owner: AztecAddress, claimer: AztecAddress, claim: L2AmountClaim) {
|
|
128
133
|
this.logger.info('Consuming messages on L2 Privately');
|
|
129
134
|
const { claimAmount, claimSecret, messageLeafIndex } = claim;
|
|
130
|
-
await this.feeJuice.methods.claim(owner, claimAmount, claimSecret, messageLeafIndex).send({ from: claimer })
|
|
135
|
+
await this.feeJuice.methods.claim(owner, claimAmount, claimSecret, messageLeafIndex).send({ from: claimer });
|
|
131
136
|
}
|
|
132
137
|
|
|
133
138
|
async getL2PublicBalanceOf(owner: AztecAddress) {
|
|
134
|
-
return await this.feeJuice.methods.balance_of_public(owner).simulate({ from: owner });
|
|
139
|
+
return (await this.feeJuice.methods.balance_of_public(owner).simulate({ from: owner })).result;
|
|
135
140
|
}
|
|
136
141
|
|
|
137
142
|
async expectPublicBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
|
|
@@ -144,8 +149,7 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
144
149
|
await this.mintTokensOnL1();
|
|
145
150
|
const claim = await this.sendTokensToPortalPublic(bridgeAmount, owner);
|
|
146
151
|
|
|
147
|
-
|
|
148
|
-
await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 1);
|
|
152
|
+
await waitForL1ToL2MessageSeen(this.aztecNode, Fr.fromHexString(claim.messageHash), { timeoutSeconds: 24 });
|
|
149
153
|
|
|
150
154
|
// Progress by 2 L2 blocks so that the l1ToL2Message added above will be available to use on L2.
|
|
151
155
|
await this.advanceL2Block();
|
|
@@ -163,6 +167,11 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
163
167
|
}
|
|
164
168
|
|
|
165
169
|
private async advanceL2Block() {
|
|
170
|
+
if (this.aztecNode.mineBlock) {
|
|
171
|
+
await this.aztecNode.mineBlock();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
166
175
|
const initialBlockNumber = await this.aztecNode.getBlockNumber();
|
|
167
176
|
|
|
168
177
|
let minTxsPerBlock = undefined;
|
|
@@ -171,11 +180,12 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
|
|
|
171
180
|
await this.aztecNodeAdmin.setConfig({ minTxsPerBlock: 0 }); // Set to 0 to ensure we can advance the block
|
|
172
181
|
}
|
|
173
182
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
183
|
+
try {
|
|
184
|
+
await retryUntil(async () => (await this.aztecNode.getBlockNumber()) >= initialBlockNumber + 1);
|
|
185
|
+
} finally {
|
|
186
|
+
if (this.aztecNodeAdmin && minTxsPerBlock !== undefined) {
|
|
187
|
+
await this.aztecNodeAdmin.setConfig({ minTxsPerBlock });
|
|
188
|
+
}
|
|
178
189
|
}
|
|
179
190
|
}
|
|
180
191
|
}
|
|
181
|
-
// docs:end:cross_chain_test_harness
|
package/src/shared/index.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { uniswapL1L2TestSuite
|
|
1
|
+
export { uniswapL1L2TestSuite } from './uniswap_l1_l2.js';
|
|
2
|
+
export { MockStateView, diffInBps } from './mock_state_view.js';
|
package/src/shared/jest_setup.ts
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/aztec.js/log';
|
|
2
2
|
|
|
3
|
-
import { beforeEach, expect } from '@jest/globals';
|
|
3
|
+
import { afterAll, afterEach, beforeEach, expect } from '@jest/globals';
|
|
4
|
+
import { readlinkSync } from 'fs';
|
|
4
5
|
import { basename } from 'path';
|
|
5
6
|
|
|
7
|
+
import { EluMonitor } from '../fixtures/elu_monitor.js';
|
|
8
|
+
|
|
9
|
+
const eluMonitor = process.env.ELU_MONITOR_FILE
|
|
10
|
+
? new EluMonitor(process.env.ELU_MONITOR_FILE, Number(process.env.ELU_MONITOR_INTERVAL_MS) || undefined)
|
|
11
|
+
: undefined;
|
|
12
|
+
|
|
13
|
+
if (eluMonitor) {
|
|
14
|
+
process.on('exit', () => eluMonitor.stop());
|
|
15
|
+
}
|
|
16
|
+
|
|
6
17
|
beforeEach(() => {
|
|
7
18
|
const { testPath, currentTestName } = expect.getState();
|
|
8
19
|
if (!testPath || !currentTestName) {
|
|
@@ -10,4 +21,43 @@ beforeEach(() => {
|
|
|
10
21
|
}
|
|
11
22
|
const logger = createLogger(`e2e:${basename(testPath).replace('.test.ts', '')}`);
|
|
12
23
|
logger.info(`Running test: ${currentTestName}`);
|
|
24
|
+
eluMonitor?.startTest(currentTestName);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
eluMonitor?.stopTest();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Log leaked handles after all tests complete. This runs after test-level afterAll hooks,
|
|
32
|
+
// so any handles still alive at this point were not properly cleaned up during teardown.
|
|
33
|
+
// This diagnostic helps identify the source of exit hangs without masking them.
|
|
34
|
+
afterAll(() => {
|
|
35
|
+
const handles = (process as any)._getActiveHandles();
|
|
36
|
+
if (handles.length > 0) {
|
|
37
|
+
const details = handles.map((h: any) => {
|
|
38
|
+
const type = h?.constructor?.name ?? typeof h;
|
|
39
|
+
const fd = h?.fd ?? h?._handle?.fd ?? '?';
|
|
40
|
+
const destroyed = h?.destroyed ?? '?';
|
|
41
|
+
const hasRef = typeof h?.hasRef === 'function' ? h.hasRef() : '?';
|
|
42
|
+
const localAddr = h?.localAddress ?? '';
|
|
43
|
+
const remoteAddr = h?.remoteAddress ?? '';
|
|
44
|
+
const localPort = h?.localPort ?? '';
|
|
45
|
+
const remotePort = h?.remotePort ?? '';
|
|
46
|
+
const proto = Object.getPrototypeOf(h)?.constructor?.name ?? '?';
|
|
47
|
+
const keys = Object.keys(h).slice(0, 10).join(',');
|
|
48
|
+
let fdTarget = '';
|
|
49
|
+
if (typeof fd === 'number') {
|
|
50
|
+
try {
|
|
51
|
+
fdTarget = ` -> ${readlinkSync(`/proc/self/fd/${fd}`)}`;
|
|
52
|
+
} catch {
|
|
53
|
+
// ignore
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return ` ${type}(fd=${fd}, destroyed=${destroyed}, hasRef=${hasRef}${fdTarget}) proto=${proto} addr=${localAddr}:${localPort}->${remoteAddr}:${remotePort} keys=[${keys}]`;
|
|
57
|
+
});
|
|
58
|
+
process.stderr.write(
|
|
59
|
+
`\n[jest_setup] WARNING: ${handles.length} handle(s) still active after teardown:\n${details.join('\n')}\n` +
|
|
60
|
+
`These may prevent Jest from exiting. Investigate and fix the leak.\n\n`,
|
|
61
|
+
);
|
|
62
|
+
}
|
|
13
63
|
});
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { EthAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import { type Logger, createLogger } from '@aztec/aztec.js/log';
|
|
3
|
+
import type { EthCheatCodes } from '@aztec/aztec/testing';
|
|
4
|
+
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
5
|
+
|
|
6
|
+
import { getContract } from 'viem';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Mock StateView contract for testing the Uniswap price oracle.
|
|
10
|
+
*
|
|
11
|
+
* Wraps a compiled Solidity contract that mimics the Uniswap V4 StateView's getSlot0 function.
|
|
12
|
+
* The mock allows setting return values dynamically for testing different price scenarios.
|
|
13
|
+
*
|
|
14
|
+
* Solidity source:
|
|
15
|
+
* ```solidity
|
|
16
|
+
* // SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
* pragma solidity >=0.8.27;
|
|
18
|
+
*
|
|
19
|
+
* contract MockStateView {
|
|
20
|
+
* uint160 public sqrtPriceX96;
|
|
21
|
+
* int24 public tick;
|
|
22
|
+
* uint24 public protocolFee;
|
|
23
|
+
* uint24 public lpFee;
|
|
24
|
+
*
|
|
25
|
+
* function setReturnValues(
|
|
26
|
+
* uint160 _sqrtPriceX96,
|
|
27
|
+
* int24 _tick,
|
|
28
|
+
* uint24 _protocolFee,
|
|
29
|
+
* uint24 _lpFee
|
|
30
|
+
* ) external {
|
|
31
|
+
* sqrtPriceX96 = _sqrtPriceX96;
|
|
32
|
+
* tick = _tick;
|
|
33
|
+
* protocolFee = _protocolFee;
|
|
34
|
+
* lpFee = _lpFee;
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* function getSlot0(bytes32 poolId) external view returns (uint160, int24, uint24, uint24) {
|
|
38
|
+
* return (sqrtPriceX96, tick, protocolFee, lpFee);
|
|
39
|
+
* }
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export class MockStateView {
|
|
44
|
+
private static readonly BYTECODE: `0x${string}` =
|
|
45
|
+
'0x608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633eaf5d9f14610064578063704ce43e146100825780638db791d2146100a0578063b0e21e8a146100be578063b52e4bdd146100dc578063c815641c146100f8575b5f5ffd5b61006c61012b565b60405161007991906102ab565b60405180910390f35b61008a61013d565b60405161009791906102e1565b60405180910390f35b6100a8610151565b6040516100b59190610328565b60405180910390f35b6100c6610175565b6040516100d391906102e1565b60405180910390f35b6100f660048036038101906100f191906103c3565b610189565b005b610112600480360381019061010d919061045a565b61022b565b6040516101229493929190610485565b60405180910390f35b5f60149054906101000a900460020b81565b5f601a9054906101000a900462ffffff1681565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60179054906101000a900462ffffff1681565b835f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825f60146101000a81548162ffffff021916908360020b62ffffff160217905550815f60176101000a81548162ffffff021916908362ffffff160217905550805f601a6101000a81548162ffffff021916908362ffffff16021790555050505050565b5f5f5f5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f60149054906101000a900460020b5f60179054906101000a900462ffffff165f601a9054906101000a900462ffffff1693509350935093509193509193565b5f8160020b9050919050565b6102a581610290565b82525050565b5f6020820190506102be5f83018461029c565b92915050565b5f62ffffff82169050919050565b6102db816102c4565b82525050565b5f6020820190506102f45f8301846102d2565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b610322816102fa565b82525050565b5f60208201905061033b5f830184610319565b92915050565b5f5ffd5b61034e816102fa565b8114610358575f5ffd5b50565b5f8135905061036981610345565b92915050565b61037881610290565b8114610382575f5ffd5b50565b5f813590506103938161036f565b92915050565b6103a2816102c4565b81146103ac575f5ffd5b50565b5f813590506103bd81610399565b92915050565b5f5f5f5f608085870312156103db576103da610341565b5b5f6103e88782880161035b565b94505060206103f987828801610385565b935050604061040a878288016103af565b925050606061041b878288016103af565b91505092959194509250565b5f819050919050565b61043981610427565b8114610443575f5ffd5b50565b5f8135905061045481610430565b92915050565b5f6020828403121561046f5761046e610341565b5b5f61047c84828501610446565b91505092915050565b5f6080820190506104985f830187610319565b6104a5602083018661029c565b6104b260408301856102d2565b6104bf60608301846102d2565b9594505050505056fea2646970667358221220f8b1bfff284535bc078368ed34bd5e78981644845f3c9c1f5a4b8448c976805464736f6c634300081f0033';
|
|
46
|
+
private static readonly ABI = [
|
|
47
|
+
{
|
|
48
|
+
type: 'function',
|
|
49
|
+
name: 'setReturnValues',
|
|
50
|
+
inputs: [
|
|
51
|
+
{ name: '_sqrtPriceX96', type: 'uint160' },
|
|
52
|
+
{ name: '_tick', type: 'int24' },
|
|
53
|
+
{ name: '_protocolFee', type: 'uint24' },
|
|
54
|
+
{ name: '_lpFee', type: 'uint24' },
|
|
55
|
+
],
|
|
56
|
+
outputs: [],
|
|
57
|
+
stateMutability: 'nonpayable',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
inputs: [
|
|
61
|
+
{
|
|
62
|
+
internalType: 'bytes32',
|
|
63
|
+
name: 'poolId',
|
|
64
|
+
type: 'bytes32',
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
name: 'getSlot0',
|
|
68
|
+
outputs: [
|
|
69
|
+
{
|
|
70
|
+
internalType: 'uint160',
|
|
71
|
+
name: '',
|
|
72
|
+
type: 'uint160',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
internalType: 'int24',
|
|
76
|
+
name: '',
|
|
77
|
+
type: 'int24',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
internalType: 'uint24',
|
|
81
|
+
name: '',
|
|
82
|
+
type: 'uint24',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
internalType: 'uint24',
|
|
86
|
+
name: '',
|
|
87
|
+
type: 'uint24',
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
stateMutability: 'view',
|
|
91
|
+
type: 'function',
|
|
92
|
+
},
|
|
93
|
+
] as const;
|
|
94
|
+
|
|
95
|
+
private constructor(
|
|
96
|
+
private readonly address: EthAddress,
|
|
97
|
+
private readonly walletClient: ExtendedViemWalletClient,
|
|
98
|
+
private readonly log: Logger = createLogger('mock-state-view'),
|
|
99
|
+
) {}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Deploys the mock StateView contract at the specified address using etch.
|
|
103
|
+
* @param ethCheatCodes - Cheat codes for etching bytecode
|
|
104
|
+
* @param walletClient - Wallet client for sending transactions
|
|
105
|
+
* @param address - Address to deploy the mock at (typically the real StateView address)
|
|
106
|
+
*/
|
|
107
|
+
static async deploy(
|
|
108
|
+
ethCheatCodes: EthCheatCodes,
|
|
109
|
+
walletClient: ExtendedViemWalletClient,
|
|
110
|
+
address: EthAddress,
|
|
111
|
+
): Promise<MockStateView> {
|
|
112
|
+
await ethCheatCodes.etch(address, MockStateView.BYTECODE);
|
|
113
|
+
return new MockStateView(address, walletClient);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Sets the price using the ethPerFeeAssetE12 format (same as rollup contract).
|
|
118
|
+
* Computes the corresponding sqrtPriceX96 internally.
|
|
119
|
+
*
|
|
120
|
+
* Math (from fee_asset_price_oracle.ts):
|
|
121
|
+
* ethPerFeeAssetE12 = 1e12 * 2^192 / sqrtPriceX96^2
|
|
122
|
+
*
|
|
123
|
+
* Inverted:
|
|
124
|
+
* sqrtPriceX96^2 = 1e12 * 2^192 / ethPerFeeAssetE12
|
|
125
|
+
* sqrtPriceX96 = sqrt(1e12 * 2^192 / ethPerFeeAssetE12)
|
|
126
|
+
*
|
|
127
|
+
* @param ethPerFeeAssetE12 - The price in ETH per fee asset, scaled by 1e12
|
|
128
|
+
*/
|
|
129
|
+
async setEthPerFeeAsset(ethPerFeeAssetE12: bigint) {
|
|
130
|
+
const sqrtPriceX96 = this.ethPerFeeAssetE12ToSqrtPriceX96(ethPerFeeAssetE12);
|
|
131
|
+
return await this.setSqrtPriceX96(sqrtPriceX96);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Sets the sqrtPriceX96 value directly (Uniswap's price encoding).
|
|
136
|
+
* @param sqrtPriceX96 - The sqrtPriceX96 value
|
|
137
|
+
* @param tick - The tick value (default 10)
|
|
138
|
+
* @param protocolFee - The protocol fee (default 0)
|
|
139
|
+
* @param lpFee - The LP fee (default 500)
|
|
140
|
+
*/
|
|
141
|
+
async setSqrtPriceX96(sqrtPriceX96: bigint, tick: number = 10, protocolFee: number = 0, lpFee: number = 500) {
|
|
142
|
+
const contract = getContract({
|
|
143
|
+
address: this.address.toString() as `0x${string}`,
|
|
144
|
+
abi: MockStateView.ABI,
|
|
145
|
+
client: this.walletClient,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const hash = await contract.write.setReturnValues([sqrtPriceX96, tick, protocolFee, lpFee]);
|
|
149
|
+
this.log.info(`Set sqrtPriceX96 to ${sqrtPriceX96}`);
|
|
150
|
+
return await this.walletClient.waitForTransactionReceipt({ hash });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Converts ethPerFeeAssetE12 to sqrtPriceX96 (inverse of sqrtPriceX96ToEthPerFeeAssetE12).
|
|
155
|
+
*
|
|
156
|
+
* Math:
|
|
157
|
+
* sqrtPriceX96 = sqrt(1e12 * 2^192 / ethPerFeeAssetE12)
|
|
158
|
+
*/
|
|
159
|
+
ethPerFeeAssetE12ToSqrtPriceX96(ethPerFeeAssetE12: bigint): bigint {
|
|
160
|
+
if (ethPerFeeAssetE12 === 0n) {
|
|
161
|
+
throw new Error('Cannot convert zero ethPerFeeAssetE12');
|
|
162
|
+
}
|
|
163
|
+
const Q192 = 2n ** 192n;
|
|
164
|
+
const sqrtPriceSquared = (10n ** 12n * Q192) / ethPerFeeAssetE12;
|
|
165
|
+
return this.bigintSqrt(sqrtPriceSquared);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Integer square root using Newton's method */
|
|
169
|
+
bigintSqrt(n: bigint): bigint {
|
|
170
|
+
if (n < 0n) {
|
|
171
|
+
throw new Error('Cannot compute sqrt of negative number');
|
|
172
|
+
}
|
|
173
|
+
if (n === 0n) {
|
|
174
|
+
return 0n;
|
|
175
|
+
}
|
|
176
|
+
let x = n;
|
|
177
|
+
let y = (x + 1n) / 2n;
|
|
178
|
+
while (y < x) {
|
|
179
|
+
x = y;
|
|
180
|
+
y = (x + n / x) / 2n;
|
|
181
|
+
}
|
|
182
|
+
return x;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function diffInBps(a: bigint, b: bigint): bigint {
|
|
187
|
+
return ((a - b) * 10000n) / b;
|
|
188
|
+
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
-
import
|
|
2
|
+
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
3
3
|
import { Fr, GrumpkinScalar } from '@aztec/aztec.js/fields';
|
|
4
4
|
import type { Logger } from '@aztec/aztec.js/log';
|
|
5
|
-
import { TxStatus } from '@aztec/aztec.js/tx';
|
|
5
|
+
import { TxHash, type TxReceipt, TxStatus } from '@aztec/aztec.js/tx';
|
|
6
6
|
import { times } from '@aztec/foundation/collection';
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
8
9
|
|
|
9
10
|
// submits a set of transactions to the provided Wallet
|
|
10
11
|
export const submitTxsTo = async (
|
|
@@ -12,26 +13,20 @@ export const submitTxsTo = async (
|
|
|
12
13
|
submitter: AztecAddress,
|
|
13
14
|
numTxs: number,
|
|
14
15
|
logger: Logger,
|
|
15
|
-
): Promise<
|
|
16
|
-
const
|
|
16
|
+
): Promise<TxHash[]> => {
|
|
17
|
+
const txHashes: TxHash[] = [];
|
|
17
18
|
await Promise.all(
|
|
18
19
|
times(numTxs, async () => {
|
|
19
20
|
const accountManager = await wallet.createSchnorrAccount(Fr.random(), Fr.random(), GrumpkinScalar.random());
|
|
20
21
|
const deployMethod = await accountManager.getDeployMethod();
|
|
21
|
-
const
|
|
22
|
-
const txHash = await tx.getTxHash();
|
|
22
|
+
const { txHash } = await deployMethod.send({ from: submitter, wait: NO_WAIT });
|
|
23
23
|
|
|
24
24
|
logger.info(`Tx sent with hash ${txHash}`);
|
|
25
|
-
const receipt = await
|
|
26
|
-
expect(receipt).
|
|
27
|
-
expect.objectContaining({
|
|
28
|
-
status: TxStatus.PENDING,
|
|
29
|
-
error: '',
|
|
30
|
-
}),
|
|
31
|
-
);
|
|
25
|
+
const receipt: TxReceipt = await wallet.getTxReceipt(txHash);
|
|
26
|
+
expect(receipt.status).toBe(TxStatus.PENDING);
|
|
32
27
|
logger.info(`Receipt received for ${txHash}`);
|
|
33
|
-
|
|
28
|
+
txHashes.push(txHash);
|
|
34
29
|
}),
|
|
35
30
|
);
|
|
36
|
-
return
|
|
31
|
+
return txHashes;
|
|
37
32
|
};
|