@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.
Files changed (56) hide show
  1. package/dest/bin/index.js +2 -0
  2. package/dest/cli/aztec_start_action.d.ts +1 -1
  3. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  4. package/dest/cli/aztec_start_action.js +6 -1
  5. package/dest/cli/aztec_start_options.d.ts +1 -1
  6. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  7. package/dest/cli/aztec_start_options.js +4 -2
  8. package/dest/cli/cli.d.ts +1 -1
  9. package/dest/cli/cli.d.ts.map +1 -1
  10. package/dest/cli/cli.js +9 -53
  11. package/dest/cli/cmds/migrate_ha_db.d.ts +3 -0
  12. package/dest/cli/cmds/migrate_ha_db.d.ts.map +1 -0
  13. package/dest/cli/cmds/migrate_ha_db.js +27 -0
  14. package/dest/cli/cmds/start_archiver.d.ts +1 -1
  15. package/dest/cli/cmds/start_archiver.d.ts.map +1 -1
  16. package/dest/cli/cmds/start_archiver.js +5 -7
  17. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  18. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  19. package/dest/cli/cmds/start_prover_agent.js +1 -1
  20. package/dest/cli/util.js +1 -1
  21. package/dest/examples/token.js +3 -3
  22. package/dest/local-network/banana_fpc.d.ts +1 -1
  23. package/dest/local-network/banana_fpc.d.ts.map +1 -1
  24. package/dest/local-network/banana_fpc.js +2 -2
  25. package/dest/local-network/local-network.d.ts +1 -2
  26. package/dest/local-network/local-network.d.ts.map +1 -1
  27. package/dest/local-network/local-network.js +19 -7
  28. package/dest/testing/cheat_codes.d.ts +3 -1
  29. package/dest/testing/cheat_codes.d.ts.map +1 -1
  30. package/dest/testing/epoch_test_settler.d.ts +19 -0
  31. package/dest/testing/epoch_test_settler.d.ts.map +1 -0
  32. package/dest/testing/epoch_test_settler.js +62 -0
  33. package/dest/testing/index.d.ts +2 -1
  34. package/dest/testing/index.d.ts.map +1 -1
  35. package/dest/testing/index.js +1 -0
  36. package/package.json +37 -35
  37. package/scripts/aztec.sh +63 -0
  38. package/scripts/compile.sh +44 -0
  39. package/scripts/extract_function.js +47 -0
  40. package/scripts/flamegraph.sh +59 -0
  41. package/scripts/init.sh +35 -0
  42. package/scripts/new.sh +59 -0
  43. package/scripts/setup_project.sh +31 -0
  44. package/src/bin/index.ts +2 -0
  45. package/src/cli/aztec_start_action.ts +5 -0
  46. package/src/cli/aztec_start_options.ts +3 -1
  47. package/src/cli/cli.ts +12 -56
  48. package/src/cli/cmds/migrate_ha_db.ts +43 -0
  49. package/src/cli/cmds/start_archiver.ts +2 -13
  50. package/src/cli/cmds/start_prover_agent.ts +1 -9
  51. package/src/cli/util.ts +1 -1
  52. package/src/examples/token.ts +3 -5
  53. package/src/local-network/banana_fpc.ts +10 -6
  54. package/src/local-network/local-network.ts +31 -13
  55. package/src/testing/epoch_test_settler.ts +71 -0
  56. 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
@@ -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 }).wait();
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 }).wait();
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
- .send({ from: admin, contractAddressSalt: BANANA_COIN_SALT, universalDeploy: true })
54
- .deployed(),
55
- FPCContract.deploy(wallet, bananaCoinAddress, admin)
56
- .send({ from: admin, contractAddressSalt: BANANA_FPC_SALT, universalDeploy: true })
57
- .deployed(),
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
- const aztecNodeConfig: AztecNodeConfig = { ...getConfigEnvVars(), ...config };
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
- const l1ContractAddresses = await deployContractsToL1(
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
- watcher = new AnvilTestWatcher(
161
- new EthCheatCodes([l1RpcUrl], dateProvider),
162
- l1ContractAddresses.rollupAddress,
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, node, initialAccounts);
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
+ }
@@ -1,3 +1,4 @@
1
1
  export { AnvilTestWatcher } from './anvil_test_watcher.js';
2
2
  export { EthCheatCodes, RollupCheatCodes } from '@aztec/ethereum/test';
3
3
  export { CheatCodes } from './cheat_codes.js';
4
+ export { EpochTestSettler } from './epoch_test_settler.js';