@aztec/ethereum 0.0.1-commit.6d3c34e → 0.0.1-commit.9372f48

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 (83) hide show
  1. package/dest/config.d.ts +15 -28
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +46 -55
  4. package/dest/contracts/empire_slashing_proposer.d.ts +1 -1
  5. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
  6. package/dest/contracts/empire_slashing_proposer.js +13 -15
  7. package/dest/contracts/fee_asset_handler.d.ts +1 -1
  8. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  9. package/dest/contracts/fee_asset_handler.js +2 -0
  10. package/dest/contracts/governance.d.ts +3 -1
  11. package/dest/contracts/governance.d.ts.map +1 -1
  12. package/dest/contracts/governance.js +11 -1
  13. package/dest/contracts/governance_proposer.d.ts +1 -1
  14. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  15. package/dest/contracts/governance_proposer.js +4 -1
  16. package/dest/contracts/inbox.d.ts +18 -1
  17. package/dest/contracts/inbox.d.ts.map +1 -1
  18. package/dest/contracts/inbox.js +32 -1
  19. package/dest/contracts/index.d.ts +2 -1
  20. package/dest/contracts/index.d.ts.map +1 -1
  21. package/dest/contracts/index.js +1 -0
  22. package/dest/contracts/log.d.ts +13 -0
  23. package/dest/contracts/log.d.ts.map +1 -0
  24. package/dest/contracts/log.js +1 -0
  25. package/dest/contracts/multicall.d.ts +1 -1
  26. package/dest/contracts/multicall.d.ts.map +1 -1
  27. package/dest/contracts/multicall.js +2 -1
  28. package/dest/contracts/rollup.d.ts +34 -3
  29. package/dest/contracts/rollup.d.ts.map +1 -1
  30. package/dest/contracts/rollup.js +71 -3
  31. package/dest/contracts/tally_slashing_proposer.d.ts +1 -1
  32. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
  33. package/dest/contracts/tally_slashing_proposer.js +8 -1
  34. package/dest/deploy_aztec_l1_contracts.d.ts +6 -1
  35. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  36. package/dest/deploy_aztec_l1_contracts.js +20 -7
  37. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  38. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  39. package/dest/generated/l1-contracts-defaults.js +30 -0
  40. package/dest/l1_artifacts.d.ts +1394 -471
  41. package/dest/l1_artifacts.d.ts.map +1 -1
  42. package/dest/l1_tx_utils/constants.d.ts +1 -1
  43. package/dest/l1_tx_utils/constants.js +2 -2
  44. package/dest/l1_tx_utils/l1_tx_utils.js +6 -6
  45. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +3 -3
  46. package/dest/publisher_manager.d.ts +3 -2
  47. package/dest/publisher_manager.d.ts.map +1 -1
  48. package/dest/publisher_manager.js +2 -2
  49. package/dest/queries.d.ts +2 -2
  50. package/dest/queries.d.ts.map +1 -1
  51. package/dest/queries.js +4 -1
  52. package/dest/test/eth_cheat_codes.d.ts +13 -1
  53. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  54. package/dest/test/rollup_cheat_codes.d.ts +4 -2
  55. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  56. package/dest/test/rollup_cheat_codes.js +10 -1
  57. package/dest/test/start_anvil.js +1 -1
  58. package/dest/utils.d.ts +2 -1
  59. package/dest/utils.d.ts.map +1 -1
  60. package/dest/utils.js +46 -0
  61. package/package.json +8 -7
  62. package/src/config.ts +55 -54
  63. package/src/contracts/README.md +157 -0
  64. package/src/contracts/empire_slashing_proposer.ts +16 -27
  65. package/src/contracts/fee_asset_handler.ts +2 -0
  66. package/src/contracts/governance.ts +10 -1
  67. package/src/contracts/governance_proposer.ts +4 -1
  68. package/src/contracts/inbox.ts +48 -1
  69. package/src/contracts/index.ts +1 -0
  70. package/src/contracts/log.ts +13 -0
  71. package/src/contracts/multicall.ts +5 -2
  72. package/src/contracts/rollup.ts +100 -4
  73. package/src/contracts/tally_slashing_proposer.ts +5 -1
  74. package/src/deploy_aztec_l1_contracts.ts +21 -7
  75. package/src/generated/l1-contracts-defaults.ts +32 -0
  76. package/src/l1_tx_utils/constants.ts +2 -2
  77. package/src/l1_tx_utils/l1_tx_utils.ts +6 -6
  78. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +3 -3
  79. package/src/publisher_manager.ts +4 -2
  80. package/src/queries.ts +3 -1
  81. package/src/test/rollup_cheat_codes.ts +11 -2
  82. package/src/test/start_anvil.ts +1 -1
  83. package/src/utils.ts +53 -0
@@ -27,7 +27,7 @@ import { jsonRpc } from 'viem/nonce';
27
27
  import type { ViemClient } from '../types.js';
28
28
  import { formatViemError } from '../utils.js';
29
29
  import { type L1TxUtilsConfig, l1TxUtilsConfigMappings } from './config.js';
30
- import { LARGE_GAS_LIMIT } from './constants.js';
30
+ import { MAX_L1_TX_LIMIT } from './constants.js';
31
31
  import type { IL1TxMetrics, IL1TxStore } from './interfaces.js';
32
32
  import { ReadOnlyL1TxUtils } from './readonly_l1_tx_utils.js';
33
33
  import {
@@ -207,7 +207,7 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
207
207
 
208
208
  let gasLimit: bigint;
209
209
  if (this.debugMaxGasLimit) {
210
- gasLimit = LARGE_GAS_LIMIT;
210
+ gasLimit = MAX_L1_TX_LIMIT;
211
211
  } else if (gasConfig.gasLimit) {
212
212
  gasLimit = gasConfig.gasLimit;
213
213
  } else {
@@ -283,7 +283,7 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
283
283
  return { txHash, state: l1TxState };
284
284
  } catch (err: any) {
285
285
  const viemError = formatViemError(err, request.abi);
286
- this.logger.error(`Failed to send L1 transaction`, viemError, {
286
+ this.logger.error(`Failed to send L1 transaction: ${viemError.message}`, viemError, {
287
287
  request: pick(request, 'to', 'value'),
288
288
  });
289
289
  throw viemError;
@@ -631,12 +631,12 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
631
631
  from: request.from ?? this.getSenderAddress().toString(),
632
632
  maxFeePerGas: gasPrice.maxFeePerGas,
633
633
  maxPriorityFeePerGas: gasPrice.maxPriorityFeePerGas,
634
- gas: request.gas ?? LARGE_GAS_LIMIT,
634
+ gas: request.gas ?? MAX_L1_TX_LIMIT,
635
635
  };
636
636
 
637
637
  if (!request.gas && !gasConfig.ignoreBlockGasLimit) {
638
- // LARGE_GAS_LIMIT is set as call.gas, increase block gasLimit
639
- blockOverrides.gasLimit = LARGE_GAS_LIMIT * 2n;
638
+ // MAX_L1_TX_LIMIT is set as call.gas, ensure block gasLimit is sufficient
639
+ blockOverrides.gasLimit = MAX_L1_TX_LIMIT;
640
640
  }
641
641
 
642
642
  return this._simulate(call, blockOverrides, stateOverrides, gasConfig, abi);
@@ -27,7 +27,7 @@ import type { ViemClient } from '../types.js';
27
27
  import { type L1TxUtilsConfig, defaultL1TxUtilsConfig, l1TxUtilsConfigMappings } from './config.js';
28
28
  import {
29
29
  BLOCK_TIME_MS,
30
- LARGE_GAS_LIMIT,
30
+ MAX_L1_TX_LIMIT,
31
31
  MIN_BLOB_REPLACEMENT_BUMP_PERCENTAGE,
32
32
  MIN_REPLACEMENT_BUMP_PERCENTAGE,
33
33
  WEI_CONST,
@@ -249,7 +249,7 @@ export class ReadOnlyL1TxUtils {
249
249
  ...request,
250
250
  ..._blobInputs,
251
251
  maxFeePerBlobGas: gasPrice.maxFeePerBlobGas!,
252
- gas: LARGE_GAS_LIMIT,
252
+ gas: MAX_L1_TX_LIMIT,
253
253
  blockTag: 'latest',
254
254
  });
255
255
 
@@ -258,7 +258,7 @@ export class ReadOnlyL1TxUtils {
258
258
  initialEstimate = await this.client.estimateGas({
259
259
  account,
260
260
  ...request,
261
- gas: LARGE_GAS_LIMIT,
261
+ gas: MAX_L1_TX_LIMIT,
262
262
  blockTag: 'latest',
263
263
  });
264
264
  this.logger?.trace(`Estimated gas for non-blob tx: ${initialEstimate}`);
@@ -1,5 +1,5 @@
1
1
  import { pick } from '@aztec/foundation/collection';
2
- import { createLogger } from '@aztec/foundation/log';
2
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
3
 
4
4
  import { L1TxUtils, TxUtilsState } from './l1_tx_utils/index.js';
5
5
 
@@ -28,13 +28,15 @@ const busyStates: TxUtilsState[] = [
28
28
  export type PublisherFilter<UtilsType extends L1TxUtils> = (utils: UtilsType) => boolean;
29
29
 
30
30
  export class PublisherManager<UtilsType extends L1TxUtils = L1TxUtils> {
31
- private log = createLogger('publisher:manager');
31
+ private log: Logger;
32
32
  private config: { publisherAllowInvalidStates?: boolean };
33
33
 
34
34
  constructor(
35
35
  private publishers: UtilsType[],
36
36
  config: { publisherAllowInvalidStates?: boolean },
37
+ bindings?: LoggerBindings,
37
38
  ) {
39
+ this.log = createLogger('publisher:manager', bindings);
38
40
  this.log.info(`PublisherManager initialized with ${publishers.length} publishers.`);
39
41
  this.publishers = publishers;
40
42
  this.config = pick(config, 'publisherAllowInvalidStates');
package/src/queries.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { EthAddress } from '@aztec/foundation/eth-address';
2
2
 
3
- import type { L1ContractsConfig } from './config.js';
3
+ import { DefaultL1ContractsConfig, type L1ContractsConfig } from './config.js';
4
4
  import { ReadOnlyGovernanceContract } from './contracts/governance.js';
5
5
  import { GovernanceProposerContract } from './contracts/governance_proposer.js';
6
6
  import { InboxContract } from './contracts/inbox.js';
@@ -99,6 +99,7 @@ export async function getL1ContractsConfig(
99
99
  inboxLag: Number(inboxLag),
100
100
  governanceProposerQuorum: Number(governanceProposerQuorum),
101
101
  governanceProposerRoundSize: Number(governanceProposerRoundSize),
102
+ governanceVotingDuration: DefaultL1ContractsConfig.governanceVotingDuration,
102
103
  activationThreshold,
103
104
  ejectionThreshold,
104
105
  localEjectionThreshold,
@@ -118,5 +119,6 @@ export async function getL1ContractsConfig(
118
119
  slashAmountSmall: slashingAmounts[0],
119
120
  slashAmountMedium: slashingAmounts[1],
120
121
  slashAmountLarge: slashingAmounts[2],
122
+ initialEthPerFeeAsset: DefaultL1ContractsConfig.initialEthPerFeeAsset,
121
123
  };
122
124
  }
@@ -56,6 +56,15 @@ export class RollupCheatCodes {
56
56
  return SlotNumber.fromBigInt(await this.rollup.read.getSlotAt([ts]));
57
57
  }
58
58
 
59
+ /** Returns the number of seconds until the start of the given slot based on L1 block timestamp. */
60
+ public async getSecondsUntilSlot(slot: SlotNumber): Promise<number> {
61
+ const [currentTimestamp, targetTimestamp] = await Promise.all([
62
+ this.client.getBlock().then(b => BigInt(b.timestamp)),
63
+ this.rollup.read.getTimestampForSlot([BigInt(slot)]),
64
+ ]);
65
+ return Math.max(0, Number(targetTimestamp - currentTimestamp));
66
+ }
67
+
59
68
  /** Returns the current epoch */
60
69
  public async getEpoch(): Promise<EpochNumber> {
61
70
  const slotNumber = await this.getSlot();
@@ -124,7 +133,7 @@ export class RollupCheatCodes {
124
133
  } = {},
125
134
  ) {
126
135
  const { epochDuration: slotsInEpoch } = await this.getConfig();
127
- const slotNumber = SlotNumber(epoch * Number(slotsInEpoch));
136
+ const slotNumber = SlotNumber(Number(epoch) * Number(slotsInEpoch));
128
137
  const timestamp = (await this.rollup.read.getTimestampForSlot([BigInt(slotNumber)])) + BigInt(opts.offset ?? 0);
129
138
  try {
130
139
  await this.ethCheatCodes.warp(Number(timestamp), { ...opts, silent: true, resetBlockInterval: true });
@@ -176,7 +185,7 @@ export class RollupCheatCodes {
176
185
  * Marks the specified checkpoint (or latest if none) as proven
177
186
  * @param maybeCheckpointNumber - The checkpoint number to mark as proven (defaults to latest pending)
178
187
  */
179
- public markAsProven(maybeCheckpointNumber?: number | bigint) {
188
+ public markAsProven(maybeCheckpointNumber?: CheckpointNumber) {
180
189
  return this.ethCheatCodes.execWithPausedAnvil(async () => {
181
190
  const tipsBefore = await this.getTips();
182
191
  const { pending, proven } = tipsBefore;
@@ -33,7 +33,7 @@ export async function startAnvil(
33
33
  const anvil = createAnvil({
34
34
  anvilBinary,
35
35
  host: '127.0.0.1',
36
- port: opts.port ?? 8545,
36
+ port: opts.port ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : 8545),
37
37
  blockTime: opts.l1BlockTime,
38
38
  stopTimeout: 1000,
39
39
  accounts: opts.accounts ?? 20,
package/src/utils.ts CHANGED
@@ -4,6 +4,7 @@ import { ErrorsAbi } from '@aztec/l1-artifacts/ErrorsAbi';
4
4
 
5
5
  import {
6
6
  type Abi,
7
+ type AbiItem,
7
8
  BaseError,
8
9
  type ContractEventName,
9
10
  ContractFunctionRevertedError,
@@ -14,6 +15,7 @@ import {
14
15
  decodeErrorResult,
15
16
  decodeEventLog,
16
17
  } from 'viem';
18
+ import { formatAbiItem, formatAbiParams } from 'viem/utils';
17
19
 
18
20
  export interface L2Claim {
19
21
  claimSecret: Fr;
@@ -93,6 +95,57 @@ export function prettyLogViemErrorMsg(err: any) {
93
95
  return err?.message ?? err;
94
96
  }
95
97
 
98
+ export function mergeAbis(abis: Abi[]): Abi {
99
+ let merged: Abi = [];
100
+ const seen = new Set<string>();
101
+
102
+ for (const abi of abis) {
103
+ for (const item of abi) {
104
+ const key = getAbiItemKey(item);
105
+ if (!seen.has(key)) {
106
+ seen.add(key);
107
+ merged = [...merged, item];
108
+ }
109
+ }
110
+ }
111
+
112
+ return merged;
113
+ }
114
+
115
+ function getAbiItemKey(item: AbiItem): string {
116
+ if (item.type === 'function') {
117
+ const signature = formatAbiItem(item);
118
+ const outputs = formatAbiParams(item.outputs);
119
+ const stateMutability = typeof item.stateMutability === 'string' ? item.stateMutability : '';
120
+ return `function:${signature}:${outputs}:${stateMutability}`;
121
+ }
122
+
123
+ if (item.type === 'event') {
124
+ const signature = formatAbiItem(item);
125
+ const indexed = (item.inputs ?? []).map(input => ((input as { indexed?: boolean }).indexed ? '1' : '0')).join('');
126
+ const anonymous = item.anonymous ? 'anonymous' : 'not-anonymous';
127
+ return `event:${signature}:${indexed}:${anonymous}`;
128
+ }
129
+
130
+ if (item.type === 'error') {
131
+ const signature = formatAbiItem(item);
132
+ return `error:${signature}`;
133
+ }
134
+
135
+ if (item.type === 'constructor') {
136
+ const inputs = formatAbiParams(item.inputs);
137
+ const stateMutability = typeof item.stateMutability === 'string' ? item.stateMutability : '';
138
+ return `constructor::${inputs}:${stateMutability}`;
139
+ }
140
+
141
+ if (item.type === 'fallback' || item.type === 'receive') {
142
+ const stateMutability = typeof item.stateMutability === 'string' ? item.stateMutability : '';
143
+ return `${item.type}:::${stateMutability}`;
144
+ }
145
+
146
+ return 'unknown';
147
+ }
148
+
96
149
  function getNestedErrorData(error: unknown): string | undefined {
97
150
  // If nothing, bail
98
151
  if (!error) {