@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,312 @@
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ import { createLogger } from '@aztec/foundation/log';
3
+ import { DateProvider } from '@aztec/foundation/timer';
4
+ import { concatHex, encodeAbiParameters, encodeDeployData, getContractAddress, numberToHex, padHex } from 'viem';
5
+ import { DEPLOYER_ADDRESS } from './deploy_aztec_l1_contracts.js';
6
+ import { RegisterNewRollupVersionPayloadArtifact } from './l1_artifacts.js';
7
+ import { getL1TxUtilsConfigEnvVars } from './l1_tx_utils/config.js';
8
+ import { createL1TxUtilsFromViemWallet } from './l1_tx_utils/factory.js';
9
+ import { formatViemError } from './utils.js';
10
+ export class L1Deployer {
11
+ client;
12
+ acceleratedTestDeployments;
13
+ logger;
14
+ txUtilsConfig;
15
+ createVerificationJson;
16
+ salt;
17
+ txHashes;
18
+ l1TxUtils;
19
+ verificationRecords;
20
+ constructor(client, maybeSalt, dateProvider = new DateProvider(), acceleratedTestDeployments = false, logger = createLogger('L1Deployer'), txUtilsConfig, createVerificationJson = false){
21
+ this.client = client;
22
+ this.acceleratedTestDeployments = acceleratedTestDeployments;
23
+ this.logger = logger;
24
+ this.txUtilsConfig = txUtilsConfig;
25
+ this.createVerificationJson = createVerificationJson;
26
+ this.txHashes = [];
27
+ this.verificationRecords = [];
28
+ this.salt = maybeSalt ? padHex(numberToHex(maybeSalt), {
29
+ size: 32
30
+ }) : undefined;
31
+ this.l1TxUtils = createL1TxUtilsFromViemWallet(this.client, {
32
+ logger: this.logger,
33
+ dateProvider
34
+ }, {
35
+ ...this.txUtilsConfig,
36
+ debugMaxGasLimit: acceleratedTestDeployments
37
+ });
38
+ }
39
+ async deploy(params, args, opts = {}) {
40
+ this.logger.debug(`Deploying ${params.name} contract`, {
41
+ args
42
+ });
43
+ try {
44
+ const { txHash, address, deployedLibraries, existed } = await deployL1Contract(this.client, params.contractAbi, params.contractBytecode, args ?? [], {
45
+ salt: this.salt,
46
+ libraries: params.libraries,
47
+ logger: this.logger,
48
+ l1TxUtils: this.l1TxUtils,
49
+ acceleratedTestDeployments: this.acceleratedTestDeployments,
50
+ gasLimit: opts.gasLimit,
51
+ noSimulation: opts.noSimulation
52
+ });
53
+ if (txHash) {
54
+ this.txHashes.push(txHash);
55
+ }
56
+ this.logger.debug(`Deployed ${params.name} at ${address}`, {
57
+ args
58
+ });
59
+ if (this.createVerificationJson) {
60
+ // Encode constructor args for verification
61
+ let constructorArgsHex = '0x';
62
+ try {
63
+ const abiItem = params.contractAbi.find((x)=>x && x.type === 'constructor');
64
+ const inputDefs = abiItem && Array.isArray(abiItem.inputs) ? abiItem.inputs : [];
65
+ constructorArgsHex = inputDefs.length > 0 ? encodeAbiParameters(inputDefs, args ?? []) : '0x';
66
+ } catch {
67
+ constructorArgsHex = '0x';
68
+ }
69
+ this.verificationRecords.push({
70
+ name: params.name,
71
+ address: address.toString(),
72
+ constructorArgsHex,
73
+ libraries: deployedLibraries ?? []
74
+ });
75
+ }
76
+ return {
77
+ address,
78
+ existed
79
+ };
80
+ } catch (error) {
81
+ throw new Error(`Failed to deploy ${params.name}`, {
82
+ cause: formatViemError(error)
83
+ });
84
+ }
85
+ }
86
+ async waitForDeployments() {
87
+ if (this.acceleratedTestDeployments) {
88
+ this.logger.info('Accelerated test deployments - skipping waiting for deployments');
89
+ return;
90
+ }
91
+ if (this.txHashes.length === 0) {
92
+ return;
93
+ }
94
+ this.logger.verbose(`Waiting for ${this.txHashes.length} transactions to be mined`, {
95
+ txHashes: this.txHashes
96
+ });
97
+ const receipts = await Promise.all(this.txHashes.map((txHash)=>this.client.waitForTransactionReceipt({
98
+ hash: txHash
99
+ })));
100
+ const failed = receipts.filter((r)=>r.status !== 'success');
101
+ if (failed.length > 0) {
102
+ throw new Error(`Some deployment txs have failed: ${failed.map((f)=>f.transactionHash).join(', ')}`);
103
+ }
104
+ this.logger.info('All transactions mined successfully', {
105
+ txHashes: this.txHashes
106
+ });
107
+ }
108
+ sendTransaction(tx, options) {
109
+ return this.l1TxUtils.sendTransaction(tx, options).then(({ txHash, state })=>({
110
+ txHash,
111
+ gasLimit: state.gasLimit,
112
+ gasPrice: state.gasPrice
113
+ }));
114
+ }
115
+ }
116
+ /**
117
+ * Helper function to deploy ETH contracts.
118
+ * @param walletClient - A viem WalletClient.
119
+ * @param publicClient - A viem PublicClient.
120
+ * @param abi - The ETH contract's ABI (as abitype's Abi).
121
+ * @param bytecode - The ETH contract's bytecode.
122
+ * @param args - Constructor arguments for the contract.
123
+ * @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).
124
+ * @returns The ETH address the contract was deployed to.
125
+ */ export async function deployL1Contract(extendedClient, abi, bytecode, args = [], opts = {}) {
126
+ let txHash = undefined;
127
+ let resultingAddress = undefined;
128
+ const deployedLibraries = [];
129
+ const { salt: saltFromOpts, libraries, logger, gasLimit, acceleratedTestDeployments, noSimulation } = opts;
130
+ let { l1TxUtils } = opts;
131
+ if (!l1TxUtils) {
132
+ const config = getL1TxUtilsConfigEnvVars();
133
+ l1TxUtils = createL1TxUtilsFromViemWallet(extendedClient, {
134
+ logger
135
+ }, {
136
+ ...config,
137
+ debugMaxGasLimit: acceleratedTestDeployments
138
+ });
139
+ }
140
+ if (libraries) {
141
+ // Note that this does NOT work well for linked libraries having linked libraries.
142
+ // Verify that all link references have corresponding code
143
+ for(const linkRef in libraries.linkReferences){
144
+ for(const contractName in libraries.linkReferences[linkRef]){
145
+ if (!libraries.libraryCode[contractName]) {
146
+ throw new Error(`Missing library code for ${contractName}`);
147
+ }
148
+ }
149
+ }
150
+ const replacements = {};
151
+ const libraryTxs = [];
152
+ for(const libraryName in libraries?.libraryCode){
153
+ const lib = libraries.libraryCode[libraryName];
154
+ const { libraries: _libraries, ...optsWithoutLibraries } = opts;
155
+ const { address, txHash } = await deployL1Contract(extendedClient, lib.contractAbi, lib.contractBytecode, [], optsWithoutLibraries);
156
+ // Log deployed library name and address for easier verification/triage
157
+ logger?.verbose(`Linked library deployed`, {
158
+ library: libraryName,
159
+ address: address.toString(),
160
+ txHash
161
+ });
162
+ if (txHash) {
163
+ libraryTxs.push(txHash);
164
+ }
165
+ // Try to find the source file for this library from linkReferences
166
+ let fileNameForLibrary = undefined;
167
+ for(const fileName in libraries.linkReferences){
168
+ if (libraries.linkReferences[fileName] && libraries.linkReferences[fileName][libraryName]) {
169
+ fileNameForLibrary = fileName;
170
+ break;
171
+ }
172
+ }
173
+ if (fileNameForLibrary) {
174
+ deployedLibraries.push({
175
+ file: fileNameForLibrary,
176
+ contract: libraryName,
177
+ address: address.toString()
178
+ });
179
+ }
180
+ for(const linkRef in libraries.linkReferences){
181
+ for(const contractName in libraries.linkReferences[linkRef]){
182
+ // If the library name matches the one we just deployed, we replace it.
183
+ if (contractName !== libraryName) {
184
+ continue;
185
+ }
186
+ // We read the first instance to figure out what we are to replace.
187
+ const start = 2 + 2 * libraries.linkReferences[linkRef][contractName][0].start;
188
+ const length = 2 * libraries.linkReferences[linkRef][contractName][0].length;
189
+ const toReplace = bytecode.slice(start, start + length);
190
+ replacements[toReplace] = address;
191
+ }
192
+ }
193
+ }
194
+ const escapeRegExp = (s)=>{
195
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // Escape special characters
196
+ };
197
+ for(const toReplace in replacements){
198
+ const replacement = replacements[toReplace].toString().slice(2);
199
+ bytecode = bytecode.replace(new RegExp(escapeRegExp(toReplace), 'g'), replacement);
200
+ }
201
+ // Reth fails gas estimation if the deployed contract attempts to call a library that is not yet deployed,
202
+ // so we wait for all library deployments to be mined before deploying the contract.
203
+ // However, if we are in fast mode or using debugMaxGasLimit, we will skip simulation, so we can skip waiting.
204
+ if (libraryTxs.length > 0 && !acceleratedTestDeployments) {
205
+ logger?.verbose(`Awaiting for linked libraries to be deployed`);
206
+ await Promise.all(libraryTxs.map((txHash)=>extendedClient.waitForTransactionReceipt({
207
+ hash: txHash
208
+ })));
209
+ } else {
210
+ logger?.verbose(`Skipping waiting for linked libraries to be deployed ${acceleratedTestDeployments ? '(accelerated test deployments)' : ''}`);
211
+ }
212
+ }
213
+ let existed = false;
214
+ if (saltFromOpts) {
215
+ logger?.info(`Deploying contract with salt ${saltFromOpts}`);
216
+ const { address, paddedSalt: salt, calldata } = getExpectedAddress(abi, bytecode, args, saltFromOpts);
217
+ resultingAddress = address;
218
+ const existing = await extendedClient.getCode({
219
+ address: resultingAddress
220
+ });
221
+ if (existing === undefined || existing === '0x') {
222
+ if (!noSimulation) {
223
+ try {
224
+ await l1TxUtils.simulate({
225
+ to: DEPLOYER_ADDRESS,
226
+ data: concatHex([
227
+ salt,
228
+ calldata
229
+ ]),
230
+ gas: gasLimit
231
+ });
232
+ } catch (err) {
233
+ logger?.error(`Failed to simulate deployment tx using universal deployer`, err);
234
+ await l1TxUtils.simulate({
235
+ to: null,
236
+ data: encodeDeployData({
237
+ abi,
238
+ bytecode,
239
+ args
240
+ }),
241
+ gas: gasLimit
242
+ });
243
+ }
244
+ }
245
+ const res = await l1TxUtils.sendTransaction({
246
+ to: DEPLOYER_ADDRESS,
247
+ data: concatHex([
248
+ salt,
249
+ calldata
250
+ ])
251
+ }, {
252
+ gasLimit
253
+ });
254
+ txHash = res.txHash;
255
+ logger?.verbose(`Deployed contract with salt ${salt} to address ${resultingAddress} in tx ${txHash}.`);
256
+ } else {
257
+ logger?.verbose(`Skipping existing deployment of contract with salt ${salt} to address ${resultingAddress}`);
258
+ existed = true;
259
+ }
260
+ } else {
261
+ const deployData = encodeDeployData({
262
+ abi,
263
+ bytecode,
264
+ args
265
+ });
266
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
267
+ to: null,
268
+ data: deployData
269
+ }, {
270
+ gasLimit
271
+ });
272
+ txHash = receipt.transactionHash;
273
+ resultingAddress = receipt.contractAddress;
274
+ if (!resultingAddress) {
275
+ throw new Error(`No contract address found in receipt: ${JSON.stringify(receipt, (_, val)=>typeof val === 'bigint' ? String(val) : val)}`);
276
+ }
277
+ }
278
+ return {
279
+ address: EthAddress.fromString(resultingAddress),
280
+ txHash,
281
+ deployedLibraries,
282
+ existed
283
+ };
284
+ }
285
+ export function getExpectedAddress(abi, bytecode, args, salt) {
286
+ const paddedSalt = padHex(salt, {
287
+ size: 32
288
+ });
289
+ const calldata = encodeDeployData({
290
+ abi,
291
+ bytecode,
292
+ args
293
+ });
294
+ const address = getContractAddress({
295
+ from: DEPLOYER_ADDRESS,
296
+ salt: paddedSalt,
297
+ bytecode: calldata,
298
+ opcode: 'CREATE2'
299
+ });
300
+ return {
301
+ address,
302
+ paddedSalt,
303
+ calldata
304
+ };
305
+ }
306
+ export const deployUpgradePayload = async (deployer, addresses)=>{
307
+ const payloadAddress = (await deployer.deploy(RegisterNewRollupVersionPayloadArtifact, [
308
+ addresses.registryAddress.toString(),
309
+ addresses.rollupAddress.toString()
310
+ ])).address;
311
+ return payloadAddress;
312
+ };
@@ -0,0 +1,32 @@
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ import type { Logger } from '@aztec/foundation/log';
3
+ import type { ExtendedViemWalletClient } from './types.js';
4
+ export declare const FORWARDER_SOLIDITY_SOURCE = "\ncontract ForwarderProxy {\n function forward(address target, bytes calldata data) external payable returns (bytes memory) {\n (bool success, bytes memory result) = target.call{value: msg.value}(data);\n require(success, \"call failed\");\n return result;\n }\n}";
5
+ export declare const FORWARDER_ABI: readonly [{
6
+ readonly inputs: readonly [{
7
+ readonly internalType: "address";
8
+ readonly name: "target";
9
+ readonly type: "address";
10
+ }, {
11
+ readonly internalType: "bytes";
12
+ readonly name: "data";
13
+ readonly type: "bytes";
14
+ }];
15
+ readonly name: "forward";
16
+ readonly outputs: readonly [{
17
+ readonly internalType: "bytes";
18
+ readonly name: "";
19
+ readonly type: "bytes";
20
+ }];
21
+ readonly stateMutability: "payable";
22
+ readonly type: "function";
23
+ }];
24
+ export declare const FORWARDER_BYTECODE: `0x${string}`;
25
+ /**
26
+ * Deploys the forwarder proxy contract to L1.
27
+ * @param client - The L1 client to use for deployment
28
+ * @param logger - Optional logger
29
+ * @returns The deployed forwarder contract address
30
+ */
31
+ export declare function deployForwarderProxy(client: ExtendedViemWalletClient, logger?: Logger): Promise<EthAddress>;
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yd2FyZGVyX3Byb3h5LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZm9yd2FyZGVyX3Byb3h5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVFwRCxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzRCxlQUFPLE1BQU0seUJBQXlCLHVSQU9wQyxDQUFDO0FBRUgsZUFBTyxNQUFNLGFBQWE7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlCaEIsQ0FBQztBQUVYLGVBQU8sTUFBTSxrQkFBa0IsZUFDbzZELENBQUM7QUFRcDhEOzs7OztHQUtHO0FBQ0gsd0JBQXNCLG9CQUFvQixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQVVqSCJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarder_proxy.d.ts","sourceRoot":"","sources":["../src/forwarder_proxy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAQpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,yBAAyB,uRAOpC,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;EAyBhB,CAAC;AAEX,eAAO,MAAM,kBAAkB,eACo6D,CAAC;AAQp8D;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,wBAAwB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAUjH"}
@@ -0,0 +1,93 @@
1
+ /* eslint-disable no-console */ import { createLogger } from '@aztec/foundation/log';
2
+ import { DateProvider } from '@aztec/foundation/timer';
3
+ import { extractChain } from 'viem';
4
+ import { anvil, mainnet, sepolia } from 'viem/chains';
5
+ import { L1Deployer } from './deploy_l1_contract.js';
6
+ export const FORWARDER_SOLIDITY_SOURCE = `
7
+ contract ForwarderProxy {
8
+ function forward(address target, bytes calldata data) external payable returns (bytes memory) {
9
+ (bool success, bytes memory result) = target.call{value: msg.value}(data);
10
+ require(success, "call failed");
11
+ return result;
12
+ }
13
+ }`;
14
+ export const FORWARDER_ABI = [
15
+ {
16
+ inputs: [
17
+ {
18
+ internalType: 'address',
19
+ name: 'target',
20
+ type: 'address'
21
+ },
22
+ {
23
+ internalType: 'bytes',
24
+ name: 'data',
25
+ type: 'bytes'
26
+ }
27
+ ],
28
+ name: 'forward',
29
+ outputs: [
30
+ {
31
+ internalType: 'bytes',
32
+ name: '',
33
+ type: 'bytes'
34
+ }
35
+ ],
36
+ stateMutability: 'payable',
37
+ type: 'function'
38
+ }
39
+ ];
40
+ export const FORWARDER_BYTECODE = '0x6080604052348015600e575f5ffd5b506103bf8061001c5f395ff3fe60806040526004361061001d575f3560e01c80636fadcf7214610021575b5f5ffd5b61003b600480360381019061003691906101d0565b610051565b604051610048919061029d565b60405180910390f35b60605f5f8573ffffffffffffffffffffffffffffffffffffffff1634868660405161007d9291906102f9565b5f6040518083038185875af1925050503d805f81146100b7576040519150601f19603f3d011682016040523d82523d5f602084013e6100bc565b606091505b509150915081610101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f89061036b565b60405180910390fd5b80925050509392505050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61013e82610115565b9050919050565b61014e81610134565b8114610158575f5ffd5b50565b5f8135905061016981610145565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126101905761018f61016f565b5b8235905067ffffffffffffffff8111156101ad576101ac610173565b5b6020830191508360018202830111156101c9576101c8610177565b5b9250929050565b5f5f5f604084860312156101e7576101e661010d565b5b5f6101f48682870161015b565b935050602084013567ffffffffffffffff81111561021557610214610111565b5b6102218682870161017b565b92509250509250925092565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61026f8261022d565b6102798185610237565b9350610289818560208601610247565b61029281610255565b840191505092915050565b5f6020820190508181035f8301526102b58184610265565b905092915050565b5f81905092915050565b828183375f83830152505050565b5f6102e083856102bd565b93506102ed8385846102c7565b82840190509392505050565b5f6103058284866102d5565b91508190509392505050565b5f82825260208201905092915050565b7f63616c6c206661696c65640000000000000000000000000000000000000000005f82015250565b5f610355600b83610311565b915061036082610321565b602082019050919050565b5f6020820190508181035f83015261038281610349565b905091905056fea26469706673582212209a1c8cf638cf1569450a731ef9457b862f9e153b0a46e5555429bcf4dffd999564736f6c634300081e0033';
41
+ const FORWARDER_ARTIFACT = {
42
+ name: 'Forwarder',
43
+ contractAbi: FORWARDER_ABI,
44
+ contractBytecode: FORWARDER_BYTECODE
45
+ };
46
+ /**
47
+ * Deploys the forwarder proxy contract to L1.
48
+ * @param client - The L1 client to use for deployment
49
+ * @param logger - Optional logger
50
+ * @returns The deployed forwarder contract address
51
+ */ export async function deployForwarderProxy(client, logger) {
52
+ const log = logger ?? createLogger('ethereum:forwarder');
53
+ const nonce = await client.getTransactionCount({
54
+ address: client.account.address
55
+ });
56
+ const deployer = new L1Deployer(client, nonce, new DateProvider(), false, log, undefined, false);
57
+ log.info('Deploying forwarder proxy contract');
58
+ const deployment = await deployer.deploy(FORWARDER_ARTIFACT, []);
59
+ log.info(`Forwarder proxy deployed at ${deployment.address.toString()}`);
60
+ return deployment.address;
61
+ }
62
+ /**
63
+ * Main function for deploying the forwarder proxy from command line.
64
+ * Usage: node forwarder_proxy.js <private_key> <rpc_url>
65
+ */ async function main() {
66
+ const args = process.argv.slice(2);
67
+ if (args.length < 3) {
68
+ console.error('Usage: node forwarder_proxy.js <private_key> <rpc_url> <chain_id>');
69
+ process.exit(1);
70
+ }
71
+ const [privateKey, rpcUrl, chainId] = args;
72
+ // Dynamic import to avoid pulling in dependencies at module load time
73
+ const { createExtendedL1Client } = await import('./client.js');
74
+ const client = createExtendedL1Client([
75
+ rpcUrl
76
+ ], privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`, extractChain({
77
+ chains: [
78
+ mainnet,
79
+ sepolia,
80
+ anvil
81
+ ],
82
+ id: parseInt(chainId)
83
+ }));
84
+ const address = await deployForwarderProxy(client);
85
+ console.log(`Forwarder proxy deployed at: ${address.toString()}`);
86
+ }
87
+ // Only run main if this is the entry point
88
+ if (import.meta.url === `file://${process.argv[1]}`) {
89
+ main().catch((err)=>{
90
+ console.error('Failed to deploy forwarder proxy:', err);
91
+ process.exit(1);
92
+ });
93
+ }
@@ -0,0 +1,30 @@
1
+ /** Default L1 contracts configuration values from network-defaults.yml */
2
+ export declare const l1ContractsDefaultEnv: {
3
+ readonly ETHEREUM_SLOT_DURATION: 12;
4
+ readonly AZTEC_SLOT_DURATION: 36;
5
+ readonly AZTEC_EPOCH_DURATION: 32;
6
+ readonly AZTEC_TARGET_COMMITTEE_SIZE: 48;
7
+ readonly AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 2;
8
+ readonly AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: 2;
9
+ readonly AZTEC_ACTIVATION_THRESHOLD: 100000000000000000000;
10
+ readonly AZTEC_EJECTION_THRESHOLD: 50000000000000000000;
11
+ readonly AZTEC_LOCAL_EJECTION_THRESHOLD: 98000000000000000000;
12
+ readonly AZTEC_EXIT_DELAY_SECONDS: 172800;
13
+ readonly AZTEC_INBOX_LAG: 1;
14
+ readonly AZTEC_PROOF_SUBMISSION_EPOCHS: 1;
15
+ readonly AZTEC_MANA_TARGET: 100000000;
16
+ readonly AZTEC_PROVING_COST_PER_MANA: 100;
17
+ readonly AZTEC_INITIAL_ETH_PER_FEE_ASSET: 10000000;
18
+ readonly AZTEC_SLASHER_FLAVOR: "tally";
19
+ readonly AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: 4;
20
+ readonly AZTEC_SLASHING_LIFETIME_IN_ROUNDS: 5;
21
+ readonly AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS: 0;
22
+ readonly AZTEC_SLASHING_OFFSET_IN_ROUNDS: 2;
23
+ readonly AZTEC_SLASHING_VETOER: "0x0000000000000000000000000000000000000000";
24
+ readonly AZTEC_SLASHING_DISABLE_DURATION: 432000;
25
+ readonly AZTEC_SLASH_AMOUNT_SMALL: 10000000000000000000;
26
+ readonly AZTEC_SLASH_AMOUNT_MEDIUM: 20000000000000000000;
27
+ readonly AZTEC_SLASH_AMOUNT_LARGE: 50000000000000000000;
28
+ readonly AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: 300;
29
+ };
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDEtY29udHJhY3RzLWRlZmF1bHRzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhdGVkL2wxLWNvbnRyYWN0cy1kZWZhdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSwwRUFBMEU7QUFDMUUsZUFBTyxNQUFNLHFCQUFxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMkJ4QixDQUFDIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1-contracts-defaults.d.ts","sourceRoot":"","sources":["../../src/generated/l1-contracts-defaults.ts"],"names":[],"mappings":"AAGA,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BxB,CAAC"}
@@ -0,0 +1,30 @@
1
+ // Auto-generated from spartan/environments/network-defaults.yml
2
+ // Do not edit manually - run yarn generate to regenerate
3
+ /** Default L1 contracts configuration values from network-defaults.yml */ export const l1ContractsDefaultEnv = {
4
+ ETHEREUM_SLOT_DURATION: 12,
5
+ AZTEC_SLOT_DURATION: 36,
6
+ AZTEC_EPOCH_DURATION: 32,
7
+ AZTEC_TARGET_COMMITTEE_SIZE: 48,
8
+ AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 2,
9
+ AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: 2,
10
+ AZTEC_ACTIVATION_THRESHOLD: 100000000000000000000,
11
+ AZTEC_EJECTION_THRESHOLD: 50000000000000000000,
12
+ AZTEC_LOCAL_EJECTION_THRESHOLD: 98000000000000000000,
13
+ AZTEC_EXIT_DELAY_SECONDS: 172800,
14
+ AZTEC_INBOX_LAG: 1,
15
+ AZTEC_PROOF_SUBMISSION_EPOCHS: 1,
16
+ AZTEC_MANA_TARGET: 100000000,
17
+ AZTEC_PROVING_COST_PER_MANA: 100,
18
+ AZTEC_INITIAL_ETH_PER_FEE_ASSET: 10000000,
19
+ AZTEC_SLASHER_FLAVOR: 'tally',
20
+ AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: 4,
21
+ AZTEC_SLASHING_LIFETIME_IN_ROUNDS: 5,
22
+ AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS: 0,
23
+ AZTEC_SLASHING_OFFSET_IN_ROUNDS: 2,
24
+ AZTEC_SLASHING_VETOER: '0x0000000000000000000000000000000000000000',
25
+ AZTEC_SLASHING_DISABLE_DURATION: 432000,
26
+ AZTEC_SLASH_AMOUNT_SMALL: 10000000000000000000,
27
+ AZTEC_SLASH_AMOUNT_MEDIUM: 20000000000000000000,
28
+ AZTEC_SLASH_AMOUNT_LARGE: 50000000000000000000,
29
+ AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: 300
30
+ };