@aztec/ethereum 0.0.1-commit.6d3c34e → 0.0.1-commit.72dcdcda8

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 (140) hide show
  1. package/dest/config.d.ts +15 -28
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +50 -57
  4. package/dest/contracts/empire_base.d.ts +3 -1
  5. package/dest/contracts/empire_base.d.ts.map +1 -1
  6. package/dest/contracts/empire_slashing_proposer.d.ts +3 -1
  7. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
  8. package/dest/contracts/empire_slashing_proposer.js +22 -15
  9. package/dest/contracts/fee_asset_handler.d.ts +1 -1
  10. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  11. package/dest/contracts/fee_asset_handler.js +2 -0
  12. package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
  13. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  14. package/dest/contracts/fee_asset_price_oracle.js +651 -0
  15. package/dest/contracts/governance.d.ts +3 -1
  16. package/dest/contracts/governance.d.ts.map +1 -1
  17. package/dest/contracts/governance.js +14 -4
  18. package/dest/contracts/governance_proposer.d.ts +3 -1
  19. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  20. package/dest/contracts/governance_proposer.js +13 -1
  21. package/dest/contracts/inbox.d.ts +18 -1
  22. package/dest/contracts/inbox.d.ts.map +1 -1
  23. package/dest/contracts/inbox.js +32 -1
  24. package/dest/contracts/index.d.ts +3 -1
  25. package/dest/contracts/index.d.ts.map +1 -1
  26. package/dest/contracts/index.js +2 -0
  27. package/dest/contracts/log.d.ts +13 -0
  28. package/dest/contracts/log.d.ts.map +1 -0
  29. package/dest/contracts/log.js +1 -0
  30. package/dest/contracts/multicall.d.ts +1 -1
  31. package/dest/contracts/multicall.d.ts.map +1 -1
  32. package/dest/contracts/multicall.js +2 -1
  33. package/dest/contracts/rollup.d.ts +35 -3
  34. package/dest/contracts/rollup.d.ts.map +1 -1
  35. package/dest/contracts/rollup.js +86 -6
  36. package/dest/contracts/tally_slashing_proposer.d.ts +1 -1
  37. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
  38. package/dest/contracts/tally_slashing_proposer.js +8 -1
  39. package/dest/deploy_aztec_l1_contracts.d.ts +7 -3
  40. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  41. package/dest/deploy_aztec_l1_contracts.js +56 -28
  42. package/dest/deploy_l1_contract.js +3 -3
  43. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  44. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  45. package/dest/generated/l1-contracts-defaults.js +30 -0
  46. package/dest/l1_artifacts.d.ts +2405 -473
  47. package/dest/l1_artifacts.d.ts.map +1 -1
  48. package/dest/l1_tx_utils/config.d.ts +7 -1
  49. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  50. package/dest/l1_tx_utils/config.js +14 -1
  51. package/dest/l1_tx_utils/constants.d.ts +1 -1
  52. package/dest/l1_tx_utils/constants.js +2 -2
  53. package/dest/l1_tx_utils/factory.d.ts +18 -10
  54. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  55. package/dest/l1_tx_utils/factory.js +17 -7
  56. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +1 -1
  57. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +1 -1
  58. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
  59. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
  60. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
  61. package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
  62. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
  63. package/dest/l1_tx_utils/index-blobs.js +2 -2
  64. package/dest/l1_tx_utils/index.d.ts +2 -1
  65. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  66. package/dest/l1_tx_utils/index.js +1 -0
  67. package/dest/l1_tx_utils/l1_tx_utils.d.ts +16 -7
  68. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  69. package/dest/l1_tx_utils/l1_tx_utils.js +47 -42
  70. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +3 -3
  71. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  72. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  73. package/dest/{test → l1_tx_utils}/tx_delayer.js +62 -34
  74. package/dest/publisher_manager.d.ts +3 -2
  75. package/dest/publisher_manager.d.ts.map +1 -1
  76. package/dest/publisher_manager.js +2 -2
  77. package/dest/queries.d.ts +2 -2
  78. package/dest/queries.d.ts.map +1 -1
  79. package/dest/queries.js +4 -1
  80. package/dest/test/eth_cheat_codes.d.ts +13 -1
  81. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  82. package/dest/test/index.d.ts +1 -3
  83. package/dest/test/index.d.ts.map +1 -1
  84. package/dest/test/index.js +0 -2
  85. package/dest/test/rollup_cheat_codes.d.ts +4 -2
  86. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  87. package/dest/test/rollup_cheat_codes.js +10 -1
  88. package/dest/test/start_anvil.d.ts +9 -3
  89. package/dest/test/start_anvil.d.ts.map +1 -1
  90. package/dest/test/start_anvil.js +128 -29
  91. package/dest/test/upgrade_utils.js +2 -2
  92. package/dest/utils.d.ts +2 -1
  93. package/dest/utils.d.ts.map +1 -1
  94. package/dest/utils.js +46 -0
  95. package/package.json +8 -9
  96. package/src/config.ts +58 -56
  97. package/src/contracts/README.md +157 -0
  98. package/src/contracts/empire_base.ts +2 -0
  99. package/src/contracts/empire_slashing_proposer.ts +22 -27
  100. package/src/contracts/fee_asset_handler.ts +2 -0
  101. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  102. package/src/contracts/governance.ts +13 -4
  103. package/src/contracts/governance_proposer.ts +10 -1
  104. package/src/contracts/inbox.ts +48 -1
  105. package/src/contracts/index.ts +2 -0
  106. package/src/contracts/log.ts +13 -0
  107. package/src/contracts/multicall.ts +5 -2
  108. package/src/contracts/rollup.ts +125 -11
  109. package/src/contracts/tally_slashing_proposer.ts +5 -1
  110. package/src/deploy_aztec_l1_contracts.ts +80 -35
  111. package/src/deploy_l1_contract.ts +3 -3
  112. package/src/generated/l1-contracts-defaults.ts +32 -0
  113. package/src/l1_tx_utils/config.ts +20 -0
  114. package/src/l1_tx_utils/constants.ts +2 -2
  115. package/src/l1_tx_utils/factory.ts +31 -31
  116. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +1 -1
  117. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +1 -1
  118. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
  119. package/src/l1_tx_utils/index-blobs.ts +2 -2
  120. package/src/l1_tx_utils/index.ts +1 -0
  121. package/src/l1_tx_utils/l1_tx_utils.ts +47 -32
  122. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +3 -3
  123. package/src/{test → l1_tx_utils}/tx_delayer.ts +78 -50
  124. package/src/publisher_manager.ts +4 -2
  125. package/src/queries.ts +3 -1
  126. package/src/test/index.ts +0 -2
  127. package/src/test/rollup_cheat_codes.ts +11 -2
  128. package/src/test/start_anvil.ts +146 -29
  129. package/src/test/upgrade_utils.ts +2 -2
  130. package/src/utils.ts +53 -0
  131. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  132. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  133. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  134. package/dest/test/delayed_tx_utils.d.ts +0 -13
  135. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  136. package/dest/test/delayed_tx_utils.js +0 -28
  137. package/dest/test/tx_delayer.d.ts +0 -36
  138. package/dest/test/tx_delayer.d.ts.map +0 -1
  139. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  140. package/src/test/delayed_tx_utils.ts +0 -52
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
2
  import { makeBackoff, retry } from '@aztec/foundation/retry';
3
3
  import { fileURLToPath } from '@aztec/foundation/url';
4
- import { createAnvil } from '@viem/anvil';
4
+ import { spawn } from 'child_process';
5
5
  import { dirname, resolve } from 'path';
6
6
  /**
7
7
  * Ensures there's a running Anvil instance and returns the RPC URL.
@@ -9,47 +9,146 @@ import { dirname, resolve } from 'path';
9
9
  const anvilBinary = resolve(dirname(fileURLToPath(import.meta.url)), '../../', 'scripts/anvil_kill_wrapper.sh');
10
10
  const logger = opts.log ? createLogger('ethereum:anvil') : undefined;
11
11
  const methodCalls = opts.captureMethodCalls ? [] : undefined;
12
- let port;
13
- // Start anvil.
14
- // We go via a wrapper script to ensure if the parent dies, anvil dies.
12
+ let detectedPort;
15
13
  const anvil = await retry(async ()=>{
16
- const anvil = createAnvil({
17
- anvilBinary,
18
- host: '127.0.0.1',
19
- port: opts.port ?? 8545,
20
- blockTime: opts.l1BlockTime,
21
- stopTimeout: 1000,
22
- accounts: opts.accounts ?? 20,
23
- gasLimit: 45_000_000n,
24
- chainId: opts.chainId ?? 31337
25
- });
26
- // Listen to the anvil output to get the port.
27
- const removeHandler = anvil.on('message', (message)=>{
28
- logger?.debug(message.trim());
29
- methodCalls?.push(...message.match(/eth_[^\s]+/g) || []);
30
- if (port === undefined && message.includes('Listening on')) {
31
- port = parseInt(message.match(/Listening on ([^:]+):(\d+)/)[2]);
14
+ const port = opts.port ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : 8545);
15
+ const args = [
16
+ '--host',
17
+ '127.0.0.1',
18
+ '--port',
19
+ String(port),
20
+ '--accounts',
21
+ String(opts.accounts ?? 20),
22
+ '--gas-limit',
23
+ String(45_000_000),
24
+ '--chain-id',
25
+ String(opts.chainId ?? 31337)
26
+ ];
27
+ if (opts.l1BlockTime !== undefined) {
28
+ args.push('--block-time', String(opts.l1BlockTime));
29
+ }
30
+ if (opts.hardfork !== undefined) {
31
+ args.push('--hardfork', opts.hardfork);
32
+ }
33
+ const child = spawn(anvilBinary, args, {
34
+ stdio: [
35
+ 'ignore',
36
+ 'pipe',
37
+ 'pipe'
38
+ ],
39
+ env: {
40
+ ...process.env,
41
+ RAYON_NUM_THREADS: '1'
32
42
  }
33
43
  });
34
- await anvil.start();
35
- if (!logger && !opts.captureMethodCalls) {
36
- removeHandler();
44
+ // Wait for "Listening on" or an early exit.
45
+ await new Promise((resolve, reject)=>{
46
+ let stderr = '';
47
+ const onStdout = (data)=>{
48
+ const text = data.toString();
49
+ logger?.debug(text.trim());
50
+ methodCalls?.push(...text.match(/eth_[^\s]+/g) || []);
51
+ if (detectedPort === undefined && text.includes('Listening on')) {
52
+ const match = text.match(/Listening on ([^:]+):(\d+)/);
53
+ if (match) {
54
+ detectedPort = parseInt(match[2]);
55
+ }
56
+ }
57
+ if (detectedPort !== undefined) {
58
+ child.stdout?.removeListener('data', onStdout);
59
+ child.stderr?.removeListener('data', onStderr);
60
+ child.removeListener('close', onClose);
61
+ resolve();
62
+ }
63
+ };
64
+ const onStderr = (data)=>{
65
+ stderr += data.toString();
66
+ logger?.debug(data.toString().trim());
67
+ };
68
+ const onClose = (code)=>{
69
+ child.stdout?.removeListener('data', onStdout);
70
+ child.stderr?.removeListener('data', onStderr);
71
+ reject(new Error(`Anvil exited with code ${code} before listening. stderr: ${stderr}`));
72
+ };
73
+ child.stdout?.on('data', onStdout);
74
+ child.stderr?.on('data', onStderr);
75
+ child.once('close', onClose);
76
+ });
77
+ // Continue piping for logging / method-call capture after startup.
78
+ if (logger || opts.captureMethodCalls) {
79
+ child.stdout?.on('data', (data)=>{
80
+ const text = data.toString();
81
+ logger?.debug(text.trim());
82
+ methodCalls?.push(...text.match(/eth_[^\s]+/g) || []);
83
+ });
84
+ child.stderr?.on('data', (data)=>{
85
+ logger?.debug(data.toString().trim());
86
+ });
87
+ } else {
88
+ // Consume streams so the child process doesn't block on full pipe buffers.
89
+ child.stdout?.resume();
90
+ child.stderr?.resume();
37
91
  }
38
- return anvil;
92
+ return child;
39
93
  }, 'Start anvil', makeBackoff([
40
94
  5,
41
95
  5,
42
96
  5
43
97
  ]));
44
- if (!port) {
98
+ if (!detectedPort) {
45
99
  throw new Error('Failed to start anvil');
46
100
  }
47
- // Monkeypatch the anvil instance to include the actually assigned port
48
- // Object.defineProperty(anvil, 'port', { value: port, writable: false });
101
+ const port = detectedPort;
102
+ let status = 'listening';
103
+ anvil.once('close', ()=>{
104
+ status = 'idle';
105
+ });
106
+ const stop = async ()=>{
107
+ if (status === 'idle') {
108
+ return;
109
+ }
110
+ await killChild(anvil);
111
+ };
112
+ const anvilObj = {
113
+ port,
114
+ host: '127.0.0.1',
115
+ get status () {
116
+ return status;
117
+ },
118
+ stop
119
+ };
49
120
  return {
50
- anvil,
121
+ anvil: anvilObj,
51
122
  methodCalls,
52
- stop: ()=>anvil.stop(),
123
+ stop,
53
124
  rpcUrl: `http://127.0.0.1:${port}`
54
125
  };
55
126
  }
127
+ /** Send SIGTERM, wait up to 5 s, then SIGKILL. All timers are always cleared. */ function killChild(child) {
128
+ return new Promise((resolve)=>{
129
+ if (child.exitCode !== null || child.killed) {
130
+ child.stdout?.destroy();
131
+ child.stderr?.destroy();
132
+ resolve();
133
+ return;
134
+ }
135
+ let killTimer;
136
+ const onClose = ()=>{
137
+ if (killTimer !== undefined) {
138
+ clearTimeout(killTimer);
139
+ }
140
+ // Destroy stdio streams so their PipeWrap handles don't keep the event loop alive.
141
+ child.stdout?.destroy();
142
+ child.stderr?.destroy();
143
+ resolve();
144
+ };
145
+ child.once('close', onClose);
146
+ child.kill('SIGTERM');
147
+ killTimer = setTimeout(()=>{
148
+ killTimer = undefined;
149
+ child.kill('SIGKILL');
150
+ }, 5000);
151
+ // Ensure the timer does not prevent Node from exiting.
152
+ killTimer.unref();
153
+ });
154
+ }
@@ -3,13 +3,13 @@ import { GovernanceAbi } from '@aztec/l1-artifacts/GovernanceAbi';
3
3
  import { TestERC20Abi as StakingAssetAbi } from '@aztec/l1-artifacts/TestERC20Abi';
4
4
  import { getContract } from 'viem';
5
5
  import { extractProposalIdFromLogs } from '../contracts/governance.js';
6
- import { createL1TxUtilsFromViemWallet } from '../l1_tx_utils/index.js';
6
+ import { createL1TxUtils } from '../l1_tx_utils/index.js';
7
7
  import { EthCheatCodes } from './eth_cheat_codes.js';
8
8
  export async function executeGovernanceProposal(proposalId, governance, voteAmount, privateKey, l1Client, rpcUrls, logger) {
9
9
  const proposal = await governance.read.getProposal([
10
10
  proposalId
11
11
  ]);
12
- const l1TxUtils = createL1TxUtilsFromViemWallet(l1Client);
12
+ const l1TxUtils = createL1TxUtils(l1Client);
13
13
  const waitL1Block = async ()=>{
14
14
  await l1TxUtils.sendAndMonitorTransaction({
15
15
  to: l1Client.account.address,
package/dest/utils.d.ts CHANGED
@@ -14,6 +14,7 @@ export declare class FormattedViemError extends Error {
14
14
  export declare function extractEvent<const TAbi extends Abi | readonly unknown[], TEventName extends ContractEventName<TAbi>, TEventType = DecodeEventLogReturnType<TAbi, TEventName, Hex[], undefined, true>>(logs: Log[], address: Hex, abi: TAbi, eventName: TEventName, filter?: (log: TEventType) => boolean, logger?: Logger): TEventType;
15
15
  export declare function tryExtractEvent<const TAbi extends Abi | readonly unknown[], TEventName extends ContractEventName<TAbi>, TEventType = DecodeEventLogReturnType<TAbi, TEventName, Hex[], undefined, true>>(logs: Log[], address: Hex, abi: TAbi, eventName: TEventName, filter?: (log: TEventType) => boolean, logger?: Logger): TEventType | undefined;
16
16
  export declare function prettyLogViemErrorMsg(err: any): any;
17
+ export declare function mergeAbis(abis: Abi[]): Abi;
17
18
  /**
18
19
  * Formats a Viem error into a FormattedViemError instance.
19
20
  * @param error - The error to format.
@@ -34,4 +35,4 @@ export declare function isBlobTransaction(tx: FormattedTransaction): tx is Forma
34
35
  * Calculates a percentile from an array of bigints
35
36
  */
36
37
  export declare function calculatePercentile(values: bigint[], percentile: number): bigint;
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRCxPQUFPLEVBQ0wsS0FBSyxHQUFHLEVBRVIsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyx3QkFBd0IsRUFDN0IsS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxHQUFHLEVBQ1IsS0FBSyxHQUFHLEVBR1QsTUFBTSxNQUFNLENBQUM7QUFFZCxNQUFNLFdBQVcsT0FBTztJQUN0QixXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ2hCLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDaEIsV0FBVyxFQUFFLEdBQUcsQ0FBQztJQUNqQixnQkFBZ0IsRUFBRSxNQUFNLENBQUM7Q0FDMUI7QUFFRCxxQkFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBQzNDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRXJCLFlBQVksT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFJaEQ7Q0FDRjtBQUVELHdCQUFnQixZQUFZLENBQzFCLEtBQUssQ0FBQyxJQUFJLFNBQVMsR0FBRyxHQUFHLFNBQVMsT0FBTyxFQUFFLEVBQzNDLFVBQVUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFDMUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUUvRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQ1gsT0FBTyxFQUFFLEdBQUcsRUFDWixHQUFHLEVBQUUsSUFBSSxFQUNULFNBQVMsRUFBRSxVQUFVLEVBQ3JCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsS0FBSyxPQUFPLEVBQ3JDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FDZCxVQUFVLENBTVo7QUFFRCx3QkFBZ0IsZUFBZSxDQUM3QixLQUFLLENBQUMsSUFBSSxTQUFTLEdBQUcsR0FBRyxTQUFTLE9BQU8sRUFBRSxFQUMzQyxVQUFVLFNBQVMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQzFDLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFFL0UsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUNYLE9BQU8sRUFBRSxHQUFHLEVBQ1osR0FBRyxFQUFFLElBQUksRUFDVCxTQUFTLEVBQUUsVUFBVSxFQUNyQixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLEtBQUssT0FBTyxFQUNyQyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQ2QsVUFBVSxHQUFHLFNBQVMsQ0FnQnhCO0FBRUQsd0JBQWdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxHQUFHLE9BVzdDO0FBMEJEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRSxHQUFlLEdBQUcsa0JBQWtCLENBd0VwRjtBQXlCRCx3QkFBZ0IscUJBQXFCLENBQUMsR0FBRyxFQUFFLEdBQUcsc0JBYTdDO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxvQkFBb0IsR0FBRyxFQUFFLElBQUksb0JBQW9CLEdBQUc7SUFDeEYsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLG1CQUFtQixFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUM7Q0FDckMsQ0FPQTtBQUVEOztHQUVHO0FBQ0gsd0JBQWdCLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FPaEYifQ==
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRCxPQUFPLEVBQ0wsS0FBSyxHQUFHLEVBR1IsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyx3QkFBd0IsRUFDN0IsS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxHQUFHLEVBQ1IsS0FBSyxHQUFHLEVBR1QsTUFBTSxNQUFNLENBQUM7QUFHZCxNQUFNLFdBQVcsT0FBTztJQUN0QixXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ2hCLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDaEIsV0FBVyxFQUFFLEdBQUcsQ0FBQztJQUNqQixnQkFBZ0IsRUFBRSxNQUFNLENBQUM7Q0FDMUI7QUFFRCxxQkFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBQzNDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRXJCLFlBQVksT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFJaEQ7Q0FDRjtBQUVELHdCQUFnQixZQUFZLENBQzFCLEtBQUssQ0FBQyxJQUFJLFNBQVMsR0FBRyxHQUFHLFNBQVMsT0FBTyxFQUFFLEVBQzNDLFVBQVUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFDMUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUUvRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQ1gsT0FBTyxFQUFFLEdBQUcsRUFDWixHQUFHLEVBQUUsSUFBSSxFQUNULFNBQVMsRUFBRSxVQUFVLEVBQ3JCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsS0FBSyxPQUFPLEVBQ3JDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FDZCxVQUFVLENBTVo7QUFFRCx3QkFBZ0IsZUFBZSxDQUM3QixLQUFLLENBQUMsSUFBSSxTQUFTLEdBQUcsR0FBRyxTQUFTLE9BQU8sRUFBRSxFQUMzQyxVQUFVLFNBQVMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQzFDLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFFL0UsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUNYLE9BQU8sRUFBRSxHQUFHLEVBQ1osR0FBRyxFQUFFLElBQUksRUFDVCxTQUFTLEVBQUUsVUFBVSxFQUNyQixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLEtBQUssT0FBTyxFQUNyQyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQ2QsVUFBVSxHQUFHLFNBQVMsQ0FnQnhCO0FBRUQsd0JBQWdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxHQUFHLE9BVzdDO0FBRUQsd0JBQWdCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQWUxQztBQTRERDs7Ozs7R0FLRztBQUNILHdCQUFnQixlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUUsR0FBZSxHQUFHLGtCQUFrQixDQXdFcEY7QUF5QkQsd0JBQWdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxHQUFHLHNCQWE3QztBQUVEOzs7R0FHRztBQUNILHdCQUFnQixpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEdBQUcsRUFBRSxJQUFJLG9CQUFvQixHQUFHO0lBQ3hGLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztJQUN6QixtQkFBbUIsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFDO0NBQ3JDLENBT0E7QUFFRDs7R0FFRztBQUNILHdCQUFnQixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBT2hGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EACL,KAAK,GAAG,EAER,KAAK,iBAAiB,EAEtB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,GAAG,EACR,KAAK,GAAG,EAGT,MAAM,MAAM,CAAC;AAEd,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,EAAE,CAAC;IAChB,WAAW,EAAE,EAAE,CAAC;IAChB,WAAW,EAAE,GAAG,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;IAErB,YAAY,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,EAIhD;CACF;AAED,wBAAgB,YAAY,CAC1B,KAAK,CAAC,IAAI,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,EAC3C,UAAU,SAAS,iBAAiB,CAAC,IAAI,CAAC,EAC1C,UAAU,GAAG,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAE/E,IAAI,EAAE,GAAG,EAAE,EACX,OAAO,EAAE,GAAG,EACZ,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,UAAU,EACrB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,EACrC,MAAM,CAAC,EAAE,MAAM,GACd,UAAU,CAMZ;AAED,wBAAgB,eAAe,CAC7B,KAAK,CAAC,IAAI,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,EAC3C,UAAU,SAAS,iBAAiB,CAAC,IAAI,CAAC,EAC1C,UAAU,GAAG,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAE/E,IAAI,EAAE,GAAG,EAAE,EACX,OAAO,EAAE,GAAG,EACZ,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,UAAU,EACrB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,EACrC,MAAM,CAAC,EAAE,MAAM,GACd,UAAU,GAAG,SAAS,CAgBxB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,OAW7C;AA0BD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAE,GAAe,GAAG,kBAAkB,CAwEpF;AAyBD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,sBAa7C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,oBAAoB,GAAG,EAAE,IAAI,oBAAoB,GAAG;IACxF,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,SAAS,GAAG,EAAE,CAAC;CACrC,CAOA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAOhF"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EACL,KAAK,GAAG,EAGR,KAAK,iBAAiB,EAEtB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,GAAG,EACR,KAAK,GAAG,EAGT,MAAM,MAAM,CAAC;AAGd,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,EAAE,CAAC;IAChB,WAAW,EAAE,EAAE,CAAC;IAChB,WAAW,EAAE,GAAG,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;IAErB,YAAY,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,EAIhD;CACF;AAED,wBAAgB,YAAY,CAC1B,KAAK,CAAC,IAAI,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,EAC3C,UAAU,SAAS,iBAAiB,CAAC,IAAI,CAAC,EAC1C,UAAU,GAAG,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAE/E,IAAI,EAAE,GAAG,EAAE,EACX,OAAO,EAAE,GAAG,EACZ,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,UAAU,EACrB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,EACrC,MAAM,CAAC,EAAE,MAAM,GACd,UAAU,CAMZ;AAED,wBAAgB,eAAe,CAC7B,KAAK,CAAC,IAAI,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,EAC3C,UAAU,SAAS,iBAAiB,CAAC,IAAI,CAAC,EAC1C,UAAU,GAAG,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAE/E,IAAI,EAAE,GAAG,EAAE,EACX,OAAO,EAAE,GAAG,EACZ,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,UAAU,EACrB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,EACrC,MAAM,CAAC,EAAE,MAAM,GACd,UAAU,GAAG,SAAS,CAgBxB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,OAW7C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAe1C;AA4DD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAE,GAAe,GAAG,kBAAkB,CAwEpF;AAyBD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,sBAa7C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,oBAAoB,GAAG,EAAE,IAAI,oBAAoB,GAAG;IACxF,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,SAAS,GAAG,EAAE,CAAC;CACrC,CAOA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAOhF"}
package/dest/utils.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { ErrorsAbi } from '@aztec/l1-artifacts/ErrorsAbi';
2
2
  import { BaseError, ContractFunctionRevertedError, decodeErrorResult, decodeEventLog } from 'viem';
3
+ import { formatAbiItem, formatAbiParams } from 'viem/utils';
3
4
  export class FormattedViemError extends Error {
4
5
  metaMessages;
5
6
  constructor(message, metaMessages){
@@ -46,6 +47,51 @@ export function prettyLogViemErrorMsg(err) {
46
47
  }
47
48
  return err?.message ?? err;
48
49
  }
50
+ export function mergeAbis(abis) {
51
+ let merged = [];
52
+ const seen = new Set();
53
+ for (const abi of abis){
54
+ for (const item of abi){
55
+ const key = getAbiItemKey(item);
56
+ if (!seen.has(key)) {
57
+ seen.add(key);
58
+ merged = [
59
+ ...merged,
60
+ item
61
+ ];
62
+ }
63
+ }
64
+ }
65
+ return merged;
66
+ }
67
+ function getAbiItemKey(item) {
68
+ if (item.type === 'function') {
69
+ const signature = formatAbiItem(item);
70
+ const outputs = formatAbiParams(item.outputs);
71
+ const stateMutability = typeof item.stateMutability === 'string' ? item.stateMutability : '';
72
+ return `function:${signature}:${outputs}:${stateMutability}`;
73
+ }
74
+ if (item.type === 'event') {
75
+ const signature = formatAbiItem(item);
76
+ const indexed = (item.inputs ?? []).map((input)=>input.indexed ? '1' : '0').join('');
77
+ const anonymous = item.anonymous ? 'anonymous' : 'not-anonymous';
78
+ return `event:${signature}:${indexed}:${anonymous}`;
79
+ }
80
+ if (item.type === 'error') {
81
+ const signature = formatAbiItem(item);
82
+ return `error:${signature}`;
83
+ }
84
+ if (item.type === 'constructor') {
85
+ const inputs = formatAbiParams(item.inputs);
86
+ const stateMutability = typeof item.stateMutability === 'string' ? item.stateMutability : '';
87
+ return `constructor::${inputs}:${stateMutability}`;
88
+ }
89
+ if (item.type === 'fallback' || item.type === 'receive') {
90
+ const stateMutability = typeof item.stateMutability === 'string' ? item.stateMutability : '';
91
+ return `${item.type}:::${stateMutability}`;
92
+ }
93
+ return 'unknown';
94
+ }
49
95
  function getNestedErrorData(error) {
50
96
  // If nothing, bail
51
97
  if (!error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/ethereum",
3
- "version": "0.0.1-commit.6d3c34e",
3
+ "version": "0.0.1-commit.72dcdcda8",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./account": "./dest/account.js",
@@ -40,7 +40,8 @@
40
40
  "build": "yarn clean && ../scripts/tsc.sh",
41
41
  "build:dev": "../scripts/tsc.sh --watch",
42
42
  "clean": "rm -rf ./dest .tsbuildinfo",
43
- "start:dev": "concurrently -k \"tsgo -b -w\" \"nodemon --watch dest --exec yarn start\"",
43
+ "generate": "./scripts/generate.sh",
44
+ "start:dev": "concurrently -k \"../scripts/tsc.sh --watch\" \"nodemon --watch dest --exec yarn start\"",
44
45
  "start": "node ./dest/index.js",
45
46
  "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
46
47
  "proposer-address": "node ./dest/cli/forwarder_address.js"
@@ -49,11 +50,10 @@
49
50
  "../package.common.json"
50
51
  ],
51
52
  "dependencies": {
52
- "@aztec/blob-lib": "0.0.1-commit.6d3c34e",
53
- "@aztec/constants": "0.0.1-commit.6d3c34e",
54
- "@aztec/foundation": "0.0.1-commit.6d3c34e",
55
- "@aztec/l1-artifacts": "0.0.1-commit.6d3c34e",
56
- "@viem/anvil": "^0.0.10",
53
+ "@aztec/blob-lib": "0.0.1-commit.72dcdcda8",
54
+ "@aztec/constants": "0.0.1-commit.72dcdcda8",
55
+ "@aztec/foundation": "0.0.1-commit.72dcdcda8",
56
+ "@aztec/l1-artifacts": "0.0.1-commit.72dcdcda8",
57
57
  "dotenv": "^16.0.3",
58
58
  "lodash.chunk": "^4.2.0",
59
59
  "lodash.pickby": "^4.5.0",
@@ -67,8 +67,7 @@
67
67
  "@types/jest": "^30.0.0",
68
68
  "@types/lodash.pickby": "^4",
69
69
  "@types/node": "^22.15.17",
70
- "@typescript/native-preview": "7.0.0-dev.20251126.1",
71
- "@viem/anvil": "^0.0.10",
70
+ "@typescript/native-preview": "7.0.0-dev.20260113.1",
72
71
  "get-port": "^7.1.0",
73
72
  "jest": "^30.0.0",
74
73
  "jest-mock-extended": "^4.0.0",
package/src/config.ts CHANGED
@@ -1,15 +1,17 @@
1
1
  import {
2
2
  type ConfigMappingsType,
3
- // type NetworkNames,
4
3
  bigintConfigHelper,
5
4
  booleanConfigHelper,
6
5
  enumConfigHelper,
7
6
  getConfigFromMappings,
7
+ getDefaultConfig,
8
8
  numberConfigHelper,
9
+ omitConfigMappings,
9
10
  optionalNumberConfigHelper,
10
11
  } from '@aztec/foundation/config';
11
12
  import { EthAddress } from '@aztec/foundation/eth-address';
12
13
 
14
+ import { l1ContractsDefaultEnv } from './generated/l1-contracts-defaults.js';
13
15
  import { type L1TxUtilsConfig, l1TxUtilsConfigMappings } from './l1_tx_utils/config.js';
14
16
 
15
17
  export type GenesisStateConfig = {
@@ -68,124 +70,108 @@ export type L1ContractsConfig = {
68
70
  governanceProposerQuorum?: number;
69
71
  /** Governance proposing round size */
70
72
  governanceProposerRoundSize: number;
73
+ /** Governance voting duration in seconds (only for local/devnet/next-net, default 3600) */
74
+ governanceVotingDuration?: number;
71
75
  /** The mana target for the rollup */
72
76
  manaTarget: bigint;
73
77
  /** The proving cost per mana */
74
78
  provingCostPerMana: bigint;
79
+ /** The initial ETH per fee asset price (with 1e12 precision) */
80
+ initialEthPerFeeAsset: bigint;
75
81
  /** The number of seconds to wait for an exit */
76
82
  exitDelaySeconds: number;
77
83
  } & L1TxUtilsConfig;
78
84
 
79
- export const DefaultL1ContractsConfig = {
80
- ethereumSlotDuration: 12,
81
- aztecSlotDuration: 36,
82
- aztecEpochDuration: 32,
83
- aztecTargetCommitteeSize: 48,
84
- lagInEpochsForValidatorSet: 2,
85
- lagInEpochsForRandao: 2, // For PROD, this value should be > lagInEpochsForValidatorSet
86
- inboxLag: 1, // Default inbox lag to prevent sequencer DOS attacks
87
- aztecProofSubmissionEpochs: 1, // you have a full epoch to submit a proof after the epoch to prove ends
88
- activationThreshold: 100n * 10n ** 18n,
89
- ejectionThreshold: 50n * 10n ** 18n,
90
- localEjectionThreshold: 98n * 10n ** 18n,
91
- slashAmountSmall: 10n * 10n ** 18n,
92
- slashAmountMedium: 20n * 10n ** 18n,
93
- slashAmountLarge: 50n * 10n ** 18n,
94
- slashingRoundSizeInEpochs: 4,
95
- slashingLifetimeInRounds: 5,
96
- slashingExecutionDelayInRounds: 0, // round N may be submitted in round N + 1
97
- slashingVetoer: EthAddress.ZERO,
98
- governanceProposerRoundSize: 300,
99
- manaTarget: BigInt(100e6),
100
- provingCostPerMana: BigInt(100),
101
- exitDelaySeconds: 2 * 24 * 60 * 60,
102
- slasherFlavor: 'tally' as const,
103
- slashingOffsetInRounds: 2,
104
- slashingDisableDuration: 5 * 24 * 60 * 60, // 5 days in seconds
105
- } satisfies L1ContractsConfig;
106
-
85
+ /**
86
+ * Config mappings for L1ContractsConfig.
87
+ * Default values come from generated l1-contracts-defaults.json (source: defaults.yml).
88
+ * Real deployments use forge scripts which require explicit env vars (vm.envUint).
89
+ */
107
90
  export const l1ContractsConfigMappings: ConfigMappingsType<L1ContractsConfig> = {
108
91
  ethereumSlotDuration: {
109
92
  env: 'ETHEREUM_SLOT_DURATION',
110
93
  description: 'How many seconds an L1 slot lasts.',
111
- ...numberConfigHelper(DefaultL1ContractsConfig.ethereumSlotDuration),
94
+ ...numberConfigHelper(l1ContractsDefaultEnv.ETHEREUM_SLOT_DURATION),
112
95
  },
113
96
  aztecSlotDuration: {
114
97
  env: 'AZTEC_SLOT_DURATION',
115
98
  description: 'How many seconds an L2 slots lasts (must be multiple of ethereum slot duration).',
116
- ...numberConfigHelper(DefaultL1ContractsConfig.aztecSlotDuration),
99
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_SLOT_DURATION),
117
100
  },
118
101
  aztecEpochDuration: {
119
102
  env: 'AZTEC_EPOCH_DURATION',
120
- description: `How many L2 slots an epoch lasts (maximum AZTEC_MAX_EPOCH_DURATION).`,
121
- ...numberConfigHelper(DefaultL1ContractsConfig.aztecEpochDuration),
103
+ description: `How many L2 slots an epoch lasts (maximum MAX_CHECKPOINTS_PER_EPOCH).`,
104
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_EPOCH_DURATION),
122
105
  },
123
106
  aztecTargetCommitteeSize: {
124
107
  env: 'AZTEC_TARGET_COMMITTEE_SIZE',
125
108
  description: 'The target validator committee size.',
126
- ...numberConfigHelper(DefaultL1ContractsConfig.aztecTargetCommitteeSize),
109
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_TARGET_COMMITTEE_SIZE),
127
110
  },
128
111
  lagInEpochsForValidatorSet: {
129
112
  env: 'AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET',
130
113
  description: 'The number of epochs to lag behind the current epoch for validator selection.',
131
- ...numberConfigHelper(DefaultL1ContractsConfig.lagInEpochsForValidatorSet),
114
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET),
132
115
  },
133
116
  lagInEpochsForRandao: {
134
117
  env: 'AZTEC_LAG_IN_EPOCHS_FOR_RANDAO',
135
118
  description: 'The number of epochs to lag behind the current epoch for randao selection.',
136
- ...numberConfigHelper(DefaultL1ContractsConfig.lagInEpochsForRandao),
119
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_LAG_IN_EPOCHS_FOR_RANDAO),
137
120
  },
138
121
  inboxLag: {
139
122
  env: 'AZTEC_INBOX_LAG',
140
123
  description: 'The number of checkpoints to lag in the inbox (prevents sequencer DOS attacks).',
141
- ...numberConfigHelper(DefaultL1ContractsConfig.inboxLag),
124
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_INBOX_LAG),
142
125
  },
143
126
  aztecProofSubmissionEpochs: {
144
127
  env: 'AZTEC_PROOF_SUBMISSION_EPOCHS',
145
128
  description: 'The number of epochs after an epoch ends that proofs are still accepted.',
146
- ...numberConfigHelper(DefaultL1ContractsConfig.aztecProofSubmissionEpochs),
129
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_PROOF_SUBMISSION_EPOCHS),
147
130
  },
148
131
  activationThreshold: {
149
132
  env: 'AZTEC_ACTIVATION_THRESHOLD',
150
133
  description: 'The deposit amount for a validator',
151
- ...bigintConfigHelper(DefaultL1ContractsConfig.activationThreshold),
134
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_ACTIVATION_THRESHOLD)),
152
135
  },
153
136
  ejectionThreshold: {
154
137
  env: 'AZTEC_EJECTION_THRESHOLD',
155
138
  description: 'The minimum stake for a validator.',
156
- ...bigintConfigHelper(DefaultL1ContractsConfig.ejectionThreshold),
139
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_EJECTION_THRESHOLD)),
157
140
  },
158
141
  localEjectionThreshold: {
159
142
  env: 'AZTEC_LOCAL_EJECTION_THRESHOLD',
160
143
  description:
161
144
  'The local ejection threshold for a validator. Stricter than ejectionThreshold but local to a specific rollup',
162
- ...bigintConfigHelper(DefaultL1ContractsConfig.localEjectionThreshold),
145
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_LOCAL_EJECTION_THRESHOLD)),
163
146
  },
164
147
  slashingOffsetInRounds: {
165
148
  env: 'AZTEC_SLASHING_OFFSET_IN_ROUNDS',
166
149
  description:
167
150
  'How many slashing rounds back we slash (ie when slashing in round N, we slash for offenses committed during epochs of round N-offset)',
168
- ...numberConfigHelper(DefaultL1ContractsConfig.slashingOffsetInRounds),
151
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_SLASHING_OFFSET_IN_ROUNDS),
169
152
  },
170
153
  slasherFlavor: {
171
154
  env: 'AZTEC_SLASHER_FLAVOR',
172
155
  description: 'Type of slasher proposer (empire, tally, or none)',
173
- ...enumConfigHelper(['empire', 'tally', 'none'] as const, DefaultL1ContractsConfig.slasherFlavor),
156
+ ...enumConfigHelper(
157
+ ['empire', 'tally', 'none'] as const,
158
+ l1ContractsDefaultEnv.AZTEC_SLASHER_FLAVOR as 'empire' | 'tally' | 'none',
159
+ ),
174
160
  },
175
161
  slashAmountSmall: {
176
162
  env: 'AZTEC_SLASH_AMOUNT_SMALL',
177
163
  description: 'Small slashing amount for light offenses',
178
- ...bigintConfigHelper(DefaultL1ContractsConfig.slashAmountSmall),
164
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_SLASH_AMOUNT_SMALL)),
179
165
  },
180
166
  slashAmountMedium: {
181
167
  env: 'AZTEC_SLASH_AMOUNT_MEDIUM',
182
168
  description: 'Medium slashing amount for moderate offenses',
183
- ...bigintConfigHelper(DefaultL1ContractsConfig.slashAmountMedium),
169
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_SLASH_AMOUNT_MEDIUM)),
184
170
  },
185
171
  slashAmountLarge: {
186
172
  env: 'AZTEC_SLASH_AMOUNT_LARGE',
187
173
  description: 'Large slashing amount for severe offenses',
188
- ...bigintConfigHelper(DefaultL1ContractsConfig.slashAmountLarge),
174
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_SLASH_AMOUNT_LARGE)),
189
175
  },
190
176
  slashingQuorum: {
191
177
  env: 'AZTEC_SLASHING_QUORUM',
@@ -195,28 +181,28 @@ export const l1ContractsConfigMappings: ConfigMappingsType<L1ContractsConfig> =
195
181
  slashingRoundSizeInEpochs: {
196
182
  env: 'AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS',
197
183
  description: 'The slashing round size',
198
- ...numberConfigHelper(DefaultL1ContractsConfig.slashingRoundSizeInEpochs),
184
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS),
199
185
  },
200
186
  slashingLifetimeInRounds: {
201
187
  env: 'AZTEC_SLASHING_LIFETIME_IN_ROUNDS',
202
188
  description: 'The slashing lifetime in rounds',
203
- ...numberConfigHelper(DefaultL1ContractsConfig.slashingLifetimeInRounds),
189
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_SLASHING_LIFETIME_IN_ROUNDS),
204
190
  },
205
191
  slashingExecutionDelayInRounds: {
206
192
  env: 'AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS',
207
193
  description: 'The slashing execution delay in rounds',
208
- ...numberConfigHelper(DefaultL1ContractsConfig.slashingExecutionDelayInRounds),
194
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS),
209
195
  },
210
196
  slashingVetoer: {
211
197
  env: 'AZTEC_SLASHING_VETOER',
212
198
  description: 'The slashing vetoer',
213
199
  parseEnv: (val: string) => EthAddress.fromString(val),
214
- defaultValue: DefaultL1ContractsConfig.slashingVetoer,
200
+ defaultValue: EthAddress.fromString(l1ContractsDefaultEnv.AZTEC_SLASHING_VETOER),
215
201
  },
216
202
  slashingDisableDuration: {
217
203
  env: 'AZTEC_SLASHING_DISABLE_DURATION',
218
204
  description: 'How long slashing can be disabled for in seconds when vetoer disables it',
219
- ...numberConfigHelper(DefaultL1ContractsConfig.slashingDisableDuration),
205
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_SLASHING_DISABLE_DURATION),
220
206
  },
221
207
  governanceProposerQuorum: {
222
208
  env: 'AZTEC_GOVERNANCE_PROPOSER_QUORUM',
@@ -226,26 +212,42 @@ export const l1ContractsConfigMappings: ConfigMappingsType<L1ContractsConfig> =
226
212
  governanceProposerRoundSize: {
227
213
  env: 'AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE',
228
214
  description: 'The governance proposing round size',
229
- ...numberConfigHelper(DefaultL1ContractsConfig.governanceProposerRoundSize),
215
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE),
216
+ },
217
+ governanceVotingDuration: {
218
+ env: 'AZTEC_GOVERNANCE_VOTING_DURATION',
219
+ description: 'Governance voting duration in seconds (only for local/devnet/next-net)',
220
+ ...numberConfigHelper(3600), // 1 hour default, not in generated defaults as it's deployment-time only
230
221
  },
231
222
  manaTarget: {
232
223
  env: 'AZTEC_MANA_TARGET',
233
224
  description: 'The mana target for the rollup',
234
- ...bigintConfigHelper(DefaultL1ContractsConfig.manaTarget),
225
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_MANA_TARGET)),
235
226
  },
236
227
  provingCostPerMana: {
237
228
  env: 'AZTEC_PROVING_COST_PER_MANA',
238
229
  description: 'The proving cost per mana',
239
- ...bigintConfigHelper(DefaultL1ContractsConfig.provingCostPerMana),
230
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_PROVING_COST_PER_MANA)),
231
+ },
232
+ initialEthPerFeeAsset: {
233
+ env: 'AZTEC_INITIAL_ETH_PER_FEE_ASSET',
234
+ description: 'The initial ETH per fee asset price (with 1e12 precision)',
235
+ ...bigintConfigHelper(BigInt(l1ContractsDefaultEnv.AZTEC_INITIAL_ETH_PER_FEE_ASSET)),
240
236
  },
241
237
  exitDelaySeconds: {
242
238
  env: 'AZTEC_EXIT_DELAY_SECONDS',
243
239
  description: 'The delay before a validator can exit the set',
244
- ...numberConfigHelper(DefaultL1ContractsConfig.exitDelaySeconds),
240
+ ...numberConfigHelper(l1ContractsDefaultEnv.AZTEC_EXIT_DELAY_SECONDS),
245
241
  },
246
- ...l1TxUtilsConfigMappings,
242
+ ...omitConfigMappings(l1TxUtilsConfigMappings, ['ethereumSlotDuration']),
247
243
  };
248
244
 
245
+ /**
246
+ * Default L1 contracts configuration derived from l1ContractsConfigMappings.
247
+ * Source of truth: spartan/environments/defaults.yml -> defaults.l1-contracts
248
+ */
249
+ export const DefaultL1ContractsConfig = getDefaultConfig(l1ContractsConfigMappings);
250
+
249
251
  export const genesisStateConfigMappings: ConfigMappingsType<GenesisStateConfig> = {
250
252
  testAccounts: {
251
253
  env: 'TEST_ACCOUNTS',