@aztec/ethereum 0.0.1-commit.2ed92850 → 0.0.1-commit.3100065

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 (174) hide show
  1. package/dest/client.d.ts +25 -3
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +60 -8
  4. package/dest/config.d.ts +17 -6
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +39 -11
  7. package/dest/contracts/chain_state_override.d.ts +78 -0
  8. package/dest/contracts/chain_state_override.d.ts.map +1 -0
  9. package/dest/contracts/chain_state_override.js +137 -0
  10. package/dest/contracts/fee_asset_handler.d.ts +1 -1
  11. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  12. package/dest/contracts/fee_asset_handler.js +2 -0
  13. package/dest/contracts/fee_asset_price_oracle.d.ts +105 -0
  14. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  15. package/dest/contracts/fee_asset_price_oracle.js +656 -0
  16. package/dest/contracts/governance.d.ts +108 -33
  17. package/dest/contracts/governance.d.ts.map +1 -1
  18. package/dest/contracts/governance.js +198 -15
  19. package/dest/contracts/governance_proposer.d.ts +33 -1
  20. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  21. package/dest/contracts/governance_proposer.js +57 -3
  22. package/dest/contracts/gse.d.ts +4 -2
  23. package/dest/contracts/gse.d.ts.map +1 -1
  24. package/dest/contracts/gse.js +2 -2
  25. package/dest/contracts/inbox.d.ts +3 -3
  26. package/dest/contracts/inbox.d.ts.map +1 -1
  27. package/dest/contracts/inbox.js +12 -7
  28. package/dest/contracts/index.d.ts +4 -3
  29. package/dest/contracts/index.d.ts.map +1 -1
  30. package/dest/contracts/index.js +3 -2
  31. package/dest/contracts/multicall.d.ts +127 -12
  32. package/dest/contracts/multicall.d.ts.map +1 -1
  33. package/dest/contracts/multicall.js +201 -93
  34. package/dest/contracts/outbox.d.ts +27 -4
  35. package/dest/contracts/outbox.d.ts.map +1 -1
  36. package/dest/contracts/outbox.js +34 -7
  37. package/dest/contracts/registry.d.ts +3 -1
  38. package/dest/contracts/registry.d.ts.map +1 -1
  39. package/dest/contracts/registry.js +30 -1
  40. package/dest/contracts/rollup.d.ts +5420 -31
  41. package/dest/contracts/rollup.d.ts.map +1 -1
  42. package/dest/contracts/rollup.js +406 -75
  43. package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
  44. package/dest/contracts/slashing_proposer.d.ts.map +1 -0
  45. package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +18 -13
  46. package/dest/deploy_aztec_l1_contracts.d.ts +5 -9
  47. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  48. package/dest/deploy_aztec_l1_contracts.js +41 -26
  49. package/dest/deploy_l1_contract.js +3 -3
  50. package/dest/generated/l1-contracts-defaults.d.ts +3 -3
  51. package/dest/generated/l1-contracts-defaults.js +3 -3
  52. package/dest/l1_artifacts.d.ts +15524 -15847
  53. package/dest/l1_artifacts.d.ts.map +1 -1
  54. package/dest/l1_artifacts.js +9 -24
  55. package/dest/l1_contract_addresses.d.ts +61 -65
  56. package/dest/l1_contract_addresses.d.ts.map +1 -1
  57. package/dest/l1_contract_addresses.js +101 -82
  58. package/dest/l1_reader.d.ts +5 -5
  59. package/dest/l1_reader.d.ts.map +1 -1
  60. package/dest/l1_reader.js +9 -7
  61. package/dest/l1_tx_utils/config.d.ts +7 -1
  62. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  63. package/dest/l1_tx_utils/config.js +17 -4
  64. package/dest/l1_tx_utils/constants.d.ts +1 -1
  65. package/dest/l1_tx_utils/constants.js +2 -2
  66. package/dest/l1_tx_utils/factory.d.ts +18 -10
  67. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  68. package/dest/l1_tx_utils/factory.js +17 -7
  69. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +1 -1
  70. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +1 -1
  71. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
  72. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
  73. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
  74. package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
  75. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
  76. package/dest/l1_tx_utils/index-blobs.js +2 -2
  77. package/dest/l1_tx_utils/index.d.ts +2 -1
  78. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  79. package/dest/l1_tx_utils/index.js +1 -0
  80. package/dest/l1_tx_utils/l1_tx_utils.d.ts +26 -7
  81. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  82. package/dest/l1_tx_utils/l1_tx_utils.js +158 -81
  83. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -1
  84. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  85. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +13 -8
  86. package/dest/l1_tx_utils/tx_delayer.d.ts +58 -0
  87. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  88. package/dest/{test → l1_tx_utils}/tx_delayer.js +67 -37
  89. package/dest/publisher_manager.d.ts +34 -7
  90. package/dest/publisher_manager.d.ts.map +1 -1
  91. package/dest/publisher_manager.js +119 -8
  92. package/dest/queries.d.ts +13 -2
  93. package/dest/queries.d.ts.map +1 -1
  94. package/dest/queries.js +62 -3
  95. package/dest/test/blob_kzg_warmup.d.ts +19 -0
  96. package/dest/test/blob_kzg_warmup.d.ts.map +1 -0
  97. package/dest/test/blob_kzg_warmup.js +64 -0
  98. package/dest/test/chain_monitor.d.ts +55 -4
  99. package/dest/test/chain_monitor.d.ts.map +1 -1
  100. package/dest/test/chain_monitor.js +104 -3
  101. package/dest/test/eth_cheat_codes.d.ts +31 -6
  102. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  103. package/dest/test/eth_cheat_codes.js +67 -44
  104. package/dest/test/index.d.ts +2 -3
  105. package/dest/test/index.d.ts.map +1 -1
  106. package/dest/test/index.js +1 -2
  107. package/dest/test/rollup_cheat_codes.d.ts +62 -3
  108. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  109. package/dest/test/rollup_cheat_codes.js +95 -7
  110. package/dest/test/start_anvil.d.ts +23 -3
  111. package/dest/test/start_anvil.d.ts.map +1 -1
  112. package/dest/test/start_anvil.js +143 -29
  113. package/dest/test/upgrade_utils.js +2 -2
  114. package/dest/utils.d.ts +10 -2
  115. package/dest/utils.d.ts.map +1 -1
  116. package/dest/utils.js +105 -24
  117. package/package.json +6 -8
  118. package/src/client.ts +66 -2
  119. package/src/config.ts +59 -15
  120. package/src/contracts/chain_state_override.ts +200 -0
  121. package/src/contracts/fee_asset_handler.ts +2 -0
  122. package/src/contracts/fee_asset_price_oracle.ts +285 -0
  123. package/src/contracts/governance.ts +271 -12
  124. package/src/contracts/governance_proposer.ts +58 -2
  125. package/src/contracts/gse.ts +7 -2
  126. package/src/contracts/inbox.ts +13 -5
  127. package/src/contracts/index.ts +3 -2
  128. package/src/contracts/multicall.ts +243 -102
  129. package/src/contracts/outbox.ts +42 -8
  130. package/src/contracts/registry.ts +31 -1
  131. package/src/contracts/rollup.ts +457 -78
  132. package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +16 -14
  133. package/src/deploy_aztec_l1_contracts.ts +63 -35
  134. package/src/deploy_l1_contract.ts +3 -3
  135. package/src/generated/l1-contracts-defaults.ts +3 -3
  136. package/src/l1_artifacts.ts +12 -35
  137. package/src/l1_contract_addresses.ts +120 -94
  138. package/src/l1_reader.ts +17 -10
  139. package/src/l1_tx_utils/config.ts +23 -3
  140. package/src/l1_tx_utils/constants.ts +2 -2
  141. package/src/l1_tx_utils/factory.ts +31 -31
  142. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +1 -1
  143. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +1 -1
  144. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
  145. package/src/l1_tx_utils/index-blobs.ts +2 -2
  146. package/src/l1_tx_utils/index.ts +1 -0
  147. package/src/l1_tx_utils/l1_tx_utils.ts +151 -66
  148. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +13 -8
  149. package/src/{test → l1_tx_utils}/tx_delayer.ts +93 -56
  150. package/src/publisher_manager.ts +145 -12
  151. package/src/queries.ts +70 -4
  152. package/src/test/blob_kzg_warmup.ts +65 -0
  153. package/src/test/chain_monitor.ts +148 -3
  154. package/src/test/eth_cheat_codes.ts +63 -47
  155. package/src/test/index.ts +1 -2
  156. package/src/test/rollup_cheat_codes.ts +124 -6
  157. package/src/test/start_anvil.ts +177 -29
  158. package/src/test/upgrade_utils.ts +2 -2
  159. package/src/utils.ts +109 -29
  160. package/dest/contracts/empire_slashing_proposer.d.ts +0 -67
  161. package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
  162. package/dest/contracts/empire_slashing_proposer.js +0 -209
  163. package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
  164. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  165. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  166. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  167. package/dest/test/delayed_tx_utils.d.ts +0 -13
  168. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  169. package/dest/test/delayed_tx_utils.js +0 -28
  170. package/dest/test/tx_delayer.d.ts +0 -36
  171. package/dest/test/tx_delayer.d.ts.map +0 -1
  172. package/src/contracts/empire_slashing_proposer.ts +0 -270
  173. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  174. package/src/test/delayed_tx_utils.ts +0 -52
@@ -1,12 +1,13 @@
1
1
  import type { L1TxRequest } from '@aztec/ethereum/l1-tx-utils';
2
2
  import type { ViemClient } from '@aztec/ethereum/types';
3
- import { tryExtractEvent } from '@aztec/ethereum/utils';
3
+ import { mergeAbis, tryExtractEvent } from '@aztec/ethereum/utils';
4
4
  import { SlotNumber } from '@aztec/foundation/branded-types';
5
5
  import { Buffer32 } from '@aztec/foundation/buffer';
6
6
  import { EthAddress } from '@aztec/foundation/eth-address';
7
7
  import { Signature } from '@aztec/foundation/eth-signature';
8
8
  import { hexToBuffer } from '@aztec/foundation/string';
9
- import { TallySlashingProposerAbi } from '@aztec/l1-artifacts/TallySlashingProposerAbi';
9
+ import { SlasherAbi } from '@aztec/l1-artifacts/SlasherAbi';
10
+ import { SlashingProposerAbi } from '@aztec/l1-artifacts/SlashingProposerAbi';
10
11
 
11
12
  import {
12
13
  type GetContractReturnType,
@@ -18,13 +19,11 @@ import {
18
19
  } from 'viem';
19
20
 
20
21
  /**
21
- * Wrapper around the TallySlashingProposer contract that provides
22
+ * Wrapper around the SlashingProposer contract that provides
22
23
  * a TypeScript interface for interacting with the consensus-based slashing system.
23
24
  */
24
- export class TallySlashingProposerContract {
25
- private readonly contract: GetContractReturnType<typeof TallySlashingProposerAbi, ViemClient>;
26
-
27
- public readonly type = 'tally' as const;
25
+ export class SlashingProposerContract {
26
+ private readonly contract: GetContractReturnType<typeof SlashingProposerAbi, ViemClient>;
28
27
 
29
28
  constructor(
30
29
  public readonly client: ViemClient,
@@ -32,7 +31,7 @@ export class TallySlashingProposerContract {
32
31
  ) {
33
32
  this.contract = getContract({
34
33
  address: typeof address === 'string' ? address : address.toString(),
35
- abi: TallySlashingProposerAbi,
34
+ abi: SlashingProposerAbi,
36
35
  client,
37
36
  });
38
37
  }
@@ -135,12 +134,12 @@ export class TallySlashingProposerContract {
135
134
 
136
135
  /** Tries to extract a VoteCast event from the given logs. */
137
136
  public tryExtractVoteCastEvent(logs: Log[]) {
138
- return tryExtractEvent(logs, this.address.toString(), TallySlashingProposerAbi, 'VoteCast');
137
+ return tryExtractEvent(logs, this.address.toString(), SlashingProposerAbi, 'VoteCast');
139
138
  }
140
139
 
141
140
  /** Tries to extract a RoundExecuted event from the given logs. */
142
141
  public tryExtractRoundExecutedEvent(logs: Log[]) {
143
- return tryExtractEvent(logs, this.address.toString(), TallySlashingProposerAbi, 'RoundExecuted');
142
+ return tryExtractEvent(logs, this.address.toString(), SlashingProposerAbi, 'RoundExecuted');
144
143
  }
145
144
 
146
145
  /**
@@ -160,8 +159,9 @@ export class TallySlashingProposerContract {
160
159
 
161
160
  return {
162
161
  to: this.contract.address,
162
+ abi: SlashingProposerAbi,
163
163
  data: encodeFunctionData({
164
- abi: TallySlashingProposerAbi,
164
+ abi: SlashingProposerAbi,
165
165
  functionName: 'vote',
166
166
  args: [votes, signature.toViemSignature()],
167
167
  }),
@@ -171,7 +171,7 @@ export class TallySlashingProposerContract {
171
171
  /** Returns the typed data definition to EIP712-sign for voting */
172
172
  public buildVoteTypedData(votes: Hex, slot: SlotNumber): TypedDataDefinition {
173
173
  const domain = {
174
- name: 'TallySlashingProposer',
174
+ name: 'SlashingProposer',
175
175
  version: '1',
176
176
  chainId: this.client.chain.id,
177
177
  verifyingContract: this.contract.address,
@@ -207,8 +207,9 @@ export class TallySlashingProposerContract {
207
207
  public buildVoteRequestWithSignature(votes: Hex, signature: { v: number; r: Hex; s: Hex }): L1TxRequest {
208
208
  return {
209
209
  to: this.contract.address,
210
+ abi: SlashingProposerAbi,
210
211
  data: encodeFunctionData({
211
- abi: TallySlashingProposerAbi,
212
+ abi: SlashingProposerAbi,
212
213
  functionName: 'vote',
213
214
  args: [votes, signature],
214
215
  }),
@@ -224,8 +225,9 @@ export class TallySlashingProposerContract {
224
225
  public buildExecuteRoundRequest(round: bigint, committees: EthAddress[][]): L1TxRequest {
225
226
  return {
226
227
  to: this.contract.address,
228
+ abi: mergeAbis([SlashingProposerAbi, SlasherAbi]),
227
229
  data: encodeFunctionData({
228
- abi: TallySlashingProposerAbi,
230
+ abi: SlashingProposerAbi,
229
231
  functionName: 'executeRound',
230
232
  args: [round, committees.map(c => c.map(addr => addr.toString()))],
231
233
  }),
@@ -15,15 +15,14 @@ import { tmpdir } from 'os';
15
15
  import { dirname, join, resolve } from 'path';
16
16
  import readline from 'readline';
17
17
  import type { Hex } from 'viem';
18
- import { foundry, mainnet, sepolia } from 'viem/chains';
18
+ import { mainnet, sepolia } from 'viem/chains';
19
19
 
20
20
  import { createEthereumChain, isAnvilTestChain } from './chain.js';
21
21
  import { createExtendedL1Client } from './client.js';
22
- import type { L1ContractsConfig } from './config.js';
22
+ import { type L1ContractsConfig, assertValidSlotDurations } from './config.js';
23
23
  import { deployMulticall3 } from './contracts/multicall.js';
24
24
  import { RollupContract } from './contracts/rollup.js';
25
25
  import type { L1ContractAddresses } from './l1_contract_addresses.js';
26
- import type { L1TxUtilsConfig } from './l1_tx_utils/config.js';
27
26
  import type { ExtendedViemWalletClient } from './types.js';
28
27
 
29
28
  const logger = createLogger('ethereum:deploy_aztec_l1_contracts');
@@ -31,9 +30,9 @@ const logger = createLogger('ethereum:deploy_aztec_l1_contracts');
31
30
  const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:';
32
31
 
33
32
  /**
34
- * Runs a process with the given command, arguments, and environment.
35
- * If the process outputs a line starting with JSON_DEPLOY_RESULT_PREFIX,
36
- * the JSON is parsed and returned.
33
+ * Runs a process and parses JSON deploy results from stdout.
34
+ * Lines starting with JSON_DEPLOY_RESULT_PREFIX are parsed and returned.
35
+ * All other stdout goes to logger.info, stderr goes to logger.warn.
37
36
  */
38
37
  function runProcess<T>(
39
38
  command: string,
@@ -49,26 +48,41 @@ function runProcess<T>(
49
48
  });
50
49
 
51
50
  let result: T | undefined;
51
+ let parseError: Error | undefined;
52
+ let settled = false;
52
53
 
53
54
  readline.createInterface({ input: proc.stdout }).on('line', line => {
54
55
  const trimmedLine = line.trim();
55
56
  if (trimmedLine.startsWith(JSON_DEPLOY_RESULT_PREFIX)) {
56
57
  const jsonStr = trimmedLine.slice(JSON_DEPLOY_RESULT_PREFIX.length).trim();
57
- // TODO(AD): should this be a zod parse?
58
- result = JSON.parse(jsonStr);
58
+ try {
59
+ result = JSON.parse(jsonStr);
60
+ } catch {
61
+ parseError = new Error(`Failed to parse deploy result JSON: ${jsonStr.slice(0, 200)}`);
62
+ }
59
63
  } else {
60
64
  logger.info(line);
61
65
  }
62
66
  });
63
- readline.createInterface({ input: proc.stderr }).on('line', logger.error.bind(logger));
67
+ readline.createInterface({ input: proc.stderr }).on('line', logger.warn.bind(logger));
64
68
 
65
69
  proc.on('error', error => {
70
+ if (settled) {
71
+ return;
72
+ }
73
+ settled = true;
66
74
  reject(new Error(`Failed to spawn ${command}: ${error.message}`));
67
75
  });
68
76
 
69
77
  proc.on('close', code => {
78
+ if (settled) {
79
+ return;
80
+ }
81
+ settled = true;
70
82
  if (code !== 0) {
71
- reject(new Error(`${command} exited with code ${code}. See logs for details.\n`));
83
+ reject(new Error(`${command} exited with code ${code}`));
84
+ } else if (parseError) {
85
+ reject(parseError);
72
86
  } else {
73
87
  resolve(result);
74
88
  }
@@ -168,6 +182,9 @@ export function prepareL1ContractsForDeployment(): string {
168
182
  const foundryTomlPath = join(basePath, 'foundry.toml');
169
183
  let foundryToml = readFileSync(foundryTomlPath, 'utf-8');
170
184
  const solcPathMatch = foundryToml.match(/solc\s*=\s*"\.\/solc-([^"]+)"/);
185
+ // Did we find a hardcoded solc path that we need to make absolute?
186
+ // This code path happens in CI currently as we bundle solc there to avoid race conditions when
187
+ // downloading solc.
171
188
  if (solcPathMatch) {
172
189
  const solcVersion = solcPathMatch[1];
173
190
  const absoluteSolcPath = join(basePath, `solc-${solcVersion}`);
@@ -213,7 +230,6 @@ export function computeValidatorData(operator: Operator): ValidatorJson {
213
230
  export interface RollupUpgradeAddresses {
214
231
  rollupAddress: string;
215
232
  verifierAddress: string;
216
- slashFactoryAddress: string;
217
233
  inboxAddress: string;
218
234
  outboxAddress: string;
219
235
  feeJuicePortalAddress: string;
@@ -226,7 +242,6 @@ export interface RollupUpgradeAddresses {
226
242
  export interface ForgeRollupUpgradeResult {
227
243
  rollupAddress: Hex;
228
244
  verifierAddress: Hex;
229
- slashFactoryAddress: Hex;
230
245
  inboxAddress: Hex;
231
246
  outboxAddress: Hex;
232
247
  feeJuicePortalAddress: Hex;
@@ -267,6 +282,7 @@ export async function deployAztecL1Contracts(
267
282
  args: DeployAztecL1ContractsArgs,
268
283
  ): Promise<DeployAztecL1ContractsReturnType> {
269
284
  logger.info(`Deploying L1 contracts with config: ${jsonStringify(args)}`);
285
+ assertValidSlotDurations(args);
270
286
  if (args.initialValidators && args.initialValidators.length > 0 && args.existingTokenAddress) {
271
287
  throw new Error(
272
288
  'Cannot deploy with both initialValidators and existingTokenAddress. ' +
@@ -318,11 +334,8 @@ export async function deployAztecL1Contracts(
318
334
  );
319
335
  }
320
336
 
321
- // From heuristic testing. More caused issues with anvil.
322
- const MAGIC_ANVIL_BATCH_SIZE = 8;
323
- // Anvil seems to stall with unbounded batch size. Otherwise no max batch size is desirable.
337
+ const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
324
338
  const forgeArgs = [
325
- 'script',
326
339
  FORGE_SCRIPT,
327
340
  '--sig',
328
341
  'run()',
@@ -330,8 +343,6 @@ export async function deployAztecL1Contracts(
330
343
  privateKey,
331
344
  '--rpc-url',
332
345
  rpcUrl,
333
- '--broadcast',
334
- ...(chainId === foundry.id ? ['--batch-size', MAGIC_ANVIL_BATCH_SIZE.toString()] : []),
335
346
  ...(shouldVerify ? ['--verify'] : []),
336
347
  ];
337
348
  const forgeEnv = {
@@ -340,7 +351,12 @@ export async function deployAztecL1Contracts(
340
351
  FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
341
352
  ...getDeployAztecL1ContractsEnvVars(args),
342
353
  };
343
- const result = await runProcess<ForgeL1ContractsDeployResult>('forge', forgeArgs, forgeEnv, l1ContractsPath);
354
+ const result = await runProcess<ForgeL1ContractsDeployResult>(
355
+ process.execPath,
356
+ [scriptPath, ...forgeArgs],
357
+ forgeEnv,
358
+ l1ContractsPath,
359
+ );
344
360
  if (!result) {
345
361
  throw new Error('Forge script did not output deployment result');
346
362
  }
@@ -386,7 +402,6 @@ export async function deployAztecL1Contracts(
386
402
  governanceProposerAddress: EthAddress.fromString(result.governanceProposerAddress),
387
403
  governanceAddress: EthAddress.fromString(result.governanceAddress),
388
404
  stakingAssetAddress: EthAddress.fromString(result.stakingAssetAddress),
389
- slashFactoryAddress: result.slashFactoryAddress ? EthAddress.fromString(result.slashFactoryAddress) : undefined,
390
405
  feeAssetHandlerAddress: result.feeAssetHandlerAddress
391
406
  ? EthAddress.fromString(result.feeAssetHandlerAddress)
392
407
  : undefined,
@@ -473,7 +488,25 @@ export type VerificationRecord = {
473
488
  libraries: VerificationLibraryEntry[];
474
489
  };
475
490
 
476
- export interface DeployAztecL1ContractsArgs extends Omit<L1ContractsConfig, keyof L1TxUtilsConfig> {
491
+ export interface DeployAztecL1ContractsArgs
492
+ extends Omit<
493
+ L1ContractsConfig,
494
+ | 'gasLimitBufferPercentage'
495
+ | 'maxGwei'
496
+ | 'maxBlobGwei'
497
+ | 'priorityFeeBumpPercentage'
498
+ | 'priorityFeeRetryBumpPercentage'
499
+ | 'minimumPriorityFeePerGas'
500
+ | 'maxSpeedUpAttempts'
501
+ | 'checkIntervalMs'
502
+ | 'stallTimeMs'
503
+ | 'txTimeoutMs'
504
+ | 'cancelTxOnTimeout'
505
+ | 'txCancellationFinalTimeoutMs'
506
+ | 'txUnseenConsideredDroppedMs'
507
+ | 'enableDelayer'
508
+ | 'txDelayerMaxInclusionTimeIntoSlot'
509
+ > {
477
510
  /** The vk tree root. */
478
511
  vkTreeRoot: Fr;
479
512
  /** The hash of the protocol contracts. */
@@ -550,7 +583,7 @@ export function getDeployRollupForUpgradeEnvVars(
550
583
  AZTEC_EXIT_DELAY_SECONDS: args.exitDelaySeconds.toString(),
551
584
  AZTEC_PROVING_COST_PER_MANA: args.provingCostPerMana.toString(),
552
585
  AZTEC_INITIAL_ETH_PER_FEE_ASSET: args.initialEthPerFeeAsset.toString(),
553
- AZTEC_SLASHER_FLAVOR: args.slasherFlavor,
586
+ AZTEC_SLASHER_ENABLED: args.slasherEnabled ? 'true' : 'false',
554
587
  AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: args.slashingRoundSizeInEpochs.toString(),
555
588
  AZTEC_SLASHING_QUORUM: args.slashingQuorum?.toString(),
556
589
  AZTEC_SLASHING_OFFSET_IN_ROUNDS: args.slashingOffsetInRounds.toString(),
@@ -583,17 +616,8 @@ export const deployRollupForUpgrade = async (
583
616
  const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol';
584
617
  await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
585
618
 
586
- const forgeArgs = [
587
- 'script',
588
- FORGE_SCRIPT,
589
- '--sig',
590
- 'run()',
591
- '--private-key',
592
- privateKey,
593
- '--rpc-url',
594
- rpcUrl,
595
- '--broadcast',
596
- ];
619
+ const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
620
+ const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl];
597
621
  const forgeEnv = {
598
622
  FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
599
623
  // Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol.
@@ -602,7 +626,12 @@ export const deployRollupForUpgrade = async (
602
626
  ...getDeployRollupForUpgradeEnvVars(args),
603
627
  };
604
628
 
605
- const result = await runProcess<ForgeRollupUpgradeResult>('forge', forgeArgs, forgeEnv, l1ContractsPath);
629
+ const result = await runProcess<ForgeRollupUpgradeResult>(
630
+ process.execPath,
631
+ [scriptPath, ...forgeArgs],
632
+ forgeEnv,
633
+ l1ContractsPath,
634
+ );
606
635
  if (!result) {
607
636
  throw new Error('Forge script did not output deployment result');
608
637
  }
@@ -614,6 +643,5 @@ export const deployRollupForUpgrade = async (
614
643
 
615
644
  return {
616
645
  rollup,
617
- slashFactoryAddress: result.slashFactoryAddress,
618
646
  };
619
647
  };
@@ -24,7 +24,7 @@ import {
24
24
  } from './deploy_aztec_l1_contracts.js';
25
25
  import { RegisterNewRollupVersionPayloadArtifact } from './l1_artifacts.js';
26
26
  import { type L1TxUtilsConfig, getL1TxUtilsConfigEnvVars } from './l1_tx_utils/config.js';
27
- import { createL1TxUtilsFromViemWallet } from './l1_tx_utils/factory.js';
27
+ import { createL1TxUtils } from './l1_tx_utils/factory.js';
28
28
  import type { L1TxUtils } from './l1_tx_utils/l1_tx_utils.js';
29
29
  import type { GasPrice, L1TxConfig, L1TxRequest } from './l1_tx_utils/types.js';
30
30
  import type { ExtendedViemWalletClient } from './types.js';
@@ -46,7 +46,7 @@ export class L1Deployer {
46
46
  private createVerificationJson: boolean = false,
47
47
  ) {
48
48
  this.salt = maybeSalt ? padHex(numberToHex(maybeSalt), { size: 32 }) : undefined;
49
- this.l1TxUtils = createL1TxUtilsFromViemWallet(
49
+ this.l1TxUtils = createL1TxUtils(
50
50
  this.client,
51
51
  { logger: this.logger, dateProvider },
52
52
  { ...this.txUtilsConfig, debugMaxGasLimit: acceleratedTestDeployments },
@@ -179,7 +179,7 @@ export async function deployL1Contract(
179
179
 
180
180
  if (!l1TxUtils) {
181
181
  const config = getL1TxUtilsConfigEnvVars();
182
- l1TxUtils = createL1TxUtilsFromViemWallet(
182
+ l1TxUtils = createL1TxUtils(
183
183
  extendedClient,
184
184
  { logger },
185
185
  { ...config, debugMaxGasLimit: acceleratedTestDeployments },
@@ -4,7 +4,7 @@
4
4
  /** Default L1 contracts configuration values from network-defaults.yml */
5
5
  export const l1ContractsDefaultEnv = {
6
6
  ETHEREUM_SLOT_DURATION: 12,
7
- AZTEC_SLOT_DURATION: 36,
7
+ AZTEC_SLOT_DURATION: 72,
8
8
  AZTEC_EPOCH_DURATION: 32,
9
9
  AZTEC_TARGET_COMMITTEE_SIZE: 48,
10
10
  AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 2,
@@ -13,12 +13,12 @@ export const l1ContractsDefaultEnv = {
13
13
  AZTEC_EJECTION_THRESHOLD: 50000000000000000000,
14
14
  AZTEC_LOCAL_EJECTION_THRESHOLD: 98000000000000000000,
15
15
  AZTEC_EXIT_DELAY_SECONDS: 172800,
16
- AZTEC_INBOX_LAG: 1,
16
+ AZTEC_INBOX_LAG: 2,
17
17
  AZTEC_PROOF_SUBMISSION_EPOCHS: 1,
18
18
  AZTEC_MANA_TARGET: 100000000,
19
19
  AZTEC_PROVING_COST_PER_MANA: 100,
20
20
  AZTEC_INITIAL_ETH_PER_FEE_ASSET: 10000000,
21
- AZTEC_SLASHER_FLAVOR: 'tally',
21
+ AZTEC_SLASHER_ENABLED: true,
22
22
  AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: 4,
23
23
  AZTEC_SLASHING_LIFETIME_IN_ROUNDS: 5,
24
24
  AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS: 0,
@@ -3,10 +3,6 @@ import {
3
3
  CoinIssuerBytecode,
4
4
  DateGatedRelayerAbi,
5
5
  DateGatedRelayerBytecode,
6
- EmpireSlasherDeploymentExtLibAbi,
7
- EmpireSlasherDeploymentExtLibBytecode,
8
- EmpireSlashingProposerAbi,
9
- EmpireSlashingProposerBytecode,
10
6
  FeeAssetHandlerAbi,
11
7
  FeeAssetHandlerBytecode,
12
8
  FeeJuicePortalAbi,
@@ -42,16 +38,14 @@ import {
42
38
  RollupLinkReferences,
43
39
  RollupOperationsExtLibAbi,
44
40
  RollupOperationsExtLibBytecode,
45
- SlashFactoryAbi,
46
- SlashFactoryBytecode,
47
41
  SlasherAbi,
48
42
  SlasherBytecode,
43
+ SlasherDeploymentExtLibAbi,
44
+ SlasherDeploymentExtLibBytecode,
45
+ SlashingProposerAbi,
46
+ SlashingProposerBytecode,
49
47
  StakingAssetHandlerAbi,
50
48
  StakingAssetHandlerBytecode,
51
- TallySlasherDeploymentExtLibAbi,
52
- TallySlasherDeploymentExtLibBytecode,
53
- TallySlashingProposerAbi,
54
- TallySlashingProposerBytecode,
55
49
  TestERC20Abi,
56
50
  TestERC20Bytecode,
57
51
  ValidatorOperationsExtLibAbi,
@@ -107,15 +101,10 @@ export const RollupArtifact = {
107
101
  contractAbi: RewardExtLibAbi,
108
102
  contractBytecode: RewardExtLibBytecode as Hex,
109
103
  },
110
- TallySlasherDeploymentExtLib: {
111
- name: 'TallySlasherDeploymentExtLib',
112
- contractAbi: TallySlasherDeploymentExtLibAbi,
113
- contractBytecode: TallySlasherDeploymentExtLibBytecode as Hex,
114
- },
115
- EmpireSlasherDeploymentExtLib: {
116
- name: 'EmpireSlasherDeploymentExtLib',
117
- contractAbi: EmpireSlasherDeploymentExtLibAbi,
118
- contractBytecode: EmpireSlasherDeploymentExtLibBytecode as Hex,
104
+ SlasherDeploymentExtLib: {
105
+ name: 'SlasherDeploymentExtLib',
106
+ contractAbi: SlasherDeploymentExtLibAbi,
107
+ contractBytecode: SlasherDeploymentExtLibBytecode as Hex,
119
108
  },
120
109
  },
121
110
  },
@@ -175,22 +164,10 @@ export const SlasherArtifact = {
175
164
  contractBytecode: SlasherBytecode as Hex,
176
165
  };
177
166
 
178
- export const EmpireSlashingProposerArtifact = {
179
- name: 'EmpireSlashingProposer',
180
- contractAbi: EmpireSlashingProposerAbi,
181
- contractBytecode: EmpireSlashingProposerBytecode as Hex,
182
- };
183
-
184
- export const TallySlashingProposerArtifact = {
185
- name: 'TallySlashingProposer',
186
- contractAbi: TallySlashingProposerAbi,
187
- contractBytecode: TallySlashingProposerBytecode as Hex,
188
- };
189
-
190
- export const SlashFactoryArtifact = {
191
- name: 'SlashFactory',
192
- contractAbi: SlashFactoryAbi,
193
- contractBytecode: SlashFactoryBytecode as Hex,
167
+ export const SlashingProposerArtifact = {
168
+ name: 'SlashingProposer',
169
+ contractAbi: SlashingProposerAbi,
170
+ contractBytecode: SlashingProposerBytecode as Hex,
194
171
  };
195
172
 
196
173
  export const RegisterNewRollupVersionPayloadArtifact = {