@aztec/ethereum 0.0.1-commit.03f7ef2 → 0.0.1-commit.04d373f

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 (188) hide show
  1. package/dest/client.d.ts +16 -2
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +27 -7
  4. package/dest/config.d.ts +24 -32
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +63 -62
  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 +6 -5
  11. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  12. package/dest/contracts/fee_asset_handler.js +11 -9
  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 +110 -33
  17. package/dest/contracts/governance.d.ts.map +1 -1
  18. package/dest/contracts/governance.js +207 -16
  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 +438 -10
  22. package/dest/contracts/inbox.d.ts +22 -1
  23. package/dest/contracts/inbox.d.ts.map +1 -1
  24. package/dest/contracts/inbox.js +42 -2
  25. package/dest/contracts/index.d.ts +6 -3
  26. package/dest/contracts/index.d.ts.map +1 -1
  27. package/dest/contracts/index.js +5 -2
  28. package/dest/contracts/log.d.ts +13 -0
  29. package/dest/contracts/log.d.ts.map +1 -0
  30. package/dest/contracts/log.js +1 -0
  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 +58 -0
  35. package/dest/contracts/outbox.d.ts.map +1 -0
  36. package/dest/contracts/outbox.js +109 -0
  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 +5409 -115
  41. package/dest/contracts/rollup.d.ts.map +1 -1
  42. package/dest/contracts/rollup.js +1027 -189
  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 +20 -9
  47. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  48. package/dest/deploy_aztec_l1_contracts.js +113 -37
  49. package/dest/deploy_l1_contract.js +3 -3
  50. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  51. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  52. package/dest/generated/l1-contracts-defaults.js +30 -0
  53. package/dest/l1_artifacts.d.ts +18360 -16454
  54. package/dest/l1_artifacts.d.ts.map +1 -1
  55. package/dest/l1_artifacts.js +9 -24
  56. package/dest/l1_contract_addresses.d.ts +61 -65
  57. package/dest/l1_contract_addresses.d.ts.map +1 -1
  58. package/dest/l1_contract_addresses.js +101 -82
  59. package/dest/l1_reader.d.ts +5 -5
  60. package/dest/l1_reader.d.ts.map +1 -1
  61. package/dest/l1_reader.js +9 -7
  62. package/dest/l1_tx_utils/config.d.ts +7 -1
  63. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  64. package/dest/l1_tx_utils/config.js +14 -1
  65. package/dest/l1_tx_utils/constants.d.ts +1 -1
  66. package/dest/l1_tx_utils/constants.js +2 -2
  67. package/dest/l1_tx_utils/factory.d.ts +18 -10
  68. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  69. package/dest/l1_tx_utils/factory.js +17 -7
  70. package/dest/l1_tx_utils/fee-strategies/index.d.ts +3 -2
  71. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -1
  72. package/dest/l1_tx_utils/fee-strategies/index.js +2 -1
  73. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +2 -12
  74. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -1
  75. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +36 -18
  76. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +2 -11
  77. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -1
  78. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +37 -19
  79. package/dest/l1_tx_utils/fee-strategies/types.d.ts +14 -27
  80. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -1
  81. package/dest/l1_tx_utils/fee-strategies/types.js +0 -21
  82. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
  83. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
  84. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
  85. package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
  86. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
  87. package/dest/l1_tx_utils/index-blobs.js +2 -2
  88. package/dest/l1_tx_utils/index.d.ts +2 -1
  89. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  90. package/dest/l1_tx_utils/index.js +1 -0
  91. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +2 -2
  92. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -1
  93. package/dest/l1_tx_utils/l1_fee_analyzer.js +3 -3
  94. package/dest/l1_tx_utils/l1_tx_utils.d.ts +26 -7
  95. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  96. package/dest/l1_tx_utils/l1_tx_utils.js +101 -66
  97. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -5
  98. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  99. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +25 -58
  100. package/dest/l1_tx_utils/tx_delayer.d.ts +58 -0
  101. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  102. package/dest/{test → l1_tx_utils}/tx_delayer.js +67 -37
  103. package/dest/publisher_manager.d.ts +21 -6
  104. package/dest/publisher_manager.d.ts.map +1 -1
  105. package/dest/publisher_manager.js +81 -7
  106. package/dest/queries.d.ts +14 -3
  107. package/dest/queries.d.ts.map +1 -1
  108. package/dest/queries.js +74 -7
  109. package/dest/test/chain_monitor.d.ts +23 -3
  110. package/dest/test/chain_monitor.d.ts.map +1 -1
  111. package/dest/test/chain_monitor.js +39 -4
  112. package/dest/test/eth_cheat_codes.d.ts +24 -4
  113. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  114. package/dest/test/eth_cheat_codes.js +17 -4
  115. package/dest/test/index.d.ts +1 -3
  116. package/dest/test/index.d.ts.map +1 -1
  117. package/dest/test/index.js +0 -2
  118. package/dest/test/rollup_cheat_codes.d.ts +34 -3
  119. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  120. package/dest/test/rollup_cheat_codes.js +75 -6
  121. package/dest/test/start_anvil.d.ts +23 -3
  122. package/dest/test/start_anvil.d.ts.map +1 -1
  123. package/dest/test/start_anvil.js +143 -29
  124. package/dest/test/upgrade_utils.js +2 -2
  125. package/dest/utils.d.ts +9 -1
  126. package/dest/utils.d.ts.map +1 -1
  127. package/dest/utils.js +81 -12
  128. package/package.json +9 -10
  129. package/src/client.ts +28 -2
  130. package/src/config.ts +81 -63
  131. package/src/contracts/README.md +157 -0
  132. package/src/contracts/chain_state_override.ts +200 -0
  133. package/src/contracts/fee_asset_handler.ts +10 -7
  134. package/src/contracts/fee_asset_price_oracle.ts +285 -0
  135. package/src/contracts/governance.ts +279 -13
  136. package/src/contracts/governance_proposer.ts +58 -2
  137. package/src/contracts/inbox.ts +62 -2
  138. package/src/contracts/index.ts +5 -2
  139. package/src/contracts/log.ts +13 -0
  140. package/src/contracts/multicall.ts +243 -102
  141. package/src/contracts/outbox.ts +128 -0
  142. package/src/contracts/registry.ts +31 -1
  143. package/src/contracts/rollup.ts +728 -148
  144. package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +16 -14
  145. package/src/deploy_aztec_l1_contracts.ts +137 -47
  146. package/src/deploy_l1_contract.ts +3 -3
  147. package/src/generated/l1-contracts-defaults.ts +32 -0
  148. package/src/l1_artifacts.ts +12 -35
  149. package/src/l1_contract_addresses.ts +120 -94
  150. package/src/l1_reader.ts +17 -10
  151. package/src/l1_tx_utils/config.ts +20 -0
  152. package/src/l1_tx_utils/constants.ts +2 -2
  153. package/src/l1_tx_utils/factory.ts +31 -31
  154. package/src/l1_tx_utils/fee-strategies/index.ts +1 -1
  155. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +46 -42
  156. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +49 -45
  157. package/src/l1_tx_utils/fee-strategies/types.ts +14 -46
  158. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
  159. package/src/l1_tx_utils/index-blobs.ts +2 -2
  160. package/src/l1_tx_utils/index.ts +1 -0
  161. package/src/l1_tx_utils/l1_fee_analyzer.ts +2 -3
  162. package/src/l1_tx_utils/l1_tx_utils.ts +99 -48
  163. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +31 -66
  164. package/src/{test → l1_tx_utils}/tx_delayer.ts +93 -56
  165. package/src/publisher_manager.ts +107 -10
  166. package/src/queries.ts +81 -7
  167. package/src/test/chain_monitor.ts +66 -4
  168. package/src/test/eth_cheat_codes.ts +16 -4
  169. package/src/test/index.ts +0 -2
  170. package/src/test/rollup_cheat_codes.ts +82 -6
  171. package/src/test/start_anvil.ts +177 -29
  172. package/src/test/upgrade_utils.ts +2 -2
  173. package/src/utils.ts +88 -14
  174. package/dest/contracts/empire_slashing_proposer.d.ts +0 -67
  175. package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
  176. package/dest/contracts/empire_slashing_proposer.js +0 -209
  177. package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
  178. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  179. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  180. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  181. package/dest/test/delayed_tx_utils.d.ts +0 -13
  182. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  183. package/dest/test/delayed_tx_utils.js +0 -28
  184. package/dest/test/tx_delayer.d.ts +0 -36
  185. package/dest/test/tx_delayer.d.ts.map +0 -1
  186. package/src/contracts/empire_slashing_proposer.ts +0 -270
  187. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  188. 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
  }),
@@ -10,10 +10,12 @@ import { fileURLToPath } from '@aztec/foundation/url';
10
10
  import { bn254 } from '@noble/curves/bn254';
11
11
  import type { Abi, Narrow } from 'abitype';
12
12
  import { spawn } from 'child_process';
13
- import { dirname, resolve } from 'path';
13
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'fs';
14
+ import { tmpdir } from 'os';
15
+ import { dirname, join, resolve } from 'path';
14
16
  import readline from 'readline';
15
17
  import type { Hex } from 'viem';
16
- import { foundry, mainnet, sepolia } from 'viem/chains';
18
+ import { mainnet, sepolia } from 'viem/chains';
17
19
 
18
20
  import { createEthereumChain, isAnvilTestChain } from './chain.js';
19
21
  import { createExtendedL1Client } from './client.js';
@@ -21,7 +23,6 @@ import type { L1ContractsConfig } from './config.js';
21
23
  import { deployMulticall3 } from './contracts/multicall.js';
22
24
  import { RollupContract } from './contracts/rollup.js';
23
25
  import type { L1ContractAddresses } from './l1_contract_addresses.js';
24
- import type { L1TxUtilsConfig } from './l1_tx_utils/config.js';
25
26
  import type { ExtendedViemWalletClient } from './types.js';
26
27
 
27
28
  const logger = createLogger('ethereum:deploy_aztec_l1_contracts');
@@ -29,9 +30,9 @@ const logger = createLogger('ethereum:deploy_aztec_l1_contracts');
29
30
  const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:';
30
31
 
31
32
  /**
32
- * Runs a process with the given command, arguments, and environment.
33
- * If the process outputs a line starting with JSON_DEPLOY_RESULT_PREFIX,
34
- * 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.
35
36
  */
36
37
  function runProcess<T>(
37
38
  command: string,
@@ -47,26 +48,41 @@ function runProcess<T>(
47
48
  });
48
49
 
49
50
  let result: T | undefined;
51
+ let parseError: Error | undefined;
52
+ let settled = false;
50
53
 
51
54
  readline.createInterface({ input: proc.stdout }).on('line', line => {
52
55
  const trimmedLine = line.trim();
53
56
  if (trimmedLine.startsWith(JSON_DEPLOY_RESULT_PREFIX)) {
54
57
  const jsonStr = trimmedLine.slice(JSON_DEPLOY_RESULT_PREFIX.length).trim();
55
- // TODO(AD): should this be a zod parse?
56
- 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
+ }
57
63
  } else {
58
64
  logger.info(line);
59
65
  }
60
66
  });
61
- readline.createInterface({ input: proc.stderr }).on('line', logger.error.bind(logger));
67
+ readline.createInterface({ input: proc.stderr }).on('line', logger.warn.bind(logger));
62
68
 
63
69
  proc.on('error', error => {
70
+ if (settled) {
71
+ return;
72
+ }
73
+ settled = true;
64
74
  reject(new Error(`Failed to spawn ${command}: ${error.message}`));
65
75
  });
66
76
 
67
77
  proc.on('close', code => {
78
+ if (settled) {
79
+ return;
80
+ }
81
+ settled = true;
68
82
  if (code !== 0) {
69
- 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);
70
86
  } else {
71
87
  resolve(result);
72
88
  }
@@ -107,17 +123,80 @@ export interface ValidatorJson {
107
123
  }
108
124
 
109
125
  /**
110
- * Gets the path to the l1-contracts directory.
126
+ * Gets the path to the l1-contracts foundry artifacts directory.
127
+ * These are copied from l1-contracts to yarn-project/l1-artifacts/l1-contracts
128
+ * during build to make yarn-project self-contained.
111
129
  */
112
130
  export function getL1ContractsPath(): string {
113
- // Try to find l1-contracts relative to this file
114
131
  const currentDir = dirname(fileURLToPath(import.meta.url));
115
-
116
- // Go up from yarn-project/ethereum/src to yarn-project, then to repo root, then to l1-contracts
117
- const l1ContractsPath = resolve(currentDir, '..', '..', '..', 'l1-contracts');
132
+ // Go up from yarn-project/ethereum/dest to yarn-project, then to l1-artifacts/l1-contracts
133
+ const l1ContractsPath = resolve(currentDir, '..', '..', 'l1-artifacts', 'l1-contracts');
118
134
  return l1ContractsPath;
119
135
  }
120
136
 
137
+ // Cached deployment directory
138
+ let preparedDeployDir: string | undefined;
139
+
140
+ function cleanupDeployDir() {
141
+ if (preparedDeployDir) {
142
+ try {
143
+ rmSync(preparedDeployDir, { recursive: true, force: true });
144
+ } catch {
145
+ // ignore cleanup errors
146
+ }
147
+ preparedDeployDir = undefined;
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Prepares a temp directory for forge deployment.
153
+ * Copies all artifacts with preserved timestamps (required for forge cache validity).
154
+ * A fresh broadcast/ directory is created for deployment outputs.
155
+ */
156
+ export function prepareL1ContractsForDeployment(): string {
157
+ if (preparedDeployDir && existsSync(preparedDeployDir)) {
158
+ logger.verbose(`Using cached deployment directory: ${preparedDeployDir}`);
159
+ return preparedDeployDir;
160
+ }
161
+
162
+ const basePath = getL1ContractsPath();
163
+ logger.verbose(`Preparing L1 contracts from: ${basePath}`);
164
+ const tempDir = mkdtempSync(join(tmpdir(), '.foundry-deploy-'));
165
+ logger.verbose(`Created temp directory for deployment: ${tempDir}`);
166
+ preparedDeployDir = tempDir;
167
+ process.on('exit', cleanupDeployDir);
168
+
169
+ // Copy all dirs with preserved timestamps (required for forge cache validity)
170
+ const copyOpts = { recursive: true, preserveTimestamps: true };
171
+ cpSync(join(basePath, 'out'), join(tempDir, 'out'), copyOpts);
172
+ cpSync(join(basePath, 'lib'), join(tempDir, 'lib'), copyOpts);
173
+ cpSync(join(basePath, 'cache'), join(tempDir, 'cache'), copyOpts);
174
+ cpSync(join(basePath, 'src'), join(tempDir, 'src'), copyOpts);
175
+ cpSync(join(basePath, 'script'), join(tempDir, 'script'), copyOpts);
176
+ cpSync(join(basePath, 'generated'), join(tempDir, 'generated'), copyOpts);
177
+ // Kludge: copy test/ to appease forge cache which references test/shouting.t.sol
178
+ cpSync(join(basePath, 'test'), join(tempDir, 'test'), copyOpts);
179
+ cpSync(join(basePath, 'foundry.lock'), join(tempDir, 'foundry.lock'));
180
+
181
+ // Update foundry.toml to use absolute path to solc binary (avoids copying to noexec tmpfs)
182
+ const foundryTomlPath = join(basePath, 'foundry.toml');
183
+ let foundryToml = readFileSync(foundryTomlPath, 'utf-8');
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.
188
+ if (solcPathMatch) {
189
+ const solcVersion = solcPathMatch[1];
190
+ const absoluteSolcPath = join(basePath, `solc-${solcVersion}`);
191
+ foundryToml = foundryToml.replace(/solc\s*=\s*"\.\/solc-[^"]+"/, `solc = "${absoluteSolcPath}"`);
192
+ logger.verbose(`Updated solc path in foundry.toml to: ${absoluteSolcPath}`);
193
+ }
194
+ writeFileSync(join(tempDir, 'foundry.toml'), foundryToml);
195
+
196
+ mkdirSync(join(tempDir, 'broadcast'));
197
+ return tempDir;
198
+ }
199
+
121
200
  /**
122
201
  * Computes the validator data for passing to Solidity.
123
202
  * Only computes the G2 public key (which requires scalar multiplication on G2, not available in EVM).
@@ -151,7 +230,6 @@ export function computeValidatorData(operator: Operator): ValidatorJson {
151
230
  export interface RollupUpgradeAddresses {
152
231
  rollupAddress: string;
153
232
  verifierAddress: string;
154
- slashFactoryAddress: string;
155
233
  inboxAddress: string;
156
234
  outboxAddress: string;
157
235
  feeJuicePortalAddress: string;
@@ -164,7 +242,6 @@ export interface RollupUpgradeAddresses {
164
242
  export interface ForgeRollupUpgradeResult {
165
243
  rollupAddress: Hex;
166
244
  verifierAddress: Hex;
167
- slashFactoryAddress: Hex;
168
245
  inboxAddress: Hex;
169
246
  outboxAddress: Hex;
170
247
  feeJuicePortalAddress: Hex;
@@ -211,7 +288,6 @@ export async function deployAztecL1Contracts(
211
288
  'Initial validator funding requires minting tokens, which is not possible with an external token.',
212
289
  );
213
290
  }
214
- const currentDir = dirname(fileURLToPath(import.meta.url));
215
291
  const chain = createEthereumChain([rpcUrl], chainId);
216
292
 
217
293
  const l1Client = createExtendedL1Client([rpcUrl], privateKey, chain.chainInfo);
@@ -240,8 +316,8 @@ export async function deployAztecL1Contracts(
240
316
  }
241
317
  }
242
318
 
243
- // Relative location of l1-contracts in monorepo or docker image.
244
- const l1ContractsPath = resolve(currentDir, '..', '..', '..', 'l1-contracts');
319
+ // Use foundry-artifacts from l1-artifacts package
320
+ const l1ContractsPath = prepareL1ContractsForDeployment();
245
321
 
246
322
  const FORGE_SCRIPT = 'script/deploy/DeployAztecL1Contracts.s.sol';
247
323
  await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
@@ -257,11 +333,8 @@ export async function deployAztecL1Contracts(
257
333
  );
258
334
  }
259
335
 
260
- // From heuristic testing. More caused issues with anvil.
261
- const MAGIC_ANVIL_BATCH_SIZE = 12;
262
- // Anvil seems to stall with unbounded batch size. Otherwise no max batch size is desirable.
336
+ const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
263
337
  const forgeArgs = [
264
- 'script',
265
338
  FORGE_SCRIPT,
266
339
  '--sig',
267
340
  'run()',
@@ -269,8 +342,6 @@ export async function deployAztecL1Contracts(
269
342
  privateKey,
270
343
  '--rpc-url',
271
344
  rpcUrl,
272
- '--broadcast',
273
- ...(chainId === foundry.id ? ['--batch-size', MAGIC_ANVIL_BATCH_SIZE.toString()] : []),
274
345
  ...(shouldVerify ? ['--verify'] : []),
275
346
  ];
276
347
  const forgeEnv = {
@@ -279,7 +350,12 @@ export async function deployAztecL1Contracts(
279
350
  FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
280
351
  ...getDeployAztecL1ContractsEnvVars(args),
281
352
  };
282
- 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
+ );
283
359
  if (!result) {
284
360
  throw new Error('Forge script did not output deployment result');
285
361
  }
@@ -325,7 +401,6 @@ export async function deployAztecL1Contracts(
325
401
  governanceProposerAddress: EthAddress.fromString(result.governanceProposerAddress),
326
402
  governanceAddress: EthAddress.fromString(result.governanceAddress),
327
403
  stakingAssetAddress: EthAddress.fromString(result.stakingAssetAddress),
328
- slashFactoryAddress: result.slashFactoryAddress ? EthAddress.fromString(result.slashFactoryAddress) : undefined,
329
404
  feeAssetHandlerAddress: result.feeAssetHandlerAddress
330
405
  ? EthAddress.fromString(result.feeAssetHandlerAddress)
331
406
  : undefined,
@@ -412,7 +487,25 @@ export type VerificationRecord = {
412
487
  libraries: VerificationLibraryEntry[];
413
488
  };
414
489
 
415
- 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
+ > {
416
509
  /** The vk tree root. */
417
510
  vkTreeRoot: Fr;
418
511
  /** The hash of the protocol contracts. */
@@ -447,6 +540,7 @@ export function getDeployAztecL1ContractsEnvVars(args: DeployAztecL1ContractsArg
447
540
  AZTEC_EJECTION_THRESHOLD: args.ejectionThreshold?.toString(),
448
541
  AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: args.governanceProposerRoundSize?.toString(),
449
542
  AZTEC_GOVERNANCE_PROPOSER_QUORUM: args.governanceProposerQuorum?.toString(),
543
+ AZTEC_GOVERNANCE_VOTING_DURATION: args.governanceVotingDuration?.toString(),
450
544
  ZKPASSPORT_DOMAIN: args.zkPassportArgs?.zkPassportDomain,
451
545
  ZKPASSPORT_SCOPE: args.zkPassportArgs?.zkPassportScope,
452
546
  } as const;
@@ -477,15 +571,18 @@ export function getDeployRollupForUpgradeEnvVars(
477
571
  AZTEC_TARGET_COMMITTEE_SIZE: args.aztecTargetCommitteeSize.toString(),
478
572
  AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: args.lagInEpochsForValidatorSet.toString(),
479
573
  AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: args.lagInEpochsForRandao.toString(),
574
+ AZTEC_INBOX_LAG: args.inboxLag?.toString(),
480
575
  AZTEC_PROOF_SUBMISSION_EPOCHS: args.aztecProofSubmissionEpochs.toString(),
481
576
  AZTEC_LOCAL_EJECTION_THRESHOLD: args.localEjectionThreshold.toString(),
482
577
  AZTEC_SLASHING_LIFETIME_IN_ROUNDS: args.slashingLifetimeInRounds.toString(),
578
+ AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS: args.slashingExecutionDelayInRounds.toString(),
483
579
  AZTEC_SLASHING_VETOER: args.slashingVetoer.toString(),
484
580
  AZTEC_SLASHING_DISABLE_DURATION: args.slashingDisableDuration.toString(),
485
581
  AZTEC_MANA_TARGET: args.manaTarget.toString(),
486
582
  AZTEC_EXIT_DELAY_SECONDS: args.exitDelaySeconds.toString(),
487
583
  AZTEC_PROVING_COST_PER_MANA: args.provingCostPerMana.toString(),
488
- AZTEC_SLASHER_FLAVOR: args.slasherFlavor,
584
+ AZTEC_INITIAL_ETH_PER_FEE_ASSET: args.initialEthPerFeeAsset.toString(),
585
+ AZTEC_SLASHER_ENABLED: args.slasherEnabled ? 'true' : 'false',
489
586
  AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: args.slashingRoundSizeInEpochs.toString(),
490
587
  AZTEC_SLASHING_QUORUM: args.slashingQuorum?.toString(),
491
588
  AZTEC_SLASHING_OFFSET_IN_ROUNDS: args.slashingOffsetInRounds.toString(),
@@ -512,25 +609,14 @@ export const deployRollupForUpgrade = async (
512
609
  | 'zkPassportArgs'
513
610
  >,
514
611
  ) => {
515
- const currentDir = dirname(fileURLToPath(import.meta.url));
516
-
517
- // Relative location of l1-contracts in monorepo or docker image.
518
- const l1ContractsPath = resolve(currentDir, '..', '..', '..', 'l1-contracts');
612
+ // Use foundry-artifacts from l1-artifacts package
613
+ const l1ContractsPath = prepareL1ContractsForDeployment();
519
614
 
520
615
  const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol';
521
616
  await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
522
617
 
523
- const forgeArgs = [
524
- 'script',
525
- FORGE_SCRIPT,
526
- '--sig',
527
- 'run()',
528
- '--private-key',
529
- privateKey,
530
- '--rpc-url',
531
- rpcUrl,
532
- '--broadcast',
533
- ];
618
+ const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
619
+ const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl];
534
620
  const forgeEnv = {
535
621
  FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
536
622
  // Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol.
@@ -539,7 +625,12 @@ export const deployRollupForUpgrade = async (
539
625
  ...getDeployRollupForUpgradeEnvVars(args),
540
626
  };
541
627
 
542
- 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
+ );
543
634
  if (!result) {
544
635
  throw new Error('Forge script did not output deployment result');
545
636
  }
@@ -551,6 +642,5 @@ export const deployRollupForUpgrade = async (
551
642
 
552
643
  return {
553
644
  rollup,
554
- slashFactoryAddress: result.slashFactoryAddress,
555
645
  };
556
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 },
@@ -0,0 +1,32 @@
1
+ // Auto-generated from spartan/environments/network-defaults.yml
2
+ // Do not edit manually - run yarn generate to regenerate
3
+
4
+ /** Default L1 contracts configuration values from network-defaults.yml */
5
+ export const l1ContractsDefaultEnv = {
6
+ ETHEREUM_SLOT_DURATION: 12,
7
+ AZTEC_SLOT_DURATION: 72,
8
+ AZTEC_EPOCH_DURATION: 32,
9
+ AZTEC_TARGET_COMMITTEE_SIZE: 48,
10
+ AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 2,
11
+ AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: 2,
12
+ AZTEC_ACTIVATION_THRESHOLD: 100000000000000000000,
13
+ AZTEC_EJECTION_THRESHOLD: 50000000000000000000,
14
+ AZTEC_LOCAL_EJECTION_THRESHOLD: 98000000000000000000,
15
+ AZTEC_EXIT_DELAY_SECONDS: 172800,
16
+ AZTEC_INBOX_LAG: 1,
17
+ AZTEC_PROOF_SUBMISSION_EPOCHS: 1,
18
+ AZTEC_MANA_TARGET: 100000000,
19
+ AZTEC_PROVING_COST_PER_MANA: 100,
20
+ AZTEC_INITIAL_ETH_PER_FEE_ASSET: 10000000,
21
+ AZTEC_SLASHER_ENABLED: true,
22
+ AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: 4,
23
+ AZTEC_SLASHING_LIFETIME_IN_ROUNDS: 5,
24
+ AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS: 0,
25
+ AZTEC_SLASHING_OFFSET_IN_ROUNDS: 2,
26
+ AZTEC_SLASHING_VETOER: '0x0000000000000000000000000000000000000000',
27
+ AZTEC_SLASHING_DISABLE_DURATION: 432000,
28
+ AZTEC_SLASH_AMOUNT_SMALL: 10000000000000000000,
29
+ AZTEC_SLASH_AMOUNT_MEDIUM: 20000000000000000000,
30
+ AZTEC_SLASH_AMOUNT_LARGE: 50000000000000000000,
31
+ AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: 300,
32
+ } as const;
@@ -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 = {