@aztec/end-to-end 3.0.0-canary.a9708bd → 3.0.0-devnet.20251212
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/benchmark.d.ts +4 -3
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +25 -14
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +111 -90
- package/dest/bench/client_flows/config.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.js +8 -30
- package/dest/bench/utils.d.ts +4 -13
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +10 -34
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +8 -8
- 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 +42 -42
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +12 -9
- 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 +35 -35
- package/dest/e2e_deploy_contract/deploy_test.d.ts +12 -6
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +9 -18
- package/dest/e2e_epochs/epochs_test.d.ts +19 -12
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +30 -22
- package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
- package/dest/e2e_fees/bridging_race.notest.js +14 -11
- package/dest/e2e_fees/fees_test.d.ts +10 -8
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +35 -38
- package/dest/e2e_l1_publisher/write_json.d.ts +4 -2
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +9 -8
- package/dest/e2e_multi_validator/utils.d.ts +2 -2
- package/dest/e2e_multi_validator/utils.d.ts.map +1 -1
- package/dest/e2e_multi_validator/utils.js +4 -10
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +7 -4
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +11 -12
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
- package/dest/e2e_p2p/inactivity_slash_test.js +139 -0
- package/dest/e2e_p2p/p2p_network.d.ts +238 -17
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +46 -19
- package/dest/e2e_p2p/shared.d.ts +16 -17
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +56 -55
- package/dest/e2e_token_contract/token_contract_test.d.ts +6 -5
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +14 -17
- package/dest/fixtures/e2e_prover_test.d.ts +12 -8
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +53 -58
- package/dest/fixtures/fixtures.d.ts +1 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +1 -1
- package/dest/fixtures/get_acvm_config.d.ts +2 -2
- package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
- package/dest/fixtures/get_acvm_config.js +1 -1
- package/dest/fixtures/get_bb_config.d.ts +2 -2
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +2 -2
- package/dest/fixtures/index.d.ts +1 -1
- 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/setup_l1_contracts.d.ts +476 -5
- package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -1
- package/dest/fixtures/setup_l1_contracts.js +3 -3
- package/dest/fixtures/setup_p2p_test.d.ts +12 -11
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +50 -24
- package/dest/fixtures/snapshot_manager.d.ts +13 -10
- package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
- package/dest/fixtures/snapshot_manager.js +66 -51
- package/dest/fixtures/token_utils.d.ts +10 -5
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +17 -18
- package/dest/fixtures/utils.d.ts +479 -35
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +106 -125
- package/dest/fixtures/web3signer.d.ts +5 -0
- package/dest/fixtures/web3signer.d.ts.map +1 -0
- package/dest/fixtures/web3signer.js +53 -0
- 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/index.d.ts +1 -1
- package/dest/quality_of_service/alert_checker.d.ts +2 -2
- package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts +20 -23
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +14 -16
- package/dest/shared/gas_portal_test_harness.d.ts +10 -17
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +11 -8
- package/dest/shared/index.d.ts +1 -1
- package/dest/shared/jest_setup.d.ts +1 -1
- package/dest/shared/jest_setup.js +1 -1
- package/dest/shared/submit-transactions.d.ts +6 -4
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +8 -7
- package/dest/shared/uniswap_l1_l2.d.ts +12 -8
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +44 -58
- package/dest/simulators/index.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts +4 -7
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +8 -5
- package/dest/simulators/token_simulator.d.ts +4 -2
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +2 -2
- package/dest/spartan/setup_test_wallets.d.ts +22 -14
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +144 -86
- package/dest/spartan/tx_metrics.d.ts +39 -0
- package/dest/spartan/tx_metrics.d.ts.map +1 -0
- package/dest/spartan/tx_metrics.js +95 -0
- package/dest/spartan/utils.d.ts +92 -17
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +386 -63
- package/package.json +43 -40
- package/src/bench/client_flows/benchmark.ts +8 -8
- package/src/bench/client_flows/client_flows_benchmark.ts +141 -114
- package/src/bench/client_flows/data_extractor.ts +9 -31
- package/src/bench/utils.ts +9 -37
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +46 -63
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +38 -51
- package/src/e2e_deploy_contract/deploy_test.ts +18 -36
- package/src/e2e_epochs/epochs_test.ts +41 -35
- package/src/e2e_fees/bridging_race.notest.ts +16 -11
- package/src/e2e_fees/fees_test.ts +42 -47
- package/src/e2e_l1_publisher/write_json.ts +12 -9
- package/src/e2e_multi_validator/utils.ts +5 -11
- package/src/e2e_nested_contract/nested_contract_test.ts +15 -13
- package/src/e2e_p2p/inactivity_slash_test.ts +184 -0
- package/src/e2e_p2p/p2p_network.ts +124 -82
- package/src/e2e_p2p/shared.ts +66 -58
- package/src/e2e_token_contract/token_contract_test.ts +17 -17
- package/src/fixtures/e2e_prover_test.ts +60 -97
- package/src/fixtures/fixtures.ts +1 -2
- package/src/fixtures/get_acvm_config.ts +2 -2
- package/src/fixtures/get_bb_config.ts +3 -2
- package/src/fixtures/l1_to_l2_messaging.ts +4 -2
- package/src/fixtures/setup_l1_contracts.ts +5 -4
- package/src/fixtures/setup_p2p_test.ts +79 -32
- package/src/fixtures/snapshot_manager.ts +87 -82
- package/src/fixtures/token_utils.ts +16 -24
- package/src/fixtures/utils.ts +142 -172
- package/src/fixtures/web3signer.ts +63 -0
- package/src/fixtures/with_telemetry_utils.ts +2 -2
- package/src/guides/up_quick_start.sh +3 -11
- package/src/quality_of_service/alert_checker.ts +1 -1
- package/src/shared/cross_chain_test_harness.ts +23 -31
- package/src/shared/gas_portal_test_harness.ts +14 -21
- package/src/shared/jest_setup.ts +1 -1
- package/src/shared/submit-transactions.ts +12 -8
- package/src/shared/uniswap_l1_l2.ts +77 -86
- package/src/simulators/lending_simulator.ts +9 -6
- package/src/simulators/token_simulator.ts +5 -2
- package/src/spartan/DEVELOP.md +15 -3
- package/src/spartan/setup_test_wallets.ts +171 -127
- package/src/spartan/tx_metrics.ts +130 -0
- package/src/spartan/utils.ts +463 -64
package/dest/e2e_p2p/shared.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Fr
|
|
1
|
+
import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
2
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
3
|
+
import { TxStatus } from '@aztec/aztec.js/tx';
|
|
4
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
3
5
|
import { timesAsync, unique } from '@aztec/foundation/collection';
|
|
6
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
7
|
+
import { pluralize } from '@aztec/foundation/string';
|
|
4
8
|
import { TestContract, TestContractArtifact } from '@aztec/noir-test-contracts.js/Test';
|
|
5
|
-
import {
|
|
9
|
+
import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
|
|
6
10
|
import { getRoundForOffense } from '@aztec/slasher';
|
|
11
|
+
import { TestWallet, proveInteraction } from '@aztec/test-wallet/server';
|
|
7
12
|
import { submitTxsTo } from '../shared/submit-transactions.js';
|
|
8
13
|
// submits a set of transactions to the provided Private eXecution Environment (PXE)
|
|
9
14
|
export const submitComplexTxsTo = async (logger, from, spamContract, numTxs, opts = {})=>{
|
|
@@ -26,51 +31,42 @@ export const submitComplexTxsTo = async (logger, from, spamContract, numTxs, opt
|
|
|
26
31
|
}
|
|
27
32
|
return txs;
|
|
28
33
|
};
|
|
29
|
-
// creates
|
|
30
|
-
export const
|
|
34
|
+
// creates a wallet and submit a given number of transactions through it.
|
|
35
|
+
export const submitTransactions = async (logger, node, numTxs, fundedAccount)=>{
|
|
31
36
|
const rpcConfig = getRpcConfig();
|
|
32
37
|
rpcConfig.proverEnabled = false;
|
|
33
|
-
const
|
|
38
|
+
const wallet = await TestWallet.create(node, {
|
|
39
|
+
...getPXEConfig(),
|
|
40
|
+
proverEnabled: false
|
|
41
|
+
}, {
|
|
34
42
|
useLogSuffix: true
|
|
35
43
|
});
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
const wallet = await account.getWallet();
|
|
39
|
-
const txs = await submitTxsTo(pxeService, numTxs, wallet, logger);
|
|
40
|
-
return {
|
|
41
|
-
txs,
|
|
42
|
-
pxeService,
|
|
43
|
-
node
|
|
44
|
-
};
|
|
44
|
+
const fundedAccountManager = await wallet.createSchnorrAccount(fundedAccount.secret, fundedAccount.salt);
|
|
45
|
+
return submitTxsTo(wallet, fundedAccountManager.address, numTxs, logger);
|
|
45
46
|
};
|
|
46
|
-
export async function
|
|
47
|
+
export async function prepareTransactions(logger, node, numTxs, fundedAccount) {
|
|
47
48
|
const rpcConfig = getRpcConfig();
|
|
48
49
|
rpcConfig.proverEnabled = false;
|
|
49
|
-
const
|
|
50
|
+
const wallet = await TestWallet.create(node, {
|
|
51
|
+
...getPXEConfig(),
|
|
52
|
+
proverEnabled: false
|
|
53
|
+
}, {
|
|
50
54
|
useLogSuffix: true
|
|
51
55
|
});
|
|
52
|
-
const
|
|
53
|
-
await
|
|
54
|
-
|
|
55
|
-
const testContractInstance = await getContractInstanceFromInstantiationParams(TestContractArtifact, {});
|
|
56
|
-
await wallet.registerContract({
|
|
57
|
-
instance: testContractInstance,
|
|
58
|
-
artifact: TestContractArtifact
|
|
56
|
+
const fundedAccountManager = await wallet.createSchnorrAccount(fundedAccount.secret, fundedAccount.salt);
|
|
57
|
+
const testContractInstance = await getContractInstanceFromInstantiationParams(TestContractArtifact, {
|
|
58
|
+
salt: Fr.random()
|
|
59
59
|
});
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
await wallet.registerContract(testContractInstance, TestContractArtifact);
|
|
61
|
+
const contract = TestContract.at(testContractInstance.address, wallet);
|
|
62
|
+
return timesAsync(numTxs, async ()=>{
|
|
63
|
+
const tx = await proveInteraction(wallet, contract.methods.emit_nullifier(Fr.random()), {
|
|
64
|
+
from: fundedAccountManager.address
|
|
64
65
|
});
|
|
65
66
|
const txHash = tx.getTxHash();
|
|
66
67
|
logger.info(`Tx prepared with hash ${txHash}`);
|
|
67
68
|
return tx;
|
|
68
69
|
});
|
|
69
|
-
return {
|
|
70
|
-
txs,
|
|
71
|
-
pxeService: pxe,
|
|
72
|
-
node
|
|
73
|
-
};
|
|
74
70
|
}
|
|
75
71
|
export function awaitProposalExecution(slashingProposer, timeoutSeconds, logger) {
|
|
76
72
|
return new Promise((resolve, reject)=>{
|
|
@@ -107,37 +103,36 @@ export async function awaitCommitteeExists({ rollup, logger }) {
|
|
|
107
103
|
}, 'non-empty committee', 60);
|
|
108
104
|
return committee;
|
|
109
105
|
}
|
|
110
|
-
export async function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSize, epochDuration }) {
|
|
111
|
-
|
|
106
|
+
export async function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSize, epochDuration, waitUntilOffenseCount, timeoutSeconds = 120 }) {
|
|
107
|
+
const targetOffenseCount = waitUntilOffenseCount ?? 1;
|
|
108
|
+
logger.warn(`Waiting for ${pluralize('offense', targetOffenseCount)} to be detected`);
|
|
112
109
|
const offenses = await retryUntil(async ()=>{
|
|
113
110
|
const offenses = await nodeAdmin.getSlashOffenses('all');
|
|
114
|
-
if (offenses.length
|
|
111
|
+
if (offenses.length >= targetOffenseCount) {
|
|
115
112
|
return offenses;
|
|
116
113
|
}
|
|
117
|
-
}, 'non-empty offenses',
|
|
114
|
+
}, 'non-empty offenses', timeoutSeconds);
|
|
118
115
|
logger.info(`Hit ${offenses.length} offenses on rounds ${unique(offenses.map((o)=>getRoundForOffense(o, {
|
|
119
116
|
slashingRoundSize,
|
|
120
117
|
epochDuration
|
|
121
|
-
})))}`,
|
|
118
|
+
})))}`, {
|
|
119
|
+
offenses
|
|
120
|
+
});
|
|
122
121
|
return offenses;
|
|
123
122
|
}
|
|
124
123
|
/**
|
|
125
124
|
* Await the committee to be slashed out of the validator set.
|
|
126
125
|
* Currently assumes that the committee is the same size as the validator set.
|
|
127
|
-
*/ export async function awaitCommitteeKicked({ rollup, cheatCodes, committee, slashFactory, slashingProposer, slashingRoundSize, aztecSlotDuration, logger,
|
|
126
|
+
*/ export async function awaitCommitteeKicked({ rollup, cheatCodes, committee, slashFactory, slashingProposer, slashingRoundSize, aztecSlotDuration, aztecEpochDuration, logger, offenseEpoch }) {
|
|
128
127
|
if (!slashingProposer) {
|
|
129
128
|
throw new Error('No slashing proposer configured. Cannot test slashing.');
|
|
130
129
|
}
|
|
131
|
-
logger.info(`Advancing epochs so we start slashing`);
|
|
132
130
|
await cheatCodes.debugRollup();
|
|
133
|
-
await cheatCodes.advanceToNextEpoch({
|
|
134
|
-
updateDateProvider: dateProvider
|
|
135
|
-
});
|
|
136
|
-
await cheatCodes.advanceToNextEpoch({
|
|
137
|
-
updateDateProvider: dateProvider
|
|
138
|
-
});
|
|
139
|
-
// Await for the slash payload to be created if empire (no payload is created on tally until execution time)
|
|
140
131
|
if (slashingProposer.type === 'empire') {
|
|
132
|
+
// Await for the slash payload to be created if empire (no payload is created on tally until execution time)
|
|
133
|
+
const targetEpoch = BigInt(await cheatCodes.getEpoch()) + await rollup.getLagInEpochsForValidatorSet() + 1n;
|
|
134
|
+
logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
|
|
135
|
+
await cheatCodes.advanceToEpoch(EpochNumber.fromBigInt(targetEpoch));
|
|
141
136
|
const slashPayloadEvents = await retryUntil(async ()=>{
|
|
142
137
|
const events = await slashFactory.getSlashPayloadCreatedEvents();
|
|
143
138
|
return events.length > 0 ? events : undefined;
|
|
@@ -145,6 +140,17 @@ export async function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSiz
|
|
|
145
140
|
expect(slashPayloadEvents.length).toBe(1);
|
|
146
141
|
// The uniqueness check is needed since a validator may be slashed more than once on the same round (eg because they let two epochs be pruned)
|
|
147
142
|
expect(unique(slashPayloadEvents[0].slashes.map((slash)=>slash.validator.toString()))).toHaveLength(committee.length);
|
|
143
|
+
} else {
|
|
144
|
+
// Use the slash offset to ensure we are in the right epoch for tally
|
|
145
|
+
const slashOffsetInRounds = await slashingProposer.getSlashOffsetInRounds();
|
|
146
|
+
const slashingRoundSizeInEpochs = slashingRoundSize / aztecEpochDuration;
|
|
147
|
+
const slashingOffsetInEpochs = Number(slashOffsetInRounds) * slashingRoundSizeInEpochs;
|
|
148
|
+
const firstEpochInOffenseRound = offenseEpoch - offenseEpoch % slashingRoundSizeInEpochs;
|
|
149
|
+
const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
|
|
150
|
+
logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
|
|
151
|
+
await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), {
|
|
152
|
+
offset: -aztecSlotDuration / 2
|
|
153
|
+
});
|
|
148
154
|
}
|
|
149
155
|
const attestersPre = await rollup.getAttesters();
|
|
150
156
|
expect(attestersPre.length).toBe(committee.length);
|
|
@@ -152,7 +158,7 @@ export async function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSiz
|
|
|
152
158
|
const attesterInfo = await rollup.getAttesterView(attester);
|
|
153
159
|
expect(attesterInfo.status).toEqual(1); // Validating
|
|
154
160
|
}
|
|
155
|
-
const timeout = slashingRoundSize * 2 * aztecSlotDuration;
|
|
161
|
+
const timeout = slashingRoundSize * 2 * aztecSlotDuration + 30;
|
|
156
162
|
logger.info(`Waiting for slash to be executed (timeout ${timeout}s)`);
|
|
157
163
|
await awaitProposalExecution(slashingProposer, timeout, logger);
|
|
158
164
|
// The attesters should still form the committee but they should be reduced to the "living" status
|
|
@@ -165,14 +171,9 @@ export async function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSiz
|
|
|
165
171
|
const attesterInfo = await rollup.getAttesterView(attester);
|
|
166
172
|
expect(attesterInfo.status).toEqual(2); // Living
|
|
167
173
|
}
|
|
168
|
-
logger.info(`Advancing
|
|
174
|
+
logger.info(`Advancing to check current committee`);
|
|
169
175
|
await cheatCodes.debugRollup();
|
|
170
|
-
await cheatCodes.
|
|
171
|
-
updateDateProvider: dateProvider
|
|
172
|
-
});
|
|
173
|
-
await cheatCodes.advanceToNextEpoch({
|
|
174
|
-
updateDateProvider: dateProvider
|
|
175
|
-
});
|
|
176
|
+
await cheatCodes.advanceToEpoch(EpochNumber.fromBigInt(BigInt(await cheatCodes.getEpoch()) + await rollup.getLagInEpochsForValidatorSet() + 1n));
|
|
176
177
|
await cheatCodes.debugRollup();
|
|
177
178
|
const committeeNextEpoch = await rollup.getCurrentEpochCommittee();
|
|
178
179
|
// The committee should be undefined, since the validator set is empty
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import { type Logger } from '@aztec/aztec.js/log';
|
|
3
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
2
4
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
3
5
|
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
6
|
+
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
4
7
|
import { type SubsystemsContext } from '../fixtures/snapshot_manager.js';
|
|
5
8
|
import { TokenSimulator } from '../simulators/token_simulator.js';
|
|
6
9
|
export declare class TokenContractTest {
|
|
@@ -13,11 +16,9 @@ export declare class TokenContractTest {
|
|
|
13
16
|
tokenSim: TokenSimulator;
|
|
14
17
|
node: AztecNode;
|
|
15
18
|
badAccount: InvalidAccountContract;
|
|
16
|
-
|
|
19
|
+
wallet: TestWallet;
|
|
17
20
|
adminAddress: AztecAddress;
|
|
18
|
-
account1: AccountWallet;
|
|
19
21
|
account1Address: AztecAddress;
|
|
20
|
-
account2: AccountWallet;
|
|
21
22
|
account2Address: AztecAddress;
|
|
22
23
|
constructor(testName: string);
|
|
23
24
|
/**
|
|
@@ -31,4 +32,4 @@ export declare class TokenContractTest {
|
|
|
31
32
|
teardown(): Promise<void>;
|
|
32
33
|
applyMintSnapshot(): Promise<void>;
|
|
33
34
|
}
|
|
34
|
-
//# sourceMappingURL=
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5fY29udHJhY3RfdGVzdC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2UyZV90b2tlbl9jb250cmFjdC90b2tlbl9jb250cmFjdF90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0scUJBQXFCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RGLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSTVELE9BQU8sRUFFTCxLQUFLLGlCQUFpQixFQUl2QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUlsRSxxQkFBYSxpQkFBaUI7SUFDNUIsTUFBTSxDQUFDLFVBQVUsU0FBVTtJQUMzQixNQUFNLENBQUMsWUFBWSxTQUFTO0lBQzVCLE1BQU0sQ0FBQyxjQUFjLFNBQU87SUFDNUIsT0FBTyxDQUFDLGVBQWUsQ0FBbUI7SUFDMUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLEtBQUssRUFBRyxhQUFhLENBQUM7SUFDdEIsUUFBUSxFQUFHLGNBQWMsQ0FBQztJQUMxQixJQUFJLEVBQUcsU0FBUyxDQUFDO0lBRWpCLFVBQVUsRUFBRyxzQkFBc0IsQ0FBQztJQUNwQyxNQUFNLEVBQUcsVUFBVSxDQUFDO0lBQ3BCLFlBQVksRUFBRyxZQUFZLENBQUM7SUFDNUIsZUFBZSxFQUFHLFlBQVksQ0FBQztJQUMvQixlQUFlLEVBQUcsWUFBWSxDQUFDO0lBRS9CLFlBQVksUUFBUSxFQUFFLE1BQU0sRUFLM0I7SUFFRDs7OztPQUlHO0lBQ0csa0JBQWtCLGtCQWdFdkI7SUFFSyxLQUFLLGtCQUVWO0lBRUQsUUFBUSxHQUFJLENBQUMsOEpBSTJEO0lBRWxFLFFBQVEsa0JBRWI7SUFFSyxpQkFBaUIsa0JBb0N0QjtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token_contract_test.d.ts","sourceRoot":"","sources":["../../src/e2e_token_contract/token_contract_test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token_contract_test.d.ts","sourceRoot":"","sources":["../../src/e2e_token_contract/token_contract_test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI5D,OAAO,EAEL,KAAK,iBAAiB,EAIvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAIlE,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,UAAU,SAAU;IAC3B,MAAM,CAAC,YAAY,SAAS;IAC5B,MAAM,CAAC,cAAc,SAAO;IAC5B,OAAO,CAAC,eAAe,CAAmB;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAG,aAAa,CAAC;IACtB,QAAQ,EAAG,cAAc,CAAC;IAC1B,IAAI,EAAG,SAAS,CAAC;IAEjB,UAAU,EAAG,sBAAsB,CAAC;IACpC,MAAM,EAAG,UAAU,CAAC;IACpB,YAAY,EAAG,YAAY,CAAC;IAC5B,eAAe,EAAG,YAAY,CAAC;IAC/B,eAAe,EAAG,YAAY,CAAC;IAE/B,YAAY,QAAQ,EAAE,MAAM,EAK3B;IAED;;;;OAIG;IACG,kBAAkB,kBAgEvB;IAEK,KAAK,kBAEV;IAED,QAAQ,GAAI,CAAC,8JAI2D;IAElE,QAAQ,kBAEb;IAEK,iBAAiB,kBAoCtB;CACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createLogger } from '@aztec/aztec.js';
|
|
1
|
+
import { createLogger } from '@aztec/aztec.js/log';
|
|
3
2
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
4
3
|
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
5
4
|
import { jest } from '@jest/globals';
|
|
@@ -17,11 +16,9 @@ export class TokenContractTest {
|
|
|
17
16
|
tokenSim;
|
|
18
17
|
node;
|
|
19
18
|
badAccount;
|
|
20
|
-
|
|
19
|
+
wallet;
|
|
21
20
|
adminAddress;
|
|
22
|
-
account1;
|
|
23
21
|
account1Address;
|
|
24
|
-
account2;
|
|
25
22
|
account2Address;
|
|
26
23
|
constructor(testName){
|
|
27
24
|
this.logger = createLogger(`e2e:e2e_token_contract:${testName}`);
|
|
@@ -36,27 +33,27 @@ export class TokenContractTest {
|
|
|
36
33
|
*/ async applyBaseSnapshots() {
|
|
37
34
|
// Adding a timeout of 2 minutes in here such that it is propagated to the underlying tests
|
|
38
35
|
jest.setTimeout(120_000);
|
|
39
|
-
await this.snapshotManager.snapshot('3_accounts', deployAccounts(3, this.logger),
|
|
36
|
+
await this.snapshotManager.snapshot('3_accounts', deployAccounts(3, this.logger), ({ deployedAccounts }, { wallet, aztecNode })=>{
|
|
40
37
|
this.node = aztecNode;
|
|
41
|
-
|
|
42
|
-
[this.
|
|
43
|
-
|
|
38
|
+
this.wallet = wallet;
|
|
39
|
+
[this.adminAddress, this.account1Address, this.account2Address] = deployedAccounts.map((acc)=>acc.address);
|
|
40
|
+
return Promise.resolve();
|
|
44
41
|
});
|
|
45
42
|
await this.snapshotManager.snapshot('e2e_token_contract', async ()=>{
|
|
46
43
|
// Create the token contract state.
|
|
47
44
|
// Move this account thing to addAccounts above?
|
|
48
45
|
this.logger.verbose(`Public deploy accounts...`);
|
|
49
|
-
await publicDeployAccounts(this.
|
|
46
|
+
await publicDeployAccounts(this.wallet, [
|
|
50
47
|
this.adminAddress,
|
|
51
48
|
this.account1Address
|
|
52
49
|
]);
|
|
53
50
|
this.logger.verbose(`Deploying TokenContract...`);
|
|
54
|
-
const asset = await TokenContract.deploy(this.
|
|
51
|
+
const asset = await TokenContract.deploy(this.wallet, this.adminAddress, TokenContractTest.TOKEN_NAME, TokenContractTest.TOKEN_SYMBOL, TokenContractTest.TOKEN_DECIMALS).send({
|
|
55
52
|
from: this.adminAddress
|
|
56
53
|
}).deployed();
|
|
57
54
|
this.logger.verbose(`Token deployed to ${asset.address}`);
|
|
58
55
|
this.logger.verbose(`Deploying bad account...`);
|
|
59
|
-
this.badAccount = await InvalidAccountContract.deploy(this.
|
|
56
|
+
this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({
|
|
60
57
|
from: this.adminAddress
|
|
61
58
|
}).deployed();
|
|
62
59
|
this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
|
|
@@ -66,13 +63,13 @@ export class TokenContractTest {
|
|
|
66
63
|
};
|
|
67
64
|
}, async ({ tokenContractAddress, badAccountAddress })=>{
|
|
68
65
|
// Restore the token contract state.
|
|
69
|
-
this.asset =
|
|
66
|
+
this.asset = TokenContract.at(tokenContractAddress, this.wallet);
|
|
70
67
|
this.logger.verbose(`Token contract address: ${this.asset.address}`);
|
|
71
|
-
this.tokenSim = new TokenSimulator(this.asset, this.
|
|
68
|
+
this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
|
|
72
69
|
this.adminAddress,
|
|
73
70
|
this.account1Address
|
|
74
71
|
]);
|
|
75
|
-
this.badAccount =
|
|
72
|
+
this.badAccount = InvalidAccountContract.at(badAccountAddress, this.wallet);
|
|
76
73
|
this.logger.verbose(`Bad account address: ${this.badAccount.address}`);
|
|
77
74
|
expect(await this.asset.methods.get_admin().simulate({
|
|
78
75
|
from: this.adminAddress
|
|
@@ -92,14 +89,14 @@ export class TokenContractTest {
|
|
|
92
89
|
}
|
|
93
90
|
async applyMintSnapshot() {
|
|
94
91
|
await this.snapshotManager.snapshot('mint', async ()=>{
|
|
95
|
-
const { asset,
|
|
92
|
+
const { asset, adminAddress } = this;
|
|
96
93
|
const amount = 10000n;
|
|
97
94
|
this.logger.verbose(`Minting ${amount} publicly...`);
|
|
98
95
|
await asset.methods.mint_to_public(adminAddress, amount).send({
|
|
99
96
|
from: adminAddress
|
|
100
97
|
}).wait();
|
|
101
98
|
this.logger.verbose(`Minting ${amount} privately...`);
|
|
102
|
-
await mintTokensToPrivate(asset, adminAddress,
|
|
99
|
+
await mintTokensToPrivate(asset, adminAddress, adminAddress, amount);
|
|
103
100
|
this.logger.verbose(`Minting complete.`);
|
|
104
101
|
return {
|
|
105
102
|
amount
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import type { InitialAccountData } from '@aztec/accounts/testing';
|
|
2
|
-
import {
|
|
2
|
+
import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import { type Logger } from '@aztec/aztec.js/log';
|
|
4
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
3
5
|
import { CheatCodes } from '@aztec/aztec/testing';
|
|
4
6
|
import { type ClientProtocolCircuitVerifier } from '@aztec/bb-prover';
|
|
5
7
|
import type { BlobSinkServer } from '@aztec/blob-sink/server';
|
|
6
|
-
import type { DeployL1ContractsReturnType } from '@aztec/ethereum';
|
|
8
|
+
import type { DeployL1ContractsReturnType } from '@aztec/ethereum/deploy-l1-contracts';
|
|
7
9
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
8
|
-
import type {
|
|
10
|
+
import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
9
11
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
12
|
+
import { TestWallet } from '@aztec/test-wallet/server';
|
|
10
13
|
import { TokenSimulator } from '../simulators/token_simulator.js';
|
|
11
14
|
import { type SubsystemsContext } from './snapshot_manager.js';
|
|
12
15
|
/**
|
|
@@ -23,21 +26,22 @@ export declare class FullProverTest {
|
|
|
23
26
|
static TOKEN_DECIMALS: bigint;
|
|
24
27
|
private snapshotManager;
|
|
25
28
|
logger: Logger;
|
|
29
|
+
wallet: TestWallet;
|
|
30
|
+
provenWallet: TestWallet;
|
|
31
|
+
accounts: AztecAddress[];
|
|
26
32
|
deployedAccounts: InitialAccountData[];
|
|
27
|
-
wallets: AccountWalletWithSecretKey[];
|
|
28
|
-
accounts: CompleteAddress[];
|
|
29
33
|
fakeProofsAsset: TokenContract;
|
|
34
|
+
fakeProofsAssetInstance: ContractInstanceWithAddress;
|
|
30
35
|
tokenSim: TokenSimulator;
|
|
31
36
|
aztecNode: AztecNode;
|
|
32
37
|
aztecNodeAdmin: AztecNodeAdmin;
|
|
33
|
-
pxe: PXEService;
|
|
34
38
|
cheatCodes: CheatCodes;
|
|
35
39
|
blobSink: BlobSinkServer;
|
|
36
40
|
private provenComponents;
|
|
37
41
|
private bbConfigCleanup?;
|
|
38
42
|
private acvmConfigCleanup?;
|
|
39
43
|
circuitProofVerifier?: ClientProtocolCircuitVerifier;
|
|
40
|
-
|
|
44
|
+
provenAsset: TokenContract;
|
|
41
45
|
private context;
|
|
42
46
|
private proverNode;
|
|
43
47
|
private simulatedProverNode;
|
|
@@ -56,4 +60,4 @@ export declare class FullProverTest {
|
|
|
56
60
|
teardown(): Promise<void>;
|
|
57
61
|
applyMintSnapshot(): Promise<void>;
|
|
58
62
|
}
|
|
59
|
-
//# sourceMappingURL=
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTJlX3Byb3Zlcl90ZXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZml4dHVyZXMvZTJlX3Byb3Zlcl90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0scUJBQXFCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFFTCxLQUFLLDZCQUE2QixFQUduQyxNQUFNLGtCQUFrQixDQUFDO0FBRzFCLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFJdkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBTXZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUdsRSxPQUFPLEVBRUwsS0FBSyxpQkFBaUIsRUFJdkIsTUFBTSx1QkFBdUIsQ0FBQztBQVUvQjs7Ozs7R0FLRztBQUVILHFCQUFhLGNBQWM7SUE4QnZCLE9BQU8sQ0FBQyxzQkFBc0I7SUFFOUIsT0FBTyxDQUFDLFVBQVU7SUEvQnBCLE1BQU0sQ0FBQyxVQUFVLFNBQVU7SUFDM0IsTUFBTSxDQUFDLFlBQVksU0FBUztJQUM1QixNQUFNLENBQUMsY0FBYyxTQUFPO0lBQzVCLE9BQU8sQ0FBQyxlQUFlLENBQW1CO0lBQzFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDZixNQUFNLEVBQUcsVUFBVSxDQUFDO0lBQ3BCLFlBQVksRUFBRyxVQUFVLENBQUM7SUFDMUIsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFNO0lBQzlCLGdCQUFnQixFQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDeEMsZUFBZSxFQUFHLGFBQWEsQ0FBQztJQUNoQyx1QkFBdUIsRUFBRywyQkFBMkIsQ0FBQztJQUN0RCxRQUFRLEVBQUcsY0FBYyxDQUFDO0lBQzFCLFNBQVMsRUFBRyxTQUFTLENBQUM7SUFDdEIsY0FBYyxFQUFHLGNBQWMsQ0FBQztJQUNoQyxVQUFVLEVBQUcsVUFBVSxDQUFDO0lBQ3hCLFFBQVEsRUFBRyxjQUFjLENBQUM7SUFDMUIsT0FBTyxDQUFDLGdCQUFnQixDQUFxQjtJQUM3QyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQXNCO0lBQzlDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFzQjtJQUNoRCxvQkFBb0IsQ0FBQyxFQUFFLDZCQUE2QixDQUFDO0lBQ3JELFdBQVcsRUFBRyxhQUFhLENBQUM7SUFDNUIsT0FBTyxDQUFDLE9BQU8sQ0FBcUI7SUFDcEMsT0FBTyxDQUFDLFVBQVUsQ0FBYztJQUNoQyxPQUFPLENBQUMsbUJBQW1CLENBQWM7SUFDbEMsV0FBVyxFQUFHLDJCQUEyQixDQUFDO0lBQzFDLGFBQWEsRUFBRyxVQUFVLENBQUM7SUFFbEMsWUFDRSxRQUFRLEVBQUUsTUFBTSxFQUNSLHNCQUFzQixFQUFFLE1BQU0sRUFDdEMsUUFBUSxFQUFFLFVBQVUsRUFDWixVQUFVLFVBQU8sRUFXMUI7SUFFRDs7OztPQUlHO0lBQ0csa0JBQWtCLGtCQXFEdkI7SUFFSyxLQUFLLGtCQXFJVjtZQUVhLFlBQVk7SUFTMUIsUUFBUSxHQUFJLENBQUMsOEpBSTJEO0lBRWxFLFFBQVEsa0JBY2I7SUFFSyxpQkFBaUIsa0JBNkN0QjtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"e2e_prover_test.d.ts","sourceRoot":"","sources":["../../src/fixtures/e2e_prover_test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"e2e_prover_test.d.ts","sourceRoot":"","sources":["../../src/fixtures/e2e_prover_test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAEL,KAAK,6BAA6B,EAGnC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAIvF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAMvD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAGlE,OAAO,EAEL,KAAK,iBAAiB,EAIvB,MAAM,uBAAuB,CAAC;AAU/B;;;;;GAKG;AAEH,qBAAa,cAAc;IA8BvB,OAAO,CAAC,sBAAsB;IAE9B,OAAO,CAAC,UAAU;IA/BpB,MAAM,CAAC,UAAU,SAAU;IAC3B,MAAM,CAAC,YAAY,SAAS;IAC5B,MAAM,CAAC,cAAc,SAAO;IAC5B,OAAO,CAAC,eAAe,CAAmB;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAG,UAAU,CAAC;IACpB,YAAY,EAAG,UAAU,CAAC;IAC1B,QAAQ,EAAE,YAAY,EAAE,CAAM;IAC9B,gBAAgB,EAAG,kBAAkB,EAAE,CAAC;IACxC,eAAe,EAAG,aAAa,CAAC;IAChC,uBAAuB,EAAG,2BAA2B,CAAC;IACtD,QAAQ,EAAG,cAAc,CAAC;IAC1B,SAAS,EAAG,SAAS,CAAC;IACtB,cAAc,EAAG,cAAc,CAAC;IAChC,UAAU,EAAG,UAAU,CAAC;IACxB,QAAQ,EAAG,cAAc,CAAC;IAC1B,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,eAAe,CAAC,CAAsB;IAC9C,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAChD,oBAAoB,CAAC,EAAE,6BAA6B,CAAC;IACrD,WAAW,EAAG,aAAa,CAAC;IAC5B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,mBAAmB,CAAc;IAClC,WAAW,EAAG,2BAA2B,CAAC;IAC1C,aAAa,EAAG,UAAU,CAAC;IAElC,YACE,QAAQ,EAAE,MAAM,EACR,sBAAsB,EAAE,MAAM,EACtC,QAAQ,EAAE,UAAU,EACZ,UAAU,UAAO,EAW1B;IAED;;;;OAIG;IACG,kBAAkB,kBAqDvB;IAEK,KAAK,kBAqIV;YAEa,YAAY;IAS1B,QAAQ,GAAI,CAAC,8JAI2D;IAElE,QAAQ,kBAcb;IAEK,iBAAiB,kBA6CtB;CACF"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { SchnorrAccountContractArtifact, getSchnorrAccount, getSchnorrWalletWithSecretKey } from '@aztec/accounts/schnorr';
|
|
2
1
|
import { createArchiver } from '@aztec/archiver';
|
|
3
|
-
import { EthAddress
|
|
2
|
+
import { EthAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import { createLogger } from '@aztec/aztec.js/log';
|
|
4
4
|
import { BBCircuitVerifier, QueuedIVCVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
5
|
+
import { BackendType, Barretenberg } from '@aztec/bb.js';
|
|
5
6
|
import { createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
6
7
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
7
8
|
import { SecretValue } from '@aztec/foundation/config';
|
|
@@ -15,7 +16,7 @@ import { TokenSimulator } from '../simulators/token_simulator.js';
|
|
|
15
16
|
import { getACVMConfig } from './get_acvm_config.js';
|
|
16
17
|
import { getBBConfig } from './get_bb_config.js';
|
|
17
18
|
import { createSnapshotManager, deployAccounts, publicDeployAccounts } from './snapshot_manager.js';
|
|
18
|
-
import { getPrivateKeyFromIndex, getSponsoredFPCAddress,
|
|
19
|
+
import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setupPXEAndGetWallet } from './utils.js';
|
|
19
20
|
const { E2E_DATA_PATH: dataPath } = process.env;
|
|
20
21
|
/**
|
|
21
22
|
* Largely taken from the e2e_token_contract test file. We deploy 2 accounts and a token contract.
|
|
@@ -30,21 +31,22 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
30
31
|
static TOKEN_DECIMALS = 18n;
|
|
31
32
|
snapshotManager;
|
|
32
33
|
logger;
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
wallet;
|
|
35
|
+
provenWallet;
|
|
35
36
|
accounts;
|
|
37
|
+
deployedAccounts;
|
|
36
38
|
fakeProofsAsset;
|
|
39
|
+
fakeProofsAssetInstance;
|
|
37
40
|
tokenSim;
|
|
38
41
|
aztecNode;
|
|
39
42
|
aztecNodeAdmin;
|
|
40
|
-
pxe;
|
|
41
43
|
cheatCodes;
|
|
42
44
|
blobSink;
|
|
43
45
|
provenComponents;
|
|
44
46
|
bbConfigCleanup;
|
|
45
47
|
acvmConfigCleanup;
|
|
46
48
|
circuitProofVerifier;
|
|
47
|
-
|
|
49
|
+
provenAsset;
|
|
48
50
|
context;
|
|
49
51
|
proverNode;
|
|
50
52
|
simulatedProverNode;
|
|
@@ -53,11 +55,8 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
53
55
|
constructor(testName, minNumberOfTxsPerBlock, coinbase, realProofs = true){
|
|
54
56
|
this.minNumberOfTxsPerBlock = minNumberOfTxsPerBlock;
|
|
55
57
|
this.realProofs = realProofs;
|
|
56
|
-
this.deployedAccounts = [];
|
|
57
|
-
this.wallets = [];
|
|
58
58
|
this.accounts = [];
|
|
59
59
|
this.provenComponents = [];
|
|
60
|
-
this.provenAssets = [];
|
|
61
60
|
this.snapshot = (name, apply, restore = ()=>Promise.resolve())=>this.snapshotManager.snapshot(name, apply, restore);
|
|
62
61
|
this.logger = createLogger(`e2e:full_prover_test:${testName}`);
|
|
63
62
|
this.snapshotManager = createSnapshotManager(`full_prover_integration/${testName}`, dataPath, {
|
|
@@ -73,33 +72,35 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
73
72
|
* 1. Add 2 accounts.
|
|
74
73
|
* 2. Publicly deploy accounts, deploy token contract
|
|
75
74
|
*/ async applyBaseSnapshots() {
|
|
76
|
-
await this.snapshotManager.snapshot('2_accounts', deployAccounts(2, this.logger),
|
|
75
|
+
await this.snapshotManager.snapshot('2_accounts', deployAccounts(2, this.logger), ({ deployedAccounts }, { wallet })=>{
|
|
77
76
|
this.deployedAccounts = deployedAccounts;
|
|
78
|
-
this.
|
|
79
|
-
this.
|
|
80
|
-
|
|
77
|
+
this.accounts = deployedAccounts.map((a)=>a.address);
|
|
78
|
+
this.wallet = wallet;
|
|
79
|
+
return Promise.resolve();
|
|
81
80
|
});
|
|
82
81
|
await this.snapshotManager.snapshot('client_prover_integration', async ()=>{
|
|
83
82
|
// Create the token contract state.
|
|
84
83
|
// Move this account thing to addAccounts above?
|
|
85
84
|
this.logger.verbose(`Public deploy accounts...`);
|
|
86
|
-
await publicDeployAccounts(this.
|
|
85
|
+
await publicDeployAccounts(this.wallet, this.accounts.slice(0, 2));
|
|
87
86
|
this.logger.verbose(`Deploying TokenContract...`);
|
|
88
|
-
const asset = await TokenContract.deploy(this.
|
|
89
|
-
from: this.
|
|
90
|
-
}).
|
|
87
|
+
const { contract: asset, instance } = await TokenContract.deploy(this.wallet, this.accounts[0], FullProverTest.TOKEN_NAME, FullProverTest.TOKEN_SYMBOL, FullProverTest.TOKEN_DECIMALS).send({
|
|
88
|
+
from: this.accounts[0]
|
|
89
|
+
}).wait();
|
|
91
90
|
this.logger.verbose(`Token deployed to ${asset.address}`);
|
|
92
91
|
return {
|
|
93
|
-
tokenContractAddress: asset.address
|
|
92
|
+
tokenContractAddress: asset.address,
|
|
93
|
+
tokenContractInstance: instance
|
|
94
94
|
};
|
|
95
|
-
}, async ({ tokenContractAddress })=>{
|
|
95
|
+
}, async ({ tokenContractAddress, tokenContractInstance })=>{
|
|
96
96
|
// Restore the token contract state.
|
|
97
|
-
this.fakeProofsAsset =
|
|
97
|
+
this.fakeProofsAsset = TokenContract.at(tokenContractAddress, this.wallet);
|
|
98
|
+
this.fakeProofsAssetInstance = tokenContractInstance;
|
|
98
99
|
this.logger.verbose(`Token contract address: ${this.fakeProofsAsset.address}`);
|
|
99
|
-
this.tokenSim = new TokenSimulator(this.fakeProofsAsset, this.
|
|
100
|
+
this.tokenSim = new TokenSimulator(this.fakeProofsAsset, this.wallet, this.accounts[0], this.logger, this.accounts);
|
|
100
101
|
expect(await this.fakeProofsAsset.methods.get_admin().simulate({
|
|
101
|
-
from: this.accounts[0]
|
|
102
|
-
})).toBe(this.accounts[0].
|
|
102
|
+
from: this.accounts[0]
|
|
103
|
+
})).toBe(this.accounts[0].toBigInt());
|
|
103
104
|
});
|
|
104
105
|
}
|
|
105
106
|
async setup() {
|
|
@@ -107,7 +108,7 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
107
108
|
// We don't wish to mark as proven automatically, so we set the flag to false
|
|
108
109
|
this.context.watcher.setIsMarkingAsProven(false);
|
|
109
110
|
this.simulatedProverNode = this.context.proverNode;
|
|
110
|
-
({
|
|
111
|
+
({ aztecNode: this.aztecNode, deployL1ContractsValues: this.l1Contracts, cheatCodes: this.cheatCodes, blobSink: this.blobSink } = this.context);
|
|
111
112
|
this.aztecNodeAdmin = this.context.aztecNode;
|
|
112
113
|
const blobSinkClient = createBlobSinkClient({
|
|
113
114
|
blobSinkUrl: `http://localhost:${this.blobSink.port}`
|
|
@@ -125,9 +126,9 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
125
126
|
}
|
|
126
127
|
this.acvmConfigCleanup = acvmConfig.cleanup;
|
|
127
128
|
this.bbConfigCleanup = bbConfig.cleanup;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
129
|
+
await Barretenberg.initSingleton({
|
|
130
|
+
backend: BackendType.NativeUnixSocket
|
|
131
|
+
});
|
|
131
132
|
const verifier = await BBCircuitVerifier.new(bbConfig);
|
|
132
133
|
this.circuitProofVerifier = new QueuedIVCVerifier(bbConfig, verifier);
|
|
133
134
|
this.logger.debug(`Configuring the node for real proofs...`);
|
|
@@ -147,31 +148,22 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
147
148
|
this.logger.verbose(`Marking current block as proven`);
|
|
148
149
|
await this.context.cheatCodes.rollup.markAsProven();
|
|
149
150
|
this.logger.verbose(`Main setup completed, initializing full prover PXE, Node, and Prover Node`);
|
|
151
|
+
const { wallet: provenWallet, teardown: provenTeardown } = await setupPXEAndGetWallet(this.aztecNode, {
|
|
152
|
+
proverEnabled: this.realProofs
|
|
153
|
+
}, undefined, true);
|
|
154
|
+
this.logger.debug(`Contract address ${this.fakeProofsAsset.address}`);
|
|
155
|
+
await provenWallet.registerContract(this.fakeProofsAssetInstance, TokenContract.artifact);
|
|
150
156
|
for(let i = 0; i < 2; i++){
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
bbBinaryPath: bbConfig?.bbBinaryPath,
|
|
154
|
-
bbWorkingDirectory: bbConfig?.bbWorkingDirectory
|
|
155
|
-
}, undefined, true);
|
|
156
|
-
this.logger.debug(`Contract address ${this.fakeProofsAsset.address}`);
|
|
157
|
-
await result.pxe.registerContract(this.fakeProofsAsset);
|
|
158
|
-
for(let i = 0; i < 2; i++){
|
|
159
|
-
await result.pxe.registerAccount(this.deployedAccounts[i].secret, this.wallets[i].getCompleteAddress().partialAddress);
|
|
160
|
-
await this.pxe.registerAccount(this.deployedAccounts[i].secret, this.wallets[i].getCompleteAddress().partialAddress);
|
|
161
|
-
}
|
|
162
|
-
const account = await getSchnorrAccount(result.pxe, this.deployedAccounts[0].secret, this.deployedAccounts[0].signingKey, this.deployedAccounts[0].salt);
|
|
163
|
-
await result.pxe.registerContract({
|
|
164
|
-
instance: account.getInstance(),
|
|
165
|
-
artifact: SchnorrAccountContractArtifact
|
|
166
|
-
});
|
|
167
|
-
const provenWallet = await account.getWallet();
|
|
168
|
-
const asset = await TokenContract.at(this.fakeProofsAsset.address, provenWallet);
|
|
169
|
-
this.provenComponents.push({
|
|
170
|
-
pxe: result.pxe,
|
|
171
|
-
teardown: result.teardown
|
|
172
|
-
});
|
|
173
|
-
this.provenAssets.push(asset);
|
|
157
|
+
await provenWallet.createSchnorrAccount(this.deployedAccounts[i].secret, this.deployedAccounts[i].salt);
|
|
158
|
+
await this.wallet.createSchnorrAccount(this.deployedAccounts[i].secret, this.deployedAccounts[i].salt);
|
|
174
159
|
}
|
|
160
|
+
const asset = TokenContract.at(this.fakeProofsAsset.address, provenWallet);
|
|
161
|
+
this.provenComponents.push({
|
|
162
|
+
wallet: provenWallet,
|
|
163
|
+
teardown: provenTeardown
|
|
164
|
+
});
|
|
165
|
+
this.provenAsset = asset;
|
|
166
|
+
this.provenWallet = provenWallet;
|
|
175
167
|
this.logger.info(`Full prover PXE started`);
|
|
176
168
|
// Shutdown the current, simulated prover node
|
|
177
169
|
this.logger.verbose('Shutting down simulated prover node');
|
|
@@ -182,7 +174,8 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
182
174
|
...this.context.aztecNodeConfig,
|
|
183
175
|
dataDirectory: undefined
|
|
184
176
|
}, {
|
|
185
|
-
blobSinkClient
|
|
177
|
+
blobSinkClient,
|
|
178
|
+
dateProvider: this.context.dateProvider
|
|
186
179
|
}, {
|
|
187
180
|
blockUntilSync: true
|
|
188
181
|
});
|
|
@@ -210,7 +203,8 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
210
203
|
txGatheringBatchSize: 10,
|
|
211
204
|
txGatheringMaxParallelRequestsPerNode: 100,
|
|
212
205
|
txGatheringTimeoutMs: 24_000,
|
|
213
|
-
proverNodeFailedEpochStore: undefined
|
|
206
|
+
proverNodeFailedEpochStore: undefined,
|
|
207
|
+
proverNodeEpochProvingDelayMs: undefined
|
|
214
208
|
};
|
|
215
209
|
const sponsoredFPCAddress = await getSponsoredFPCAddress();
|
|
216
210
|
const { prefilledPublicData } = await getGenesisValues(this.context.initialFundedAccounts.map((a)=>a.address).concat(sponsoredFPCAddress));
|
|
@@ -250,6 +244,7 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
250
244
|
}
|
|
251
245
|
// clean up the full prover node
|
|
252
246
|
await this.proverNode.stop();
|
|
247
|
+
await Barretenberg.destroySingleton();
|
|
253
248
|
await this.bbConfigCleanup?.();
|
|
254
249
|
await this.acvmConfigCleanup?.();
|
|
255
250
|
}
|
|
@@ -259,19 +254,19 @@ const { E2E_DATA_PATH: dataPath } = process.env;
|
|
|
259
254
|
const privateAmount = 10000n;
|
|
260
255
|
const publicAmount = 10000n;
|
|
261
256
|
this.logger.verbose(`Minting ${privateAmount + publicAmount} publicly...`);
|
|
262
|
-
await asset.methods.mint_to_public(accounts[0]
|
|
263
|
-
from: accounts[0]
|
|
257
|
+
await asset.methods.mint_to_public(accounts[0], privateAmount + publicAmount).send({
|
|
258
|
+
from: accounts[0]
|
|
264
259
|
}).wait();
|
|
265
260
|
this.logger.verbose(`Transferring ${privateAmount} to private...`);
|
|
266
|
-
await asset.methods.transfer_to_private(accounts[0]
|
|
267
|
-
from: accounts[0]
|
|
261
|
+
await asset.methods.transfer_to_private(accounts[0], privateAmount).send({
|
|
262
|
+
from: accounts[0]
|
|
268
263
|
}).wait();
|
|
269
264
|
this.logger.verbose(`Minting complete.`);
|
|
270
265
|
return {
|
|
271
266
|
amount: publicAmount
|
|
272
267
|
};
|
|
273
268
|
}, async ({ amount })=>{
|
|
274
|
-
const { fakeProofsAsset: asset, accounts: [
|
|
269
|
+
const { fakeProofsAsset: asset, accounts: [address], tokenSim } = this;
|
|
275
270
|
tokenSim.mintPublic(address, amount);
|
|
276
271
|
const publicBalance = await asset.methods.balance_of_public(address).simulate({
|
|
277
272
|
from: address
|
|
@@ -13,4 +13,4 @@ export declare const NO_L1_TO_L2_MSG_ERROR: RegExp;
|
|
|
13
13
|
export declare const STATIC_CALL_STATE_MODIFICATION_ERROR: RegExp;
|
|
14
14
|
export declare const STATIC_CONTEXT_ASSERTION_ERROR: RegExp;
|
|
15
15
|
export declare const DEFAULT_BLOB_SINK_PORT = "5052";
|
|
16
|
-
//# sourceMappingURL=
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maXh0dXJlcy9maXh0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFPLE1BQU0sWUFBWSxPQUFPLENBQUM7QUFFakMsZUFBTyxNQUFNLG9CQUFvQix3QkFLaEMsQ0FBQztBQUVGLGVBQU8sTUFBTSwyQkFBMkIsT0FBTyxDQUFDO0FBQ2hELGVBQU8sTUFBTSxxQkFBcUIsUUFBeUIsQ0FBQztBQUU1RCxlQUFPLE1BQU0sUUFBUSxnRUFBZ0UsQ0FBQztBQUN0RixlQUFPLE1BQU0sVUFBVSxxQkFBeUYsQ0FBQztBQUNqSCxlQUFPLE1BQU0sV0FBVyxxQkFBeUYsQ0FBQztBQUdsSCxlQUFPLE1BQU0sb0JBQW9CLHdEQUF3RCxDQUFDO0FBQzFGLGVBQU8sTUFBTSxtQkFBbUIsbURBQW1ELENBQUM7QUFDcEYsZUFBTyxNQUFNLHFCQUFxQiwrRUFBK0UsQ0FBQztBQUVsSCxlQUFPLE1BQU0seUJBQXlCLFFBQWdDLENBQUM7QUFDdkUsZUFBTyxNQUFNLHFCQUFxQixRQUN3RSxDQUFDO0FBQzNHLGVBQU8sTUFBTSxvQ0FBb0MsUUFBMEMsQ0FBQztBQUM1RixlQUFPLE1BQU0sOEJBQThCLFFBQWtFLENBQUM7QUFFOUcsZUFBTyxNQUFNLHNCQUFzQixTQUFTLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/fixtures/fixtures.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,eAAO,MAAM,oBAAoB,wBAKhC,CAAC;AAEF,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,qBAAqB,QAAyB,CAAC;AAE5D,eAAO,MAAM,QAAQ,gEAAgE,CAAC;AACtF,eAAO,MAAM,UAAU,qBAAyF,CAAC;AACjH,eAAO,MAAM,WAAW,qBAAyF,CAAC;AAGlH,eAAO,MAAM,oBAAoB,wDAAwD,CAAC;AAC1F,eAAO,MAAM,mBAAmB,mDAAmD,CAAC;AACpF,eAAO,MAAM,qBAAqB,+EAA+E,CAAC;AAElH,eAAO,MAAM,yBAAyB,QAAgC,CAAC;AACvE,eAAO,MAAM,qBAAqB,QACwE,CAAC;AAC3G,eAAO,MAAM,oCAAoC,
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/fixtures/fixtures.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,eAAO,MAAM,oBAAoB,wBAKhC,CAAC;AAEF,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,qBAAqB,QAAyB,CAAC;AAE5D,eAAO,MAAM,QAAQ,gEAAgE,CAAC;AACtF,eAAO,MAAM,UAAU,qBAAyF,CAAC;AACjH,eAAO,MAAM,WAAW,qBAAyF,CAAC;AAGlH,eAAO,MAAM,oBAAoB,wDAAwD,CAAC;AAC1F,eAAO,MAAM,mBAAmB,mDAAmD,CAAC;AACpF,eAAO,MAAM,qBAAqB,+EAA+E,CAAC;AAElH,eAAO,MAAM,yBAAyB,QAAgC,CAAC;AACvE,eAAO,MAAM,qBAAqB,QACwE,CAAC;AAC3G,eAAO,MAAM,oCAAoC,QAA0C,CAAC;AAC5F,eAAO,MAAM,8BAA8B,QAAkE,CAAC;AAE9G,eAAO,MAAM,sBAAsB,SAAS,CAAC"}
|
|
@@ -17,6 +17,6 @@ export const BITSIZE_TOO_BIG_ERROR = "Assertion failed: call to assert_max_bit_s
|
|
|
17
17
|
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/5818): Make these a fixed error after transition.
|
|
18
18
|
export const DUPLICATE_NULLIFIER_ERROR = /dropped|nullifier|reverted/i;
|
|
19
19
|
export const NO_L1_TO_L2_MSG_ERROR = /No non-nullified L1 to L2 message found for message hash|Tried to consume nonexistent L1-to-L2 message/;
|
|
20
|
-
export const STATIC_CALL_STATE_MODIFICATION_ERROR = /Static call cannot update the state
|
|
20
|
+
export const STATIC_CALL_STATE_MODIFICATION_ERROR = /Static call cannot update the state.*/;
|
|
21
21
|
export const STATIC_CONTEXT_ASSERTION_ERROR = /Assertion failed: Function .* can only be called statically.*/;
|
|
22
22
|
export const DEFAULT_BLOB_SINK_PORT = '5052';
|