@aztec/ethereum 0.0.1-commit.ee80a48 → 0.0.1-commit.f103f88

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 (154) hide show
  1. package/dest/client.d.ts +10 -2
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +13 -7
  4. package/dest/config.d.ts +8 -6
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +15 -11
  7. package/dest/contracts/chain_state_override.d.ts +38 -0
  8. package/dest/contracts/chain_state_override.d.ts.map +1 -0
  9. package/dest/contracts/chain_state_override.js +100 -0
  10. package/dest/contracts/empire_base.d.ts +3 -1
  11. package/dest/contracts/empire_base.d.ts.map +1 -1
  12. package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
  13. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  14. package/dest/contracts/fee_asset_price_oracle.js +651 -0
  15. package/dest/contracts/governance.js +3 -3
  16. package/dest/contracts/governance_proposer.d.ts +3 -1
  17. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  18. package/dest/contracts/governance_proposer.js +9 -0
  19. package/dest/contracts/inbox.d.ts +3 -3
  20. package/dest/contracts/inbox.d.ts.map +1 -1
  21. package/dest/contracts/inbox.js +5 -6
  22. package/dest/contracts/index.d.ts +4 -3
  23. package/dest/contracts/index.d.ts.map +1 -1
  24. package/dest/contracts/index.js +3 -2
  25. package/dest/contracts/multicall.d.ts +51 -2
  26. package/dest/contracts/multicall.d.ts.map +1 -1
  27. package/dest/contracts/multicall.js +85 -0
  28. package/dest/contracts/registry.d.ts +3 -1
  29. package/dest/contracts/registry.d.ts.map +1 -1
  30. package/dest/contracts/registry.js +30 -1
  31. package/dest/contracts/rollup.d.ts +88 -24
  32. package/dest/contracts/rollup.d.ts.map +1 -1
  33. package/dest/contracts/rollup.js +302 -60
  34. package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
  35. package/dest/contracts/slashing_proposer.d.ts.map +1 -0
  36. package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +13 -15
  37. package/dest/deploy_aztec_l1_contracts.d.ts +4 -8
  38. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  39. package/dest/deploy_aztec_l1_contracts.js +38 -23
  40. package/dest/deploy_l1_contract.js +3 -3
  41. package/dest/generated/l1-contracts-defaults.d.ts +2 -2
  42. package/dest/generated/l1-contracts-defaults.js +2 -2
  43. package/dest/l1_artifacts.d.ts +9402 -15732
  44. package/dest/l1_artifacts.d.ts.map +1 -1
  45. package/dest/l1_artifacts.js +9 -24
  46. package/dest/l1_contract_addresses.d.ts +1 -5
  47. package/dest/l1_contract_addresses.d.ts.map +1 -1
  48. package/dest/l1_contract_addresses.js +0 -6
  49. package/dest/l1_reader.d.ts +3 -1
  50. package/dest/l1_reader.d.ts.map +1 -1
  51. package/dest/l1_reader.js +6 -1
  52. package/dest/l1_tx_utils/config.d.ts +7 -1
  53. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  54. package/dest/l1_tx_utils/config.js +14 -1
  55. package/dest/l1_tx_utils/factory.d.ts +18 -10
  56. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  57. package/dest/l1_tx_utils/factory.js +17 -7
  58. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +1 -1
  59. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +1 -1
  60. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
  61. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
  62. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
  63. package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
  64. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
  65. package/dest/l1_tx_utils/index-blobs.js +2 -2
  66. package/dest/l1_tx_utils/index.d.ts +2 -1
  67. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  68. package/dest/l1_tx_utils/index.js +1 -0
  69. package/dest/l1_tx_utils/l1_tx_utils.d.ts +20 -7
  70. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  71. package/dest/l1_tx_utils/l1_tx_utils.js +75 -51
  72. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -1
  73. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  74. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +8 -4
  75. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  76. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  77. package/dest/{test → l1_tx_utils}/tx_delayer.js +62 -34
  78. package/dest/publisher_manager.d.ts +21 -7
  79. package/dest/publisher_manager.d.ts.map +1 -1
  80. package/dest/publisher_manager.js +81 -7
  81. package/dest/queries.js +3 -3
  82. package/dest/test/chain_monitor.d.ts +22 -3
  83. package/dest/test/chain_monitor.d.ts.map +1 -1
  84. package/dest/test/chain_monitor.js +33 -2
  85. package/dest/test/eth_cheat_codes.d.ts +6 -4
  86. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  87. package/dest/test/eth_cheat_codes.js +6 -4
  88. package/dest/test/index.d.ts +1 -3
  89. package/dest/test/index.d.ts.map +1 -1
  90. package/dest/test/index.js +0 -2
  91. package/dest/test/rollup_cheat_codes.d.ts +5 -1
  92. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  93. package/dest/test/rollup_cheat_codes.js +9 -1
  94. package/dest/test/start_anvil.d.ts +23 -3
  95. package/dest/test/start_anvil.d.ts.map +1 -1
  96. package/dest/test/start_anvil.js +143 -29
  97. package/dest/test/upgrade_utils.js +2 -2
  98. package/dest/utils.d.ts +1 -1
  99. package/dest/utils.d.ts.map +1 -1
  100. package/dest/utils.js +16 -12
  101. package/package.json +5 -7
  102. package/src/client.ts +10 -2
  103. package/src/config.ts +24 -15
  104. package/src/contracts/chain_state_override.ts +147 -0
  105. package/src/contracts/empire_base.ts +2 -0
  106. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  107. package/src/contracts/governance.ts +3 -3
  108. package/src/contracts/governance_proposer.ts +6 -0
  109. package/src/contracts/inbox.ts +4 -4
  110. package/src/contracts/index.ts +3 -2
  111. package/src/contracts/multicall.ts +65 -1
  112. package/src/contracts/registry.ts +31 -1
  113. package/src/contracts/rollup.ts +331 -59
  114. package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +14 -16
  115. package/src/deploy_aztec_l1_contracts.ts +60 -34
  116. package/src/deploy_l1_contract.ts +3 -3
  117. package/src/generated/l1-contracts-defaults.ts +2 -2
  118. package/src/l1_artifacts.ts +12 -35
  119. package/src/l1_contract_addresses.ts +0 -7
  120. package/src/l1_reader.ts +13 -1
  121. package/src/l1_tx_utils/config.ts +20 -0
  122. package/src/l1_tx_utils/factory.ts +31 -31
  123. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +1 -1
  124. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +1 -1
  125. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
  126. package/src/l1_tx_utils/index-blobs.ts +2 -2
  127. package/src/l1_tx_utils/index.ts +1 -0
  128. package/src/l1_tx_utils/l1_tx_utils.ts +68 -30
  129. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +8 -4
  130. package/src/{test → l1_tx_utils}/tx_delayer.ts +78 -50
  131. package/src/publisher_manager.ts +105 -10
  132. package/src/queries.ts +3 -3
  133. package/src/test/chain_monitor.ts +60 -3
  134. package/src/test/eth_cheat_codes.ts +6 -4
  135. package/src/test/index.ts +0 -2
  136. package/src/test/rollup_cheat_codes.ts +11 -1
  137. package/src/test/start_anvil.ts +177 -29
  138. package/src/test/upgrade_utils.ts +2 -2
  139. package/src/utils.ts +17 -14
  140. package/dest/contracts/empire_slashing_proposer.d.ts +0 -67
  141. package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
  142. package/dest/contracts/empire_slashing_proposer.js +0 -207
  143. package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
  144. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  145. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  146. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  147. package/dest/test/delayed_tx_utils.d.ts +0 -13
  148. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  149. package/dest/test/delayed_tx_utils.js +0 -28
  150. package/dest/test/tx_delayer.d.ts +0 -36
  151. package/dest/test/tx_delayer.d.ts.map +0 -1
  152. package/src/contracts/empire_slashing_proposer.ts +0 -259
  153. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  154. package/src/test/delayed_tx_utils.ts +0 -52
@@ -7,7 +7,7 @@ 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
9
  import { SlasherAbi } from '@aztec/l1-artifacts/SlasherAbi';
10
- import { TallySlashingProposerAbi } from '@aztec/l1-artifacts/TallySlashingProposerAbi';
10
+ import { SlashingProposerAbi } from '@aztec/l1-artifacts/SlashingProposerAbi';
11
11
 
12
12
  import {
13
13
  type GetContractReturnType,
@@ -19,13 +19,11 @@ import {
19
19
  } from 'viem';
20
20
 
21
21
  /**
22
- * Wrapper around the TallySlashingProposer contract that provides
22
+ * Wrapper around the SlashingProposer contract that provides
23
23
  * a TypeScript interface for interacting with the consensus-based slashing system.
24
24
  */
25
- export class TallySlashingProposerContract {
26
- private readonly contract: GetContractReturnType<typeof TallySlashingProposerAbi, ViemClient>;
27
-
28
- public readonly type = 'tally' as const;
25
+ export class SlashingProposerContract {
26
+ private readonly contract: GetContractReturnType<typeof SlashingProposerAbi, ViemClient>;
29
27
 
30
28
  constructor(
31
29
  public readonly client: ViemClient,
@@ -33,7 +31,7 @@ export class TallySlashingProposerContract {
33
31
  ) {
34
32
  this.contract = getContract({
35
33
  address: typeof address === 'string' ? address : address.toString(),
36
- abi: TallySlashingProposerAbi,
34
+ abi: SlashingProposerAbi,
37
35
  client,
38
36
  });
39
37
  }
@@ -136,12 +134,12 @@ export class TallySlashingProposerContract {
136
134
 
137
135
  /** Tries to extract a VoteCast event from the given logs. */
138
136
  public tryExtractVoteCastEvent(logs: Log[]) {
139
- return tryExtractEvent(logs, this.address.toString(), TallySlashingProposerAbi, 'VoteCast');
137
+ return tryExtractEvent(logs, this.address.toString(), SlashingProposerAbi, 'VoteCast');
140
138
  }
141
139
 
142
140
  /** Tries to extract a RoundExecuted event from the given logs. */
143
141
  public tryExtractRoundExecutedEvent(logs: Log[]) {
144
- return tryExtractEvent(logs, this.address.toString(), TallySlashingProposerAbi, 'RoundExecuted');
142
+ return tryExtractEvent(logs, this.address.toString(), SlashingProposerAbi, 'RoundExecuted');
145
143
  }
146
144
 
147
145
  /**
@@ -161,9 +159,9 @@ export class TallySlashingProposerContract {
161
159
 
162
160
  return {
163
161
  to: this.contract.address,
164
- abi: TallySlashingProposerAbi,
162
+ abi: SlashingProposerAbi,
165
163
  data: encodeFunctionData({
166
- abi: TallySlashingProposerAbi,
164
+ abi: SlashingProposerAbi,
167
165
  functionName: 'vote',
168
166
  args: [votes, signature.toViemSignature()],
169
167
  }),
@@ -173,7 +171,7 @@ export class TallySlashingProposerContract {
173
171
  /** Returns the typed data definition to EIP712-sign for voting */
174
172
  public buildVoteTypedData(votes: Hex, slot: SlotNumber): TypedDataDefinition {
175
173
  const domain = {
176
- name: 'TallySlashingProposer',
174
+ name: 'SlashingProposer',
177
175
  version: '1',
178
176
  chainId: this.client.chain.id,
179
177
  verifyingContract: this.contract.address,
@@ -209,9 +207,9 @@ export class TallySlashingProposerContract {
209
207
  public buildVoteRequestWithSignature(votes: Hex, signature: { v: number; r: Hex; s: Hex }): L1TxRequest {
210
208
  return {
211
209
  to: this.contract.address,
212
- abi: TallySlashingProposerAbi,
210
+ abi: SlashingProposerAbi,
213
211
  data: encodeFunctionData({
214
- abi: TallySlashingProposerAbi,
212
+ abi: SlashingProposerAbi,
215
213
  functionName: 'vote',
216
214
  args: [votes, signature],
217
215
  }),
@@ -227,9 +225,9 @@ export class TallySlashingProposerContract {
227
225
  public buildExecuteRoundRequest(round: bigint, committees: EthAddress[][]): L1TxRequest {
228
226
  return {
229
227
  to: this.contract.address,
230
- abi: mergeAbis([TallySlashingProposerAbi, SlasherAbi]),
228
+ abi: mergeAbis([SlashingProposerAbi, SlasherAbi]),
231
229
  data: encodeFunctionData({
232
- abi: TallySlashingProposerAbi,
230
+ abi: SlashingProposerAbi,
233
231
  functionName: 'executeRound',
234
232
  args: [round, committees.map(c => c.map(addr => addr.toString()))],
235
233
  }),
@@ -23,7 +23,6 @@ import type { L1ContractsConfig } 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;
@@ -318,11 +333,8 @@ export async function deployAztecL1Contracts(
318
333
  );
319
334
  }
320
335
 
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.
336
+ const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
324
337
  const forgeArgs = [
325
- 'script',
326
338
  FORGE_SCRIPT,
327
339
  '--sig',
328
340
  'run()',
@@ -330,9 +342,6 @@ export async function deployAztecL1Contracts(
330
342
  privateKey,
331
343
  '--rpc-url',
332
344
  rpcUrl,
333
- '--broadcast',
334
- '--batch-size',
335
- MAGIC_ANVIL_BATCH_SIZE.toString(),
336
345
  ...(shouldVerify ? ['--verify'] : []),
337
346
  ];
338
347
  const forgeEnv = {
@@ -341,7 +350,12 @@ export async function deployAztecL1Contracts(
341
350
  FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
342
351
  ...getDeployAztecL1ContractsEnvVars(args),
343
352
  };
344
- const result = await runProcess<ForgeL1ContractsDeployResult>('forge', forgeArgs, forgeEnv, l1ContractsPath);
353
+ const result = await runProcess<ForgeL1ContractsDeployResult>(
354
+ process.execPath,
355
+ [scriptPath, ...forgeArgs],
356
+ forgeEnv,
357
+ l1ContractsPath,
358
+ );
345
359
  if (!result) {
346
360
  throw new Error('Forge script did not output deployment result');
347
361
  }
@@ -387,7 +401,6 @@ export async function deployAztecL1Contracts(
387
401
  governanceProposerAddress: EthAddress.fromString(result.governanceProposerAddress),
388
402
  governanceAddress: EthAddress.fromString(result.governanceAddress),
389
403
  stakingAssetAddress: EthAddress.fromString(result.stakingAssetAddress),
390
- slashFactoryAddress: result.slashFactoryAddress ? EthAddress.fromString(result.slashFactoryAddress) : undefined,
391
404
  feeAssetHandlerAddress: result.feeAssetHandlerAddress
392
405
  ? EthAddress.fromString(result.feeAssetHandlerAddress)
393
406
  : undefined,
@@ -474,7 +487,25 @@ export type VerificationRecord = {
474
487
  libraries: VerificationLibraryEntry[];
475
488
  };
476
489
 
477
- export interface DeployAztecL1ContractsArgs extends Omit<L1ContractsConfig, keyof L1TxUtilsConfig> {
490
+ export interface DeployAztecL1ContractsArgs
491
+ extends Omit<
492
+ L1ContractsConfig,
493
+ | 'gasLimitBufferPercentage'
494
+ | 'maxGwei'
495
+ | 'maxBlobGwei'
496
+ | 'priorityFeeBumpPercentage'
497
+ | 'priorityFeeRetryBumpPercentage'
498
+ | 'minimumPriorityFeePerGas'
499
+ | 'maxSpeedUpAttempts'
500
+ | 'checkIntervalMs'
501
+ | 'stallTimeMs'
502
+ | 'txTimeoutMs'
503
+ | 'cancelTxOnTimeout'
504
+ | 'txCancellationFinalTimeoutMs'
505
+ | 'txUnseenConsideredDroppedMs'
506
+ | 'enableDelayer'
507
+ | 'txDelayerMaxInclusionTimeIntoSlot'
508
+ > {
478
509
  /** The vk tree root. */
479
510
  vkTreeRoot: Fr;
480
511
  /** The hash of the protocol contracts. */
@@ -551,7 +582,7 @@ export function getDeployRollupForUpgradeEnvVars(
551
582
  AZTEC_EXIT_DELAY_SECONDS: args.exitDelaySeconds.toString(),
552
583
  AZTEC_PROVING_COST_PER_MANA: args.provingCostPerMana.toString(),
553
584
  AZTEC_INITIAL_ETH_PER_FEE_ASSET: args.initialEthPerFeeAsset.toString(),
554
- AZTEC_SLASHER_FLAVOR: args.slasherFlavor,
585
+ AZTEC_SLASHER_ENABLED: args.slasherEnabled ? 'true' : 'false',
555
586
  AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: args.slashingRoundSizeInEpochs.toString(),
556
587
  AZTEC_SLASHING_QUORUM: args.slashingQuorum?.toString(),
557
588
  AZTEC_SLASHING_OFFSET_IN_ROUNDS: args.slashingOffsetInRounds.toString(),
@@ -584,17 +615,8 @@ export const deployRollupForUpgrade = async (
584
615
  const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol';
585
616
  await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
586
617
 
587
- const forgeArgs = [
588
- 'script',
589
- FORGE_SCRIPT,
590
- '--sig',
591
- 'run()',
592
- '--private-key',
593
- privateKey,
594
- '--rpc-url',
595
- rpcUrl,
596
- '--broadcast',
597
- ];
618
+ const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
619
+ const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl];
598
620
  const forgeEnv = {
599
621
  FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
600
622
  // Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol.
@@ -603,7 +625,12 @@ export const deployRollupForUpgrade = async (
603
625
  ...getDeployRollupForUpgradeEnvVars(args),
604
626
  };
605
627
 
606
- const result = await runProcess<ForgeRollupUpgradeResult>('forge', forgeArgs, forgeEnv, l1ContractsPath);
628
+ const result = await runProcess<ForgeRollupUpgradeResult>(
629
+ process.execPath,
630
+ [scriptPath, ...forgeArgs],
631
+ forgeEnv,
632
+ l1ContractsPath,
633
+ );
607
634
  if (!result) {
608
635
  throw new Error('Forge script did not output deployment result');
609
636
  }
@@ -615,6 +642,5 @@ export const deployRollupForUpgrade = async (
615
642
 
616
643
  return {
617
644
  rollup,
618
- slashFactoryAddress: result.slashFactoryAddress,
619
645
  };
620
646
  };
@@ -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,
@@ -18,7 +18,7 @@ export const l1ContractsDefaultEnv = {
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 = {
@@ -27,7 +27,6 @@ export const L1ContractsNames = [
27
27
  export type L1ContractAddresses = {
28
28
  [K in (typeof L1ContractsNames)[number]]: EthAddress;
29
29
  } & {
30
- slashFactoryAddress?: EthAddress | undefined;
31
30
  feeAssetHandlerAddress?: EthAddress | undefined;
32
31
  stakingAssetHandlerAddress?: EthAddress | undefined;
33
32
  zkPassportVerifierAddress?: EthAddress | undefined;
@@ -48,7 +47,6 @@ export const L1ContractAddressesSchema = zodFor<L1ContractAddresses>()(
48
47
  rewardDistributorAddress: schemas.EthAddress,
49
48
  governanceProposerAddress: schemas.EthAddress,
50
49
  governanceAddress: schemas.EthAddress,
51
- slashFactoryAddress: schemas.EthAddress.optional(),
52
50
  feeAssetHandlerAddress: schemas.EthAddress.optional(),
53
51
  stakingAssetHandlerAddress: schemas.EthAddress.optional(),
54
52
  zkPassportVerifierAddress: schemas.EthAddress.optional(),
@@ -67,11 +65,6 @@ export const l1ContractAddressesMapping: ConfigMappingsType<
67
65
  description: 'The deployed L1 registry contract address.',
68
66
  parseEnv,
69
67
  },
70
- slashFactoryAddress: {
71
- env: 'SLASH_FACTORY_CONTRACT_ADDRESS',
72
- description: 'The deployed L1 slashFactory contract address',
73
- parseEnv,
74
- },
75
68
  feeAssetHandlerAddress: {
76
69
  env: 'FEE_ASSET_HANDLER_CONTRACT_ADDRESS',
77
70
  description: 'The deployed L1 feeAssetHandler contract address',
package/src/l1_reader.ts CHANGED
@@ -1,4 +1,9 @@
1
- import { type ConfigMappingsType, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
1
+ import {
2
+ type ConfigMappingsType,
3
+ getConfigFromMappings,
4
+ numberConfigHelper,
5
+ optionalNumberConfigHelper,
6
+ } from '@aztec/foundation/config';
2
7
 
3
8
  import { type L1ContractAddresses, l1ContractAddressesMapping } from './l1_contract_addresses.js';
4
9
 
@@ -14,6 +19,8 @@ export interface L1ReaderConfig {
14
19
  l1Contracts: L1ContractAddresses;
15
20
  /** The polling interval viem uses in ms */
16
21
  viemPollingIntervalMS: number;
22
+ /** Timeout for HTTP requests to the L1 RPC node in ms. */
23
+ l1HttpTimeoutMS?: number;
17
24
  }
18
25
 
19
26
  export const l1ReaderConfigMappings: ConfigMappingsType<L1ReaderConfig> = {
@@ -43,6 +50,11 @@ export const l1ReaderConfigMappings: ConfigMappingsType<L1ReaderConfig> = {
43
50
  description: 'The polling interval viem uses in ms',
44
51
  ...numberConfigHelper(1_000),
45
52
  },
53
+ l1HttpTimeoutMS: {
54
+ env: 'ETHEREUM_HTTP_TIMEOUT_MS',
55
+ description: 'Timeout for HTTP requests to the L1 RPC node in ms.',
56
+ ...optionalNumberConfigHelper(),
57
+ },
46
58
  };
47
59
 
48
60
  export function getL1ReaderConfigFromEnv(): L1ReaderConfig {
@@ -5,6 +5,7 @@ import {
5
5
  getConfigFromMappings,
6
6
  getDefaultConfig,
7
7
  numberConfigHelper,
8
+ optionalNumberConfigHelper,
8
9
  } from '@aztec/foundation/config';
9
10
 
10
11
  export interface L1TxUtilsConfig {
@@ -60,6 +61,12 @@ export interface L1TxUtilsConfig {
60
61
  * How long a tx nonce can be unseen in the mempool before considering it dropped
61
62
  */
62
63
  txUnseenConsideredDroppedMs?: number;
64
+ /** Enable tx delayer. When true, wraps the viem client to intercept and delay txs. Test-only. */
65
+ enableDelayer?: boolean;
66
+ /** Max seconds into an L1 slot for tx inclusion. Txs sent later are deferred to next slot. Only used when enableDelayer is true. */
67
+ txDelayerMaxInclusionTimeIntoSlot?: number;
68
+ /** How many seconds an L1 slot lasts. */
69
+ ethereumSlotDuration?: number;
63
70
  }
64
71
 
65
72
  export const l1TxUtilsConfigMappings: ConfigMappingsType<L1TxUtilsConfig> = {
@@ -142,6 +149,19 @@ export const l1TxUtilsConfigMappings: ConfigMappingsType<L1TxUtilsConfig> = {
142
149
  env: 'L1_TX_MONITOR_TX_UNSEEN_CONSIDERED_DROPPED_MS',
143
150
  ...numberConfigHelper(6 * 12 * 1000), // 6 L1 blocks
144
151
  },
152
+ enableDelayer: {
153
+ description: 'Enable tx delayer for testing.',
154
+ ...booleanConfigHelper(false),
155
+ },
156
+ txDelayerMaxInclusionTimeIntoSlot: {
157
+ description: 'Max seconds into L1 slot for tx inclusion when delayer is enabled.',
158
+ ...optionalNumberConfigHelper(),
159
+ },
160
+ ethereumSlotDuration: {
161
+ env: 'ETHEREUM_SLOT_DURATION',
162
+ description: 'How many seconds an L1 slot lasts.',
163
+ ...numberConfigHelper(12),
164
+ },
145
165
  };
146
166
 
147
167
  // We abuse the fact that all mappings above have a non null default value and force-type this to Required
@@ -1,64 +1,64 @@
1
+ import type { BlobKzgInstance } from '@aztec/blob-lib/types';
1
2
  import { EthAddress } from '@aztec/foundation/eth-address';
2
3
  import type { Logger } from '@aztec/foundation/log';
3
4
  import { DateProvider } from '@aztec/foundation/timer';
4
5
 
5
- import type { TransactionSerializable } from 'viem';
6
-
7
6
  import type { EthSigner } from '../eth-signer/eth-signer.js';
8
7
  import type { ExtendedViemWalletClient, ViemClient } from '../types.js';
9
8
  import type { L1TxUtilsConfig } from './config.js';
10
9
  import type { IL1TxMetrics, IL1TxStore } from './interfaces.js';
11
10
  import { L1TxUtils } from './l1_tx_utils.js';
12
11
  import { createViemSigner } from './signer.js';
12
+ import { Delayer } from './tx_delayer.js';
13
13
  import type { SigningCallback } from './types.js';
14
14
 
15
- export function createL1TxUtilsFromViemWallet(
16
- client: ExtendedViemWalletClient,
17
- deps?: {
18
- logger?: Logger;
19
- dateProvider?: DateProvider;
20
- store?: IL1TxStore;
21
- metrics?: IL1TxMetrics;
22
- },
23
- config?: Partial<L1TxUtilsConfig> & { debugMaxGasLimit?: boolean },
24
- ): L1TxUtils {
25
- return new L1TxUtils(
15
+ /** Source of signing capability: either a wallet client or a separate client + signer. */
16
+ export type L1SignerSource = ExtendedViemWalletClient | { client: ViemClient; signer: EthSigner };
17
+
18
+ export function resolveSignerSource(source: L1SignerSource): {
19
+ client: ViemClient;
20
+ address: EthAddress;
21
+ signingCallback: SigningCallback;
22
+ } {
23
+ if ('account' in source && source.account) {
24
+ return {
25
+ client: source as ExtendedViemWalletClient,
26
+ address: EthAddress.fromString((source as ExtendedViemWalletClient).account.address),
27
+ signingCallback: createViemSigner(source as ExtendedViemWalletClient),
28
+ };
29
+ }
30
+ const { client, signer } = source as { client: ViemClient; signer: EthSigner };
31
+ return {
26
32
  client,
27
- EthAddress.fromString(client.account.address),
28
- createViemSigner(client),
29
- deps?.logger,
30
- deps?.dateProvider,
31
- config,
32
- config?.debugMaxGasLimit ?? false,
33
- deps?.store,
34
- deps?.metrics,
35
- );
33
+ address: signer.address,
34
+ signingCallback: async (tx, _addr) => (await signer.signTransaction(tx)).toViemTransactionSignature(),
35
+ };
36
36
  }
37
37
 
38
- export function createL1TxUtilsFromEthSigner(
39
- client: ViemClient,
40
- signer: EthSigner,
38
+ export function createL1TxUtils(
39
+ source: L1SignerSource,
41
40
  deps?: {
42
41
  logger?: Logger;
43
42
  dateProvider?: DateProvider;
44
43
  store?: IL1TxStore;
45
44
  metrics?: IL1TxMetrics;
45
+ kzg?: BlobKzgInstance;
46
+ delayer?: Delayer;
46
47
  },
47
48
  config?: Partial<L1TxUtilsConfig> & { debugMaxGasLimit?: boolean },
48
49
  ): L1TxUtils {
49
- const callback: SigningCallback = async (transaction: TransactionSerializable, _signingAddress) => {
50
- return (await signer.signTransaction(transaction)).toViemTransactionSignature();
51
- };
52
-
50
+ const { client, address, signingCallback } = resolveSignerSource(source);
53
51
  return new L1TxUtils(
54
52
  client,
55
- signer.address,
56
- callback,
53
+ address,
54
+ signingCallback,
57
55
  deps?.logger,
58
56
  deps?.dateProvider,
59
57
  config,
60
58
  config?.debugMaxGasLimit ?? false,
61
59
  deps?.store,
62
60
  deps?.metrics,
61
+ deps?.kzg,
62
+ deps?.delayer,
63
63
  );
64
64
  }
@@ -134,7 +134,7 @@ export const P75AllTxsPriorityFeeStrategy: PriorityFeeStrategy = {
134
134
  // Sanity check: cap competitive fee at 100x network estimate to avoid using unrealistic fees
135
135
  const maxReasonableFee = networkEstimate * 100n;
136
136
  if (competitiveFee > maxReasonableFee && networkEstimate > 0n) {
137
- logger?.warn('Competitive fee exceeds sanity cap, using capped value', {
137
+ logger?.debug('Competitive fee exceeds sanity cap, using capped value', {
138
138
  competitiveFee: formatGwei(competitiveFee),
139
139
  networkEstimate: formatGwei(networkEstimate),
140
140
  cappedTo: formatGwei(maxReasonableFee),
@@ -207,7 +207,7 @@ export const P75BlobTxsOnlyPriorityFeeStrategy: PriorityFeeStrategy = {
207
207
 
208
208
  // Debug: Log suspicious fees from history
209
209
  if (medianHistoricalFee > 100n * WEI_CONST) {
210
- logger?.warn('Suspicious high fee in history', {
210
+ logger?.debug('Suspicious high fee in history', {
211
211
  historicalMedian: formatGwei(medianHistoricalFee),
212
212
  allP75Fees: percentile75Fees.map(f => formatGwei(f)),
213
213
  });