@aztec/ethereum 0.0.1-commit.fce3e4f → 0.0.1-commit.fffb133c

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 (166) hide show
  1. package/dest/client.js +6 -2
  2. package/dest/config.d.ts +19 -68
  3. package/dest/config.d.ts.map +1 -1
  4. package/dest/config.js +51 -378
  5. package/dest/contracts/empire_base.d.ts +2 -1
  6. package/dest/contracts/empire_base.d.ts.map +1 -1
  7. package/dest/contracts/empire_slashing_proposer.d.ts +2 -1
  8. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
  9. package/dest/contracts/empire_slashing_proposer.js +9 -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 +9 -9
  13. package/dest/contracts/governance.d.ts +3 -1
  14. package/dest/contracts/governance.d.ts.map +1 -1
  15. package/dest/contracts/governance.js +9 -1
  16. package/dest/contracts/governance_proposer.d.ts +2 -1
  17. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  18. package/dest/contracts/governance_proposer.js +391 -8
  19. package/dest/contracts/inbox.d.ts +24 -3
  20. package/dest/contracts/inbox.d.ts.map +1 -1
  21. package/dest/contracts/inbox.js +36 -1
  22. package/dest/contracts/index.d.ts +3 -1
  23. package/dest/contracts/index.d.ts.map +1 -1
  24. package/dest/contracts/index.js +2 -0
  25. package/dest/contracts/log.d.ts +13 -0
  26. package/dest/contracts/log.d.ts.map +1 -0
  27. package/dest/contracts/log.js +1 -0
  28. package/dest/contracts/outbox.d.ts +41 -0
  29. package/dest/contracts/outbox.d.ts.map +1 -0
  30. package/dest/contracts/outbox.js +86 -0
  31. package/dest/contracts/rollup.d.ts +176 -96
  32. package/dest/contracts/rollup.d.ts.map +1 -1
  33. package/dest/contracts/rollup.js +698 -141
  34. package/dest/contracts/tally_slashing_proposer.d.ts +3 -2
  35. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
  36. package/dest/contracts/tally_slashing_proposer.js +1 -1
  37. package/dest/deploy_aztec_l1_contracts.d.ts +260 -0
  38. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
  39. package/dest/deploy_aztec_l1_contracts.js +398 -0
  40. package/dest/deploy_l1_contract.d.ts +68 -0
  41. package/dest/deploy_l1_contract.d.ts.map +1 -0
  42. package/dest/deploy_l1_contract.js +312 -0
  43. package/dest/forwarder_proxy.d.ts +32 -0
  44. package/dest/forwarder_proxy.d.ts.map +1 -0
  45. package/dest/forwarder_proxy.js +93 -0
  46. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  47. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  48. package/dest/generated/l1-contracts-defaults.js +30 -0
  49. package/dest/l1_artifacts.d.ts +4964 -1573
  50. package/dest/l1_artifacts.d.ts.map +1 -1
  51. package/dest/l1_contract_addresses.d.ts +1 -1
  52. package/dest/l1_contract_addresses.d.ts.map +1 -1
  53. package/dest/l1_contract_addresses.js +3 -3
  54. package/dest/l1_reader.d.ts +3 -1
  55. package/dest/l1_reader.d.ts.map +1 -1
  56. package/dest/l1_reader.js +6 -0
  57. package/dest/l1_tx_utils/config.d.ts +3 -3
  58. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  59. package/dest/l1_tx_utils/config.js +17 -3
  60. package/dest/l1_tx_utils/constants.d.ts +7 -1
  61. package/dest/l1_tx_utils/constants.d.ts.map +1 -1
  62. package/dest/l1_tx_utils/constants.js +25 -0
  63. package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
  64. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
  65. package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
  66. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
  67. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
  68. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
  69. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
  70. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
  71. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
  72. package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
  73. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
  74. package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
  75. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
  76. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
  77. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +48 -0
  78. package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
  79. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
  80. package/dest/l1_tx_utils/index-blobs.js +2 -0
  81. package/dest/l1_tx_utils/index.d.ts +3 -1
  82. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  83. package/dest/l1_tx_utils/index.js +2 -0
  84. package/dest/l1_tx_utils/interfaces.d.ts +2 -2
  85. package/dest/l1_tx_utils/interfaces.d.ts.map +1 -1
  86. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
  87. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
  88. package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
  89. package/dest/l1_tx_utils/l1_tx_utils.d.ts +1 -1
  90. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  91. package/dest/l1_tx_utils/l1_tx_utils.js +17 -4
  92. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +4 -15
  93. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  94. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +52 -159
  95. package/dest/queries.d.ts +2 -2
  96. package/dest/queries.d.ts.map +1 -1
  97. package/dest/queries.js +12 -4
  98. package/dest/test/chain_monitor.d.ts +15 -13
  99. package/dest/test/chain_monitor.d.ts.map +1 -1
  100. package/dest/test/chain_monitor.js +7 -9
  101. package/dest/test/eth_cheat_codes.d.ts +13 -1
  102. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  103. package/dest/test/eth_cheat_codes.js +4 -2
  104. package/dest/test/rollup_cheat_codes.d.ts +7 -6
  105. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  106. package/dest/test/rollup_cheat_codes.js +23 -6
  107. package/dest/test/start_anvil.d.ts +3 -1
  108. package/dest/test/start_anvil.d.ts.map +1 -1
  109. package/dest/test/tx_delayer.d.ts +1 -1
  110. package/dest/test/tx_delayer.d.ts.map +1 -1
  111. package/dest/test/tx_delayer.js +4 -3
  112. package/dest/types.d.ts +57 -2
  113. package/dest/types.d.ts.map +1 -1
  114. package/dest/utils.d.ts +15 -3
  115. package/dest/utils.d.ts.map +1 -1
  116. package/dest/utils.js +18 -0
  117. package/package.json +33 -14
  118. package/src/client.ts +2 -2
  119. package/src/config.ts +62 -457
  120. package/src/contracts/README.md +157 -0
  121. package/src/contracts/empire_base.ts +1 -1
  122. package/src/contracts/empire_slashing_proposer.ts +6 -1
  123. package/src/contracts/fee_asset_handler.ts +8 -7
  124. package/src/contracts/governance.ts +8 -1
  125. package/src/contracts/governance_proposer.ts +6 -1
  126. package/src/contracts/inbox.ts +55 -3
  127. package/src/contracts/index.ts +2 -0
  128. package/src/contracts/log.ts +13 -0
  129. package/src/contracts/outbox.ts +98 -0
  130. package/src/contracts/rollup.ts +375 -111
  131. package/src/contracts/tally_slashing_proposer.ts +3 -1
  132. package/src/deploy_aztec_l1_contracts.ts +619 -0
  133. package/src/deploy_l1_contract.ts +362 -0
  134. package/src/forwarder_proxy.ts +108 -0
  135. package/src/generated/l1-contracts-defaults.ts +32 -0
  136. package/src/l1_contract_addresses.ts +22 -20
  137. package/src/l1_reader.ts +8 -0
  138. package/src/l1_tx_utils/config.ts +24 -6
  139. package/src/l1_tx_utils/constants.ts +11 -0
  140. package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
  141. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
  142. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
  143. package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
  144. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +119 -0
  145. package/src/l1_tx_utils/index-blobs.ts +2 -0
  146. package/src/l1_tx_utils/index.ts +2 -0
  147. package/src/l1_tx_utils/interfaces.ts +1 -1
  148. package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
  149. package/src/l1_tx_utils/l1_tx_utils.ts +24 -4
  150. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +65 -204
  151. package/src/queries.ts +11 -3
  152. package/src/test/chain_monitor.ts +18 -16
  153. package/src/test/eth_cheat_codes.ts +2 -2
  154. package/src/test/rollup_cheat_codes.ts +23 -9
  155. package/src/test/start_anvil.ts +2 -0
  156. package/src/test/tx_delayer.ts +5 -3
  157. package/src/types.ts +62 -0
  158. package/src/utils.ts +30 -1
  159. package/dest/deploy_l1_contracts.d.ts +0 -673
  160. package/dest/deploy_l1_contracts.d.ts.map +0 -1
  161. package/dest/deploy_l1_contracts.js +0 -1491
  162. package/dest/index.d.ts +0 -18
  163. package/dest/index.d.ts.map +0 -1
  164. package/dest/index.js +0 -17
  165. package/src/deploy_l1_contracts.ts +0 -1869
  166. package/src/index.ts +0 -17
@@ -0,0 +1,398 @@
1
+ import { SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { getActiveNetworkName } from '@aztec/foundation/config';
3
+ import { EthAddress } from '@aztec/foundation/eth-address';
4
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
5
+ import { createLogger } from '@aztec/foundation/log';
6
+ import { promiseWithResolvers } from '@aztec/foundation/promise';
7
+ import { fileURLToPath } from '@aztec/foundation/url';
8
+ import { bn254 } from '@noble/curves/bn254';
9
+ import { spawn } from 'child_process';
10
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'fs';
11
+ import { tmpdir } from 'os';
12
+ import { dirname, join, resolve } from 'path';
13
+ import readline from 'readline';
14
+ import { foundry, mainnet, sepolia } from 'viem/chains';
15
+ import { createEthereumChain, isAnvilTestChain } from './chain.js';
16
+ import { createExtendedL1Client } from './client.js';
17
+ import { deployMulticall3 } from './contracts/multicall.js';
18
+ import { RollupContract } from './contracts/rollup.js';
19
+ const logger = createLogger('ethereum:deploy_aztec_l1_contracts');
20
+ const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:';
21
+ /**
22
+ * Runs a process with the given command, arguments, and environment.
23
+ * If the process outputs a line starting with JSON_DEPLOY_RESULT_PREFIX,
24
+ * the JSON is parsed and returned.
25
+ */ function runProcess(command, args, env, cwd) {
26
+ const { promise, resolve, reject } = promiseWithResolvers();
27
+ const proc = spawn(command, args, {
28
+ cwd,
29
+ env: {
30
+ ...process.env,
31
+ ...env
32
+ },
33
+ stdio: [
34
+ 'ignore',
35
+ 'pipe',
36
+ 'pipe'
37
+ ]
38
+ });
39
+ let result;
40
+ readline.createInterface({
41
+ input: proc.stdout
42
+ }).on('line', (line)=>{
43
+ const trimmedLine = line.trim();
44
+ if (trimmedLine.startsWith(JSON_DEPLOY_RESULT_PREFIX)) {
45
+ const jsonStr = trimmedLine.slice(JSON_DEPLOY_RESULT_PREFIX.length).trim();
46
+ // TODO(AD): should this be a zod parse?
47
+ result = JSON.parse(jsonStr);
48
+ } else {
49
+ logger.info(line);
50
+ }
51
+ });
52
+ readline.createInterface({
53
+ input: proc.stderr
54
+ }).on('line', logger.error.bind(logger));
55
+ proc.on('error', (error)=>{
56
+ reject(new Error(`Failed to spawn ${command}: ${error.message}`));
57
+ });
58
+ proc.on('close', (code)=>{
59
+ if (code !== 0) {
60
+ reject(new Error(`${command} exited with code ${code}. See logs for details.\n`));
61
+ } else {
62
+ resolve(result);
63
+ }
64
+ });
65
+ return promise;
66
+ }
67
+ // Covers an edge where where we may have a cached BlobLib that is not meant for production.
68
+ // Despite the profile apparently sometimes cached code remains (so says Lasse after his ignition-monorepo arc).
69
+ async function maybeForgeForceProductionBuild(l1ContractsPath, script, chainId) {
70
+ if (chainId === mainnet.id) {
71
+ logger.info(`Recompiling ${script} with production profile for mainnet deployment`);
72
+ logger.info('This may take a minute but ensures production BlobLib is used.');
73
+ await runProcess('forge', [
74
+ 'build',
75
+ script,
76
+ '--force'
77
+ ], {
78
+ FOUNDRY_PROFILE: 'production'
79
+ }, l1ContractsPath);
80
+ }
81
+ }
82
+ /**
83
+ * Gets the path to the l1-contracts foundry artifacts directory.
84
+ * These are copied from l1-contracts to yarn-project/l1-artifacts/l1-contracts
85
+ * during build to make yarn-project self-contained.
86
+ */ export function getL1ContractsPath() {
87
+ const currentDir = dirname(fileURLToPath(import.meta.url));
88
+ // Go up from yarn-project/ethereum/dest to yarn-project, then to l1-artifacts/l1-contracts
89
+ const l1ContractsPath = resolve(currentDir, '..', '..', 'l1-artifacts', 'l1-contracts');
90
+ return l1ContractsPath;
91
+ }
92
+ // Cached deployment directory
93
+ let preparedDeployDir;
94
+ function cleanupDeployDir() {
95
+ if (preparedDeployDir) {
96
+ try {
97
+ rmSync(preparedDeployDir, {
98
+ recursive: true,
99
+ force: true
100
+ });
101
+ } catch {
102
+ // ignore cleanup errors
103
+ }
104
+ preparedDeployDir = undefined;
105
+ }
106
+ }
107
+ /**
108
+ * Prepares a temp directory for forge deployment.
109
+ * Copies all artifacts with preserved timestamps (required for forge cache validity).
110
+ * A fresh broadcast/ directory is created for deployment outputs.
111
+ */ export function prepareL1ContractsForDeployment() {
112
+ if (preparedDeployDir && existsSync(preparedDeployDir)) {
113
+ logger.verbose(`Using cached deployment directory: ${preparedDeployDir}`);
114
+ return preparedDeployDir;
115
+ }
116
+ const basePath = getL1ContractsPath();
117
+ logger.verbose(`Preparing L1 contracts from: ${basePath}`);
118
+ const tempDir = mkdtempSync(join(tmpdir(), '.foundry-deploy-'));
119
+ logger.verbose(`Created temp directory for deployment: ${tempDir}`);
120
+ preparedDeployDir = tempDir;
121
+ process.on('exit', cleanupDeployDir);
122
+ // Copy all dirs with preserved timestamps (required for forge cache validity)
123
+ const copyOpts = {
124
+ recursive: true,
125
+ preserveTimestamps: true
126
+ };
127
+ cpSync(join(basePath, 'out'), join(tempDir, 'out'), copyOpts);
128
+ cpSync(join(basePath, 'lib'), join(tempDir, 'lib'), copyOpts);
129
+ cpSync(join(basePath, 'cache'), join(tempDir, 'cache'), copyOpts);
130
+ cpSync(join(basePath, 'src'), join(tempDir, 'src'), copyOpts);
131
+ cpSync(join(basePath, 'script'), join(tempDir, 'script'), copyOpts);
132
+ cpSync(join(basePath, 'generated'), join(tempDir, 'generated'), copyOpts);
133
+ // Kludge: copy test/ to appease forge cache which references test/shouting.t.sol
134
+ cpSync(join(basePath, 'test'), join(tempDir, 'test'), copyOpts);
135
+ cpSync(join(basePath, 'foundry.lock'), join(tempDir, 'foundry.lock'));
136
+ // Update foundry.toml to use absolute path to solc binary (avoids copying to noexec tmpfs)
137
+ const foundryTomlPath = join(basePath, 'foundry.toml');
138
+ let foundryToml = readFileSync(foundryTomlPath, 'utf-8');
139
+ const solcPathMatch = foundryToml.match(/solc\s*=\s*"\.\/solc-([^"]+)"/);
140
+ if (solcPathMatch) {
141
+ const solcVersion = solcPathMatch[1];
142
+ const absoluteSolcPath = join(basePath, `solc-${solcVersion}`);
143
+ foundryToml = foundryToml.replace(/solc\s*=\s*"\.\/solc-[^"]+"/, `solc = "${absoluteSolcPath}"`);
144
+ logger.verbose(`Updated solc path in foundry.toml to: ${absoluteSolcPath}`);
145
+ }
146
+ writeFileSync(join(tempDir, 'foundry.toml'), foundryToml);
147
+ mkdirSync(join(tempDir, 'broadcast'));
148
+ return tempDir;
149
+ }
150
+ /**
151
+ * Computes the validator data for passing to Solidity.
152
+ * Only computes the G2 public key (which requires scalar multiplication on G2, not available in EVM).
153
+ * Solidity will derive G1 public key and proof of possession from the private key.
154
+ */ export function computeValidatorData(operator) {
155
+ const privateKey = operator.bn254SecretKey.getValue();
156
+ // Compute G2 public key: pk2 = privateKey * G2
157
+ // This is the only computation we need to do in TypeScript since G2 scalar mul
158
+ // is not available as an EVM precompile
159
+ const publicKeyG2 = bn254.G2.ProjectivePoint.BASE.multiply(privateKey);
160
+ const publicKeyG2Affine = publicKeyG2.toAffine();
161
+ return {
162
+ attester: operator.attester.toString(),
163
+ withdrawer: operator.withdrawer.toString(),
164
+ privateKey: privateKey.toString(),
165
+ publicKeyInG2: {
166
+ x0: publicKeyG2Affine.x.c0.toString(),
167
+ x1: publicKeyG2Affine.x.c1.toString(),
168
+ y0: publicKeyG2Affine.y.c0.toString(),
169
+ y1: publicKeyG2Affine.y.c1.toString()
170
+ }
171
+ };
172
+ }
173
+ /**
174
+ * Deploys L1 contracts using forge and returns a result compatible with the TypeScript deployAztecL1Contracts function.
175
+ * This queries the Rollup contract to get the inbox, outbox, and feeJuicePortal addresses.
176
+ *
177
+ * All configuration is passed via environment variables to the forge script. The DeploymentConfiguration.sol
178
+ * contract reads these values and applies defaults for any unspecified parameters.
179
+ *
180
+ * @param rpcUrl - The RPC URL to use
181
+ * @param privateKey - The private key for the deployer (with 0x prefix)
182
+ * @param options - Additional deployment options (all optional with sensible defaults)
183
+ * @returns The deployment result with all contract addresses and an l1Client
184
+ */ export async function deployAztecL1Contracts(rpcUrl, privateKey, chainId, args) {
185
+ logger.info(`Deploying L1 contracts with config: ${jsonStringify(args)}`);
186
+ if (args.initialValidators && args.initialValidators.length > 0 && args.existingTokenAddress) {
187
+ throw new Error('Cannot deploy with both initialValidators and existingTokenAddress. ' + 'Initial validator funding requires minting tokens, which is not possible with an external token.');
188
+ }
189
+ const chain = createEthereumChain([
190
+ rpcUrl
191
+ ], chainId);
192
+ const l1Client = createExtendedL1Client([
193
+ rpcUrl
194
+ ], privateKey, chain.chainInfo);
195
+ const rpcCall = async (method, params)=>{
196
+ logger.info(`Calling ${method} with params: ${JSON.stringify(params)}`);
197
+ return await l1Client.transport.request({
198
+ method,
199
+ params
200
+ });
201
+ };
202
+ logger.verbose(`Deploying contracts from ${l1Client.account.address.toString()}`);
203
+ // Deploy multicall3 if it does not exist in this network
204
+ // Sepolia and mainnet will have this.
205
+ await deployMulticall3(l1Client, logger);
206
+ if (isAnvilTestChain(chainId)) {
207
+ try {
208
+ // We are assuming that you are running this on a local anvil node which have 1s block times
209
+ // To align better with actual deployment, we update the block interval to 12s
210
+ await rpcCall('anvil_setBlockTimestampInterval', [
211
+ args.ethereumSlotDuration
212
+ ]);
213
+ logger.warn(`Set block interval to ${args.ethereumSlotDuration}`);
214
+ } catch (e) {
215
+ logger.error(`Error setting block interval: ${e}`);
216
+ }
217
+ }
218
+ // Use foundry-artifacts from l1-artifacts package
219
+ const l1ContractsPath = prepareL1ContractsForDeployment();
220
+ const FORGE_SCRIPT = 'script/deploy/DeployAztecL1Contracts.s.sol';
221
+ await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
222
+ // Verify contracts on Etherscan when on mainnet/sepolia and ETHERSCAN_API_KEY is available.
223
+ const isVerifiableChain = chainId === mainnet.id || chainId === sepolia.id;
224
+ const shouldVerify = isVerifiableChain && !!process.env.ETHERSCAN_API_KEY;
225
+ if (isVerifiableChain && !process.env.ETHERSCAN_API_KEY) {
226
+ logger.warn(`Deploying to chain ${chainId} (${chainId === mainnet.id ? 'mainnet' : 'sepolia'}) without ETHERSCAN_API_KEY. ` + `Contracts will NOT be verified on Etherscan. Set ETHERSCAN_API_KEY environment variable to enable verification.`);
227
+ }
228
+ // From heuristic testing. More caused issues with anvil.
229
+ const MAGIC_ANVIL_BATCH_SIZE = 8;
230
+ // Anvil seems to stall with unbounded batch size. Otherwise no max batch size is desirable.
231
+ const forgeArgs = [
232
+ 'script',
233
+ FORGE_SCRIPT,
234
+ '--sig',
235
+ 'run()',
236
+ '--private-key',
237
+ privateKey,
238
+ '--rpc-url',
239
+ rpcUrl,
240
+ '--broadcast',
241
+ ...chainId === foundry.id ? [
242
+ '--batch-size',
243
+ MAGIC_ANVIL_BATCH_SIZE.toString()
244
+ ] : [],
245
+ ...shouldVerify ? [
246
+ '--verify'
247
+ ] : []
248
+ ];
249
+ const forgeEnv = {
250
+ // Env vars required by l1-contracts/script/deploy/DeploymentConfiguration.sol.
251
+ NETWORK: getActiveNetworkName(),
252
+ FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
253
+ ...getDeployAztecL1ContractsEnvVars(args)
254
+ };
255
+ const result = await runProcess('forge', forgeArgs, forgeEnv, l1ContractsPath);
256
+ if (!result) {
257
+ throw new Error('Forge script did not output deployment result');
258
+ }
259
+ logger.info(`Deployed L1 contracts with L1 addresses: ${jsonStringify(result)}`);
260
+ const rollup = new RollupContract(l1Client, result.rollupAddress);
261
+ if (isAnvilTestChain(chainId)) {
262
+ // @note We make a time jump PAST the very first slot to not have to deal with the edge case of the first slot.
263
+ // The edge case being that the genesis block is already occupying slot 0, so we cannot have another block.
264
+ try {
265
+ // Need to get the time
266
+ const currentSlot = await rollup.getSlotNumber();
267
+ if (currentSlot === 0) {
268
+ const ts = Number(await rollup.getTimestampForSlot(SlotNumber(1)));
269
+ await rpcCall('evm_setNextBlockTimestamp', [
270
+ ts
271
+ ]);
272
+ await rpcCall('hardhat_mine', [
273
+ 1
274
+ ]);
275
+ const currentSlot = await rollup.getSlotNumber();
276
+ if (currentSlot !== 1) {
277
+ throw new Error(`Error jumping time: current slot is ${currentSlot}`);
278
+ }
279
+ logger.info(`Jumped to slot 1`);
280
+ }
281
+ } catch (e) {
282
+ throw new Error(`Error jumping time: ${e}`);
283
+ }
284
+ }
285
+ return {
286
+ l1Client,
287
+ rollupVersion: result.rollupVersion,
288
+ l1ContractAddresses: {
289
+ rollupAddress: EthAddress.fromString(result.rollupAddress),
290
+ registryAddress: EthAddress.fromString(result.registryAddress),
291
+ inboxAddress: EthAddress.fromString(result.inboxAddress),
292
+ outboxAddress: EthAddress.fromString(result.outboxAddress),
293
+ feeJuiceAddress: EthAddress.fromString(result.feeAssetAddress),
294
+ feeJuicePortalAddress: EthAddress.fromString(result.feeJuicePortalAddress),
295
+ coinIssuerAddress: EthAddress.fromString(result.coinIssuerAddress),
296
+ rewardDistributorAddress: EthAddress.fromString(result.rewardDistributorAddress),
297
+ governanceProposerAddress: EthAddress.fromString(result.governanceProposerAddress),
298
+ governanceAddress: EthAddress.fromString(result.governanceAddress),
299
+ stakingAssetAddress: EthAddress.fromString(result.stakingAssetAddress),
300
+ slashFactoryAddress: result.slashFactoryAddress ? EthAddress.fromString(result.slashFactoryAddress) : undefined,
301
+ feeAssetHandlerAddress: result.feeAssetHandlerAddress ? EthAddress.fromString(result.feeAssetHandlerAddress) : undefined,
302
+ stakingAssetHandlerAddress: result.stakingAssetHandlerAddress ? EthAddress.fromString(result.stakingAssetHandlerAddress) : undefined,
303
+ zkPassportVerifierAddress: result.zkPassportVerifierAddress ? EthAddress.fromString(result.zkPassportVerifierAddress) : undefined,
304
+ gseAddress: result.gseAddress ? EthAddress.fromString(result.gseAddress) : undefined,
305
+ dateGatedRelayerAddress: result.dateGatedRelayerAddress ? EthAddress.fromString(result.dateGatedRelayerAddress) : undefined
306
+ }
307
+ };
308
+ }
309
+ export const DEPLOYER_ADDRESS = '0x4e59b44847b379578588920cA78FbF26c0B4956C';
310
+ // picked up by l1-contracts DeploymentConfiguration.sol
311
+ export function getDeployAztecL1ContractsEnvVars(args) {
312
+ return {
313
+ ...getDeployRollupForUpgradeEnvVars(args),
314
+ EXISTING_TOKEN_ADDRESS: args.existingTokenAddress?.toString(),
315
+ AZTEC_ACTIVATION_THRESHOLD: args.activationThreshold?.toString(),
316
+ AZTEC_EJECTION_THRESHOLD: args.ejectionThreshold?.toString(),
317
+ AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: args.governanceProposerRoundSize?.toString(),
318
+ AZTEC_GOVERNANCE_PROPOSER_QUORUM: args.governanceProposerQuorum?.toString(),
319
+ AZTEC_GOVERNANCE_VOTING_DURATION: args.governanceVotingDuration?.toString(),
320
+ ZKPASSPORT_DOMAIN: args.zkPassportArgs?.zkPassportDomain,
321
+ ZKPASSPORT_SCOPE: args.zkPassportArgs?.zkPassportScope
322
+ };
323
+ }
324
+ // picked up by l1-contracts RollupConfiguration.sol
325
+ export function getDeployRollupForUpgradeEnvVars(args) {
326
+ return {
327
+ INITIAL_VALIDATORS: JSON.stringify((args.initialValidators ?? []).map(computeValidatorData)),
328
+ REAL_VERIFIER: args.realVerifier ? 'true' : 'false',
329
+ FEE_JUICE_PORTAL_INITIAL_BALANCE: (args.feeJuicePortalInitialBalance ?? 0n).toString(),
330
+ // Genesis state
331
+ VK_TREE_ROOT: args.vkTreeRoot.toString(),
332
+ PROTOCOL_CONTRACTS_HASH: args.protocolContractsHash.toString(),
333
+ GENESIS_ARCHIVE_ROOT: args.genesisArchiveRoot.toString(),
334
+ // Rollup config
335
+ AZTEC_SLOT_DURATION: args.aztecSlotDuration.toString(),
336
+ AZTEC_EPOCH_DURATION: args.aztecEpochDuration.toString(),
337
+ AZTEC_TARGET_COMMITTEE_SIZE: args.aztecTargetCommitteeSize.toString(),
338
+ AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: args.lagInEpochsForValidatorSet.toString(),
339
+ AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: args.lagInEpochsForRandao.toString(),
340
+ AZTEC_INBOX_LAG: args.inboxLag?.toString(),
341
+ AZTEC_PROOF_SUBMISSION_EPOCHS: args.aztecProofSubmissionEpochs.toString(),
342
+ AZTEC_LOCAL_EJECTION_THRESHOLD: args.localEjectionThreshold.toString(),
343
+ AZTEC_SLASHING_LIFETIME_IN_ROUNDS: args.slashingLifetimeInRounds.toString(),
344
+ AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS: args.slashingExecutionDelayInRounds.toString(),
345
+ AZTEC_SLASHING_VETOER: args.slashingVetoer.toString(),
346
+ AZTEC_SLASHING_DISABLE_DURATION: args.slashingDisableDuration.toString(),
347
+ AZTEC_MANA_TARGET: args.manaTarget.toString(),
348
+ AZTEC_EXIT_DELAY_SECONDS: args.exitDelaySeconds.toString(),
349
+ AZTEC_PROVING_COST_PER_MANA: args.provingCostPerMana.toString(),
350
+ AZTEC_INITIAL_ETH_PER_FEE_ASSET: args.initialEthPerFeeAsset.toString(),
351
+ AZTEC_SLASHER_FLAVOR: args.slasherFlavor,
352
+ AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: args.slashingRoundSizeInEpochs.toString(),
353
+ AZTEC_SLASHING_QUORUM: args.slashingQuorum?.toString(),
354
+ AZTEC_SLASHING_OFFSET_IN_ROUNDS: args.slashingOffsetInRounds.toString(),
355
+ AZTEC_SLASH_AMOUNT_SMALL: args.slashAmountSmall.toString(),
356
+ AZTEC_SLASH_AMOUNT_MEDIUM: args.slashAmountMedium.toString(),
357
+ AZTEC_SLASH_AMOUNT_LARGE: args.slashAmountLarge.toString()
358
+ };
359
+ }
360
+ /**
361
+ * Deploys a new rollup, using the existing canonical version to derive certain values (addresses of assets etc).
362
+ */ export const deployRollupForUpgrade = async (privateKey, rpcUrl, chainId, registryAddress, args)=>{
363
+ // Use foundry-artifacts from l1-artifacts package
364
+ const l1ContractsPath = prepareL1ContractsForDeployment();
365
+ const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol';
366
+ await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
367
+ const forgeArgs = [
368
+ 'script',
369
+ FORGE_SCRIPT,
370
+ '--sig',
371
+ 'run()',
372
+ '--private-key',
373
+ privateKey,
374
+ '--rpc-url',
375
+ rpcUrl,
376
+ '--broadcast'
377
+ ];
378
+ const forgeEnv = {
379
+ FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
380
+ // Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol.
381
+ REGISTRY_ADDRESS: registryAddress.toString(),
382
+ NETWORK: getActiveNetworkName(),
383
+ ...getDeployRollupForUpgradeEnvVars(args)
384
+ };
385
+ const result = await runProcess('forge', forgeArgs, forgeEnv, l1ContractsPath);
386
+ if (!result) {
387
+ throw new Error('Forge script did not output deployment result');
388
+ }
389
+ const extendedClient = createExtendedL1Client([
390
+ rpcUrl
391
+ ], privateKey);
392
+ // Create RollupContract wrapper for the deployed rollup
393
+ const rollup = new RollupContract(extendedClient, result.rollupAddress);
394
+ return {
395
+ rollup,
396
+ slashFactoryAddress: result.slashFactoryAddress
397
+ };
398
+ };
@@ -0,0 +1,68 @@
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ import { type Logger } from '@aztec/foundation/log';
3
+ import { DateProvider } from '@aztec/foundation/timer';
4
+ import { type Abi, type ContractConstructorArgs, type Hex, type Narrow } from 'viem';
5
+ import { type ContractArtifacts, type Libraries, type VerificationLibraryEntry, type VerificationRecord } from './deploy_aztec_l1_contracts.js';
6
+ import { type L1TxUtilsConfig } from './l1_tx_utils/config.js';
7
+ import type { L1TxUtils } from './l1_tx_utils/l1_tx_utils.js';
8
+ import type { GasPrice, L1TxConfig, L1TxRequest } from './l1_tx_utils/types.js';
9
+ import type { ExtendedViemWalletClient } from './types.js';
10
+ export declare class L1Deployer {
11
+ readonly client: ExtendedViemWalletClient;
12
+ private acceleratedTestDeployments;
13
+ private logger;
14
+ private txUtilsConfig?;
15
+ private createVerificationJson;
16
+ private salt;
17
+ private txHashes;
18
+ readonly l1TxUtils: L1TxUtils;
19
+ readonly verificationRecords: VerificationRecord[];
20
+ constructor(client: ExtendedViemWalletClient, maybeSalt: number | undefined, dateProvider?: DateProvider, acceleratedTestDeployments?: boolean, logger?: Logger, txUtilsConfig?: L1TxUtilsConfig | undefined, createVerificationJson?: boolean);
21
+ deploy<const TAbi extends Abi>(params: ContractArtifacts<TAbi>, args?: ContractConstructorArgs<TAbi>, opts?: {
22
+ gasLimit?: bigint;
23
+ noSimulation?: boolean;
24
+ }): Promise<{
25
+ address: EthAddress;
26
+ existed: boolean;
27
+ }>;
28
+ waitForDeployments(): Promise<void>;
29
+ sendTransaction(tx: L1TxRequest, options?: L1TxConfig): Promise<{
30
+ txHash: Hex;
31
+ gasLimit: bigint;
32
+ gasPrice: GasPrice;
33
+ }>;
34
+ }
35
+ /**
36
+ * Helper function to deploy ETH contracts.
37
+ * @param walletClient - A viem WalletClient.
38
+ * @param publicClient - A viem PublicClient.
39
+ * @param abi - The ETH contract's ABI (as abitype's Abi).
40
+ * @param bytecode - The ETH contract's bytecode.
41
+ * @param args - Constructor arguments for the contract.
42
+ * @param salt - Optional salt for CREATE2 deployment (does not wait for deployment tx to be mined if set, does not send tx if contract already exists).
43
+ * @returns The ETH address the contract was deployed to.
44
+ */
45
+ export declare function deployL1Contract(extendedClient: ExtendedViemWalletClient, abi: Narrow<Abi | readonly unknown[]>, bytecode: Hex, args?: readonly unknown[], opts?: {
46
+ salt?: Hex;
47
+ libraries?: Libraries;
48
+ logger?: Logger;
49
+ l1TxUtils?: L1TxUtils;
50
+ gasLimit?: bigint;
51
+ acceleratedTestDeployments?: boolean;
52
+ noSimulation?: boolean;
53
+ }): Promise<{
54
+ address: EthAddress;
55
+ txHash: Hex | undefined;
56
+ deployedLibraries?: VerificationLibraryEntry[];
57
+ existed: boolean;
58
+ }>;
59
+ export declare function getExpectedAddress(abi: Narrow<Abi | readonly unknown[]>, bytecode: Hex, args: readonly unknown[], salt: Hex): {
60
+ address: `0x${string}`;
61
+ paddedSalt: `0x${string}`;
62
+ calldata: `0x${string}`;
63
+ };
64
+ export declare const deployUpgradePayload: (deployer: L1Deployer, addresses: {
65
+ registryAddress: EthAddress;
66
+ rollupAddress: EthAddress;
67
+ }) => Promise<EthAddress>;
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2wxX2NvbnRyYWN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVwbG95X2wxX2NvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFDTCxLQUFLLEdBQUcsRUFDUixLQUFLLHVCQUF1QixFQUM1QixLQUFLLEdBQUcsRUFDUixLQUFLLE1BQU0sRUFPWixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxLQUFLLGlCQUFpQixFQUV0QixLQUFLLFNBQVMsRUFDZCxLQUFLLHdCQUF3QixFQUM3QixLQUFLLGtCQUFrQixFQUN4QixNQUFNLGdDQUFnQyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBNkIsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRixPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRzNELHFCQUFhLFVBQVU7YUFPSCxNQUFNLEVBQUUsd0JBQXdCO0lBR2hELE9BQU8sQ0FBQywwQkFBMEI7SUFDbEMsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxzQkFBc0I7SUFaaEMsT0FBTyxDQUFDLElBQUksQ0FBa0I7SUFDOUIsT0FBTyxDQUFDLFFBQVEsQ0FBYTtJQUM3QixTQUFnQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3JDLFNBQWdCLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLENBQU07SUFFL0QsWUFDa0IsTUFBTSxFQUFFLHdCQUF3QixFQUNoRCxTQUFTLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDN0IsWUFBWSxHQUFFLFlBQWlDLEVBQ3ZDLDBCQUEwQixHQUFFLE9BQWUsRUFDM0MsTUFBTSxHQUFFLE1BQW1DLEVBQzNDLGFBQWEsQ0FBQyw2QkFBaUIsRUFDL0Isc0JBQXNCLEdBQUUsT0FBZSxFQVFoRDtJQUVLLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLEdBQUcsRUFDakMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUMvQixJQUFJLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFDcEMsSUFBSSxHQUFFO1FBQUUsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFBO0tBQU8sR0FDdkQsT0FBTyxDQUFDO1FBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQztRQUFDLE9BQU8sRUFBRSxPQUFPLENBQUE7S0FBRSxDQUFDLENBaURwRDtJQUVLLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FrQnhDO0lBRUQsZUFBZSxDQUNiLEVBQUUsRUFBRSxXQUFXLEVBQ2YsT0FBTyxDQUFDLEVBQUUsVUFBVSxHQUNuQixPQUFPLENBQUM7UUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDO1FBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUFDLFFBQVEsRUFBRSxRQUFRLENBQUE7S0FBRSxDQUFDLENBTWhFO0NBQ0Y7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBc0IsZ0JBQWdCLENBQ3BDLGNBQWMsRUFBRSx3QkFBd0IsRUFDeEMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsU0FBUyxPQUFPLEVBQUUsQ0FBQyxFQUNyQyxRQUFRLEVBQUUsR0FBRyxFQUNiLElBQUksR0FBRSxTQUFTLE9BQU8sRUFBTyxFQUM3QixJQUFJLEdBQUU7SUFDSixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUM7SUFDWCxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUM7SUFDdEIsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztJQUN0QixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDbEIsMEJBQTBCLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDckMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFDO0NBQ25CLEdBQ0wsT0FBTyxDQUFDO0lBQ1QsT0FBTyxFQUFFLFVBQVUsQ0FBQztJQUNwQixNQUFNLEVBQUUsR0FBRyxHQUFHLFNBQVMsQ0FBQztJQUN4QixpQkFBaUIsQ0FBQyxFQUFFLHdCQUF3QixFQUFFLENBQUM7SUFDL0MsT0FBTyxFQUFFLE9BQU8sQ0FBQztDQUNsQixDQUFDLENBMkpEO0FBRUQsd0JBQWdCLGtCQUFrQixDQUNoQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxTQUFTLE9BQU8sRUFBRSxDQUFDLEVBQ3JDLFFBQVEsRUFBRSxHQUFHLEVBQ2IsSUFBSSxFQUFFLFNBQVMsT0FBTyxFQUFFLEVBQ3hCLElBQUksRUFBRSxHQUFHOzs7O0VBZVY7QUFFRCxlQUFPLE1BQU0sb0JBQW9COzs7eUJBWWhDLENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy_l1_contract.d.ts","sourceRoot":"","sources":["../src/deploy_l1_contract.ts"],"names":[],"mappings":"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"}