@aztec/aztec 0.0.1-commit.03f7ef2 → 0.0.1-commit.04852196a

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 (132) hide show
  1. package/dest/bin/index.js +9 -3
  2. package/dest/cli/admin_api_key_store.d.ts +45 -0
  3. package/dest/cli/admin_api_key_store.d.ts.map +1 -0
  4. package/dest/cli/admin_api_key_store.js +98 -0
  5. package/dest/cli/aztec_start_action.d.ts +1 -1
  6. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  7. package/dest/cli/aztec_start_action.js +55 -12
  8. package/dest/cli/aztec_start_options.d.ts +1 -1
  9. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  10. package/dest/cli/aztec_start_options.js +29 -11
  11. package/dest/cli/cli.d.ts +1 -1
  12. package/dest/cli/cli.d.ts.map +1 -1
  13. package/dest/cli/cli.js +4 -37
  14. package/dest/cli/cmds/compile.d.ts +4 -0
  15. package/dest/cli/cmds/compile.d.ts.map +1 -0
  16. package/dest/cli/cmds/compile.js +165 -0
  17. package/dest/cli/cmds/migrate_ha_db.d.ts +3 -0
  18. package/dest/cli/cmds/migrate_ha_db.d.ts.map +1 -0
  19. package/dest/cli/cmds/migrate_ha_db.js +27 -0
  20. package/dest/cli/cmds/profile.d.ts +4 -0
  21. package/dest/cli/cmds/profile.d.ts.map +1 -0
  22. package/dest/cli/cmds/profile.js +8 -0
  23. package/dest/cli/cmds/profile_flamegraph.d.ts +4 -0
  24. package/dest/cli/cmds/profile_flamegraph.d.ts.map +1 -0
  25. package/dest/cli/cmds/profile_flamegraph.js +51 -0
  26. package/dest/cli/cmds/profile_gates.d.ts +4 -0
  27. package/dest/cli/cmds/profile_gates.d.ts.map +1 -0
  28. package/dest/cli/cmds/profile_gates.js +57 -0
  29. package/dest/cli/cmds/profile_utils.d.ts +18 -0
  30. package/dest/cli/cmds/profile_utils.d.ts.map +1 -0
  31. package/dest/cli/cmds/profile_utils.js +50 -0
  32. package/dest/cli/cmds/standby.d.ts +27 -0
  33. package/dest/cli/cmds/standby.d.ts.map +1 -0
  34. package/dest/cli/cmds/standby.js +78 -0
  35. package/dest/cli/cmds/start_archiver.d.ts +2 -2
  36. package/dest/cli/cmds/start_archiver.d.ts.map +1 -1
  37. package/dest/cli/cmds/start_archiver.js +6 -8
  38. package/dest/cli/cmds/start_bot.d.ts +3 -3
  39. package/dest/cli/cmds/start_bot.d.ts.map +1 -1
  40. package/dest/cli/cmds/start_bot.js +9 -5
  41. package/dest/cli/cmds/start_node.d.ts +3 -2
  42. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  43. package/dest/cli/cmds/start_node.js +77 -27
  44. package/dest/cli/cmds/start_p2p_bootstrap.d.ts +2 -2
  45. package/dest/cli/cmds/start_p2p_bootstrap.d.ts.map +1 -1
  46. package/dest/cli/cmds/start_p2p_bootstrap.js +1 -2
  47. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  48. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  49. package/dest/cli/cmds/start_prover_agent.js +3 -3
  50. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  51. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  52. package/dest/cli/cmds/start_prover_broker.js +8 -8
  53. package/dest/cli/cmds/utils/artifacts.d.ts +21 -0
  54. package/dest/cli/cmds/utils/artifacts.d.ts.map +1 -0
  55. package/dest/cli/cmds/utils/artifacts.js +24 -0
  56. package/dest/cli/cmds/utils/needs_recompile.d.ts +10 -0
  57. package/dest/cli/cmds/utils/needs_recompile.d.ts.map +1 -0
  58. package/dest/cli/cmds/utils/needs_recompile.js +124 -0
  59. package/dest/cli/cmds/utils/spawn.d.ts +3 -0
  60. package/dest/cli/cmds/utils/spawn.d.ts.map +1 -0
  61. package/dest/cli/cmds/utils/spawn.js +16 -0
  62. package/dest/cli/util.d.ts +7 -18
  63. package/dest/cli/util.d.ts.map +1 -1
  64. package/dest/cli/util.js +51 -87
  65. package/dest/examples/token.js +9 -9
  66. package/dest/local-network/banana_fpc.d.ts +1 -1
  67. package/dest/local-network/banana_fpc.d.ts.map +1 -1
  68. package/dest/local-network/banana_fpc.js +3 -3
  69. package/dest/local-network/local-network.d.ts +4 -3
  70. package/dest/local-network/local-network.d.ts.map +1 -1
  71. package/dest/local-network/local-network.js +69 -25
  72. package/dest/testing/anvil_test_watcher.d.ts +9 -1
  73. package/dest/testing/anvil_test_watcher.d.ts.map +1 -1
  74. package/dest/testing/anvil_test_watcher.js +52 -15
  75. package/dest/testing/cheat_codes.d.ts +3 -1
  76. package/dest/testing/cheat_codes.d.ts.map +1 -1
  77. package/dest/testing/epoch_test_settler.d.ts +19 -0
  78. package/dest/testing/epoch_test_settler.d.ts.map +1 -0
  79. package/dest/testing/epoch_test_settler.js +62 -0
  80. package/dest/testing/index.d.ts +3 -1
  81. package/dest/testing/index.d.ts.map +1 -1
  82. package/dest/testing/index.js +2 -0
  83. package/dest/testing/token_allowed_setup.d.ts +7 -0
  84. package/dest/testing/token_allowed_setup.d.ts.map +1 -0
  85. package/dest/testing/token_allowed_setup.js +20 -0
  86. package/package.json +36 -34
  87. package/scripts/add_crate.sh +102 -0
  88. package/scripts/aztec.sh +22 -9
  89. package/scripts/init.sh +23 -19
  90. package/scripts/new.sh +48 -24
  91. package/scripts/setup_workspace.sh +68 -0
  92. package/src/bin/index.ts +9 -3
  93. package/src/cli/admin_api_key_store.ts +128 -0
  94. package/src/cli/aztec_start_action.ts +58 -7
  95. package/src/cli/aztec_start_options.ts +30 -9
  96. package/src/cli/cli.ts +4 -37
  97. package/src/cli/cmds/compile.ts +190 -0
  98. package/src/cli/cmds/migrate_ha_db.ts +43 -0
  99. package/src/cli/cmds/profile.ts +25 -0
  100. package/src/cli/cmds/profile_flamegraph.ts +63 -0
  101. package/src/cli/cmds/profile_gates.ts +67 -0
  102. package/src/cli/cmds/profile_utils.ts +58 -0
  103. package/src/cli/cmds/standby.ts +111 -0
  104. package/src/cli/cmds/start_archiver.ts +3 -14
  105. package/src/cli/cmds/start_bot.ts +8 -5
  106. package/src/cli/cmds/start_node.ts +76 -33
  107. package/src/cli/cmds/start_p2p_bootstrap.ts +2 -2
  108. package/src/cli/cmds/start_prover_agent.ts +3 -11
  109. package/src/cli/cmds/start_prover_broker.ts +12 -15
  110. package/src/cli/cmds/utils/artifacts.ts +44 -0
  111. package/src/cli/cmds/utils/needs_recompile.ts +139 -0
  112. package/src/cli/cmds/utils/spawn.ts +16 -0
  113. package/src/cli/util.ts +58 -96
  114. package/src/examples/token.ts +10 -10
  115. package/src/local-network/banana_fpc.ts +11 -7
  116. package/src/local-network/local-network.ts +85 -30
  117. package/src/testing/anvil_test_watcher.ts +59 -15
  118. package/src/testing/epoch_test_settler.ts +71 -0
  119. package/src/testing/index.ts +2 -0
  120. package/src/testing/token_allowed_setup.ts +19 -0
  121. package/dest/cli/cmds/start_prover_node.d.ts +0 -7
  122. package/dest/cli/cmds/start_prover_node.d.ts.map +0 -1
  123. package/dest/cli/cmds/start_prover_node.js +0 -108
  124. package/dest/cli/release_version.d.ts +0 -2
  125. package/dest/cli/release_version.d.ts.map +0 -1
  126. package/dest/cli/release_version.js +0 -14
  127. package/scripts/compile.sh +0 -44
  128. package/scripts/extract_function.js +0 -47
  129. package/scripts/flamegraph.sh +0 -59
  130. package/scripts/setup_project.sh +0 -31
  131. package/src/cli/cmds/start_prover_node.ts +0 -124
  132. package/src/cli/release_version.ts +0 -21
@@ -22,6 +22,12 @@ import { getAddress, getContract } from 'viem';
22
22
  markingAsProvenRunningPromise;
23
23
  logger;
24
24
  isMarkingAsProven;
25
+ // Optional callback to check if there are pending txs in the mempool.
26
+ getPendingTxCount;
27
+ // Optional callback to check if the sequencer is actively building a block.
28
+ isSequencerBuilding;
29
+ // Tracks when we first observed the current unfilled slot with pending txs (real wall time).
30
+ unfilledSlotFirstSeen;
25
31
  constructor(cheatcodes, rollupAddress, l1Client, dateProvider){
26
32
  this.cheatcodes = cheatcodes;
27
33
  this.dateProvider = dateProvider;
@@ -45,6 +51,12 @@ import { getAddress, getContract } from 'viem';
45
51
  setisLocalNetwork(isLocalNetwork) {
46
52
  this.isLocalNetwork = isLocalNetwork;
47
53
  }
54
+ /** Sets a callback to check for pending txs, used to skip unfilled slots faster when txs are waiting. */ setGetPendingTxCount(fn) {
55
+ this.getPendingTxCount = fn;
56
+ }
57
+ /** Sets a callback to check if the sequencer is actively building, to avoid warping while it works. */ setIsSequencerBuilding(fn) {
58
+ this.isSequencerBuilding = fn;
59
+ }
48
60
  async start() {
49
61
  if (this.filledRunningPromise) {
50
62
  throw new Error('Watcher already watching for filled slot');
@@ -111,14 +123,8 @@ import { getAddress, getContract } from 'viem';
111
123
  BigInt(nextSlot)
112
124
  ]));
113
125
  if (BigInt(currentSlot) === checkpointLog.slotNumber) {
114
- // We should jump to the next slot
115
- try {
116
- await this.cheatcodes.warp(nextSlotTimestamp, {
117
- resetBlockInterval: true
118
- });
119
- } catch (e) {
120
- this.logger.error(`Failed to warp to timestamp ${nextSlotTimestamp}: ${e}`);
121
- }
126
+ // The current slot has been filled, we should jump to the next slot.
127
+ await this.warpToTimestamp(nextSlotTimestamp);
122
128
  this.logger.info(`Slot ${currentSlot} was filled, jumped to next slot`);
123
129
  return;
124
130
  }
@@ -126,19 +132,50 @@ import { getAddress, getContract } from 'viem';
126
132
  if (!this.isLocalNetwork) {
127
133
  return;
128
134
  }
135
+ // If there are pending txs and the sequencer missed them, warp quickly (after a 2s real-time debounce) so the
136
+ // sequencer can retry in the next slot. Without this, we'd have to wait a full real-time slot duration (~36s) for
137
+ // the dateProvider to catch up to the next slot timestamp. We skip the warp if the sequencer is actively building
138
+ // to avoid invalidating its in-progress work.
139
+ if (this.getPendingTxCount) {
140
+ const pendingTxs = await this.getPendingTxCount();
141
+ if (pendingTxs > 0) {
142
+ if (this.isSequencerBuilding?.()) {
143
+ this.unfilledSlotFirstSeen = undefined;
144
+ return;
145
+ }
146
+ const realNow = Date.now();
147
+ if (!this.unfilledSlotFirstSeen || this.unfilledSlotFirstSeen.slot !== currentSlot) {
148
+ this.unfilledSlotFirstSeen = {
149
+ slot: currentSlot,
150
+ realTime: realNow
151
+ };
152
+ return;
153
+ }
154
+ if (realNow - this.unfilledSlotFirstSeen.realTime > 2000) {
155
+ await this.warpToTimestamp(nextSlotTimestamp);
156
+ this.unfilledSlotFirstSeen = undefined;
157
+ this.logger.info(`Slot ${currentSlot} was missed with pending txs, jumped to next slot`);
158
+ }
159
+ return;
160
+ }
161
+ }
162
+ // Fallback: warp when the dateProvider time has passed the next slot timestamp.
129
163
  const currentTimestamp = this.dateProvider?.now() ?? Date.now();
130
164
  if (currentTimestamp > nextSlotTimestamp * 1000) {
131
- try {
132
- await this.cheatcodes.warp(nextSlotTimestamp, {
133
- resetBlockInterval: true
134
- });
135
- } catch (e) {
136
- this.logger.error(`Failed to warp to timestamp ${nextSlotTimestamp}: ${e}`);
137
- }
165
+ await this.warpToTimestamp(nextSlotTimestamp);
138
166
  this.logger.info(`Slot ${currentSlot} was missed, jumped to next slot`);
139
167
  }
140
168
  } catch {
141
169
  this.logger.error('mineIfSlotFilled failed');
142
170
  }
143
171
  }
172
+ async warpToTimestamp(timestamp) {
173
+ try {
174
+ await this.cheatcodes.warp(timestamp, {
175
+ resetBlockInterval: true
176
+ });
177
+ } catch (e) {
178
+ this.logger.error(`Failed to warp to timestamp ${timestamp}: ${e}`);
179
+ }
180
+ }
144
181
  }
@@ -9,7 +9,9 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
9
9
  * codes, please consider whether it makes sense to just introduce new utils in your tests instead.
10
10
  */
11
11
  export declare class CheatCodes {
12
+ /** Cheat codes for L1.*/
12
13
  eth: EthCheatCodes;
14
+ /** Cheat codes for the Aztec Rollup contract on L1. */
13
15
  rollup: RollupCheatCodes;
14
16
  constructor(
15
17
  /** Cheat codes for L1.*/
@@ -38,4 +40,4 @@ export declare class CheatCodes {
38
40
  */
39
41
  warpL2TimeAtLeastBy(sequencerClient: SequencerClient, node: AztecNode, duration: bigint | number): Promise<void>;
40
42
  }
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlYXRfY29kZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2NoZWF0X2NvZGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd2RSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRTs7Ozs7R0FLRztBQUNILHFCQUFhLFVBQVU7SUFHWixHQUFHLEVBQUUsYUFBYTtJQUVsQixNQUFNLEVBQUUsZ0JBQWdCO0lBSmpDO0lBQ0UseUJBQXlCO0lBQ2xCLEdBQUcsRUFBRSxhQUFhO0lBQ3pCLHVEQUF1RDtJQUNoRCxNQUFNLEVBQUUsZ0JBQWdCLEVBQzdCO0lBRUosT0FBYSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBT3ZHO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDRyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sR0FBRyxNQUFNLGlCQXVCNUc7SUFFRDs7Ozs7Ozs7T0FRRztJQUNHLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLE1BQU0saUJBSXJHO0NBQ0YifQ==
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlYXRfY29kZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2NoZWF0X2NvZGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd2RSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRTs7Ozs7R0FLRztBQUNILHFCQUFhLFVBQVU7SUFFbkIseUJBQXlCO0lBQ2xCLEdBQUcsRUFBRSxhQUFhO0lBQ3pCLHVEQUF1RDtJQUNoRCxNQUFNLEVBQUUsZ0JBQWdCO0lBSmpDO0lBQ0UseUJBQXlCO0lBQ2xCLEdBQUcsRUFBRSxhQUFhO0lBQ3pCLHVEQUF1RDtJQUNoRCxNQUFNLEVBQUUsZ0JBQWdCLEVBQzdCO0lBRUosT0FBYSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBT3ZHO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDRyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sR0FBRyxNQUFNLGlCQXVCNUc7SUFFRDs7Ozs7Ozs7T0FRRztJQUNHLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLE1BQU0saUJBSXJHO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"cheat_codes.d.ts","sourceRoot":"","sources":["../../src/testing/cheat_codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE;;;;;GAKG;AACH,qBAAa,UAAU;IAGZ,GAAG,EAAE,aAAa;IAElB,MAAM,EAAE,gBAAgB;IAJjC;IACE,yBAAyB;IAClB,GAAG,EAAE,aAAa;IACzB,uDAAuD;IAChD,MAAM,EAAE,gBAAgB,EAC7B;IAEJ,OAAa,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAOvG;IAED;;;;;;;;OAQG;IACG,mBAAmB,CAAC,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,iBAuB5G;IAED;;;;;;;;OAQG;IACG,mBAAmB,CAAC,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,iBAIrG;CACF"}
1
+ {"version":3,"file":"cheat_codes.d.ts","sourceRoot":"","sources":["../../src/testing/cheat_codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE;;;;;GAKG;AACH,qBAAa,UAAU;IAEnB,yBAAyB;IAClB,GAAG,EAAE,aAAa;IACzB,uDAAuD;IAChD,MAAM,EAAE,gBAAgB;IAJjC;IACE,yBAAyB;IAClB,GAAG,EAAE,aAAa;IACzB,uDAAuD;IAChD,MAAM,EAAE,gBAAgB,EAC7B;IAEJ,OAAa,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAOvG;IAED;;;;;;;;OAQG;IACG,mBAAmB,CAAC,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,iBAuB5G;IAED;;;;;;;;OAQG;IACG,mBAAmB,CAAC,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,iBAIrG;CACF"}
@@ -0,0 +1,19 @@
1
+ import { type EthCheatCodes } from '@aztec/ethereum/test';
2
+ import { type EpochNumber } from '@aztec/foundation/branded-types';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
5
+ export declare class EpochTestSettler {
6
+ private l2BlockSource;
7
+ private log;
8
+ private options;
9
+ private rollupCheatCodes;
10
+ private epochMonitor?;
11
+ constructor(cheatcodes: EthCheatCodes, rollupAddress: EthAddress, l2BlockSource: L2BlockSource, log: Logger, options: {
12
+ pollingIntervalMs: number;
13
+ provingDelayMs?: number;
14
+ });
15
+ start(): Promise<void>;
16
+ stop(): Promise<void>;
17
+ handleEpochReadyToProve(epoch: EpochNumber): Promise<boolean>;
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2hfdGVzdF9zZXR0bGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9lcG9jaF90ZXN0X3NldHRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssYUFBYSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBYyxNQUFNLGlDQUFpQyxDQUFDO0FBQy9FLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdyRSxxQkFBYSxnQkFBZ0I7SUFPekIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLEdBQUc7SUFDWCxPQUFPLENBQUMsT0FBTztJQVJqQixPQUFPLENBQUMsZ0JBQWdCLENBQW1CO0lBQzNDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBZTtJQUVwQyxZQUNFLFVBQVUsRUFBRSxhQUFhLEVBQ3pCLGFBQWEsRUFBRSxVQUFVLEVBQ2pCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLEdBQUcsRUFBRSxNQUFNLEVBQ1gsT0FBTyxFQUFFO1FBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO1FBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFHeEU7SUFFSyxLQUFLLGtCQUlWO0lBRUssSUFBSSxrQkFFVDtJQUVLLHVCQUF1QixDQUFDLEtBQUssRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQXFDbEU7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoch_test_settler.d.ts","sourceRoot":"","sources":["../../src/testing/epoch_test_settler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGrE,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IARjB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC,YACE,UAAU,EAAE,aAAa,EACzB,aAAa,EAAE,UAAU,EACjB,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EAGxE;IAEK,KAAK,kBAIV;IAEK,IAAI,kBAET;IAEK,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAqClE;CACF"}
@@ -0,0 +1,62 @@
1
+ import { RollupCheatCodes } from '@aztec/ethereum/test';
2
+ import { SlotNumber } from '@aztec/foundation/branded-types';
3
+ import { EpochMonitor } from '@aztec/prover-node';
4
+ import { computeL2ToL1MembershipWitnessFromMessagesInEpoch } from '@aztec/stdlib/messaging';
5
+ export class EpochTestSettler {
6
+ l2BlockSource;
7
+ log;
8
+ options;
9
+ rollupCheatCodes;
10
+ epochMonitor;
11
+ constructor(cheatcodes, rollupAddress, l2BlockSource, log, options){
12
+ this.l2BlockSource = l2BlockSource;
13
+ this.log = log;
14
+ this.options = options;
15
+ this.rollupCheatCodes = new RollupCheatCodes(cheatcodes, {
16
+ rollupAddress
17
+ });
18
+ }
19
+ async start() {
20
+ const { epochDuration } = await this.rollupCheatCodes.getConfig();
21
+ this.epochMonitor = new EpochMonitor(this.l2BlockSource, {
22
+ epochDuration: Number(epochDuration)
23
+ }, this.options);
24
+ this.epochMonitor.start(this);
25
+ }
26
+ async stop() {
27
+ await this.epochMonitor?.stop();
28
+ }
29
+ async handleEpochReadyToProve(epoch) {
30
+ const checkpointedBlocks = await this.l2BlockSource.getCheckpointedBlocksForEpoch(epoch);
31
+ const blocks = checkpointedBlocks.map((b)=>b.block);
32
+ this.log.info(`Settling epoch ${epoch} with blocks ${blocks[0]?.header.getBlockNumber()} to ${blocks.at(-1)?.header.getBlockNumber()}`, {
33
+ blocks: blocks.map((b)=>b.toBlockInfo())
34
+ });
35
+ const messagesInEpoch = [];
36
+ let previousSlotNumber = SlotNumber.ZERO;
37
+ let checkpointIndex = -1;
38
+ for (const block of blocks){
39
+ const slotNumber = block.header.globalVariables.slotNumber;
40
+ if (slotNumber !== previousSlotNumber) {
41
+ checkpointIndex++;
42
+ messagesInEpoch[checkpointIndex] = [];
43
+ previousSlotNumber = slotNumber;
44
+ }
45
+ messagesInEpoch[checkpointIndex].push(block.body.txEffects.map((txEffect)=>txEffect.l2ToL1Msgs));
46
+ }
47
+ const [firstMessage] = messagesInEpoch.flat(3);
48
+ if (firstMessage) {
49
+ const { root: outHash } = computeL2ToL1MembershipWitnessFromMessagesInEpoch(messagesInEpoch, firstMessage);
50
+ await this.rollupCheatCodes.insertOutbox(epoch, outHash.toBigInt());
51
+ } else {
52
+ this.log.info(`No L2 to L1 messages in epoch ${epoch}`);
53
+ }
54
+ const lastCheckpoint = checkpointedBlocks.at(-1)?.checkpointNumber;
55
+ if (lastCheckpoint !== undefined) {
56
+ await this.rollupCheatCodes.markAsProven(lastCheckpoint);
57
+ } else {
58
+ this.log.warn(`No checkpoint found for epoch ${epoch}`);
59
+ }
60
+ return true;
61
+ }
62
+ }
@@ -1,4 +1,6 @@
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUMifQ==
4
+ export { EpochTestSettler } from './epoch_test_settler.js';
5
+ export { getTokenAllowedSetupFunctions } from './token_allowed_setup.js';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sMEJBQTBCLENBQUMifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC"}
@@ -1,3 +1,5 @@
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';
5
+ export { getTokenAllowedSetupFunctions } from './token_allowed_setup.js';
@@ -0,0 +1,7 @@
1
+ import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
2
+ /**
3
+ * Returns Token-specific allowlist entries needed for FPC-based fee payments.
4
+ * These are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
5
+ */
6
+ export declare function getTokenAllowedSetupFunctions(): Promise<AllowedElement[]>;
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5fYWxsb3dlZF9zZXR1cC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvdG9rZW5fYWxsb3dlZF9zZXR1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV0RTs7O0dBR0c7QUFDSCx3QkFBc0IsNkJBQTZCLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBUy9FIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token_allowed_setup.d.ts","sourceRoot":"","sources":["../../src/testing/token_allowed_setup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;;GAGG;AACH,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAS/E"}
@@ -0,0 +1,20 @@
1
+ import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
2
+ import { buildAllowedElement } from '@aztec/p2p/msg_validators';
3
+ import { getContractClassFromArtifact } from '@aztec/stdlib/contract';
4
+ /**
5
+ * Returns Token-specific allowlist entries needed for FPC-based fee payments.
6
+ * These are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
7
+ */ export async function getTokenAllowedSetupFunctions() {
8
+ const tokenClassId = (await getContractClassFromArtifact(TokenContractArtifact)).id;
9
+ const target = {
10
+ classId: tokenClassId
11
+ };
12
+ return Promise.all([
13
+ // Token: needed for private transfers via FPC (transfer_to_public enqueues this)
14
+ buildAllowedElement(TokenContractArtifact, target, '_increase_public_balance', {
15
+ onlySelf: true
16
+ }),
17
+ // Token: needed for public transfers via FPC (fee_entrypoint_public enqueues this)
18
+ buildAllowedElement(TokenContractArtifact, target, 'transfer_in_public')
19
+ ]);
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/aztec",
3
- "version": "0.0.1-commit.03f7ef2",
3
+ "version": "0.0.1-commit.04852196a",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -28,38 +28,40 @@
28
28
  "../package.common.json"
29
29
  ],
30
30
  "dependencies": {
31
- "@aztec/accounts": "0.0.1-commit.03f7ef2",
32
- "@aztec/archiver": "0.0.1-commit.03f7ef2",
33
- "@aztec/aztec-faucet": "0.0.1-commit.03f7ef2",
34
- "@aztec/aztec-node": "0.0.1-commit.03f7ef2",
35
- "@aztec/aztec.js": "0.0.1-commit.03f7ef2",
36
- "@aztec/bb-prover": "0.0.1-commit.03f7ef2",
37
- "@aztec/bb.js": "0.0.1-commit.03f7ef2",
38
- "@aztec/blob-client": "0.0.1-commit.03f7ef2",
39
- "@aztec/bot": "0.0.1-commit.03f7ef2",
40
- "@aztec/builder": "0.0.1-commit.03f7ef2",
41
- "@aztec/cli": "0.0.1-commit.03f7ef2",
42
- "@aztec/constants": "0.0.1-commit.03f7ef2",
43
- "@aztec/entrypoints": "0.0.1-commit.03f7ef2",
44
- "@aztec/ethereum": "0.0.1-commit.03f7ef2",
45
- "@aztec/foundation": "0.0.1-commit.03f7ef2",
46
- "@aztec/kv-store": "0.0.1-commit.03f7ef2",
47
- "@aztec/l1-artifacts": "0.0.1-commit.03f7ef2",
48
- "@aztec/node-lib": "0.0.1-commit.03f7ef2",
49
- "@aztec/noir-contracts.js": "0.0.1-commit.03f7ef2",
50
- "@aztec/noir-protocol-circuits-types": "0.0.1-commit.03f7ef2",
51
- "@aztec/p2p": "0.0.1-commit.03f7ef2",
52
- "@aztec/p2p-bootstrap": "0.0.1-commit.03f7ef2",
53
- "@aztec/protocol-contracts": "0.0.1-commit.03f7ef2",
54
- "@aztec/prover-client": "0.0.1-commit.03f7ef2",
55
- "@aztec/prover-node": "0.0.1-commit.03f7ef2",
56
- "@aztec/pxe": "0.0.1-commit.03f7ef2",
57
- "@aztec/sequencer-client": "0.0.1-commit.03f7ef2",
58
- "@aztec/stdlib": "0.0.1-commit.03f7ef2",
59
- "@aztec/telemetry-client": "0.0.1-commit.03f7ef2",
60
- "@aztec/test-wallet": "0.0.1-commit.03f7ef2",
61
- "@aztec/txe": "0.0.1-commit.03f7ef2",
62
- "@aztec/world-state": "0.0.1-commit.03f7ef2",
31
+ "@aztec/accounts": "0.0.1-commit.04852196a",
32
+ "@aztec/archiver": "0.0.1-commit.04852196a",
33
+ "@aztec/aztec-faucet": "0.0.1-commit.04852196a",
34
+ "@aztec/aztec-node": "0.0.1-commit.04852196a",
35
+ "@aztec/aztec.js": "0.0.1-commit.04852196a",
36
+ "@aztec/bb-prover": "0.0.1-commit.04852196a",
37
+ "@aztec/bb.js": "0.0.1-commit.04852196a",
38
+ "@aztec/blob-client": "0.0.1-commit.04852196a",
39
+ "@aztec/bot": "0.0.1-commit.04852196a",
40
+ "@aztec/builder": "0.0.1-commit.04852196a",
41
+ "@aztec/cli": "0.0.1-commit.04852196a",
42
+ "@aztec/constants": "0.0.1-commit.04852196a",
43
+ "@aztec/entrypoints": "0.0.1-commit.04852196a",
44
+ "@aztec/ethereum": "0.0.1-commit.04852196a",
45
+ "@aztec/foundation": "0.0.1-commit.04852196a",
46
+ "@aztec/kv-store": "0.0.1-commit.04852196a",
47
+ "@aztec/l1-artifacts": "0.0.1-commit.04852196a",
48
+ "@aztec/node-lib": "0.0.1-commit.04852196a",
49
+ "@aztec/noir-contracts.js": "0.0.1-commit.04852196a",
50
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.04852196a",
51
+ "@aztec/p2p": "0.0.1-commit.04852196a",
52
+ "@aztec/p2p-bootstrap": "0.0.1-commit.04852196a",
53
+ "@aztec/protocol-contracts": "0.0.1-commit.04852196a",
54
+ "@aztec/prover-client": "0.0.1-commit.04852196a",
55
+ "@aztec/prover-node": "0.0.1-commit.04852196a",
56
+ "@aztec/pxe": "0.0.1-commit.04852196a",
57
+ "@aztec/sequencer-client": "0.0.1-commit.04852196a",
58
+ "@aztec/stdlib": "0.0.1-commit.04852196a",
59
+ "@aztec/telemetry-client": "0.0.1-commit.04852196a",
60
+ "@aztec/txe": "0.0.1-commit.04852196a",
61
+ "@aztec/validator-ha-signer": "0.0.1-commit.04852196a",
62
+ "@aztec/wallets": "0.0.1-commit.04852196a",
63
+ "@aztec/world-state": "0.0.1-commit.04852196a",
64
+ "@iarna/toml": "^2.2.5",
63
65
  "@types/chalk": "^2.2.0",
64
66
  "abitype": "^0.8.11",
65
67
  "chalk": "^5.3.0",
@@ -79,7 +81,7 @@
79
81
  "@jest/globals": "^30.0.0",
80
82
  "@types/jest": "^30.0.0",
81
83
  "@types/koa": "^2.15.0",
82
- "@typescript/native-preview": "7.0.0-dev.20251126.1",
84
+ "@typescript/native-preview": "7.0.0-dev.20260113.1",
83
85
  "jest": "^30.0.0",
84
86
  "ts-node": "^10.9.1",
85
87
  "typescript": "^5.3.3"
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Creates a contract+test crate pair and adds them to an existing workspace.
5
+ # Usage: add_crate.sh <crate_name>
6
+ # Must be called from a workspace root that already has Nargo.toml with [workspace].
7
+
8
+ crate_name=$1
9
+
10
+ if [ -z "$crate_name" ]; then
11
+ echo "Error: crate name is required"
12
+ exit 1
13
+ fi
14
+
15
+ if [[ "$crate_name" == *"/"* ]] || [[ "$crate_name" == *"\\"* ]]; then
16
+ echo "Error: crate name must not contain path separators"
17
+ exit 1
18
+ fi
19
+
20
+ contract_dir="${crate_name}_contract"
21
+ test_dir="${crate_name}_test"
22
+
23
+ if [ -d "$contract_dir" ]; then
24
+ echo "Error: directory '$contract_dir' already exists"
25
+ exit 1
26
+ fi
27
+ if [ -d "$test_dir" ]; then
28
+ echo "Error: directory '$test_dir' already exists"
29
+ exit 1
30
+ fi
31
+
32
+ # Get the actual aztec version for the git tag.
33
+ AZTEC_VERSION=$(jq -r '.version' $(dirname $0)/../package.json)
34
+
35
+ # Create contract crate
36
+ mkdir -p "$contract_dir/src"
37
+ cat > "$contract_dir/Nargo.toml" << CEOF
38
+ [package]
39
+ name = "${crate_name}_contract"
40
+ type = "contract"
41
+
42
+ [dependencies]
43
+ aztec = { git="https://github.com/AztecProtocol/aztec-nr", tag="v${AZTEC_VERSION}", directory="aztec" }
44
+ CEOF
45
+
46
+ cat > "$contract_dir/src/main.nr" << 'EOF'
47
+ use aztec::macros::aztec;
48
+
49
+ #[aztec]
50
+ pub contract Main {
51
+ use aztec::macros::functions::{external, initializer};
52
+
53
+ #[initializer]
54
+ #[external("private")]
55
+ fn constructor() {}
56
+ }
57
+ EOF
58
+
59
+ # Create test crate
60
+ mkdir -p "$test_dir/src"
61
+ cat > "$test_dir/Nargo.toml" << TEOF
62
+ [package]
63
+ name = "${crate_name}_test"
64
+ type = "lib"
65
+
66
+ [dependencies]
67
+ aztec = { git="https://github.com/AztecProtocol/aztec-nr", tag="v${AZTEC_VERSION}", directory="aztec" }
68
+ ${crate_name}_contract = { path = "../${contract_dir}" }
69
+ TEOF
70
+
71
+ cat > "$test_dir/src/lib.nr" << 'NOIR'
72
+ use aztec::test::helpers::test_environment::TestEnvironment;
73
+ use __CRATE_NAME___contract::Main;
74
+
75
+ #[test]
76
+ unconstrained fn test_constructor() {
77
+ let mut env = TestEnvironment::new();
78
+ let deployer = env.create_light_account();
79
+
80
+ // Deploy the contract with the default constructor:
81
+ let contract_address = env.deploy("@__CRATE_NAME___contract/Main").with_private_initializer(
82
+ deployer,
83
+ Main::interface().constructor(),
84
+ );
85
+
86
+ // Deploy without an initializer:
87
+ let contract_address = env.deploy("@__CRATE_NAME___contract/Main").without_initializer();
88
+ }
89
+ NOIR
90
+
91
+ sed -i "s/__CRATE_NAME__/${crate_name}/g" "$test_dir/src/lib.nr"
92
+
93
+ # Add members to workspace Nargo.toml
94
+ if grep -q 'members\s*=\s*\[\s*\]' Nargo.toml; then
95
+ # Empty array: members = []
96
+ sed -i "s|members\s*=\s*\[\s*\]|members = [\"${contract_dir}\", \"${test_dir}\"]|" Nargo.toml
97
+ else
98
+ # Non-empty array: add before closing ]
99
+ sed -i "s|\(members\s*=\s*\[.*\)\]|\1, \"${contract_dir}\", \"${test_dir}\"]|" Nargo.toml
100
+ fi
101
+
102
+ echo "Created crates '${contract_dir}' and '${test_dir}'"
package/scripts/aztec.sh CHANGED
@@ -1,26 +1,35 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
+ # Re-execute using correct version if we have an .aztecrc file.
5
+ if [ "${AZTEC_VERSIONED:-0}" -eq 0 ] && [ -f .aztecrc ] && command -v aztec-up &>/dev/null; then
6
+ env_setup=$(aztec-up env)
7
+ eval "$env_setup"
8
+ AZTEC_VERSIONED=1 exec aztec "$@"
9
+ fi
10
+
11
+ cmd=${1:-}
12
+ [ -n "$cmd" ] && shift
13
+
4
14
  script_dir="$(dirname "$(realpath "$0")")"
5
15
 
6
16
  function aztec {
17
+ export AZTEC_SHELL_WRAPPER=1
7
18
  exec node --no-warnings $script_dir/../dest/bin/index.js "$@"
8
19
  }
9
20
 
10
- cmd=${1:-}
11
- [ -n "$cmd" ] && shift
12
-
13
- export AZTEC_SHELL_WRAPPER=1
14
-
15
21
  case $cmd in
16
22
  test)
17
- export LOG_LEVEL="${LOG_LEVEL:-info}"
23
+ # Attempt to compile, no-op if there are no changes
24
+ node --no-warnings "$script_dir/../dest/bin/index.js" compile
25
+
26
+ export LOG_LEVEL="${LOG_LEVEL:-"error;trace:contract_log"}"
18
27
  aztec start --txe --port 8081 &
19
28
  server_pid=$!
20
29
  trap 'kill $server_pid &>/dev/null || true' EXIT
21
30
  while ! nc -z 127.0.0.1 8081 &>/dev/null; do sleep 0.2; done
22
31
  export NARGO_FOREIGN_CALL_TIMEOUT=300000
23
- nargo test --silence-warnings --pedantic-solving --oracle-resolver http://127.0.0.1:8081 "$@"
32
+ nargo test --silence-warnings --oracle-resolver http://127.0.0.1:8081 --test-threads 16 "$@"
24
33
  ;;
25
34
  start)
26
35
  if [ "${1:-}" == "--local-network" ]; then
@@ -40,16 +49,20 @@ case $cmd in
40
49
  export ETHEREUM_HOSTS=${ETHEREUM_HOSTS:-"http://127.0.0.1:${ANVIL_PORT}"}
41
50
 
42
51
  anvil --version
43
- anvil --silent &
52
+ anvil --silent --port "$ANVIL_PORT" &
44
53
  anvil_pid=$!
45
54
  trap 'kill $anvil_pid &>/dev/null' EXIT
46
55
  fi
47
56
 
48
57
  aztec start "$@"
49
58
  ;;
50
- compile|new|init|flamegraph)
59
+ new|init)
51
60
  $script_dir/${cmd}.sh "$@"
52
61
  ;;
62
+ flamegraph)
63
+ echo "Warning: 'aztec flamegraph' is deprecated. Use 'aztec profile flamegraph' instead." >&2
64
+ aztec profile flamegraph "$@"
65
+ ;;
53
66
  *)
54
67
  aztec $cmd "$@"
55
68
  ;;
package/scripts/init.sh CHANGED
@@ -1,35 +1,39 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
- NARGO=${NARGO:-nargo}
5
4
  script_path=$(realpath $(dirname "$0"))
6
5
 
7
- for arg in "$@"; do
8
- if [ "$arg" == "--help" ] || [ "$arg" == "-h" ]; then
9
- cat << 'EOF'
6
+ # Parse arguments
7
+ while [[ $# -gt 0 ]]; do
8
+ case $1 in
9
+ --help|-h)
10
+ cat << 'EOF'
10
11
  Aztec Init - Create a new Aztec Noir project in the current directory
11
12
 
12
- Usage: aztec init [OPTIONS]
13
+ Usage: aztec init
13
14
 
14
15
  Options:
15
- --name <NAME> Name of the package [default: current directory name]
16
- --lib Use a library template
17
16
  -h, --help Print help
18
17
 
19
- This command creates a new Aztec Noir project in the current directory using nargo
20
- and automatically adds the Aztec.nr dependency to your Nargo.toml file.
18
+ This command creates a new Aztec Noir project in the current directory with
19
+ a workspace containing a contract crate and a test crate, and automatically
20
+ adds the Aztec.nr dependency to both.
21
21
 
22
+ If a workspace already exists in the current directory, use
23
+ 'aztec new <name>' instead to add another contract.
22
24
  EOF
23
- exit 0
24
- fi
25
- if [ "$arg" == "--lib" ]; then
26
- is_contract=0
27
- fi
25
+ exit 0
26
+ ;;
27
+ *)
28
+ echo "Error: unexpected argument '$1'"
29
+ echo "Usage: aztec init"
30
+ echo "Run 'aztec init --help' for more information"
31
+ exit 1
32
+ ;;
33
+ esac
28
34
  done
29
35
 
30
- echo "Initializing Noir project..."
31
- $NARGO init "$@"
36
+ package_name="$(basename $(pwd))"
32
37
 
33
- if [ "${is_contract:-1}" -eq 1 ]; then
34
- $script_path/setup_project.sh
35
- fi
38
+ echo "Initializing Aztec contract project..."
39
+ $script_path/setup_workspace.sh "$package_name"