@aztec/ethereum 0.0.1-commit.03f7ef2 → 0.0.1-commit.04852196a

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 (168) hide show
  1. package/dest/config.d.ts +19 -27
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +60 -55
  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 +6 -5
  10. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  11. package/dest/contracts/fee_asset_handler.js +11 -9
  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 +395 -9
  21. package/dest/contracts/inbox.d.ts +22 -1
  22. package/dest/contracts/inbox.d.ts.map +1 -1
  23. package/dest/contracts/inbox.js +36 -1
  24. package/dest/contracts/index.d.ts +4 -1
  25. package/dest/contracts/index.d.ts.map +1 -1
  26. package/dest/contracts/index.js +3 -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/outbox.d.ts +41 -0
  34. package/dest/contracts/outbox.d.ts.map +1 -0
  35. package/dest/contracts/outbox.js +86 -0
  36. package/dest/contracts/registry.d.ts +3 -1
  37. package/dest/contracts/registry.d.ts.map +1 -1
  38. package/dest/contracts/registry.js +30 -1
  39. package/dest/contracts/rollup.d.ts +161 -96
  40. package/dest/contracts/rollup.d.ts.map +1 -1
  41. package/dest/contracts/rollup.js +687 -132
  42. package/dest/contracts/tally_slashing_proposer.d.ts +1 -1
  43. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
  44. package/dest/contracts/tally_slashing_proposer.js +8 -1
  45. package/dest/deploy_aztec_l1_contracts.d.ts +18 -4
  46. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  47. package/dest/deploy_aztec_l1_contracts.js +111 -33
  48. package/dest/deploy_l1_contract.js +3 -3
  49. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  50. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  51. package/dest/generated/l1-contracts-defaults.js +30 -0
  52. package/dest/l1_artifacts.d.ts +5927 -1547
  53. package/dest/l1_artifacts.d.ts.map +1 -1
  54. package/dest/l1_tx_utils/config.d.ts +7 -1
  55. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  56. package/dest/l1_tx_utils/config.js +14 -1
  57. package/dest/l1_tx_utils/constants.d.ts +1 -1
  58. package/dest/l1_tx_utils/constants.js +2 -2
  59. package/dest/l1_tx_utils/factory.d.ts +18 -10
  60. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  61. package/dest/l1_tx_utils/factory.js +17 -7
  62. package/dest/l1_tx_utils/fee-strategies/index.d.ts +3 -2
  63. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -1
  64. package/dest/l1_tx_utils/fee-strategies/index.js +2 -1
  65. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +2 -12
  66. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -1
  67. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +36 -18
  68. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +2 -11
  69. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -1
  70. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +37 -19
  71. package/dest/l1_tx_utils/fee-strategies/types.d.ts +14 -27
  72. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -1
  73. package/dest/l1_tx_utils/fee-strategies/types.js +0 -21
  74. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
  75. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
  76. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
  77. package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
  78. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
  79. package/dest/l1_tx_utils/index-blobs.js +2 -2
  80. package/dest/l1_tx_utils/index.d.ts +2 -1
  81. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  82. package/dest/l1_tx_utils/index.js +1 -0
  83. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +2 -2
  84. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -1
  85. package/dest/l1_tx_utils/l1_fee_analyzer.js +3 -3
  86. package/dest/l1_tx_utils/l1_tx_utils.d.ts +18 -7
  87. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  88. package/dest/l1_tx_utils/l1_tx_utils.js +58 -42
  89. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -5
  90. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  91. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +17 -54
  92. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  93. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  94. package/dest/{test → l1_tx_utils}/tx_delayer.js +62 -34
  95. package/dest/publisher_manager.d.ts +3 -2
  96. package/dest/publisher_manager.d.ts.map +1 -1
  97. package/dest/publisher_manager.js +2 -2
  98. package/dest/queries.d.ts +2 -2
  99. package/dest/queries.d.ts.map +1 -1
  100. package/dest/queries.js +12 -4
  101. package/dest/test/chain_monitor.js +1 -2
  102. package/dest/test/eth_cheat_codes.d.ts +13 -1
  103. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  104. package/dest/test/index.d.ts +1 -3
  105. package/dest/test/index.d.ts.map +1 -1
  106. package/dest/test/index.js +0 -2
  107. package/dest/test/rollup_cheat_codes.d.ts +5 -2
  108. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  109. package/dest/test/rollup_cheat_codes.js +19 -2
  110. package/dest/test/start_anvil.d.ts +9 -3
  111. package/dest/test/start_anvil.d.ts.map +1 -1
  112. package/dest/test/start_anvil.js +128 -29
  113. package/dest/test/upgrade_utils.js +2 -2
  114. package/dest/utils.d.ts +2 -1
  115. package/dest/utils.d.ts.map +1 -1
  116. package/dest/utils.js +62 -12
  117. package/package.json +8 -9
  118. package/src/config.ts +76 -54
  119. package/src/contracts/README.md +157 -0
  120. package/src/contracts/empire_base.ts +2 -0
  121. package/src/contracts/empire_slashing_proposer.ts +22 -27
  122. package/src/contracts/fee_asset_handler.ts +10 -7
  123. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  124. package/src/contracts/governance.ts +13 -4
  125. package/src/contracts/governance_proposer.ts +10 -1
  126. package/src/contracts/inbox.ts +53 -1
  127. package/src/contracts/index.ts +3 -0
  128. package/src/contracts/log.ts +13 -0
  129. package/src/contracts/multicall.ts +5 -2
  130. package/src/contracts/outbox.ts +98 -0
  131. package/src/contracts/registry.ts +31 -1
  132. package/src/contracts/rollup.ts +362 -100
  133. package/src/contracts/tally_slashing_proposer.ts +5 -1
  134. package/src/deploy_aztec_l1_contracts.ts +136 -42
  135. package/src/deploy_l1_contract.ts +3 -3
  136. package/src/generated/l1-contracts-defaults.ts +32 -0
  137. package/src/l1_tx_utils/config.ts +20 -0
  138. package/src/l1_tx_utils/constants.ts +2 -2
  139. package/src/l1_tx_utils/factory.ts +31 -31
  140. package/src/l1_tx_utils/fee-strategies/index.ts +1 -1
  141. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +46 -42
  142. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +49 -45
  143. package/src/l1_tx_utils/fee-strategies/types.ts +14 -46
  144. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
  145. package/src/l1_tx_utils/index-blobs.ts +2 -2
  146. package/src/l1_tx_utils/index.ts +1 -0
  147. package/src/l1_tx_utils/l1_fee_analyzer.ts +2 -3
  148. package/src/l1_tx_utils/l1_tx_utils.ts +60 -32
  149. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +23 -62
  150. package/src/{test → l1_tx_utils}/tx_delayer.ts +78 -50
  151. package/src/publisher_manager.ts +4 -2
  152. package/src/queries.ts +11 -3
  153. package/src/test/chain_monitor.ts +1 -1
  154. package/src/test/index.ts +0 -2
  155. package/src/test/rollup_cheat_codes.ts +21 -3
  156. package/src/test/start_anvil.ts +146 -29
  157. package/src/test/upgrade_utils.ts +2 -2
  158. package/src/utils.ts +70 -14
  159. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  160. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  161. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  162. package/dest/test/delayed_tx_utils.d.ts +0 -13
  163. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  164. package/dest/test/delayed_tx_utils.js +0 -28
  165. package/dest/test/tx_delayer.d.ts +0 -36
  166. package/dest/test/tx_delayer.d.ts.map +0 -1
  167. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  168. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRCxPQUFPLEVBQ0wsS0FBSyxHQUFHLEVBR1IsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyx3QkFBd0IsRUFDN0IsS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxHQUFHLEVBQ1IsS0FBSyxHQUFHLEVBR1QsTUFBTSxNQUFNLENBQUM7QUFHZCxNQUFNLFdBQVcsT0FBTztJQUN0QixXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ2hCLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDaEIsV0FBVyxFQUFFLEdBQUcsQ0FBQztJQUNqQixnQkFBZ0IsRUFBRSxNQUFNLENBQUM7Q0FDMUI7QUFFRCxxQkFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBQzNDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRXJCLFlBQVksT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFJaEQ7Q0FDRjtBQUVELHdCQUFnQixZQUFZLENBQzFCLEtBQUssQ0FBQyxJQUFJLFNBQVMsR0FBRyxHQUFHLFNBQVMsT0FBTyxFQUFFLEVBQzNDLFVBQVUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFDMUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUUvRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQ1gsT0FBTyxFQUFFLEdBQUcsRUFDWixHQUFHLEVBQUUsSUFBSSxFQUNULFNBQVMsRUFBRSxVQUFVLEVBQ3JCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsS0FBSyxPQUFPLEVBQ3JDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FDZCxVQUFVLENBTVo7QUFFRCx3QkFBZ0IsZUFBZSxDQUM3QixLQUFLLENBQUMsSUFBSSxTQUFTLEdBQUcsR0FBRyxTQUFTLE9BQU8sRUFBRSxFQUMzQyxVQUFVLFNBQVMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQzFDLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFFL0UsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUNYLE9BQU8sRUFBRSxHQUFHLEVBQ1osR0FBRyxFQUFFLElBQUksRUFDVCxTQUFTLEVBQUUsVUFBVSxFQUNyQixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLEtBQUssT0FBTyxFQUNyQyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQ2QsVUFBVSxHQUFHLFNBQVMsQ0FnQnhCO0FBRUQsd0JBQWdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxHQUFHLE9BVzdDO0FBRUQsd0JBQWdCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQWUxQztBQTJFRDs7Ozs7R0FLRztBQUNILHdCQUFnQixlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUUsR0FBZSxHQUFHLGtCQUFrQixDQTREcEY7QUF5QkQsd0JBQWdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxHQUFHLHNCQWE3QztBQUVEOzs7R0FHRztBQUNILHdCQUFnQixpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEdBQUcsRUFBRSxJQUFJLG9CQUFvQixHQUFHO0lBQ3hGLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztJQUN6QixtQkFBbUIsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFDO0NBQ3JDLENBT0E7QUFFRDs7R0FFRztBQUNILHdCQUFnQixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBT2hGIn0=
@@ -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;AA2ED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAE,GAAe,GAAG,kBAAkB,CA4DpF;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) {
@@ -66,6 +112,19 @@ function getNestedErrorData(error) {
66
112
  // Not found
67
113
  return undefined;
68
114
  }
115
+ /**
116
+ * Truncates an error message to a safe length for log renderers.
117
+ * LogExplorer can only render up to 2500 characters in its summary view.
118
+ * We cap at 2000 to leave room for decorating context added by callers.
119
+ */ function truncateErrorMessage(message) {
120
+ const MAX = 2000;
121
+ const CHUNK = 950;
122
+ if (message.length <= MAX) {
123
+ return message;
124
+ }
125
+ const truncated = message.length - 2 * CHUNK;
126
+ return message.slice(0, CHUNK) + `...${truncated} characters truncated...` + message.slice(-CHUNK);
127
+ }
69
128
  /**
70
129
  * Formats a Viem error into a FormattedViemError instance.
71
130
  * @param error - The error to format.
@@ -116,18 +175,9 @@ function getNestedErrorData(error) {
116
175
  }
117
176
  // If it's a regular Error instance, return it with its message
118
177
  if (error instanceof Error) {
119
- return new FormattedViemError(error.message, error?.metaMessages);
120
- }
121
- const body = String(error);
122
- const length = body.length;
123
- // LogExplorer can only render up to 2500 characters in it's summary view. Try to keep the whole message below this number
124
- // Limit the error to 2000 chacaters in order to allow code higher up to decorate this error with extra details (up to 500 characters)
125
- if (length > 2000) {
126
- const chunk = 950;
127
- const truncated = length - 2 * chunk;
128
- return new FormattedViemError(body.slice(0, chunk) + `...${truncated} characters truncated...` + body.slice(-1 * chunk));
129
- }
130
- return new FormattedViemError(body);
178
+ return new FormattedViemError(truncateErrorMessage(error.message), error?.metaMessages);
179
+ }
180
+ return new FormattedViemError(truncateErrorMessage(String(error)));
131
181
  }
132
182
  function stripAbis(obj) {
133
183
  if (!obj || typeof obj !== 'object') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/ethereum",
3
- "version": "0.0.1-commit.03f7ef2",
3
+ "version": "0.0.1-commit.04852196a",
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.03f7ef2",
53
- "@aztec/constants": "0.0.1-commit.03f7ef2",
54
- "@aztec/foundation": "0.0.1-commit.03f7ef2",
55
- "@aztec/l1-artifacts": "0.0.1-commit.03f7ef2",
56
- "@viem/anvil": "^0.0.10",
53
+ "@aztec/blob-lib": "0.0.1-commit.04852196a",
54
+ "@aztec/constants": "0.0.1-commit.04852196a",
55
+ "@aztec/foundation": "0.0.1-commit.04852196a",
56
+ "@aztec/l1-artifacts": "0.0.1-commit.04852196a",
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",