@aztec/ethereum 0.0.1-commit.e2b2873ed → 0.0.1-commit.e304674f1

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 (142) 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 +14 -10
  7. package/dest/contracts/empire_base.d.ts +3 -1
  8. package/dest/contracts/empire_base.d.ts.map +1 -1
  9. package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
  10. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  11. package/dest/contracts/fee_asset_price_oracle.js +651 -0
  12. package/dest/contracts/governance.js +3 -3
  13. package/dest/contracts/governance_proposer.d.ts +3 -1
  14. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  15. package/dest/contracts/governance_proposer.js +9 -0
  16. package/dest/contracts/inbox.d.ts +3 -3
  17. package/dest/contracts/inbox.d.ts.map +1 -1
  18. package/dest/contracts/inbox.js +5 -6
  19. package/dest/contracts/index.d.ts +3 -3
  20. package/dest/contracts/index.d.ts.map +1 -1
  21. package/dest/contracts/index.js +2 -2
  22. package/dest/contracts/multicall.d.ts +51 -2
  23. package/dest/contracts/multicall.d.ts.map +1 -1
  24. package/dest/contracts/multicall.js +85 -0
  25. package/dest/contracts/registry.d.ts +3 -1
  26. package/dest/contracts/registry.d.ts.map +1 -1
  27. package/dest/contracts/registry.js +30 -1
  28. package/dest/contracts/rollup.d.ts +48 -18
  29. package/dest/contracts/rollup.d.ts.map +1 -1
  30. package/dest/contracts/rollup.js +213 -52
  31. package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
  32. package/dest/contracts/slashing_proposer.d.ts.map +1 -0
  33. package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +13 -15
  34. package/dest/deploy_aztec_l1_contracts.d.ts +4 -8
  35. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  36. package/dest/deploy_aztec_l1_contracts.js +35 -23
  37. package/dest/deploy_l1_contract.js +3 -3
  38. package/dest/generated/l1-contracts-defaults.d.ts +2 -2
  39. package/dest/generated/l1-contracts-defaults.js +2 -2
  40. package/dest/l1_artifacts.d.ts +9214 -15208
  41. package/dest/l1_artifacts.d.ts.map +1 -1
  42. package/dest/l1_artifacts.js +9 -24
  43. package/dest/l1_contract_addresses.d.ts +1 -5
  44. package/dest/l1_contract_addresses.d.ts.map +1 -1
  45. package/dest/l1_contract_addresses.js +0 -6
  46. package/dest/l1_reader.d.ts +3 -1
  47. package/dest/l1_reader.d.ts.map +1 -1
  48. package/dest/l1_reader.js +6 -1
  49. package/dest/l1_tx_utils/config.d.ts +7 -1
  50. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  51. package/dest/l1_tx_utils/config.js +14 -1
  52. package/dest/l1_tx_utils/factory.d.ts +18 -10
  53. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  54. package/dest/l1_tx_utils/factory.js +17 -7
  55. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
  56. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
  57. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
  58. package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
  59. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
  60. package/dest/l1_tx_utils/index-blobs.js +2 -2
  61. package/dest/l1_tx_utils/index.d.ts +2 -1
  62. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  63. package/dest/l1_tx_utils/index.js +1 -0
  64. package/dest/l1_tx_utils/l1_tx_utils.d.ts +20 -7
  65. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  66. package/dest/l1_tx_utils/l1_tx_utils.js +75 -51
  67. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -1
  68. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  69. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +8 -4
  70. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  71. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  72. package/dest/{test → l1_tx_utils}/tx_delayer.js +62 -34
  73. package/dest/publisher_manager.d.ts +21 -7
  74. package/dest/publisher_manager.d.ts.map +1 -1
  75. package/dest/publisher_manager.js +81 -7
  76. package/dest/queries.js +3 -3
  77. package/dest/test/chain_monitor.d.ts +22 -3
  78. package/dest/test/chain_monitor.d.ts.map +1 -1
  79. package/dest/test/chain_monitor.js +33 -2
  80. package/dest/test/eth_cheat_codes.d.ts +6 -4
  81. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  82. package/dest/test/eth_cheat_codes.js +6 -4
  83. package/dest/test/index.d.ts +1 -3
  84. package/dest/test/index.d.ts.map +1 -1
  85. package/dest/test/index.js +0 -2
  86. package/dest/test/start_anvil.d.ts +23 -3
  87. package/dest/test/start_anvil.d.ts.map +1 -1
  88. package/dest/test/start_anvil.js +143 -29
  89. package/dest/test/upgrade_utils.js +2 -2
  90. package/dest/utils.d.ts +1 -1
  91. package/dest/utils.d.ts.map +1 -1
  92. package/dest/utils.js +16 -12
  93. package/package.json +5 -7
  94. package/src/client.ts +10 -2
  95. package/src/config.ts +23 -14
  96. package/src/contracts/empire_base.ts +2 -0
  97. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  98. package/src/contracts/governance.ts +3 -3
  99. package/src/contracts/governance_proposer.ts +6 -0
  100. package/src/contracts/inbox.ts +4 -4
  101. package/src/contracts/index.ts +2 -2
  102. package/src/contracts/multicall.ts +65 -1
  103. package/src/contracts/registry.ts +31 -1
  104. package/src/contracts/rollup.ts +250 -59
  105. package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +14 -16
  106. package/src/deploy_aztec_l1_contracts.ts +57 -34
  107. package/src/deploy_l1_contract.ts +3 -3
  108. package/src/generated/l1-contracts-defaults.ts +2 -2
  109. package/src/l1_artifacts.ts +12 -35
  110. package/src/l1_contract_addresses.ts +0 -7
  111. package/src/l1_reader.ts +13 -1
  112. package/src/l1_tx_utils/config.ts +20 -0
  113. package/src/l1_tx_utils/factory.ts +31 -31
  114. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
  115. package/src/l1_tx_utils/index-blobs.ts +2 -2
  116. package/src/l1_tx_utils/index.ts +1 -0
  117. package/src/l1_tx_utils/l1_tx_utils.ts +68 -30
  118. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +8 -4
  119. package/src/{test → l1_tx_utils}/tx_delayer.ts +78 -50
  120. package/src/publisher_manager.ts +105 -10
  121. package/src/queries.ts +3 -3
  122. package/src/test/chain_monitor.ts +60 -3
  123. package/src/test/eth_cheat_codes.ts +6 -4
  124. package/src/test/index.ts +0 -2
  125. package/src/test/start_anvil.ts +177 -29
  126. package/src/test/upgrade_utils.ts +2 -2
  127. package/src/utils.ts +17 -14
  128. package/dest/contracts/empire_slashing_proposer.d.ts +0 -67
  129. package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
  130. package/dest/contracts/empire_slashing_proposer.js +0 -207
  131. package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
  132. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  133. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  134. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  135. package/dest/test/delayed_tx_utils.d.ts +0 -13
  136. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  137. package/dest/test/delayed_tx_utils.js +0 -28
  138. package/dest/test/tx_delayer.d.ts +0 -36
  139. package/dest/test/tx_delayer.d.ts.map +0 -1
  140. package/src/contracts/empire_slashing_proposer.ts +0 -259
  141. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  142. package/src/test/delayed_tx_utils.ts +0 -52
@@ -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
  }
@@ -216,7 +230,6 @@ export function computeValidatorData(operator: Operator): ValidatorJson {
216
230
  export interface RollupUpgradeAddresses {
217
231
  rollupAddress: string;
218
232
  verifierAddress: string;
219
- slashFactoryAddress: string;
220
233
  inboxAddress: string;
221
234
  outboxAddress: string;
222
235
  feeJuicePortalAddress: string;
@@ -229,7 +242,6 @@ export interface RollupUpgradeAddresses {
229
242
  export interface ForgeRollupUpgradeResult {
230
243
  rollupAddress: Hex;
231
244
  verifierAddress: Hex;
232
- slashFactoryAddress: Hex;
233
245
  inboxAddress: Hex;
234
246
  outboxAddress: Hex;
235
247
  feeJuicePortalAddress: Hex;
@@ -321,11 +333,8 @@ export async function deployAztecL1Contracts(
321
333
  );
322
334
  }
323
335
 
324
- // From heuristic testing. More caused issues with anvil.
325
- const MAGIC_ANVIL_BATCH_SIZE = 8;
326
- // Anvil seems to stall with unbounded batch size. Otherwise no max batch size is desirable.
336
+ const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
327
337
  const forgeArgs = [
328
- 'script',
329
338
  FORGE_SCRIPT,
330
339
  '--sig',
331
340
  'run()',
@@ -333,9 +342,6 @@ export async function deployAztecL1Contracts(
333
342
  privateKey,
334
343
  '--rpc-url',
335
344
  rpcUrl,
336
- '--broadcast',
337
- '--batch-size',
338
- MAGIC_ANVIL_BATCH_SIZE.toString(),
339
345
  ...(shouldVerify ? ['--verify'] : []),
340
346
  ];
341
347
  const forgeEnv = {
@@ -344,7 +350,12 @@ export async function deployAztecL1Contracts(
344
350
  FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
345
351
  ...getDeployAztecL1ContractsEnvVars(args),
346
352
  };
347
- 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
+ );
348
359
  if (!result) {
349
360
  throw new Error('Forge script did not output deployment result');
350
361
  }
@@ -390,7 +401,6 @@ export async function deployAztecL1Contracts(
390
401
  governanceProposerAddress: EthAddress.fromString(result.governanceProposerAddress),
391
402
  governanceAddress: EthAddress.fromString(result.governanceAddress),
392
403
  stakingAssetAddress: EthAddress.fromString(result.stakingAssetAddress),
393
- slashFactoryAddress: result.slashFactoryAddress ? EthAddress.fromString(result.slashFactoryAddress) : undefined,
394
404
  feeAssetHandlerAddress: result.feeAssetHandlerAddress
395
405
  ? EthAddress.fromString(result.feeAssetHandlerAddress)
396
406
  : undefined,
@@ -477,7 +487,25 @@ export type VerificationRecord = {
477
487
  libraries: VerificationLibraryEntry[];
478
488
  };
479
489
 
480
- 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
+ > {
481
509
  /** The vk tree root. */
482
510
  vkTreeRoot: Fr;
483
511
  /** The hash of the protocol contracts. */
@@ -554,7 +582,7 @@ export function getDeployRollupForUpgradeEnvVars(
554
582
  AZTEC_EXIT_DELAY_SECONDS: args.exitDelaySeconds.toString(),
555
583
  AZTEC_PROVING_COST_PER_MANA: args.provingCostPerMana.toString(),
556
584
  AZTEC_INITIAL_ETH_PER_FEE_ASSET: args.initialEthPerFeeAsset.toString(),
557
- AZTEC_SLASHER_FLAVOR: args.slasherFlavor,
585
+ AZTEC_SLASHER_ENABLED: args.slasherEnabled ? 'true' : 'false',
558
586
  AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: args.slashingRoundSizeInEpochs.toString(),
559
587
  AZTEC_SLASHING_QUORUM: args.slashingQuorum?.toString(),
560
588
  AZTEC_SLASHING_OFFSET_IN_ROUNDS: args.slashingOffsetInRounds.toString(),
@@ -587,17 +615,8 @@ export const deployRollupForUpgrade = async (
587
615
  const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol';
588
616
  await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
589
617
 
590
- const forgeArgs = [
591
- 'script',
592
- FORGE_SCRIPT,
593
- '--sig',
594
- 'run()',
595
- '--private-key',
596
- privateKey,
597
- '--rpc-url',
598
- rpcUrl,
599
- '--broadcast',
600
- ];
618
+ const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
619
+ const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl];
601
620
  const forgeEnv = {
602
621
  FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
603
622
  // Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol.
@@ -606,7 +625,12 @@ export const deployRollupForUpgrade = async (
606
625
  ...getDeployRollupForUpgradeEnvVars(args),
607
626
  };
608
627
 
609
- 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
+ );
610
634
  if (!result) {
611
635
  throw new Error('Forge script did not output deployment result');
612
636
  }
@@ -618,6 +642,5 @@ export const deployRollupForUpgrade = async (
618
642
 
619
643
  return {
620
644
  rollup,
621
- slashFactoryAddress: result.slashFactoryAddress,
622
645
  };
623
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
  }
@@ -1,25 +1,27 @@
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 type { DateProvider } from '@aztec/foundation/timer';
4
5
 
5
6
  import { type Hex, encodeFunctionData } from 'viem';
6
7
 
7
- import type { EthSigner } from '../eth-signer/eth-signer.js';
8
8
  import { FORWARDER_ABI } from '../forwarder_proxy.js';
9
- import type { ExtendedViemWalletClient, ViemClient } from '../types.js';
9
+ import type { ViemClient } from '../types.js';
10
10
  import type { L1TxUtilsConfig } from './config.js';
11
+ import type { L1SignerSource } from './factory.js';
12
+ import { resolveSignerSource } from './factory.js';
11
13
  import type { IL1TxMetrics, IL1TxStore } from './interfaces.js';
12
- import { L1TxUtilsWithBlobs } from './l1_tx_utils_with_blobs.js';
13
- import { createViemSigner } from './signer.js';
14
+ import { L1TxUtils } from './l1_tx_utils.js';
15
+ import { Delayer } from './tx_delayer.js';
14
16
  import type { L1BlobInputs, L1TxConfig, L1TxRequest, SigningCallback } from './types.js';
15
17
 
16
18
  /**
17
- * Extends L1TxUtilsWithBlobs to wrap all transactions through a forwarder contract.
19
+ * Extends L1TxUtils to wrap all transactions through a forwarder contract.
18
20
  * This is mainly used for testing the archiver's ability to decode transactions that go through proxies.
19
21
  */
20
- export class ForwarderL1TxUtils extends L1TxUtilsWithBlobs {
22
+ export class ForwarderL1TxUtils extends L1TxUtils {
21
23
  constructor(
22
- client: ViemClient | ExtendedViemWalletClient,
24
+ client: ViemClient,
23
25
  senderAddress: EthAddress,
24
26
  signingCallback: SigningCallback,
25
27
  logger: Logger | undefined,
@@ -28,9 +30,23 @@ export class ForwarderL1TxUtils extends L1TxUtilsWithBlobs {
28
30
  debugMaxGasLimit: boolean,
29
31
  store: IL1TxStore | undefined,
30
32
  metrics: IL1TxMetrics | undefined,
33
+ kzg: BlobKzgInstance | undefined,
34
+ delayer: Delayer | undefined,
31
35
  private readonly forwarderAddress: EthAddress,
32
36
  ) {
33
- super(client, senderAddress, signingCallback, logger, dateProvider, config, debugMaxGasLimit, store, metrics);
37
+ super(
38
+ client,
39
+ senderAddress,
40
+ signingCallback,
41
+ logger,
42
+ dateProvider,
43
+ config,
44
+ debugMaxGasLimit,
45
+ store,
46
+ metrics,
47
+ kzg,
48
+ delayer,
49
+ );
34
50
  }
35
51
 
36
52
  /**
@@ -61,59 +77,32 @@ export class ForwarderL1TxUtils extends L1TxUtilsWithBlobs {
61
77
  }
62
78
  }
63
79
 
64
- export function createForwarderL1TxUtilsFromViemWallet(
65
- client: ExtendedViemWalletClient,
80
+ export function createForwarderL1TxUtils(
81
+ source: L1SignerSource,
66
82
  forwarderAddress: EthAddress,
67
- deps: {
83
+ deps?: {
68
84
  logger?: Logger;
69
85
  dateProvider?: DateProvider;
70
86
  store?: IL1TxStore;
71
87
  metrics?: IL1TxMetrics;
72
- } = {},
73
- config: Partial<L1TxUtilsConfig> = {},
74
- debugMaxGasLimit: boolean = false,
75
- ) {
88
+ kzg?: BlobKzgInstance;
89
+ delayer?: Delayer;
90
+ },
91
+ config?: Partial<L1TxUtilsConfig> & { debugMaxGasLimit?: boolean },
92
+ ): ForwarderL1TxUtils {
93
+ const { client, address, signingCallback } = resolveSignerSource(source);
76
94
  return new ForwarderL1TxUtils(
77
95
  client,
78
- EthAddress.fromString(client.account.address),
79
- createViemSigner(client),
80
- deps.logger,
81
- deps.dateProvider,
82
- config,
83
- debugMaxGasLimit,
84
- deps.store,
85
- deps.metrics,
86
- forwarderAddress,
87
- );
88
- }
89
-
90
- export function createForwarderL1TxUtilsFromEthSigner(
91
- client: ViemClient,
92
- signer: EthSigner,
93
- forwarderAddress: EthAddress,
94
- deps: {
95
- logger?: Logger;
96
- dateProvider?: DateProvider;
97
- store?: IL1TxStore;
98
- metrics?: IL1TxMetrics;
99
- } = {},
100
- config: Partial<L1TxUtilsConfig> = {},
101
- debugMaxGasLimit: boolean = false,
102
- ) {
103
- const callback: SigningCallback = async (transaction, _signingAddress) => {
104
- return (await signer.signTransaction(transaction)).toViemTransactionSignature();
105
- };
106
-
107
- return new ForwarderL1TxUtils(
108
- client,
109
- signer.address,
110
- callback,
111
- deps.logger,
112
- deps.dateProvider,
113
- config,
114
- debugMaxGasLimit,
115
- deps.store,
116
- deps.metrics,
96
+ address,
97
+ signingCallback,
98
+ deps?.logger,
99
+ deps?.dateProvider,
100
+ config ?? {},
101
+ config?.debugMaxGasLimit ?? false,
102
+ deps?.store,
103
+ deps?.metrics,
104
+ deps?.kzg,
105
+ deps?.delayer,
117
106
  forwarderAddress,
118
107
  );
119
108
  }
@@ -1,2 +1,2 @@
1
- export * from './forwarder_l1_tx_utils.js';
2
- export * from './l1_tx_utils_with_blobs.js';
1
+ export { createForwarderL1TxUtils, ForwarderL1TxUtils } from './forwarder_l1_tx_utils.js';
2
+ export { createL1TxUtils, type L1SignerSource, resolveSignerSource } from './factory.js';
@@ -8,6 +8,7 @@ export * from './l1_tx_utils.js';
8
8
  export * from './readonly_l1_tx_utils.js';
9
9
  export * from './signer.js';
10
10
  export * from './types.js';
11
+ export * from './tx_delayer.js';
11
12
  export * from './utils.js';
12
13
 
13
14
  // Note: We intentionally do not export l1_tx_utils_with_blobs.js