@aztec/end-to-end 0.0.1-commit.43597cc1 → 0.0.1-commit.4ad48494d
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/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +3 -3
- 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/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -2
- 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 +10 -0
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.d.ts +1 -1
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +7 -2
- package/dest/e2e_fees/fees_test.d.ts +2 -2
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +5 -5
- package/dest/e2e_p2p/p2p_network.d.ts +2 -2
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.d.ts +2 -2
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +2 -1
- 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 +4 -2
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +10 -0
- package/dest/fixtures/e2e_prover_test.d.ts +2 -2
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.d.ts +1 -1
- package/dest/fixtures/ha_setup.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.js +3 -1
- package/dest/fixtures/setup.d.ts +15 -15
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +20 -79
- package/dest/shared/submit-transactions.d.ts +2 -2
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +1 -1
- 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 +2 -23
- package/dest/spartan/setup_test_wallets.d.ts +2 -2
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +3 -1
- package/dest/spartan/utils/bot.d.ts +1 -1
- package/dest/spartan/utils/bot.d.ts.map +1 -1
- package/dest/spartan/utils/bot.js +1 -1
- package/dest/test-wallet/test_wallet.d.ts +82 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +214 -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 +71 -0
- package/package.json +40 -39
- package/src/bench/client_flows/client_flows_benchmark.ts +8 -12
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/utils.ts +1 -1
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +11 -2
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +4 -4
- package/src/e2e_deploy_contract/deploy_test.ts +3 -3
- package/src/e2e_epochs/epochs_test.ts +12 -3
- package/src/e2e_fees/bridging_race.notest.ts +1 -1
- package/src/e2e_fees/fees_test.ts +11 -26
- package/src/e2e_nested_contract/nested_contract_test.ts +1 -1
- package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
- package/src/e2e_p2p/p2p_network.ts +5 -5
- package/src/e2e_p2p/reqresp/utils.ts +4 -4
- package/src/e2e_p2p/shared.ts +2 -1
- 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 +11 -2
- package/src/fixtures/e2e_prover_test.ts +4 -4
- package/src/fixtures/ha_setup.ts +3 -1
- package/src/fixtures/setup.ts +31 -109
- package/src/guides/up_quick_start.sh +3 -3
- package/src/shared/submit-transactions.ts +2 -1
- package/src/shared/uniswap_l1_l2.ts +2 -2
- package/src/simulators/token_simulator.ts +1 -29
- package/src/spartan/setup_test_wallets.ts +3 -1
- package/src/spartan/utils/bot.ts +1 -1
- package/src/test-wallet/test_wallet.ts +305 -0
- package/src/test-wallet/utils.ts +112 -0
package/src/fixtures/setup.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
|
|
2
|
-
import { type InitialAccountData, generateSchnorrAccounts
|
|
2
|
+
import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
3
3
|
import { type Archiver, createArchiver } from '@aztec/archiver';
|
|
4
4
|
import { type AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
|
|
5
5
|
import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
import { publishContractClass, publishInstance } from '@aztec/aztec.js/deployment';
|
|
14
14
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
15
15
|
import { type Logger, createLogger } from '@aztec/aztec.js/log';
|
|
16
|
-
import {
|
|
16
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
17
17
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
18
18
|
import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec/testing';
|
|
19
19
|
import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
|
|
@@ -67,7 +67,7 @@ import {
|
|
|
67
67
|
initTelemetryClient,
|
|
68
68
|
} from '@aztec/telemetry-client';
|
|
69
69
|
import { BenchmarkTelemetryClient } from '@aztec/telemetry-client/bench';
|
|
70
|
-
import {
|
|
70
|
+
import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
|
|
71
71
|
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
72
72
|
|
|
73
73
|
import type { Anvil } from '@viem/anvil';
|
|
@@ -84,6 +84,7 @@ import {
|
|
|
84
84
|
} from 'viem/accounts';
|
|
85
85
|
import { type Chain, foundry } from 'viem/chains';
|
|
86
86
|
|
|
87
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
87
88
|
import { MNEMONIC, TEST_MAX_PENDING_TX_POOL_COUNT, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
|
|
88
89
|
import { getACVMConfig } from './get_acvm_config.js';
|
|
89
90
|
import { getBBConfig } from './get_bb_config.js';
|
|
@@ -92,9 +93,6 @@ import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
|
|
|
92
93
|
|
|
93
94
|
export { startAnvil };
|
|
94
95
|
|
|
95
|
-
const { AZTEC_NODE_URL = '' } = process.env;
|
|
96
|
-
const getAztecUrl = () => AZTEC_NODE_URL;
|
|
97
|
-
|
|
98
96
|
let telemetry: TelemetryClient | undefined = undefined;
|
|
99
97
|
async function getTelemetryClient(partialConfig: Partial<TelemetryClientConfig> & { benchmark?: boolean } = {}) {
|
|
100
98
|
if (!telemetry) {
|
|
@@ -217,13 +215,13 @@ export type EndToEndContext = {
|
|
|
217
215
|
anvil: Anvil | undefined;
|
|
218
216
|
/** The Aztec Node service or client a connected to it. */
|
|
219
217
|
aztecNode: AztecNode;
|
|
220
|
-
/** The Aztec Node as a service
|
|
221
|
-
aztecNodeService: AztecNodeService
|
|
222
|
-
/** Client to the Aztec Node admin interface
|
|
223
|
-
aztecNodeAdmin: AztecNodeAdmin
|
|
218
|
+
/** The Aztec Node as a service. */
|
|
219
|
+
aztecNodeService: AztecNodeService;
|
|
220
|
+
/** Client to the Aztec Node admin interface. */
|
|
221
|
+
aztecNodeAdmin: AztecNodeAdmin;
|
|
224
222
|
/** The prover node service (only set if startProverNode is true) */
|
|
225
223
|
proverNode: ProverNode | undefined;
|
|
226
|
-
/** A client to the sequencer service
|
|
224
|
+
/** A client to the sequencer service. */
|
|
227
225
|
sequencer: SequencerClient | undefined;
|
|
228
226
|
/** Return values from deployAztecL1Contracts function. */
|
|
229
227
|
deployL1ContractsValues: DeployAztecL1ContractsReturnType;
|
|
@@ -243,12 +241,12 @@ export type EndToEndContext = {
|
|
|
243
241
|
cheatCodes: CheatCodes;
|
|
244
242
|
/** The cheat codes for L1 */
|
|
245
243
|
ethCheatCodes: EthCheatCodes;
|
|
246
|
-
/** The anvil test watcher
|
|
247
|
-
watcher: AnvilTestWatcher
|
|
248
|
-
/** Allows tweaking current system time, used by the epoch cache only
|
|
249
|
-
dateProvider: TestDateProvider
|
|
244
|
+
/** The anvil test watcher. */
|
|
245
|
+
watcher: AnvilTestWatcher;
|
|
246
|
+
/** Allows tweaking current system time, used by the epoch cache only. */
|
|
247
|
+
dateProvider: TestDateProvider;
|
|
250
248
|
/** Telemetry client */
|
|
251
|
-
telemetryClient: TelemetryClient
|
|
249
|
+
telemetryClient: TelemetryClient;
|
|
252
250
|
/** Mock gossip sub network used for gossipping messages (only if mockGossipSubNetwork was set to true in opts) */
|
|
253
251
|
mockGossipSubNetwork: MockGossipSubNetwork | undefined;
|
|
254
252
|
/** Prefilled public data used for setting up nodes. */
|
|
@@ -258,87 +256,11 @@ export type EndToEndContext = {
|
|
|
258
256
|
/** BB config (only set if running locally). */
|
|
259
257
|
bbConfig: Awaited<ReturnType<typeof getBBConfig>>;
|
|
260
258
|
/** Directory to cleanup on teardown. */
|
|
261
|
-
directoryToCleanup: string
|
|
259
|
+
directoryToCleanup: string;
|
|
262
260
|
/** Function to stop the started services. */
|
|
263
261
|
teardown: () => Promise<void>;
|
|
264
262
|
};
|
|
265
263
|
|
|
266
|
-
/**
|
|
267
|
-
* Function to setup the test against a remote deployment. It is assumed that L1 contract are already deployed
|
|
268
|
-
*/
|
|
269
|
-
async function setupWithRemoteEnvironment(
|
|
270
|
-
account: HDAccount | PrivateKeyAccount,
|
|
271
|
-
config: AztecNodeConfig & SetupOptions,
|
|
272
|
-
logger: Logger,
|
|
273
|
-
numberOfAccounts: number,
|
|
274
|
-
): Promise<EndToEndContext> {
|
|
275
|
-
const aztecNodeUrl = getAztecUrl();
|
|
276
|
-
logger.verbose(`Creating Aztec Node client to remote host ${aztecNodeUrl}`);
|
|
277
|
-
const aztecNode = createAztecNodeClient(aztecNodeUrl);
|
|
278
|
-
await waitForNode(aztecNode, logger);
|
|
279
|
-
logger.verbose('JSON RPC client connected to Aztec Node');
|
|
280
|
-
logger.verbose(`Retrieving contract addresses from ${aztecNodeUrl}`);
|
|
281
|
-
const { l1ContractAddresses, rollupVersion } = await aztecNode.getNodeInfo();
|
|
282
|
-
|
|
283
|
-
const l1Client = createExtendedL1Client(config.l1RpcUrls, account, foundry);
|
|
284
|
-
|
|
285
|
-
const deployL1ContractsValues: DeployAztecL1ContractsReturnType = {
|
|
286
|
-
l1ContractAddresses,
|
|
287
|
-
l1Client,
|
|
288
|
-
rollupVersion,
|
|
289
|
-
};
|
|
290
|
-
const ethCheatCodes = new EthCheatCodes(config.l1RpcUrls, new DateProvider());
|
|
291
|
-
const wallet = await TestWallet.create(aztecNode);
|
|
292
|
-
|
|
293
|
-
if (config.walletMinFeePadding !== undefined) {
|
|
294
|
-
wallet.setMinFeePadding(config.walletMinFeePadding);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
const cheatCodes = await CheatCodes.create(config.l1RpcUrls, aztecNode, new DateProvider());
|
|
298
|
-
const teardown = () => Promise.resolve();
|
|
299
|
-
|
|
300
|
-
logger.verbose('Populating wallet from already registered accounts...');
|
|
301
|
-
const initialFundedAccounts = await getInitialTestAccountsData();
|
|
302
|
-
|
|
303
|
-
if (initialFundedAccounts.length < numberOfAccounts) {
|
|
304
|
-
throw new Error(`Required ${numberOfAccounts} accounts. Found ${initialFundedAccounts.length}.`);
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
const testAccounts = await Promise.all(
|
|
308
|
-
initialFundedAccounts.slice(0, numberOfAccounts).map(async account => {
|
|
309
|
-
const accountManager = await wallet.createSchnorrAccount(account.secret, account.salt, account.signingKey);
|
|
310
|
-
return accountManager.address;
|
|
311
|
-
}),
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
return {
|
|
315
|
-
anvil: undefined,
|
|
316
|
-
aztecNode,
|
|
317
|
-
aztecNodeService: undefined,
|
|
318
|
-
aztecNodeAdmin: undefined,
|
|
319
|
-
sequencer: undefined,
|
|
320
|
-
proverNode: undefined,
|
|
321
|
-
deployL1ContractsValues,
|
|
322
|
-
config,
|
|
323
|
-
aztecNodeConfig: config,
|
|
324
|
-
initialFundedAccounts,
|
|
325
|
-
wallet,
|
|
326
|
-
accounts: testAccounts,
|
|
327
|
-
logger,
|
|
328
|
-
cheatCodes,
|
|
329
|
-
ethCheatCodes,
|
|
330
|
-
prefilledPublicData: undefined,
|
|
331
|
-
mockGossipSubNetwork: undefined,
|
|
332
|
-
watcher: undefined,
|
|
333
|
-
dateProvider: undefined,
|
|
334
|
-
telemetryClient: undefined,
|
|
335
|
-
acvmConfig: undefined,
|
|
336
|
-
bbConfig: undefined,
|
|
337
|
-
directoryToCleanup: undefined,
|
|
338
|
-
teardown,
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
|
|
342
264
|
/**
|
|
343
265
|
* Sets up the environment for the end-to-end tests.
|
|
344
266
|
* @param numberOfAccounts - The number of new accounts to be created once the PXE is initiated.
|
|
@@ -368,6 +290,8 @@ export async function setup(
|
|
|
368
290
|
config.enforceTimeTable = !!opts.enforceTimeTable;
|
|
369
291
|
config.listenAddress = '127.0.0.1';
|
|
370
292
|
|
|
293
|
+
config.minTxPoolAgeMs = opts.minTxPoolAgeMs ?? 0;
|
|
294
|
+
|
|
371
295
|
const logger = getLogger();
|
|
372
296
|
|
|
373
297
|
// Create a temp directory for any services that need it and cleanup later
|
|
@@ -381,12 +305,6 @@ export async function setup(
|
|
|
381
305
|
if (!isAnvilTestChain(chain.id)) {
|
|
382
306
|
throw new Error(`No ETHEREUM_HOSTS set but non anvil chain requested`);
|
|
383
307
|
}
|
|
384
|
-
if (AZTEC_NODE_URL) {
|
|
385
|
-
throw new Error(
|
|
386
|
-
`AZTEC_NODE_URL provided but no ETHEREUM_HOSTS set. Refusing to run, please set both variables so tests can deploy L1 contracts to the same Anvil instance`,
|
|
387
|
-
);
|
|
388
|
-
}
|
|
389
|
-
|
|
390
308
|
const res = await startAnvil({
|
|
391
309
|
l1BlockTime: opts.ethereumSlotDuration,
|
|
392
310
|
accounts: opts.anvilAccounts,
|
|
@@ -441,11 +359,6 @@ export async function setup(
|
|
|
441
359
|
config.coinbase = EthAddress.fromString(publisherHdAccount.address);
|
|
442
360
|
}
|
|
443
361
|
|
|
444
|
-
if (AZTEC_NODE_URL) {
|
|
445
|
-
// we are setting up against a remote environment, l1 contracts are assumed to already be deployed
|
|
446
|
-
return await setupWithRemoteEnvironment(publisherHdAccount!, config, logger, numberOfAccounts);
|
|
447
|
-
}
|
|
448
|
-
|
|
449
362
|
// Determine which addresses to fund in genesis
|
|
450
363
|
const initialFundedAccounts =
|
|
451
364
|
opts.initialFundedAccounts ??
|
|
@@ -502,9 +415,14 @@ export async function setup(
|
|
|
502
415
|
if (enableAutomine) {
|
|
503
416
|
await ethCheatCodes.setAutomine(false);
|
|
504
417
|
await ethCheatCodes.setIntervalMining(config.ethereumSlotDuration);
|
|
505
|
-
dateProvider.setTime((await ethCheatCodes.timestamp()) * 1000);
|
|
506
418
|
}
|
|
507
419
|
|
|
420
|
+
// Always sync dateProvider to L1 time after deploying L1 contracts, regardless of mining mode.
|
|
421
|
+
// In compose mode, L1 time may have drifted ahead of system time due to the local-network watcher
|
|
422
|
+
// warping time forward on each filled slot. Without this sync, the sequencer computes the wrong
|
|
423
|
+
// slot from its dateProvider and cannot propose blocks.
|
|
424
|
+
dateProvider.setTime((await ethCheatCodes.timestamp()) * 1000);
|
|
425
|
+
|
|
508
426
|
if (opts.l2StartTime) {
|
|
509
427
|
await ethCheatCodes.warp(opts.l2StartTime, { resetBlockInterval: true });
|
|
510
428
|
}
|
|
@@ -595,7 +513,7 @@ export async function setup(
|
|
|
595
513
|
const proverNodeConfig = {
|
|
596
514
|
...config.proverNodeConfig,
|
|
597
515
|
dataDirectory: proverNodeDataDirectory,
|
|
598
|
-
p2pEnabled:
|
|
516
|
+
p2pEnabled: !!mockGossipSubNetwork,
|
|
599
517
|
};
|
|
600
518
|
proverNode = await createAndSyncProverNode(
|
|
601
519
|
proverNodePrivateKeyHex,
|
|
@@ -603,6 +521,11 @@ export async function setup(
|
|
|
603
521
|
proverNodeConfig,
|
|
604
522
|
aztecNodeService,
|
|
605
523
|
prefilledPublicData,
|
|
524
|
+
{
|
|
525
|
+
p2pClientDeps: mockGossipSubNetwork
|
|
526
|
+
? { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) }
|
|
527
|
+
: undefined,
|
|
528
|
+
},
|
|
606
529
|
);
|
|
607
530
|
}
|
|
608
531
|
|
|
@@ -683,7 +606,7 @@ export async function setup(
|
|
|
683
606
|
logger.error(`Error during e2e test teardown`, err);
|
|
684
607
|
} finally {
|
|
685
608
|
try {
|
|
686
|
-
await telemetryClient
|
|
609
|
+
await telemetryClient.stop();
|
|
687
610
|
} catch (err) {
|
|
688
611
|
logger.error(`Error during telemetry client stop`, err);
|
|
689
612
|
}
|
|
@@ -870,12 +793,11 @@ export type BalancesFn = ReturnType<typeof getBalancesFn>;
|
|
|
870
793
|
export function getBalancesFn(
|
|
871
794
|
symbol: string,
|
|
872
795
|
method: ContractMethod,
|
|
873
|
-
from: AztecAddress,
|
|
874
796
|
logger: any,
|
|
875
797
|
): (...addresses: (AztecAddress | { address: AztecAddress })[]) => Promise<bigint[]> {
|
|
876
798
|
const balances = async (...addressLikes: (AztecAddress | { address: AztecAddress })[]) => {
|
|
877
799
|
const addresses = addressLikes.map(addressLike => ('address' in addressLike ? addressLike.address : addressLike));
|
|
878
|
-
const b = await Promise.all(addresses.map(address => method(address).simulate({ from })));
|
|
800
|
+
const b = await Promise.all(addresses.map(address => method(address).simulate({ from: address })));
|
|
879
801
|
const debugString = `${symbol} balances: ${addresses.map((address, i) => `${address}: ${b[i]}`).join(', ')}`;
|
|
880
802
|
logger.verbose(debugString);
|
|
881
803
|
return b;
|
|
@@ -23,6 +23,8 @@ aztec-wallet create-account -a alice -f test0
|
|
|
23
23
|
aztec-wallet create-account -a bob -f test0
|
|
24
24
|
# docs:end:declare-accounts
|
|
25
25
|
|
|
26
|
+
aztec-wallet bridge-fee-juice 1000000000000000000000 accounts:alice --mint --no-wait
|
|
27
|
+
|
|
26
28
|
DEPLOY_OUTPUT=$(aztec-wallet deploy ../noir-contracts.js/artifacts/token_contract-Token.json --args accounts:test0 Test TST 18 -f test0)
|
|
27
29
|
TOKEN_ADDRESS=$(echo "$DEPLOY_OUTPUT" | grep -oE 'Contract deployed at 0x[0-9a-fA-F]+' | cut -d ' ' -f4)
|
|
28
30
|
echo "Deployed contract at $TOKEN_ADDRESS"
|
|
@@ -38,9 +40,7 @@ fi
|
|
|
38
40
|
|
|
39
41
|
TRANSFER_AMOUNT=42
|
|
40
42
|
|
|
41
|
-
aztec-wallet
|
|
42
|
-
|
|
43
|
-
aztec-wallet send transfer_in_private -ca last --args accounts:alice accounts:bob $TRANSFER_AMOUNT 1 -aw authwits:last -f test0
|
|
43
|
+
aztec-wallet send transfer_in_private -ca last --args accounts:alice accounts:bob $TRANSFER_AMOUNT 0 -f alice --payment method=fee_juice,claim
|
|
44
44
|
|
|
45
45
|
# Test end result
|
|
46
46
|
ALICE_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:alice -f alice)
|
|
@@ -4,7 +4,8 @@ import { Fr, GrumpkinScalar } from '@aztec/aztec.js/fields';
|
|
|
4
4
|
import type { Logger } from '@aztec/aztec.js/log';
|
|
5
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 (
|
|
@@ -17,12 +17,12 @@ import { InboxAbi, UniswapPortalAbi, UniswapPortalBytecode } from '@aztec/l1-art
|
|
|
17
17
|
import { UniswapContract } from '@aztec/noir-contracts.js/Uniswap';
|
|
18
18
|
import { computeL2ToL1MessageHash } from '@aztec/stdlib/hash';
|
|
19
19
|
import { computeL2ToL1MembershipWitness } from '@aztec/stdlib/messaging';
|
|
20
|
-
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
21
20
|
|
|
22
21
|
import { jest } from '@jest/globals';
|
|
23
22
|
import { type GetContractReturnType, getContract, parseEther, toFunctionSelector } from 'viem';
|
|
24
23
|
|
|
25
24
|
import { type EndToEndContext, ensureAccountContractsPublished } from '../fixtures/utils.js';
|
|
25
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
26
26
|
import { CrossChainTestHarness } from './cross_chain_test_harness.js';
|
|
27
27
|
|
|
28
28
|
// PSA: This tests works on forked mainnet. There is a dump of the data in `dumpedState` such that we
|
|
@@ -84,7 +84,7 @@ export const uniswapL1L2TestSuite = (
|
|
|
84
84
|
|
|
85
85
|
l1Client = deployL1ContractsValues.l1Client;
|
|
86
86
|
|
|
87
|
-
t.watcher
|
|
87
|
+
t.watcher.setIsMarkingAsProven(false);
|
|
88
88
|
|
|
89
89
|
if (Number(await l1Client.getBlockNumber()) < expectedForkBlockNumber) {
|
|
90
90
|
throw new Error('This test must be run on a fork of mainnet with the expected fork block');
|
|
@@ -119,39 +119,11 @@ export class TokenSimulator {
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
async checkPrivate() {
|
|
122
|
-
// Private calls
|
|
123
|
-
const defaultLookups = [];
|
|
124
|
-
const nonDefaultLookups = [];
|
|
125
|
-
|
|
126
122
|
for (const address of this.accounts) {
|
|
127
|
-
if (this.lookupProvider.has(address.toString())) {
|
|
128
|
-
nonDefaultLookups.push(address);
|
|
129
|
-
} else {
|
|
130
|
-
defaultLookups.push(address);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const defaultCalls = defaultLookups.map(address => this.token.methods.balance_of_private(address));
|
|
135
|
-
const results = (
|
|
136
|
-
await Promise.all(
|
|
137
|
-
chunk(defaultCalls, 4).map(batch =>
|
|
138
|
-
new BatchCall(this.defaultWallet, batch).simulate({ from: this.defaultAddress }),
|
|
139
|
-
),
|
|
140
|
-
)
|
|
141
|
-
).flat();
|
|
142
|
-
for (let i = 0; i < defaultLookups.length; i++) {
|
|
143
|
-
expect(results[i]).toEqual(this.balanceOfPrivate(defaultLookups[i]));
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// We are just running individual calls for the non-default lookups
|
|
147
|
-
// @todo We should also batch these
|
|
148
|
-
for (const address of nonDefaultLookups) {
|
|
149
123
|
const wallet = this.lookupProvider.get(address.toString());
|
|
150
124
|
const asset = wallet ? this.token.withWallet(wallet) : this.token;
|
|
151
125
|
|
|
152
|
-
const actualPrivateBalance = await asset.methods
|
|
153
|
-
.balance_of_private({ address })
|
|
154
|
-
.simulate({ from: this.defaultAddress });
|
|
126
|
+
const actualPrivateBalance = await asset.methods.balance_of_private(address).simulate({ from: address });
|
|
155
127
|
expect(actualPrivateBalance).toEqual(this.balanceOfPrivate(address));
|
|
156
128
|
}
|
|
157
129
|
}
|
|
@@ -13,11 +13,13 @@ import type { Logger } from '@aztec/foundation/log';
|
|
|
13
13
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
14
14
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
15
15
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
16
|
-
import {
|
|
16
|
+
import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
|
|
17
17
|
|
|
18
18
|
import { getACVMConfig } from '../fixtures/get_acvm_config.js';
|
|
19
19
|
import { getBBConfig } from '../fixtures/get_bb_config.js';
|
|
20
20
|
import { getSponsoredFPCAddress, registerSponsoredFPC } from '../fixtures/utils.js';
|
|
21
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
22
|
+
import { proveInteraction } from '../test-wallet/utils.js';
|
|
21
23
|
|
|
22
24
|
export interface TestAccounts {
|
|
23
25
|
aztecNode: AztecNode;
|
package/src/spartan/utils/bot.ts
CHANGED
|
@@ -34,7 +34,7 @@ export async function installTransferBot({
|
|
|
34
34
|
logger: log,
|
|
35
35
|
replicas = 1,
|
|
36
36
|
txIntervalSeconds = 10,
|
|
37
|
-
followChain = '
|
|
37
|
+
followChain = 'CHECKPOINTED',
|
|
38
38
|
mnemonic = process.env.LABS_INFRA_MNEMONIC ?? 'test test test test test test test test test test test junk',
|
|
39
39
|
mnemonicStartIndex,
|
|
40
40
|
botPrivateKey = process.env.BOT_TRANSFERS_L2_PRIVATE_KEY ?? '0xcafe01',
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { EcdsaKAccountContract, EcdsaRAccountContract } from '@aztec/accounts/ecdsa';
|
|
2
|
+
import { SchnorrAccountContract } from '@aztec/accounts/schnorr';
|
|
3
|
+
import { StubAccountContractArtifact, createStubAccount } from '@aztec/accounts/stub';
|
|
4
|
+
import { type Account, type AccountContract, SignerlessAccount } from '@aztec/aztec.js/account';
|
|
5
|
+
import {
|
|
6
|
+
type CallIntent,
|
|
7
|
+
type ContractFunctionInteractionCallIntent,
|
|
8
|
+
type IntentInnerHash,
|
|
9
|
+
SetPublicAuthwitContractInteraction,
|
|
10
|
+
computeInnerAuthWitHashFromAction,
|
|
11
|
+
isContractFunctionInteractionCallIntent,
|
|
12
|
+
lookupValidity,
|
|
13
|
+
} from '@aztec/aztec.js/authorization';
|
|
14
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
15
|
+
import { AccountManager, type SendOptions } from '@aztec/aztec.js/wallet';
|
|
16
|
+
import type { DefaultAccountEntrypointOptions } from '@aztec/entrypoints/account';
|
|
17
|
+
import { Fq, Fr } from '@aztec/foundation/curves/bn254';
|
|
18
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
19
|
+
import { type PXEConfig, getPXEConfig } from '@aztec/pxe/config';
|
|
20
|
+
import { PXE, type PXECreationOptions, createPXE } from '@aztec/pxe/server';
|
|
21
|
+
import { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
22
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
23
|
+
import { getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
|
|
24
|
+
import { deriveSigningKey } from '@aztec/stdlib/keys';
|
|
25
|
+
import type { NoteDao, NotesFilter } from '@aztec/stdlib/note';
|
|
26
|
+
import type { BlockHeader, TxHash, TxReceipt, TxSimulationResult } from '@aztec/stdlib/tx';
|
|
27
|
+
import { ExecutionPayload, mergeExecutionPayloads } from '@aztec/stdlib/tx';
|
|
28
|
+
import { BaseWallet, type FeeOptions } from '@aztec/wallet-sdk/base-wallet';
|
|
29
|
+
|
|
30
|
+
import { AztecNodeProxy, ProvenTx } from './utils.js';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Data for generating an account.
|
|
34
|
+
*/
|
|
35
|
+
export interface AccountData {
|
|
36
|
+
secret: Fr;
|
|
37
|
+
salt: Fr;
|
|
38
|
+
contract: AccountContract;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Wallet implementation that stores accounts in memory and provides extra debugging
|
|
43
|
+
* utilities
|
|
44
|
+
* It is intended to be used in e2e tests.
|
|
45
|
+
*/
|
|
46
|
+
export class TestWallet extends BaseWallet {
|
|
47
|
+
constructor(
|
|
48
|
+
pxe: PXE,
|
|
49
|
+
private readonly nodeRef: AztecNodeProxy,
|
|
50
|
+
) {
|
|
51
|
+
super(pxe, nodeRef);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static async create(
|
|
55
|
+
node: AztecNode,
|
|
56
|
+
overridePXEConfig?: Partial<PXEConfig>,
|
|
57
|
+
options: PXECreationOptions = { loggers: {} },
|
|
58
|
+
): Promise<TestWallet> {
|
|
59
|
+
const nodeRef = new AztecNodeProxy(node);
|
|
60
|
+
const pxeConfig = Object.assign(getPXEConfig(), {
|
|
61
|
+
proverEnabled: overridePXEConfig?.proverEnabled ?? false,
|
|
62
|
+
...overridePXEConfig,
|
|
63
|
+
});
|
|
64
|
+
const pxe = await createPXE(nodeRef, pxeConfig, options);
|
|
65
|
+
return new TestWallet(pxe, nodeRef);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Updates the underlying node that this wallet and its PXE communicate with.
|
|
70
|
+
* @param node - The new AztecNode to forward all calls to.
|
|
71
|
+
*/
|
|
72
|
+
updateNode(node: AztecNode): void {
|
|
73
|
+
this.nodeRef.updateTargetNode(node);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
createSchnorrAccount(secret: Fr, salt: Fr, signingKey?: Fq): Promise<AccountManager> {
|
|
77
|
+
signingKey = signingKey ?? deriveSigningKey(secret);
|
|
78
|
+
const accountData = {
|
|
79
|
+
secret,
|
|
80
|
+
salt,
|
|
81
|
+
contract: new SchnorrAccountContract(signingKey),
|
|
82
|
+
};
|
|
83
|
+
return this.createAccount(accountData);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
createECDSARAccount(secret: Fr, salt: Fr, signingKey: Buffer): Promise<AccountManager> {
|
|
87
|
+
const accountData = {
|
|
88
|
+
secret,
|
|
89
|
+
salt,
|
|
90
|
+
contract: new EcdsaRAccountContract(signingKey),
|
|
91
|
+
};
|
|
92
|
+
return this.createAccount(accountData);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
createECDSAKAccount(secret: Fr, salt: Fr, signingKey: Buffer): Promise<AccountManager> {
|
|
96
|
+
const accountData = {
|
|
97
|
+
secret,
|
|
98
|
+
salt,
|
|
99
|
+
contract: new EcdsaKAccountContract(signingKey),
|
|
100
|
+
};
|
|
101
|
+
return this.createAccount(accountData);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async getFakeAccountDataFor(address: AztecAddress) {
|
|
105
|
+
const originalAccount = await this.getAccountFromAddress(address);
|
|
106
|
+
if (originalAccount instanceof SignerlessAccount) {
|
|
107
|
+
throw new Error(`Cannot create fake account data for SignerlessAccount at address: ${address}`);
|
|
108
|
+
}
|
|
109
|
+
const originalAddress = (originalAccount as Account).getCompleteAddress();
|
|
110
|
+
const contractInstance = await this.pxe.getContractInstance(originalAddress.address);
|
|
111
|
+
if (!contractInstance) {
|
|
112
|
+
throw new Error(`No contract instance found for address: ${originalAddress.address}`);
|
|
113
|
+
}
|
|
114
|
+
const stubAccount = createStubAccount(originalAddress);
|
|
115
|
+
const instance = await getContractInstanceFromInstantiationParams(StubAccountContractArtifact, {
|
|
116
|
+
salt: Fr.random(),
|
|
117
|
+
});
|
|
118
|
+
return {
|
|
119
|
+
account: stubAccount,
|
|
120
|
+
instance,
|
|
121
|
+
artifact: StubAccountContractArtifact,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
protected accounts: Map<string, Account> = new Map();
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Toggle for running "simulated simulations" when calling simulateTx.
|
|
128
|
+
*
|
|
129
|
+
* When this flag is true, simulateViaEntrypoint constructs a request using a fake account
|
|
130
|
+
* (and accepts contract overrides on the input) and the PXE emulates kernel effects without
|
|
131
|
+
* generating kernel witnesses. When false, simulateViaEntrypoint defers to the standard
|
|
132
|
+
* simulation path via the real account entrypoint.
|
|
133
|
+
*/
|
|
134
|
+
private simulatedSimulations = false;
|
|
135
|
+
|
|
136
|
+
enableSimulatedSimulations() {
|
|
137
|
+
this.simulatedSimulations = true;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
disableSimulatedSimulations() {
|
|
141
|
+
this.simulatedSimulations = false;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
setMinFeePadding(value?: number) {
|
|
145
|
+
this.minFeePadding = value ?? 0.5;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
protected getAccountFromAddress(address: AztecAddress): Promise<Account> {
|
|
149
|
+
let account: Account | undefined;
|
|
150
|
+
if (address.equals(AztecAddress.ZERO)) {
|
|
151
|
+
account = new SignerlessAccount();
|
|
152
|
+
} else {
|
|
153
|
+
account = this.accounts.get(address?.toString() ?? '');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (!account) {
|
|
157
|
+
throw new Error(`Account not found in wallet for address: ${address}`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return Promise.resolve(account);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
getAccounts() {
|
|
164
|
+
return Promise.resolve(Array.from(this.accounts.values()).map(acc => ({ alias: '', item: acc.getAddress() })));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async createAccount(accountData?: AccountData): Promise<AccountManager> {
|
|
168
|
+
const secret = accountData?.secret ?? Fr.random();
|
|
169
|
+
const salt = accountData?.salt ?? Fr.random();
|
|
170
|
+
const contract = accountData?.contract ?? new SchnorrAccountContract(GrumpkinScalar.random());
|
|
171
|
+
|
|
172
|
+
const accountManager = await AccountManager.create(this, secret, contract, salt);
|
|
173
|
+
|
|
174
|
+
const instance = accountManager.getInstance();
|
|
175
|
+
const artifact = await contract.getContractArtifact();
|
|
176
|
+
|
|
177
|
+
await this.registerContract(instance, artifact, secret);
|
|
178
|
+
|
|
179
|
+
this.accounts.set(accountManager.address.toString(), await accountManager.getAccount());
|
|
180
|
+
|
|
181
|
+
return accountManager;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
lookupValidity(
|
|
185
|
+
onBehalfOf: AztecAddress,
|
|
186
|
+
intent: IntentInnerHash | CallIntent | ContractFunctionInteractionCallIntent,
|
|
187
|
+
witness: AuthWitness,
|
|
188
|
+
): Promise<{
|
|
189
|
+
isValidInPrivate: boolean;
|
|
190
|
+
isValidInPublic: boolean;
|
|
191
|
+
}> {
|
|
192
|
+
return lookupValidity(this, onBehalfOf, intent, witness);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
public setPublicAuthWit(
|
|
196
|
+
from: AztecAddress,
|
|
197
|
+
messageHashOrIntent: Fr | IntentInnerHash | CallIntent | ContractFunctionInteractionCallIntent,
|
|
198
|
+
authorized: boolean,
|
|
199
|
+
): Promise<SetPublicAuthwitContractInteraction> {
|
|
200
|
+
return SetPublicAuthwitContractInteraction.create(this, from, messageHashOrIntent, authorized);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public override async createAuthWit(
|
|
204
|
+
from: AztecAddress,
|
|
205
|
+
intent: IntentInnerHash | CallIntent | ContractFunctionInteractionCallIntent,
|
|
206
|
+
): Promise<AuthWitness> {
|
|
207
|
+
const account = await this.getAccountFromAddress(from);
|
|
208
|
+
const chainInfo = await this.getChainInfo();
|
|
209
|
+
let intentInnerHash: IntentInnerHash;
|
|
210
|
+
if ('caller' in intent) {
|
|
211
|
+
const call = isContractFunctionInteractionCallIntent(intent)
|
|
212
|
+
? await intent.action.getFunctionCall()
|
|
213
|
+
: intent.call;
|
|
214
|
+
const innerHash = await computeInnerAuthWitHashFromAction(intent.caller, call);
|
|
215
|
+
intentInnerHash = { innerHash, consumer: call.to };
|
|
216
|
+
} else {
|
|
217
|
+
intentInnerHash = intent;
|
|
218
|
+
}
|
|
219
|
+
return account.createAuthWit(intentInnerHash, chainInfo);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Override simulateViaEntrypoint to use fake accounts for kernelless simulation
|
|
224
|
+
* when simulatedSimulations is enabled. Otherwise falls through to the real entrypoint path.
|
|
225
|
+
*/
|
|
226
|
+
protected override async simulateViaEntrypoint(
|
|
227
|
+
executionPayload: ExecutionPayload,
|
|
228
|
+
from: AztecAddress,
|
|
229
|
+
feeOptions: FeeOptions,
|
|
230
|
+
skipTxValidation?: boolean,
|
|
231
|
+
skipFeeEnforcement?: boolean,
|
|
232
|
+
scopes?: AztecAddress[],
|
|
233
|
+
): Promise<TxSimulationResult> {
|
|
234
|
+
if (!this.simulatedSimulations) {
|
|
235
|
+
return super.simulateViaEntrypoint(
|
|
236
|
+
executionPayload,
|
|
237
|
+
from,
|
|
238
|
+
feeOptions,
|
|
239
|
+
skipTxValidation,
|
|
240
|
+
skipFeeEnforcement,
|
|
241
|
+
scopes,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const feeExecutionPayload = await feeOptions.walletFeePaymentMethod?.getExecutionPayload();
|
|
246
|
+
const executionOptions: DefaultAccountEntrypointOptions = {
|
|
247
|
+
txNonce: Fr.random(),
|
|
248
|
+
cancellable: this.cancellableTransactions,
|
|
249
|
+
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions,
|
|
250
|
+
};
|
|
251
|
+
const finalExecutionPayload = feeExecutionPayload
|
|
252
|
+
? mergeExecutionPayloads([feeExecutionPayload, executionPayload])
|
|
253
|
+
: executionPayload;
|
|
254
|
+
const { account: fromAccount, instance, artifact } = await this.getFakeAccountDataFor(from);
|
|
255
|
+
const chainInfo = await this.getChainInfo();
|
|
256
|
+
const txRequest = await fromAccount.createTxExecutionRequest(
|
|
257
|
+
finalExecutionPayload,
|
|
258
|
+
feeOptions.gasSettings,
|
|
259
|
+
chainInfo,
|
|
260
|
+
executionOptions,
|
|
261
|
+
);
|
|
262
|
+
const contractOverrides = {
|
|
263
|
+
[from.toString()]: { instance, artifact },
|
|
264
|
+
};
|
|
265
|
+
return this.pxe.simulateTx(txRequest, {
|
|
266
|
+
simulatePublic: true,
|
|
267
|
+
skipFeeEnforcement: true,
|
|
268
|
+
skipTxValidation: true,
|
|
269
|
+
overrides: { contracts: contractOverrides },
|
|
270
|
+
scopes,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async proveTx(exec: ExecutionPayload, opts: Omit<SendOptions, 'wait'>): Promise<ProvenTx> {
|
|
275
|
+
const fee = await this.completeFeeOptions(opts.from, exec.feePayer, opts.fee?.gasSettings);
|
|
276
|
+
const txRequest = await this.createTxExecutionRequestFromPayloadAndFee(exec, opts.from, fee);
|
|
277
|
+
const txProvingResult = await this.pxe.proveTx(txRequest, this.scopesFor(opts.from));
|
|
278
|
+
return new ProvenTx(
|
|
279
|
+
this.aztecNode,
|
|
280
|
+
await txProvingResult.toTx(),
|
|
281
|
+
txProvingResult.getOffchainEffects(),
|
|
282
|
+
txProvingResult.stats,
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
getTxReceipt(txHash: TxHash): Promise<TxReceipt> {
|
|
287
|
+
return this.aztecNode.getTxReceipt(txHash);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
getNotes(filter: NotesFilter): Promise<NoteDao[]> {
|
|
291
|
+
return this.pxe.debug.getNotes(filter);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
295
|
+
return this.pxe.getSyncedBlockHeader();
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
sync(): Promise<void> {
|
|
299
|
+
return this.pxe.debug.sync();
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
stop(): Promise<void> {
|
|
303
|
+
return this.pxe.stop();
|
|
304
|
+
}
|
|
305
|
+
}
|