@aztec/ethereum 0.0.1-commit.27d773e65 → 0.0.1-commit.2b2662070

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 (95) hide show
  1. package/dest/client.d.ts +10 -2
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +13 -7
  4. package/dest/config.d.ts +8 -6
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +11 -9
  7. package/dest/contracts/chain_state_override.d.ts +38 -0
  8. package/dest/contracts/chain_state_override.d.ts.map +1 -0
  9. package/dest/contracts/chain_state_override.js +100 -0
  10. package/dest/contracts/inbox.d.ts +3 -3
  11. package/dest/contracts/inbox.d.ts.map +1 -1
  12. package/dest/contracts/inbox.js +5 -6
  13. package/dest/contracts/index.d.ts +3 -3
  14. package/dest/contracts/index.d.ts.map +1 -1
  15. package/dest/contracts/index.js +2 -2
  16. package/dest/contracts/multicall.d.ts +51 -2
  17. package/dest/contracts/multicall.d.ts.map +1 -1
  18. package/dest/contracts/multicall.js +85 -0
  19. package/dest/contracts/registry.d.ts +3 -1
  20. package/dest/contracts/registry.d.ts.map +1 -1
  21. package/dest/contracts/registry.js +30 -1
  22. package/dest/contracts/rollup.d.ts +83 -20
  23. package/dest/contracts/rollup.d.ts.map +1 -1
  24. package/dest/contracts/rollup.js +288 -58
  25. package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
  26. package/dest/contracts/slashing_proposer.d.ts.map +1 -0
  27. package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +13 -15
  28. package/dest/deploy_aztec_l1_contracts.d.ts +3 -6
  29. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  30. package/dest/deploy_aztec_l1_contracts.js +2 -4
  31. package/dest/generated/l1-contracts-defaults.d.ts +1 -1
  32. package/dest/generated/l1-contracts-defaults.js +1 -1
  33. package/dest/l1_artifacts.d.ts +8644 -15983
  34. package/dest/l1_artifacts.d.ts.map +1 -1
  35. package/dest/l1_artifacts.js +9 -24
  36. package/dest/l1_contract_addresses.d.ts +1 -5
  37. package/dest/l1_contract_addresses.d.ts.map +1 -1
  38. package/dest/l1_contract_addresses.js +0 -6
  39. package/dest/l1_reader.d.ts +3 -1
  40. package/dest/l1_reader.d.ts.map +1 -1
  41. package/dest/l1_reader.js +6 -1
  42. package/dest/l1_tx_utils/l1_tx_utils.d.ts +5 -1
  43. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  44. package/dest/l1_tx_utils/l1_tx_utils.js +40 -21
  45. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -1
  46. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  47. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +8 -4
  48. package/dest/publisher_manager.d.ts +21 -7
  49. package/dest/publisher_manager.d.ts.map +1 -1
  50. package/dest/publisher_manager.js +81 -7
  51. package/dest/queries.js +3 -3
  52. package/dest/test/chain_monitor.d.ts +22 -3
  53. package/dest/test/chain_monitor.d.ts.map +1 -1
  54. package/dest/test/chain_monitor.js +33 -2
  55. package/dest/test/eth_cheat_codes.d.ts +6 -4
  56. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  57. package/dest/test/eth_cheat_codes.js +6 -4
  58. package/dest/test/rollup_cheat_codes.d.ts +5 -1
  59. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  60. package/dest/test/rollup_cheat_codes.js +9 -1
  61. package/dest/test/start_anvil.d.ts +23 -3
  62. package/dest/test/start_anvil.d.ts.map +1 -1
  63. package/dest/test/start_anvil.js +143 -29
  64. package/dest/utils.d.ts +1 -1
  65. package/dest/utils.d.ts.map +1 -1
  66. package/dest/utils.js +16 -12
  67. package/package.json +5 -7
  68. package/src/client.ts +10 -2
  69. package/src/config.ts +21 -13
  70. package/src/contracts/chain_state_override.ts +147 -0
  71. package/src/contracts/inbox.ts +4 -4
  72. package/src/contracts/index.ts +2 -2
  73. package/src/contracts/multicall.ts +65 -1
  74. package/src/contracts/registry.ts +31 -1
  75. package/src/contracts/rollup.ts +315 -61
  76. package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +14 -16
  77. package/src/deploy_aztec_l1_contracts.ts +1 -5
  78. package/src/generated/l1-contracts-defaults.ts +1 -1
  79. package/src/l1_artifacts.ts +12 -35
  80. package/src/l1_contract_addresses.ts +0 -7
  81. package/src/l1_reader.ts +13 -1
  82. package/src/l1_tx_utils/l1_tx_utils.ts +31 -8
  83. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +8 -4
  84. package/src/publisher_manager.ts +105 -10
  85. package/src/queries.ts +3 -3
  86. package/src/test/chain_monitor.ts +60 -3
  87. package/src/test/eth_cheat_codes.ts +6 -4
  88. package/src/test/rollup_cheat_codes.ts +11 -1
  89. package/src/test/start_anvil.ts +177 -29
  90. package/src/utils.ts +17 -14
  91. package/dest/contracts/empire_slashing_proposer.d.ts +0 -69
  92. package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
  93. package/dest/contracts/empire_slashing_proposer.js +0 -216
  94. package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
  95. package/src/contracts/empire_slashing_proposer.ts +0 -265
@@ -82,10 +82,10 @@ export class InboxContract {
82
82
  .map(log => this.mapMessageSentLog(log));
83
83
  }
84
84
 
85
- /** Fetches MessageSent events for a specific message hash within the given block range. */
86
- async getMessageSentEventByHash(hash: Hex, fromBlock: bigint, toBlock: bigint): Promise<MessageSentLog[]> {
87
- const logs = await this.inbox.getEvents.MessageSent({ hash }, { fromBlock, toBlock });
88
- return logs.map(log => this.mapMessageSentLog(log));
85
+ /** Fetches MessageSent events for a specific message hash at a specific block. */
86
+ async getMessageSentEventByHash(msgHash: Hex, l1BlockHash: Hex): Promise<MessageSentLog> {
87
+ const [log] = await this.inbox.getEvents.MessageSent({ hash: msgHash }, { blockHash: l1BlockHash });
88
+ return log && this.mapMessageSentLog(log);
89
89
  }
90
90
 
91
91
  private mapMessageSentLog(log: {
@@ -1,3 +1,4 @@
1
+ export * from './chain_state_override.js';
1
2
  export * from './empire_base.js';
2
3
  export * from './errors.js';
3
4
  export * from './fee_asset_handler.js';
@@ -12,6 +13,5 @@ export * from './multicall.js';
12
13
  export * from './outbox.js';
13
14
  export * from './registry.js';
14
15
  export * from './rollup.js';
15
- export * from './empire_slashing_proposer.js';
16
- export * from './tally_slashing_proposer.js';
16
+ export * from './slashing_proposer.js';
17
17
  export * from './slasher_contract.js';
@@ -2,7 +2,7 @@ import { toHex as toPaddedHex } from '@aztec/foundation/bigint-buffer';
2
2
  import { TimeoutError } from '@aztec/foundation/error';
3
3
  import type { Logger } from '@aztec/foundation/log';
4
4
 
5
- import { type EncodeFunctionDataParameters, type Hex, encodeFunctionData, multicall3Abi } from 'viem';
5
+ import { type Address, type EncodeFunctionDataParameters, type Hex, encodeFunctionData, multicall3Abi } from 'viem';
6
6
 
7
7
  import type { L1BlobInputs, L1TxConfig, L1TxRequest, L1TxUtils } from '../l1_tx_utils/index.js';
8
8
  import type { ExtendedViemWalletClient } from '../types.js';
@@ -11,6 +11,39 @@ import { RollupContract } from './rollup.js';
11
11
 
12
12
  export const MULTI_CALL_3_ADDRESS = '0xcA11bde05977b3631167028862bE2a173976CA11' as const;
13
13
 
14
+ /** ABI fragment for aggregate3Value — not included in viem's multicall3Abi. */
15
+ export const aggregate3ValueAbi = [
16
+ {
17
+ inputs: [
18
+ {
19
+ components: [
20
+ { internalType: 'address', name: 'target', type: 'address' },
21
+ { internalType: 'bool', name: 'allowFailure', type: 'bool' },
22
+ { internalType: 'uint256', name: 'value', type: 'uint256' },
23
+ { internalType: 'bytes', name: 'callData', type: 'bytes' },
24
+ ],
25
+ internalType: 'struct Multicall3.Call3Value[]',
26
+ name: 'calls',
27
+ type: 'tuple[]',
28
+ },
29
+ ],
30
+ name: 'aggregate3Value',
31
+ outputs: [
32
+ {
33
+ components: [
34
+ { internalType: 'bool', name: 'success', type: 'bool' },
35
+ { internalType: 'bytes', name: 'returnData', type: 'bytes' },
36
+ ],
37
+ internalType: 'struct Multicall3.Result[]',
38
+ name: 'returnData',
39
+ type: 'tuple[]',
40
+ },
41
+ ],
42
+ stateMutability: 'payable',
43
+ type: 'function',
44
+ },
45
+ ] as const;
46
+
14
47
  export class Multicall3 {
15
48
  static async forward(
16
49
  requests: L1TxRequest[],
@@ -122,6 +155,37 @@ export class Multicall3 {
122
155
  throw err;
123
156
  }
124
157
  }
158
+
159
+ /** Batch multiple value transfers into a single aggregate3Value call on Multicall3. */
160
+ static async forwardValue(calls: { to: Address; value: bigint }[], l1TxUtils: L1TxUtils, logger: Logger) {
161
+ const args = calls.map(c => ({
162
+ target: c.to,
163
+ allowFailure: false,
164
+ value: c.value,
165
+ callData: '0x' as Hex,
166
+ }));
167
+
168
+ const data = encodeFunctionData({
169
+ abi: aggregate3ValueAbi,
170
+ functionName: 'aggregate3Value',
171
+ args: [args],
172
+ });
173
+
174
+ const totalValue = calls.reduce((sum, c) => sum + c.value, 0n);
175
+
176
+ logger.info(`Sending aggregate3Value with ${calls.length} calls`, { totalValue });
177
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
178
+ to: MULTI_CALL_3_ADDRESS,
179
+ data,
180
+ value: totalValue,
181
+ });
182
+
183
+ if (receipt.status !== 'success') {
184
+ throw new Error(`aggregate3Value transaction reverted: ${receipt.transactionHash}`);
185
+ }
186
+
187
+ return { receipt };
188
+ }
125
189
  }
126
190
 
127
191
  export async function deployMulticall3(l1Client: ExtendedViemWalletClient, logger: Logger) {
@@ -3,7 +3,7 @@ import { createLogger } from '@aztec/foundation/log';
3
3
  import { RegistryAbi } from '@aztec/l1-artifacts/RegistryAbi';
4
4
  import { TestERC20Abi } from '@aztec/l1-artifacts/TestERC20Abi';
5
5
 
6
- import { type GetContractReturnType, type Hex, getContract } from 'viem';
6
+ import { type GetContractReturnType, type Hex, getAbiItem, getContract } from 'viem';
7
7
 
8
8
  import type { L1ContractAddresses } from '../l1_contract_addresses.js';
9
9
  import type { ViemClient } from '../types.js';
@@ -128,4 +128,34 @@ export class RegistryContract {
128
128
  public async getRewardDistributor(): Promise<EthAddress> {
129
129
  return EthAddress.fromString(await this.registry.read.getRewardDistributor());
130
130
  }
131
+
132
+ /** Returns the L1 timestamp at which the given rollup was registered via addRollup(). */
133
+ public async getCanonicalRollupRegistrationTimestamp(
134
+ rollupAddress: EthAddress,
135
+ fromBlock?: bigint,
136
+ ): Promise<bigint | undefined> {
137
+ const event = getAbiItem({ abi: RegistryAbi, name: 'CanonicalRollupUpdated' });
138
+ const start = fromBlock ?? 0n;
139
+ const latestBlock = await this.client.getBlockNumber();
140
+ const chunkSize = 1_000n;
141
+
142
+ for (let from = start; from <= latestBlock; from += chunkSize) {
143
+ const to = from + chunkSize - 1n > latestBlock ? latestBlock : from + chunkSize - 1n;
144
+ const logs = await this.client.getLogs({
145
+ address: this.address.toString(),
146
+ fromBlock: from,
147
+ toBlock: to,
148
+ strict: true,
149
+ event,
150
+ args: { instance: rollupAddress.toString() },
151
+ });
152
+
153
+ if (logs.length > 0) {
154
+ const block = await this.client.getBlock({ blockNumber: logs[0].blockNumber });
155
+ return block.timestamp;
156
+ }
157
+ }
158
+
159
+ return undefined;
160
+ }
131
161
  }