@aztec/aztec 0.0.1-commit.fcb71a6 → 0.0.1-commit.fffb133c
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/bin/index.js +2 -0
- package/dest/cli/aztec_start_action.d.ts +1 -1
- package/dest/cli/aztec_start_action.d.ts.map +1 -1
- package/dest/cli/aztec_start_action.js +6 -1
- package/dest/cli/aztec_start_options.d.ts +1 -1
- package/dest/cli/aztec_start_options.d.ts.map +1 -1
- package/dest/cli/aztec_start_options.js +4 -2
- package/dest/cli/cli.d.ts +1 -1
- package/dest/cli/cli.d.ts.map +1 -1
- package/dest/cli/cli.js +9 -53
- package/dest/cli/cmds/migrate_ha_db.d.ts +3 -0
- package/dest/cli/cmds/migrate_ha_db.d.ts.map +1 -0
- package/dest/cli/cmds/migrate_ha_db.js +27 -0
- package/dest/cli/cmds/start_archiver.d.ts +1 -1
- package/dest/cli/cmds/start_archiver.d.ts.map +1 -1
- package/dest/cli/cmds/start_archiver.js +5 -7
- package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
- package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
- package/dest/cli/cmds/start_prover_agent.js +1 -1
- package/dest/cli/util.js +1 -1
- package/dest/examples/token.js +3 -3
- package/dest/local-network/banana_fpc.d.ts +1 -1
- package/dest/local-network/banana_fpc.d.ts.map +1 -1
- package/dest/local-network/banana_fpc.js +2 -2
- package/dest/local-network/local-network.d.ts +1 -2
- package/dest/local-network/local-network.d.ts.map +1 -1
- package/dest/local-network/local-network.js +19 -7
- package/dest/testing/cheat_codes.d.ts +3 -1
- package/dest/testing/cheat_codes.d.ts.map +1 -1
- package/dest/testing/epoch_test_settler.d.ts +19 -0
- package/dest/testing/epoch_test_settler.d.ts.map +1 -0
- package/dest/testing/epoch_test_settler.js +62 -0
- package/dest/testing/index.d.ts +2 -1
- package/dest/testing/index.d.ts.map +1 -1
- package/dest/testing/index.js +1 -0
- package/package.json +37 -35
- package/scripts/aztec.sh +63 -0
- package/scripts/compile.sh +44 -0
- package/scripts/extract_function.js +47 -0
- package/scripts/flamegraph.sh +59 -0
- package/scripts/init.sh +35 -0
- package/scripts/new.sh +59 -0
- package/scripts/setup_project.sh +31 -0
- package/src/bin/index.ts +2 -0
- package/src/cli/aztec_start_action.ts +5 -0
- package/src/cli/aztec_start_options.ts +3 -1
- package/src/cli/cli.ts +12 -56
- package/src/cli/cmds/migrate_ha_db.ts +43 -0
- package/src/cli/cmds/start_archiver.ts +2 -13
- package/src/cli/cmds/start_prover_agent.ts +1 -9
- package/src/cli/util.ts +1 -1
- package/src/examples/token.ts +3 -5
- package/src/local-network/banana_fpc.ts +10 -6
- package/src/local-network/local-network.ts +31 -13
- package/src/testing/epoch_test_settler.ts +71 -0
- package/src/testing/index.ts +1 -0
package/src/cli/util.ts
CHANGED
|
@@ -36,7 +36,7 @@ export function shutdown(logFn: LogFn, exitCode: ExitCode, cb?: Array<() => Prom
|
|
|
36
36
|
|
|
37
37
|
logFn('Shutting down...', { exitCode });
|
|
38
38
|
if (cb) {
|
|
39
|
-
shutdownPromise = Promise.allSettled(cb).then(() => process.exit(exitCode));
|
|
39
|
+
shutdownPromise = Promise.allSettled(cb.map(fn => fn())).then(() => process.exit(exitCode));
|
|
40
40
|
} else {
|
|
41
41
|
// synchronously shuts down the process
|
|
42
42
|
// no need to set shutdownPromise on this branch of the if statement because no more code will be executed
|
package/src/examples/token.ts
CHANGED
|
@@ -32,14 +32,12 @@ async function main() {
|
|
|
32
32
|
logger.info(`Fetched Alice and Bob accounts: ${alice.toString()}, ${bob.toString()}`);
|
|
33
33
|
|
|
34
34
|
logger.info('Deploying Token...');
|
|
35
|
-
const token = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18)
|
|
36
|
-
.send({ from: alice })
|
|
37
|
-
.deployed();
|
|
35
|
+
const token = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18).send({ from: alice });
|
|
38
36
|
logger.info('Token deployed');
|
|
39
37
|
|
|
40
38
|
// Mint tokens to Alice
|
|
41
39
|
logger.info(`Minting ${ALICE_MINT_BALANCE} more coins to Alice...`);
|
|
42
|
-
await token.methods.mint_to_private(alice, ALICE_MINT_BALANCE).send({ from: alice })
|
|
40
|
+
await token.methods.mint_to_private(alice, ALICE_MINT_BALANCE).send({ from: alice });
|
|
43
41
|
|
|
44
42
|
logger.info(`${ALICE_MINT_BALANCE} tokens were successfully minted by Alice and transferred to private`);
|
|
45
43
|
|
|
@@ -48,7 +46,7 @@ async function main() {
|
|
|
48
46
|
|
|
49
47
|
// We will now transfer tokens from Alice to Bob
|
|
50
48
|
logger.info(`Transferring ${TRANSFER_AMOUNT} tokens from Alice to Bob...`);
|
|
51
|
-
await token.methods.transfer(bob, TRANSFER_AMOUNT).send({ from: alice })
|
|
49
|
+
await token.methods.transfer(bob, TRANSFER_AMOUNT).send({ from: alice });
|
|
52
50
|
|
|
53
51
|
// Check the new balances
|
|
54
52
|
const aliceBalance = await token.methods.balance_of_private(alice).simulate({ from: alice });
|
|
@@ -49,12 +49,16 @@ export async function setupBananaFPC(initialAccounts: InitialAccountData[], wall
|
|
|
49
49
|
const bananaCoinAddress = await getBananaCoinAddress(initialAccounts);
|
|
50
50
|
const admin = getBananaAdmin(initialAccounts);
|
|
51
51
|
const [bananaCoin, fpc] = await Promise.all([
|
|
52
|
-
TokenContract.deploy(wallet, admin, bananaCoinArgs.name, bananaCoinArgs.symbol, bananaCoinArgs.decimal)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
52
|
+
TokenContract.deploy(wallet, admin, bananaCoinArgs.name, bananaCoinArgs.symbol, bananaCoinArgs.decimal).send({
|
|
53
|
+
from: admin,
|
|
54
|
+
contractAddressSalt: BANANA_COIN_SALT,
|
|
55
|
+
universalDeploy: true,
|
|
56
|
+
}),
|
|
57
|
+
FPCContract.deploy(wallet, bananaCoinAddress, admin).send({
|
|
58
|
+
from: admin,
|
|
59
|
+
contractAddressSalt: BANANA_FPC_SALT,
|
|
60
|
+
universalDeploy: true,
|
|
61
|
+
}),
|
|
58
62
|
]);
|
|
59
63
|
|
|
60
64
|
log(`BananaCoin: ${bananaCoin.address}`);
|
|
@@ -34,6 +34,7 @@ import { foundry } from 'viem/chains';
|
|
|
34
34
|
import { createAccountLogs } from '../cli/util.js';
|
|
35
35
|
import { DefaultMnemonic } from '../mnemonic.js';
|
|
36
36
|
import { AnvilTestWatcher } from '../testing/anvil_test_watcher.js';
|
|
37
|
+
import { EpochTestSettler } from '../testing/epoch_test_settler.js';
|
|
37
38
|
import { getBananaFPCAddress, setupBananaFPC } from './banana_fpc.js';
|
|
38
39
|
import { getSponsoredFPCAddress } from './sponsored_fpc.js';
|
|
39
40
|
|
|
@@ -50,7 +51,6 @@ export async function deployContractsToL1(
|
|
|
50
51
|
aztecNodeConfig: AztecNodeConfig,
|
|
51
52
|
privateKey: Hex,
|
|
52
53
|
opts: {
|
|
53
|
-
assumeProvenThroughBlockNumber?: number;
|
|
54
54
|
genesisArchiveRoot?: Fr;
|
|
55
55
|
feeJuicePortalInitialBalance?: bigint;
|
|
56
56
|
} = {},
|
|
@@ -97,7 +97,11 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
|
|
|
97
97
|
if ((config.l1RpcUrls?.length || 0) > 1) {
|
|
98
98
|
logger.warn(`Multiple L1 RPC URLs provided. Local networks will only use the first one: ${l1RpcUrl}`);
|
|
99
99
|
}
|
|
100
|
-
|
|
100
|
+
|
|
101
|
+
const aztecNodeConfig: AztecNodeConfig = {
|
|
102
|
+
...getConfigEnvVars(),
|
|
103
|
+
...config,
|
|
104
|
+
};
|
|
101
105
|
const hdAccount = mnemonicToAccount(config.l1Mnemonic || DefaultMnemonic);
|
|
102
106
|
if (
|
|
103
107
|
aztecNodeConfig.publisherPrivateKeys == undefined ||
|
|
@@ -134,18 +138,20 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
|
|
|
134
138
|
: [];
|
|
135
139
|
const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(fundedAddresses);
|
|
136
140
|
|
|
137
|
-
let watcher: AnvilTestWatcher | undefined = undefined;
|
|
138
141
|
const dateProvider = new TestDateProvider();
|
|
142
|
+
|
|
143
|
+
let cheatcodes: EthCheatCodes | undefined;
|
|
144
|
+
let rollupAddress: EthAddress | undefined;
|
|
145
|
+
let watcher: AnvilTestWatcher | undefined;
|
|
139
146
|
if (!aztecNodeConfig.p2pEnabled) {
|
|
140
|
-
|
|
147
|
+
({ rollupAddress } = await deployContractsToL1(
|
|
141
148
|
aztecNodeConfig,
|
|
142
149
|
aztecNodeConfig.validatorPrivateKeys.getValue()[0],
|
|
143
150
|
{
|
|
144
|
-
assumeProvenThroughBlockNumber: Number.MAX_SAFE_INTEGER,
|
|
145
151
|
genesisArchiveRoot,
|
|
146
152
|
feeJuicePortalInitialBalance: fundingNeeded,
|
|
147
153
|
},
|
|
148
|
-
);
|
|
154
|
+
));
|
|
149
155
|
|
|
150
156
|
const chain =
|
|
151
157
|
aztecNodeConfig.l1RpcUrls.length > 0
|
|
@@ -157,13 +163,12 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
|
|
|
157
163
|
transport: fallback([httpViemTransport(l1RpcUrl)]) as any,
|
|
158
164
|
});
|
|
159
165
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
publicClient,
|
|
164
|
-
dateProvider,
|
|
165
|
-
);
|
|
166
|
+
cheatcodes = new EthCheatCodes([l1RpcUrl], dateProvider);
|
|
167
|
+
|
|
168
|
+
watcher = new AnvilTestWatcher(cheatcodes, rollupAddress, publicClient, dateProvider);
|
|
166
169
|
watcher.setisLocalNetwork(true);
|
|
170
|
+
watcher.setIsMarkingAsProven(false); // Do not mark as proven in the watcher. It's marked in the epochTestSettler after the out hash is set.
|
|
171
|
+
|
|
167
172
|
await watcher.start();
|
|
168
173
|
}
|
|
169
174
|
|
|
@@ -172,12 +177,24 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
|
|
|
172
177
|
const blobClient = createBlobClient();
|
|
173
178
|
const node = await createAztecNode(aztecNodeConfig, { telemetry, blobClient, dateProvider }, { prefilledPublicData });
|
|
174
179
|
|
|
180
|
+
let epochTestSettler: EpochTestSettler | undefined;
|
|
181
|
+
if (!aztecNodeConfig.p2pEnabled) {
|
|
182
|
+
epochTestSettler = new EpochTestSettler(
|
|
183
|
+
cheatcodes!,
|
|
184
|
+
rollupAddress!,
|
|
185
|
+
node.getBlockSource(),
|
|
186
|
+
logger.createChild('epoch-settler'),
|
|
187
|
+
{ pollingIntervalMs: 200 },
|
|
188
|
+
);
|
|
189
|
+
await epochTestSettler.start();
|
|
190
|
+
}
|
|
191
|
+
|
|
175
192
|
if (initialAccounts.length) {
|
|
176
193
|
const PXEConfig = { proverEnabled: aztecNodeConfig.realProofs };
|
|
177
194
|
const wallet = await TestWallet.create(node, PXEConfig);
|
|
178
195
|
|
|
179
196
|
userLog('Setting up funded test accounts...');
|
|
180
|
-
const accountManagers = await deployFundedSchnorrAccounts(wallet,
|
|
197
|
+
const accountManagers = await deployFundedSchnorrAccounts(wallet, initialAccounts);
|
|
181
198
|
const accountsWithSecrets = accountManagers.map((manager, i) => ({
|
|
182
199
|
account: manager,
|
|
183
200
|
secretKey: initialAccounts[i].secret,
|
|
@@ -196,6 +213,7 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
|
|
|
196
213
|
const stop = async () => {
|
|
197
214
|
await node.stop();
|
|
198
215
|
await watcher?.stop();
|
|
216
|
+
await epochTestSettler?.stop();
|
|
199
217
|
};
|
|
200
218
|
|
|
201
219
|
return { node, stop };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
2
|
+
import { type EthCheatCodes, RollupCheatCodes } from '@aztec/ethereum/test';
|
|
3
|
+
import { type EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
5
|
+
import { EpochMonitor } from '@aztec/prover-node';
|
|
6
|
+
import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
|
|
7
|
+
import { computeL2ToL1MembershipWitnessFromMessagesInEpoch } from '@aztec/stdlib/messaging';
|
|
8
|
+
|
|
9
|
+
export class EpochTestSettler {
|
|
10
|
+
private rollupCheatCodes: RollupCheatCodes;
|
|
11
|
+
private epochMonitor?: EpochMonitor;
|
|
12
|
+
|
|
13
|
+
constructor(
|
|
14
|
+
cheatcodes: EthCheatCodes,
|
|
15
|
+
rollupAddress: EthAddress,
|
|
16
|
+
private l2BlockSource: L2BlockSource,
|
|
17
|
+
private log: Logger,
|
|
18
|
+
private options: { pollingIntervalMs: number; provingDelayMs?: number },
|
|
19
|
+
) {
|
|
20
|
+
this.rollupCheatCodes = new RollupCheatCodes(cheatcodes, { rollupAddress });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async start() {
|
|
24
|
+
const { epochDuration } = await this.rollupCheatCodes.getConfig();
|
|
25
|
+
this.epochMonitor = new EpochMonitor(this.l2BlockSource, { epochDuration: Number(epochDuration) }, this.options);
|
|
26
|
+
this.epochMonitor.start(this);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async stop() {
|
|
30
|
+
await this.epochMonitor?.stop();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async handleEpochReadyToProve(epoch: EpochNumber): Promise<boolean> {
|
|
34
|
+
const checkpointedBlocks = await this.l2BlockSource.getCheckpointedBlocksForEpoch(epoch);
|
|
35
|
+
const blocks = checkpointedBlocks.map(b => b.block);
|
|
36
|
+
this.log.info(
|
|
37
|
+
`Settling epoch ${epoch} with blocks ${blocks[0]?.header.getBlockNumber()} to ${blocks.at(-1)?.header.getBlockNumber()}`,
|
|
38
|
+
{ blocks: blocks.map(b => b.toBlockInfo()) },
|
|
39
|
+
);
|
|
40
|
+
const messagesInEpoch: Fr[][][][] = [];
|
|
41
|
+
let previousSlotNumber = SlotNumber.ZERO;
|
|
42
|
+
let checkpointIndex = -1;
|
|
43
|
+
|
|
44
|
+
for (const block of blocks) {
|
|
45
|
+
const slotNumber = block.header.globalVariables.slotNumber;
|
|
46
|
+
if (slotNumber !== previousSlotNumber) {
|
|
47
|
+
checkpointIndex++;
|
|
48
|
+
messagesInEpoch[checkpointIndex] = [];
|
|
49
|
+
previousSlotNumber = slotNumber;
|
|
50
|
+
}
|
|
51
|
+
messagesInEpoch[checkpointIndex].push(block.body.txEffects.map(txEffect => txEffect.l2ToL1Msgs));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const [firstMessage] = messagesInEpoch.flat(3);
|
|
55
|
+
if (firstMessage) {
|
|
56
|
+
const { root: outHash } = computeL2ToL1MembershipWitnessFromMessagesInEpoch(messagesInEpoch, firstMessage);
|
|
57
|
+
await this.rollupCheatCodes.insertOutbox(epoch, outHash.toBigInt());
|
|
58
|
+
} else {
|
|
59
|
+
this.log.info(`No L2 to L1 messages in epoch ${epoch}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const lastCheckpoint = checkpointedBlocks.at(-1)?.checkpointNumber;
|
|
63
|
+
if (lastCheckpoint !== undefined) {
|
|
64
|
+
await this.rollupCheatCodes.markAsProven(lastCheckpoint);
|
|
65
|
+
} else {
|
|
66
|
+
this.log.warn(`No checkpoint found for epoch ${epoch}`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
package/src/testing/index.ts
CHANGED