@aztec/ethereum 0.0.0-test.0 → 0.0.1-commit.21caa21

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 (232) hide show
  1. package/dest/account.d.ts +2 -0
  2. package/dest/account.d.ts.map +1 -0
  3. package/dest/account.js +4 -0
  4. package/dest/chain.d.ts +1 -1
  5. package/dest/client.d.ts +6 -4
  6. package/dest/client.d.ts.map +1 -1
  7. package/dest/client.js +16 -2
  8. package/dest/config.d.ts +111 -17
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +462 -22
  11. package/dest/constants.d.ts +1 -1
  12. package/dest/contracts/empire_base.d.ts +24 -8
  13. package/dest/contracts/empire_base.d.ts.map +1 -1
  14. package/dest/contracts/empire_base.js +75 -2
  15. package/dest/contracts/empire_slashing_proposer.d.ts +66 -0
  16. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -0
  17. package/dest/contracts/empire_slashing_proposer.js +200 -0
  18. package/dest/contracts/errors.d.ts +7 -0
  19. package/dest/contracts/errors.d.ts.map +1 -0
  20. package/dest/contracts/errors.js +12 -0
  21. package/dest/contracts/fee_asset_handler.d.ts +19 -0
  22. package/dest/contracts/fee_asset_handler.d.ts.map +1 -0
  23. package/dest/contracts/fee_asset_handler.js +57 -0
  24. package/dest/contracts/fee_juice.d.ts +6 -7
  25. package/dest/contracts/fee_juice.d.ts.map +1 -1
  26. package/dest/contracts/fee_juice.js +27 -20
  27. package/dest/contracts/governance.d.ts +43 -32
  28. package/dest/contracts/governance.d.ts.map +1 -1
  29. package/dest/contracts/governance.js +87 -84
  30. package/dest/contracts/governance_proposer.d.ts +16 -13
  31. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  32. package/dest/contracts/governance_proposer.js +37 -17
  33. package/dest/contracts/gse.d.ts +32 -0
  34. package/dest/contracts/gse.d.ts.map +1 -0
  35. package/dest/contracts/gse.js +72 -0
  36. package/dest/contracts/inbox.d.ts +26 -0
  37. package/dest/contracts/inbox.d.ts.map +1 -0
  38. package/dest/contracts/inbox.js +45 -0
  39. package/dest/contracts/index.d.ts +9 -3
  40. package/dest/contracts/index.d.ts.map +1 -1
  41. package/dest/contracts/index.js +8 -2
  42. package/dest/contracts/multicall.d.ts +21 -0
  43. package/dest/contracts/multicall.d.ts.map +1 -0
  44. package/dest/contracts/multicall.js +156 -0
  45. package/dest/contracts/registry.d.ts +10 -5
  46. package/dest/contracts/registry.d.ts.map +1 -1
  47. package/dest/contracts/registry.js +44 -16
  48. package/dest/contracts/rollup.d.ts +204 -40
  49. package/dest/contracts/rollup.d.ts.map +1 -1
  50. package/dest/contracts/rollup.js +529 -79
  51. package/dest/contracts/slasher_contract.d.ts +44 -0
  52. package/dest/contracts/slasher_contract.d.ts.map +1 -0
  53. package/dest/contracts/slasher_contract.js +75 -0
  54. package/dest/contracts/tally_slashing_proposer.d.ts +139 -0
  55. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -0
  56. package/dest/contracts/tally_slashing_proposer.js +313 -0
  57. package/dest/contracts/utils.d.ts +3 -0
  58. package/dest/contracts/utils.d.ts.map +1 -0
  59. package/dest/contracts/utils.js +11 -0
  60. package/dest/deploy_l1_contracts.d.ts +577 -21114
  61. package/dest/deploy_l1_contracts.d.ts.map +1 -1
  62. package/dest/deploy_l1_contracts.js +1225 -421
  63. package/dest/eth-signer/eth-signer.d.ts +21 -0
  64. package/dest/eth-signer/eth-signer.d.ts.map +1 -0
  65. package/dest/eth-signer/eth-signer.js +5 -0
  66. package/dest/eth-signer/index.d.ts +2 -0
  67. package/dest/eth-signer/index.d.ts.map +1 -0
  68. package/dest/eth-signer/index.js +1 -0
  69. package/dest/index.d.ts +7 -3
  70. package/dest/index.d.ts.map +1 -1
  71. package/dest/index.js +6 -2
  72. package/dest/l1_artifacts.d.ts +77344 -0
  73. package/dest/l1_artifacts.d.ts.map +1 -0
  74. package/dest/l1_artifacts.js +166 -0
  75. package/dest/l1_contract_addresses.d.ts +24 -4
  76. package/dest/l1_contract_addresses.d.ts.map +1 -1
  77. package/dest/l1_contract_addresses.js +22 -18
  78. package/dest/l1_reader.d.ts +2 -2
  79. package/dest/l1_reader.d.ts.map +1 -1
  80. package/dest/l1_reader.js +8 -8
  81. package/dest/l1_tx_utils/config.d.ts +59 -0
  82. package/dest/l1_tx_utils/config.d.ts.map +1 -0
  83. package/dest/l1_tx_utils/config.js +82 -0
  84. package/dest/l1_tx_utils/constants.d.ts +6 -0
  85. package/dest/l1_tx_utils/constants.d.ts.map +1 -0
  86. package/dest/l1_tx_utils/constants.js +14 -0
  87. package/dest/l1_tx_utils/factory.d.ts +24 -0
  88. package/dest/l1_tx_utils/factory.d.ts.map +1 -0
  89. package/dest/l1_tx_utils/factory.js +12 -0
  90. package/dest/l1_tx_utils/index.d.ts +10 -0
  91. package/dest/l1_tx_utils/index.d.ts.map +1 -0
  92. package/dest/l1_tx_utils/index.js +10 -0
  93. package/dest/l1_tx_utils/interfaces.d.ts +76 -0
  94. package/dest/l1_tx_utils/interfaces.d.ts.map +1 -0
  95. package/dest/l1_tx_utils/interfaces.js +4 -0
  96. package/dest/l1_tx_utils/l1_tx_utils.d.ts +94 -0
  97. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
  98. package/dest/l1_tx_utils/l1_tx_utils.js +610 -0
  99. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +26 -0
  100. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +1 -0
  101. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +26 -0
  102. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +94 -0
  103. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -0
  104. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +430 -0
  105. package/dest/l1_tx_utils/signer.d.ts +4 -0
  106. package/dest/l1_tx_utils/signer.d.ts.map +1 -0
  107. package/dest/l1_tx_utils/signer.js +16 -0
  108. package/dest/l1_tx_utils/types.d.ts +67 -0
  109. package/dest/l1_tx_utils/types.d.ts.map +1 -0
  110. package/dest/l1_tx_utils/types.js +26 -0
  111. package/dest/l1_tx_utils/utils.d.ts +4 -0
  112. package/dest/l1_tx_utils/utils.d.ts.map +1 -0
  113. package/dest/l1_tx_utils/utils.js +14 -0
  114. package/dest/l1_types.d.ts +6 -0
  115. package/dest/l1_types.d.ts.map +1 -0
  116. package/dest/l1_types.js +1 -0
  117. package/dest/publisher_manager.d.ts +15 -0
  118. package/dest/publisher_manager.d.ts.map +1 -0
  119. package/dest/publisher_manager.js +88 -0
  120. package/dest/queries.d.ts +4 -2
  121. package/dest/queries.d.ts.map +1 -1
  122. package/dest/queries.js +53 -12
  123. package/dest/test/chain_monitor.d.ts +73 -0
  124. package/dest/test/chain_monitor.d.ts.map +1 -0
  125. package/dest/test/chain_monitor.js +215 -0
  126. package/dest/test/delayed_tx_utils.d.ts +8 -3
  127. package/dest/test/delayed_tx_utils.d.ts.map +1 -1
  128. package/dest/test/delayed_tx_utils.js +13 -6
  129. package/dest/test/eth_cheat_codes.d.ts +217 -0
  130. package/dest/test/eth_cheat_codes.d.ts.map +1 -0
  131. package/dest/test/eth_cheat_codes.js +558 -0
  132. package/dest/test/eth_cheat_codes_with_state.d.ts +2 -2
  133. package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
  134. package/dest/test/eth_cheat_codes_with_state.js +1 -1
  135. package/dest/test/index.d.ts +4 -1
  136. package/dest/test/index.d.ts.map +1 -1
  137. package/dest/test/index.js +3 -0
  138. package/dest/test/rollup_cheat_codes.d.ts +87 -0
  139. package/dest/test/rollup_cheat_codes.d.ts.map +1 -0
  140. package/dest/test/rollup_cheat_codes.js +266 -0
  141. package/dest/test/start_anvil.d.ts +7 -1
  142. package/dest/test/start_anvil.d.ts.map +1 -1
  143. package/dest/test/start_anvil.js +16 -7
  144. package/dest/test/tx_delayer.d.ts +18 -7
  145. package/dest/test/tx_delayer.d.ts.map +1 -1
  146. package/dest/test/tx_delayer.js +95 -19
  147. package/dest/test/upgrade_utils.d.ts +6 -5
  148. package/dest/test/upgrade_utils.d.ts.map +1 -1
  149. package/dest/test/upgrade_utils.js +23 -16
  150. package/dest/types.d.ts +7 -8
  151. package/dest/types.d.ts.map +1 -1
  152. package/dest/types.js +3 -1
  153. package/dest/utils.d.ts +2 -1
  154. package/dest/utils.d.ts.map +1 -1
  155. package/dest/utils.js +43 -88
  156. package/dest/zkPassportVerifierAddress.d.ts +15 -0
  157. package/dest/zkPassportVerifierAddress.d.ts.map +1 -0
  158. package/dest/zkPassportVerifierAddress.js +11 -0
  159. package/package.json +28 -19
  160. package/src/account.ts +5 -0
  161. package/src/client.ts +42 -4
  162. package/src/config.ts +592 -31
  163. package/src/contracts/empire_base.ts +77 -7
  164. package/src/contracts/empire_slashing_proposer.ts +265 -0
  165. package/src/contracts/errors.ts +13 -0
  166. package/src/contracts/fee_asset_handler.ts +63 -0
  167. package/src/contracts/fee_juice.ts +29 -15
  168. package/src/contracts/governance.ts +80 -77
  169. package/src/contracts/governance_proposer.ts +66 -24
  170. package/src/contracts/gse.ts +88 -0
  171. package/src/contracts/inbox.ts +63 -0
  172. package/src/contracts/index.ts +8 -2
  173. package/src/contracts/multicall.ts +155 -0
  174. package/src/contracts/registry.ts +51 -26
  175. package/src/contracts/rollup.ts +596 -74
  176. package/src/contracts/slasher_contract.ts +89 -0
  177. package/src/contracts/tally_slashing_proposer.ts +316 -0
  178. package/src/contracts/utils.ts +14 -0
  179. package/src/deploy_l1_contracts.ts +1459 -538
  180. package/src/eth-signer/eth-signer.ts +25 -0
  181. package/src/eth-signer/index.ts +1 -0
  182. package/src/index.ts +6 -2
  183. package/src/l1_artifacts.ts +254 -0
  184. package/src/l1_contract_addresses.ts +32 -19
  185. package/src/l1_reader.ts +9 -9
  186. package/src/l1_tx_utils/README.md +177 -0
  187. package/src/l1_tx_utils/config.ts +143 -0
  188. package/src/l1_tx_utils/constants.ts +18 -0
  189. package/src/l1_tx_utils/factory.ts +64 -0
  190. package/src/l1_tx_utils/index.ts +12 -0
  191. package/src/l1_tx_utils/interfaces.ts +86 -0
  192. package/src/l1_tx_utils/l1_tx_utils.ts +718 -0
  193. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +77 -0
  194. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +558 -0
  195. package/src/l1_tx_utils/signer.ts +28 -0
  196. package/src/l1_tx_utils/types.ts +85 -0
  197. package/src/l1_tx_utils/utils.ts +16 -0
  198. package/src/l1_types.ts +6 -0
  199. package/src/publisher_manager.ts +106 -0
  200. package/src/queries.ts +73 -15
  201. package/src/test/chain_monitor.ts +243 -0
  202. package/src/test/delayed_tx_utils.ts +34 -6
  203. package/src/test/eth_cheat_codes.ts +588 -0
  204. package/src/test/eth_cheat_codes_with_state.ts +1 -1
  205. package/src/test/index.ts +3 -0
  206. package/src/test/rollup_cheat_codes.ts +307 -0
  207. package/src/test/start_anvil.ts +22 -5
  208. package/src/test/tx_delayer.ts +127 -26
  209. package/src/test/upgrade_utils.ts +30 -21
  210. package/src/types.ts +10 -8
  211. package/src/utils.ts +49 -90
  212. package/src/zkPassportVerifierAddress.ts +15 -0
  213. package/dest/contracts/forwarder.d.ts +0 -24
  214. package/dest/contracts/forwarder.d.ts.map +0 -1
  215. package/dest/contracts/forwarder.js +0 -101
  216. package/dest/contracts/slashing_proposer.d.ts +0 -21
  217. package/dest/contracts/slashing_proposer.d.ts.map +0 -1
  218. package/dest/contracts/slashing_proposer.js +0 -47
  219. package/dest/eth_cheat_codes.d.ts +0 -147
  220. package/dest/eth_cheat_codes.d.ts.map +0 -1
  221. package/dest/eth_cheat_codes.js +0 -303
  222. package/dest/l1_tx_utils.d.ts +0 -192
  223. package/dest/l1_tx_utils.d.ts.map +0 -1
  224. package/dest/l1_tx_utils.js +0 -641
  225. package/dest/l1_tx_utils_with_blobs.d.ts +0 -12
  226. package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
  227. package/dest/l1_tx_utils_with_blobs.js +0 -64
  228. package/src/contracts/forwarder.ts +0 -132
  229. package/src/contracts/slashing_proposer.ts +0 -51
  230. package/src/eth_cheat_codes.ts +0 -314
  231. package/src/l1_tx_utils.ts +0 -847
  232. package/src/l1_tx_utils_with_blobs.ts +0 -86
@@ -2,8 +2,9 @@ import { omit } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
3
  import { retryUntil } from '@aztec/foundation/retry';
4
4
  import { inspect } from 'util';
5
- import { keccak256, parseTransaction, publicActions, walletActions } from 'viem';
6
- export function waitUntilBlock(client, blockNumber, logger) {
5
+ import { keccak256, parseTransaction, publicActions, serializeTransaction, walletActions } from 'viem';
6
+ import { isExtendedClient } from '../types.js';
7
+ export function waitUntilBlock(client, blockNumber, logger, timeout) {
7
8
  const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function' ? client : client.extend(publicActions);
8
9
  return retryUntil(async ()=>{
9
10
  const currentBlockNumber = await publicClient.getBlockNumber({
@@ -11,9 +12,9 @@ export function waitUntilBlock(client, blockNumber, logger) {
11
12
  });
12
13
  logger?.debug(`Block number is ${currentBlockNumber} (waiting until ${blockNumber})`);
13
14
  return currentBlockNumber >= BigInt(blockNumber);
14
- }, `Wait until L1 block ${blockNumber}`, 120, 0.1);
15
+ }, `Wait until L1 block ${blockNumber}`, timeout ?? 120, 0.1);
15
16
  }
16
- export function waitUntilL1Timestamp(client, timestamp, logger) {
17
+ export function waitUntilL1Timestamp(client, timestamp, logger, timeout) {
17
18
  const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function' ? client : client.extend(publicActions);
18
19
  let lastBlock = undefined;
19
20
  return retryUntil(async ()=>{
@@ -31,17 +32,30 @@ export function waitUntilL1Timestamp(client, timestamp, logger) {
31
32
  const currentTs = currentBlock.timestamp;
32
33
  logger?.debug(`Block timstamp is ${currentTs} (waiting until ${timestamp})`);
33
34
  return currentTs >= BigInt(timestamp);
34
- }, `Wait until L1 timestamp ${timestamp}`, 120, 0.1);
35
+ }, `Wait until L1 timestamp ${timestamp}`, timeout ?? 120, 0.1);
35
36
  }
36
37
  class DelayerImpl {
37
- constructor(opts){
38
+ dateProvider;
39
+ logger;
40
+ constructor(dateProvider, opts){
41
+ this.dateProvider = dateProvider;
42
+ this.logger = createLogger('ethereum:tx_delayer');
43
+ this.maxInclusionTimeIntoSlot = undefined;
44
+ this.nextWait = undefined;
45
+ this.sentTxHashes = [];
46
+ this.cancelledTxs = [];
38
47
  this.ethereumSlotDuration = BigInt(opts.ethereumSlotDuration);
39
48
  }
49
+ maxInclusionTimeIntoSlot;
40
50
  ethereumSlotDuration;
41
- nextWait = undefined;
42
- txs = [];
43
- getTxs() {
44
- return this.txs;
51
+ nextWait;
52
+ sentTxHashes;
53
+ cancelledTxs;
54
+ getSentTxHashes() {
55
+ return this.sentTxHashes;
56
+ }
57
+ getCancelledTxs() {
58
+ return this.cancelledTxs;
45
59
  }
46
60
  pauseNextTxUntilBlock(l1BlockNumber) {
47
61
  this.nextWait = {
@@ -53,32 +67,77 @@ class DelayerImpl {
53
67
  l1Timestamp: BigInt(l1Timestamp)
54
68
  };
55
69
  }
70
+ cancelNextTx() {
71
+ this.nextWait = {
72
+ indefinitely: true
73
+ };
74
+ }
75
+ setMaxInclusionTimeIntoSlot(seconds) {
76
+ this.maxInclusionTimeIntoSlot = seconds;
77
+ }
56
78
  }
57
79
  /**
58
80
  * Returns a new client (without modifying the one passed in) with an injected tx delayer.
59
81
  * The delayer can be used to hold off the next tx to be sent until a given block number.
60
82
  * TODO(#10824): This doesn't play along well with blob txs for some reason.
61
- */ export function withDelayer(client, opts) {
83
+ */ export function withDelayer(client, dateProvider, opts) {
84
+ if (!isExtendedClient(client)) {
85
+ throw new Error('withDelayer has to be instantiated with a wallet viem client.');
86
+ }
62
87
  const logger = createLogger('ethereum:tx_delayer');
63
- const delayer = new DelayerImpl(opts);
88
+ const delayer = new DelayerImpl(dateProvider, opts);
64
89
  const extended = client// Tweak sendRawTransaction so it uses the delay defined in the delayer.
65
90
  // Note that this will only work with local accounts (ie accounts for which we have the private key).
66
91
  // Transactions signed by the node will not be delayed since they use sendTransaction directly,
67
92
  // but we do not use them in our codebase at all.
68
93
  .extend((client)=>({
69
94
  async sendRawTransaction (...args) {
95
+ let wait;
96
+ let txHash;
97
+ const { serializedTransaction } = args[0];
98
+ const publicClient = client;
70
99
  if (delayer.nextWait !== undefined) {
100
+ // Check if we have been instructed to delay the next tx.
71
101
  const waitUntil = delayer.nextWait;
72
102
  delayer.nextWait = undefined;
73
- const publicClient = client;
74
- const wait = 'l1BlockNumber' in waitUntil ? waitUntilBlock(publicClient, waitUntil.l1BlockNumber - 1n, logger) : waitUntilL1Timestamp(publicClient, waitUntil.l1Timestamp - delayer.ethereumSlotDuration, logger);
75
103
  // Compute the tx hash manually so we emulate sendRawTransaction response
76
- const { serializedTransaction } = args[0];
77
- const txHash = keccak256(serializedTransaction);
104
+ txHash = computeTxHash(serializedTransaction);
105
+ // Cancel tx outright if instructed
106
+ if ('indefinitely' in waitUntil && waitUntil.indefinitely) {
107
+ logger.info(`Cancelling tx ${txHash}`);
108
+ delayer.cancelledTxs.push(serializedTransaction);
109
+ return Promise.resolve(txHash);
110
+ }
111
+ // Or wait until the desired block number or timestamp
112
+ wait = 'l1BlockNumber' in waitUntil ? waitUntilBlock(publicClient, waitUntil.l1BlockNumber - 1n, logger) : 'l1Timestamp' in waitUntil ? waitUntilL1Timestamp(publicClient, waitUntil.l1Timestamp - delayer.ethereumSlotDuration, logger) : undefined;
78
113
  logger.info(`Delaying tx ${txHash} until ${inspect(waitUntil)}`, {
79
114
  argsLen: args.length,
80
115
  ...omit(parseTransaction(serializedTransaction), 'data', 'sidecars')
81
116
  });
117
+ } else if (delayer.maxInclusionTimeIntoSlot !== undefined) {
118
+ // Check if we need to delay txs sent too close to the end of the slot.
119
+ const currentBlock = await publicClient.getBlock({
120
+ includeTransactions: false
121
+ });
122
+ const { timestamp: lastBlockTimestamp, number } = currentBlock;
123
+ const now = delayer.dateProvider.now();
124
+ txHash = computeTxHash(serializedTransaction);
125
+ const logData = {
126
+ ...omit(parseTransaction(serializedTransaction), 'data', 'sidecars'),
127
+ lastBlockTimestamp,
128
+ now,
129
+ maxInclusionTimeIntoSlot: delayer.maxInclusionTimeIntoSlot
130
+ };
131
+ if (now / 1000 - Number(lastBlockTimestamp) > delayer.maxInclusionTimeIntoSlot) {
132
+ // If the last block was mined more than `maxInclusionTimeIntoSlot` seconds ago, then we cannot include
133
+ // any txs in the current slot, so we delay the tx until the next slot.
134
+ logger.info(`Delaying inclusion of tx ${txHash} until the next slot since it was sent too late`, logData);
135
+ wait = waitUntilBlock(publicClient, number + 1n, logger);
136
+ } else {
137
+ logger.debug(`Immediately sending tx ${txHash} as it was received early enough in the slot`, logData);
138
+ }
139
+ }
140
+ if (wait !== undefined) {
82
141
  // Do not await here so we can return the tx hash immediately as if it had been sent on the spot.
83
142
  // Instead, delay it so it lands on the desired block number or timestamp, assuming anvil will
84
143
  // mine it immediately.
@@ -90,14 +149,14 @@ class DelayerImpl {
90
149
  computedTxHash: txHash
91
150
  });
92
151
  }
93
- logger.info(`Sent previously delayed tx ${clientTxHash} to land on ${inspect(waitUntil)}`);
94
- delayer.txs.push(clientTxHash);
152
+ logger.info(`Sent previously delayed tx ${clientTxHash}`);
153
+ delayer.sentTxHashes.push(clientTxHash);
95
154
  }).catch((err)=>logger.error(`Error sending tx after delay`, err));
96
155
  return Promise.resolve(txHash);
97
156
  } else {
98
157
  const txHash = await client.sendRawTransaction(...args);
99
158
  logger.verbose(`Sent tx immediately ${txHash}`);
100
- delayer.txs.push(txHash);
159
+ delayer.sentTxHashes.push(txHash);
101
160
  return txHash;
102
161
  }
103
162
  }
@@ -114,3 +173,20 @@ class DelayerImpl {
114
173
  delayer
115
174
  };
116
175
  }
176
+ /**
177
+ * Compute the tx hash given the serialized tx. Note that if this is a blob tx, we need to
178
+ * exclude the blobs, commitments, and proofs from the hash.
179
+ */ function computeTxHash(serializedTransaction) {
180
+ if (serializedTransaction.startsWith('0x03')) {
181
+ const parsed = parseTransaction(serializedTransaction);
182
+ if (parsed.blobs || parsed.sidecars) {
183
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
184
+ const { blobs, sidecars, ...rest } = parsed;
185
+ return keccak256(serializeTransaction({
186
+ type: 'eip4844',
187
+ ...rest
188
+ }));
189
+ }
190
+ }
191
+ return keccak256(serializedTransaction);
192
+ }
@@ -2,10 +2,11 @@ import type { Logger } from '@aztec/foundation/log';
2
2
  import { GovernanceAbi } from '@aztec/l1-artifacts/GovernanceAbi';
3
3
  import { type GetContractReturnType, type PrivateKeyAccount } from 'viem';
4
4
  import type { L1ContractAddresses } from '../l1_contract_addresses.js';
5
- import type { L1Clients } from '../types.js';
6
- export declare function executeGovernanceProposal(proposalId: bigint, governance: GetContractReturnType<typeof GovernanceAbi, L1Clients['publicClient']>, voteAmount: bigint, privateKey: PrivateKeyAccount, publicClient: L1Clients['publicClient'], walletClient: L1Clients['walletClient'], rpcUrls: string[], logger: Logger): Promise<void>;
7
- export declare function createGovernanceProposal(payloadAddress: `0x${string}`, addresses: L1ContractAddresses, privateKey: PrivateKeyAccount, publicClient: L1Clients['publicClient'], logger: Logger): Promise<{
8
- governance: GetContractReturnType<typeof GovernanceAbi, L1Clients['publicClient']>;
5
+ import type { ExtendedViemWalletClient, ViemPublicClient } from '../types.js';
6
+ export declare function executeGovernanceProposal(proposalId: bigint, governance: GetContractReturnType<typeof GovernanceAbi, ViemPublicClient>, voteAmount: bigint, privateKey: PrivateKeyAccount, l1Client: ExtendedViemWalletClient, rpcUrls: string[], logger: Logger): Promise<void>;
7
+ export declare function createGovernanceProposal(payloadAddress: `0x${string}`, addresses: L1ContractAddresses, privateKey: PrivateKeyAccount, publicClient: ViemPublicClient, logger: Logger): Promise<{
8
+ governance: GetContractReturnType<typeof GovernanceAbi, ViemPublicClient>;
9
9
  voteAmount: bigint;
10
+ proposalId: bigint;
10
11
  }>;
11
- //# sourceMappingURL=upgrade_utils.d.ts.map
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZV91dGlscy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdXBncmFkZV91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHbEUsT0FBTyxFQUFFLEtBQUsscUJBQXFCLEVBQUUsS0FBSyxpQkFBaUIsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUd2RixPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXZFLE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzlFLHdCQUFzQix5QkFBeUIsQ0FDN0MsVUFBVSxFQUFFLE1BQU0sRUFDbEIsVUFBVSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sYUFBYSxFQUFFLGdCQUFnQixDQUFDLEVBQ3pFLFVBQVUsRUFBRSxNQUFNLEVBQ2xCLFVBQVUsRUFBRSxpQkFBaUIsRUFDN0IsUUFBUSxFQUFFLHdCQUF3QixFQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQ2pCLE1BQU0sRUFBRSxNQUFNLGlCQW1DZjtBQUVELHdCQUFzQix3QkFBd0IsQ0FDNUMsY0FBYyxFQUFFLEtBQUssTUFBTSxFQUFFLEVBQzdCLFNBQVMsRUFBRSxtQkFBbUIsRUFDOUIsVUFBVSxFQUFFLGlCQUFpQixFQUM3QixZQUFZLEVBQUUsZ0JBQWdCLEVBQzlCLE1BQU0sRUFBRSxNQUFNLEdBQ2IsT0FBTyxDQUFDO0lBQ1QsVUFBVSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDMUUsVUFBVSxFQUFFLE1BQU0sQ0FBQztJQUNuQixVQUFVLEVBQUUsTUFBTSxDQUFDO0NBQ3BCLENBQUMsQ0F5Q0QifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade_utils.d.ts","sourceRoot":"","sources":["../../src/test/upgrade_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAe,MAAM,MAAM,CAAC;AAGvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,qBAAqB,CAAC,OAAO,aAAa,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,EAClF,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,SAAS,CAAC,cAAc,CAAC,EACvC,YAAY,EAAE,SAAS,CAAC,cAAc,CAAC,EACvC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,iBAoCf;AAED,wBAAsB,wBAAwB,CAC5C,cAAc,EAAE,KAAK,MAAM,EAAE,EAC7B,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,SAAS,CAAC,cAAc,CAAC,EACvC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,UAAU,EAAE,qBAAqB,CAAC,OAAO,aAAa,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAqCrH"}
1
+ {"version":3,"file":"upgrade_utils.d.ts","sourceRoot":"","sources":["../../src/test/upgrade_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAe,MAAM,MAAM,CAAC;AAGvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,OAAO,KAAK,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG9E,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,qBAAqB,CAAC,OAAO,aAAa,EAAE,gBAAgB,CAAC,EACzE,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,iBAmCf;AAED,wBAAsB,wBAAwB,CAC5C,cAAc,EAAE,KAAK,MAAM,EAAE,EAC7B,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,gBAAgB,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IACT,UAAU,EAAE,qBAAqB,CAAC,OAAO,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAyCD"}
@@ -1,21 +1,22 @@
1
- import { TestERC20Abi as FeeJuiceAbi } from '@aztec/l1-artifacts';
1
+ import { DateProvider } from '@aztec/foundation/timer';
2
2
  import { GovernanceAbi } from '@aztec/l1-artifacts/GovernanceAbi';
3
+ import { TestERC20Abi as StakingAssetAbi } from '@aztec/l1-artifacts/TestERC20Abi';
3
4
  import { getContract } from 'viem';
4
- import { EthCheatCodes } from '../eth_cheat_codes.js';
5
- export async function executeGovernanceProposal(proposalId, governance, voteAmount, privateKey, publicClient, walletClient, rpcUrls, logger) {
5
+ import { extractProposalIdFromLogs } from '../contracts/governance.js';
6
+ import { createL1TxUtilsFromViemWallet } from '../l1_tx_utils/index.js';
7
+ import { EthCheatCodes } from './eth_cheat_codes.js';
8
+ export async function executeGovernanceProposal(proposalId, governance, voteAmount, privateKey, l1Client, rpcUrls, logger) {
6
9
  const proposal = await governance.read.getProposal([
7
10
  proposalId
8
11
  ]);
12
+ const l1TxUtils = createL1TxUtilsFromViemWallet(l1Client);
9
13
  const waitL1Block = async ()=>{
10
- await publicClient.waitForTransactionReceipt({
11
- hash: await walletClient.sendTransaction({
12
- to: privateKey.address,
13
- value: 1n,
14
- account: privateKey
15
- })
14
+ await l1TxUtils.sendAndMonitorTransaction({
15
+ to: l1Client.account.address,
16
+ value: 1n
16
17
  });
17
18
  };
18
- const cheatCodes = new EthCheatCodes(rpcUrls, logger);
19
+ const cheatCodes = new EthCheatCodes(rpcUrls, new DateProvider(), logger);
19
20
  const timeToActive = proposal.creation + proposal.config.votingDelay;
20
21
  logger.info(`Warping to ${timeToActive + 1n}`);
21
22
  await cheatCodes.warp(Number(timeToActive + 1n));
@@ -29,7 +30,7 @@ export async function executeGovernanceProposal(proposalId, governance, voteAmou
29
30
  ], {
30
31
  account: privateKey
31
32
  });
32
- await publicClient.waitForTransactionReceipt({
33
+ await l1Client.waitForTransactionReceipt({
33
34
  hash: voteTx
34
35
  });
35
36
  logger.info(`Voted`);
@@ -43,15 +44,15 @@ export async function executeGovernanceProposal(proposalId, governance, voteAmou
43
44
  ], {
44
45
  account: privateKey
45
46
  });
46
- await publicClient.waitForTransactionReceipt({
47
+ await l1Client.waitForTransactionReceipt({
47
48
  hash: executeTx
48
49
  });
49
50
  logger.info(`Executed proposal`);
50
51
  }
51
52
  export async function createGovernanceProposal(payloadAddress, addresses, privateKey, publicClient, logger) {
52
53
  const token = getContract({
53
- address: addresses.feeJuiceAddress.toString(),
54
- abi: FeeJuiceAbi,
54
+ address: addresses.stakingAssetAddress.toString(),
55
+ abi: StakingAssetAbi,
55
56
  client: publicClient
56
57
  });
57
58
  const governance = getContract({
@@ -91,14 +92,20 @@ export async function createGovernanceProposal(payloadAddress, addresses, privat
91
92
  hash: depositTx
92
93
  });
93
94
  logger.info(`Deposited tokens`);
94
- await governance.write.proposeWithLock([
95
+ const proposeTx = await governance.write.proposeWithLock([
95
96
  payloadAddress,
96
97
  privateKey.address
97
98
  ], {
98
99
  account: privateKey
99
100
  });
101
+ const receipt = await publicClient.waitForTransactionReceipt({
102
+ hash: proposeTx
103
+ });
104
+ logger.info(`Proposed upgrade`);
105
+ const proposalId = extractProposalIdFromLogs(receipt.logs);
100
106
  return {
101
107
  governance,
102
- voteAmount
108
+ voteAmount,
109
+ proposalId
103
110
  };
104
111
  }
package/dest/types.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import type { Account, Chain, Client, FallbackTransport, HttpTransport, PublicActions, PublicClient, PublicRpcSchema, WalletActions, WalletClient, WalletRpcSchema } from 'viem';
1
+ import type { Abi, Account, Chain, Client, FallbackTransport, GetContractReturnType, HttpTransport, PublicActions, PublicClient, PublicRpcSchema, WalletActions, WalletRpcSchema } from 'viem';
2
2
  /** Type for a viem public client */
3
3
  export type ViemPublicClient = PublicClient<FallbackTransport<HttpTransport[]>, Chain>;
4
- export type SimpleViemWalletClient = WalletClient<FallbackTransport<HttpTransport[]>, Chain, Account>;
5
4
  export type ExtendedViemWalletClient = Client<FallbackTransport<readonly HttpTransport[]>, Chain, Account, [
6
5
  ...PublicRpcSchema,
7
6
  ...WalletRpcSchema
8
7
  ], PublicActions<FallbackTransport<readonly HttpTransport[]>, Chain> & WalletActions<Chain, Account>>;
9
- export type ViemWalletClient = SimpleViemWalletClient | ExtendedViemWalletClient;
10
- export type L1Clients = {
11
- publicClient: ViemPublicClient;
12
- walletClient: ExtendedViemWalletClient;
13
- };
14
- //# sourceMappingURL=types.d.ts.map
8
+ /** Type for a viem client that can be either public or extended with wallet capabilities */
9
+ export type ViemClient = ViemPublicClient | ExtendedViemWalletClient;
10
+ /** Type for a viem contract that can be used with an extended viem client */
11
+ export type ViemContract<TAbi extends Abi> = GetContractReturnType<TAbi, ExtendedViemWalletClient>;
12
+ export declare function isExtendedClient(client: ViemClient): client is ExtendedViemWalletClient;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFDVixHQUFHLEVBQ0gsT0FBTyxFQUNQLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsYUFBYSxFQUNiLFlBQVksRUFDWixlQUFlLEVBQ2YsYUFBYSxFQUNiLGVBQWUsRUFDaEIsTUFBTSxNQUFNLENBQUM7QUFFZCxvQ0FBb0M7QUFDcEMsTUFBTSxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXZGLE1BQU0sTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQzNDLGlCQUFpQixDQUFDLFNBQVMsYUFBYSxFQUFFLENBQUMsRUFDM0MsS0FBSyxFQUNMLE9BQU8sRUFDUDtJQUFDLEdBQUcsZUFBZTtJQUFFLEdBQUcsZUFBZTtDQUFDLEVBQ3hDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLGFBQWEsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FDbEcsQ0FBQztBQUVGLDRGQUE0RjtBQUM1RixNQUFNLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDO0FBRXJFLDZFQUE2RTtBQUM3RSxNQUFNLE1BQU0sWUFBWSxDQUFDLElBQUksU0FBUyxHQUFHLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFFbkcsd0JBQWdCLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxVQUFVLEdBQUcsTUFBTSxJQUFJLHdCQUF3QixDQUV2RiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,KAAK,EACL,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,aAAa,EACb,YAAY,EACZ,eAAe,EAChB,MAAM,MAAM,CAAC;AAEd,oCAAoC;AACpC,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAEvF,MAAM,MAAM,sBAAsB,GAAG,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAEtG,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAC3C,iBAAiB,CAAC,SAAS,aAAa,EAAE,CAAC,EAC3C,KAAK,EACL,OAAO,EACP;IAAC,GAAG,eAAe;IAAE,GAAG,eAAe;CAAC,EACxC,aAAa,CAAC,iBAAiB,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAClG,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;AAEjF,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,YAAY,EAAE,wBAAwB,CAAC;CACxC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,GAAG,EACH,OAAO,EACP,KAAK,EACL,MAAM,EACN,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,aAAa,EACb,eAAe,EAChB,MAAM,MAAM,CAAC;AAEd,oCAAoC;AACpC,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAEvF,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAC3C,iBAAiB,CAAC,SAAS,aAAa,EAAE,CAAC,EAC3C,KAAK,EACL,OAAO,EACP;IAAC,GAAG,eAAe;IAAE,GAAG,eAAe;CAAC,EACxC,aAAa,CAAC,iBAAiB,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAClG,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,wBAAwB,CAAC;AAErE,6EAA6E;AAC7E,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;AAEnG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,wBAAwB,CAEvF"}
package/dest/types.js CHANGED
@@ -1 +1,3 @@
1
- export { };
1
+ export function isExtendedClient(client) {
2
+ return 'account' in client && client.account !== undefined;
3
+ }
package/dest/utils.d.ts CHANGED
@@ -12,6 +12,7 @@ export declare class FormattedViemError extends Error {
12
12
  constructor(message: string, metaMessages?: any[]);
13
13
  }
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
+ 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;
15
16
  export declare function prettyLogViemErrorMsg(err: any): any;
16
17
  /**
17
18
  * Formats a Viem error into a FormattedViemError instance.
@@ -21,4 +22,4 @@ export declare function prettyLogViemErrorMsg(err: any): any;
21
22
  */
22
23
  export declare function formatViemError(error: any, abi?: Abi): FormattedViemError;
23
24
  export declare function tryGetCustomErrorName(err: any): string | undefined;
24
- //# sourceMappingURL=utils.d.ts.map
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRCxPQUFPLEVBQ0wsS0FBSyxHQUFHLEVBRVIsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyx3QkFBd0IsRUFDN0IsS0FBSyxHQUFHLEVBQ1IsS0FBSyxHQUFHLEVBR1QsTUFBTSxNQUFNLENBQUM7QUFFZCxNQUFNLFdBQVcsT0FBTztJQUN0QixXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ2hCLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDaEIsV0FBVyxFQUFFLEdBQUcsQ0FBQztJQUNqQixnQkFBZ0IsRUFBRSxNQUFNLENBQUM7Q0FDMUI7QUFFRCxxQkFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBQzNDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRXJCLFlBQVksT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFJaEQ7Q0FDRjtBQUVELHdCQUFnQixZQUFZLENBQzFCLEtBQUssQ0FBQyxJQUFJLFNBQVMsR0FBRyxHQUFHLFNBQVMsT0FBTyxFQUFFLEVBQzNDLFVBQVUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFDMUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUUvRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQ1gsT0FBTyxFQUFFLEdBQUcsRUFDWixHQUFHLEVBQUUsSUFBSSxFQUNULFNBQVMsRUFBRSxVQUFVLEVBQ3JCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsS0FBSyxPQUFPLEVBQ3JDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FDZCxVQUFVLENBTVo7QUFFRCx3QkFBZ0IsZUFBZSxDQUM3QixLQUFLLENBQUMsSUFBSSxTQUFTLEdBQUcsR0FBRyxTQUFTLE9BQU8sRUFBRSxFQUMzQyxVQUFVLFNBQVMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQzFDLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFFL0UsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUNYLE9BQU8sRUFBRSxHQUFHLEVBQ1osR0FBRyxFQUFFLElBQUksRUFDVCxTQUFTLEVBQUUsVUFBVSxFQUNyQixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLEtBQUssT0FBTyxFQUNyQyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQ2QsVUFBVSxHQUFHLFNBQVMsQ0FnQnhCO0FBRUQsd0JBQWdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxHQUFHLE9BVzdDO0FBMEJEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRSxHQUFlLEdBQUcsa0JBQWtCLENBd0VwRjtBQXlCRCx3QkFBZ0IscUJBQXFCLENBQUMsR0FBRyxFQUFFLEdBQUcsc0JBYTdDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EACL,KAAK,GAAG,EAER,KAAK,iBAAiB,EAEtB,KAAK,wBAAwB,EAC7B,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;gBAET,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE;CAKlD;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;AA+BD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,OAW7C;AA0BD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAE,GAAe,GAAG,kBAAkB,CAwIpF;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,sBAa7C"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EACL,KAAK,GAAG,EAER,KAAK,iBAAiB,EAEtB,KAAK,wBAAwB,EAC7B,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"}
package/dest/utils.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ErrorsAbi } from '@aztec/l1-artifacts';
1
+ import { ErrorsAbi } from '@aztec/l1-artifacts/ErrorsAbi';
2
2
  import { BaseError, ContractFunctionRevertedError, decodeErrorResult, decodeEventLog } from 'viem';
3
3
  export class FormattedViemError extends Error {
4
4
  metaMessages;
@@ -15,7 +15,7 @@ export function extractEvent(logs, address, abi, eventName, filter, logger) {
15
15
  }
16
16
  return event;
17
17
  }
18
- function tryExtractEvent(logs, address, abi, eventName, filter, logger) {
18
+ export function tryExtractEvent(logs, address, abi, eventName, filter, logger) {
19
19
  for (const log of logs){
20
20
  if (log.address.toLowerCase() === address.toLowerCase()) {
21
21
  try {
@@ -101,97 +101,52 @@ function getNestedErrorData(error) {
101
101
  return new FormattedViemError(`${errorName}${args}`, error?.metaMessages);
102
102
  }
103
103
  }
104
- } catch (decodeErr) {
104
+ } catch {
105
105
  // If decoding fails, we fall back to the original formatting
106
106
  }
107
+ // Strip ABI from the error object before formatting
108
+ if (error && typeof error === 'object') {
109
+ // Create a clone to avoid modifying the original
110
+ const errorClone = structuredClone(error);
111
+ // Helper function to recursively remove ABI properties
112
+ // Strip ABIs from the clone
113
+ stripAbis(errorClone);
114
+ // Use the cleaned clone for further processing
115
+ error = errorClone;
116
+ }
107
117
  // If it's a regular Error instance, return it with its message
108
118
  if (error instanceof Error) {
109
- return error;
119
+ return new FormattedViemError(error.message, error?.metaMessages);
110
120
  }
111
- // Original formatting logic for non-custom errors
112
- const truncateHex = (hex, length = 100)=>{
113
- if (!hex || typeof hex !== 'string') {
114
- return hex;
115
- }
116
- if (!hex.startsWith('0x')) {
117
- return hex;
118
- }
119
- if (hex.length <= length * 2) {
120
- return hex;
121
- }
122
- return `${hex.slice(0, length)}...${hex.slice(-length)}`;
123
- };
124
- const formatRequestBody = (body)=>{
125
- try {
126
- const parsed = JSON.parse(body);
127
- // Recursively process all parameters that might contain hex strings
128
- const processParams = (obj)=>{
129
- if (Array.isArray(obj)) {
130
- return obj.map((item)=>processParams(item));
131
- }
132
- if (typeof obj === 'object' && obj !== null) {
133
- const result = {};
134
- for (const [key, value] of Object.entries(obj)){
135
- result[key] = processParams(value);
136
- }
137
- return result;
138
- }
139
- if (typeof obj === 'string') {
140
- if (obj.startsWith('0x')) {
141
- return truncateHex(obj);
142
- }
143
- }
144
- return obj;
145
- };
146
- // Process the entire request body
147
- const processed = processParams(parsed);
148
- return JSON.stringify(processed, null, 2);
149
- } catch {
150
- return body;
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);
131
+ }
132
+ function stripAbis(obj) {
133
+ if (!obj || typeof obj !== 'object') {
134
+ return;
135
+ }
136
+ // Delete ABI property at current level
137
+ if ('abi' in obj) {
138
+ delete obj.abi;
139
+ }
140
+ // Process cause property
141
+ if (obj.cause) {
142
+ stripAbis(obj.cause);
143
+ }
144
+ // Process arrays and objects
145
+ Object.values(obj).forEach((value)=>{
146
+ if (value && typeof value === 'object') {
147
+ stripAbis(value);
151
148
  }
152
- };
153
- const truncateHexStringsInText = (text)=>{
154
- const hexRegex = /\b0x[a-fA-F0-9]{10,}/g;
155
- return text.replace(hexRegex, (hex)=>truncateHex(hex));
156
- };
157
- const extractAndFormatRequestBody = (message)=>{
158
- // First handle Request body JSON
159
- const requestBodyRegex = /Request body: ({[\s\S]*?})\n/g;
160
- let result = message.replace(requestBodyRegex, (match, body)=>{
161
- return `Request body: ${formatRequestBody(body)}\n`;
162
- });
163
- // Then handle Arguments section
164
- const argsRegex = /((?:Request |Estimate Gas )?Arguments:[\s\S]*?(?=\n\n|$))/g;
165
- result = result.replace(argsRegex, (section)=>{
166
- const lines = section.split('\n');
167
- const processedLines = lines.map((line)=>{
168
- // Check if line contains a colon followed by content
169
- const colonIndex = line.indexOf(':');
170
- if (colonIndex !== -1) {
171
- const [prefix, content] = [
172
- line.slice(0, colonIndex + 1),
173
- line.slice(colonIndex + 1).trim()
174
- ];
175
- // If content contains a hex string, truncate it
176
- if (content.includes('0x')) {
177
- const hexMatches = content.match(/0x[a-fA-F0-9]+/g) || [];
178
- let processedContent = content;
179
- hexMatches.forEach((hex)=>{
180
- processedContent = processedContent.replace(hex, truncateHex(hex));
181
- });
182
- return `${prefix} ${processedContent}`;
183
- }
184
- }
185
- return line;
186
- });
187
- return processedLines.join('\n');
188
- });
189
- // Finally, catch any remaining hex strings in the message
190
- result = truncateHexStringsInText(result);
191
- return result;
192
- };
193
- const formattedRes = extractAndFormatRequestBody(error?.message || String(error));
194
- return new FormattedViemError(formattedRes.replace(/\\n/g, '\n'), error?.metaMessages);
149
+ });
195
150
  }
196
151
  export function tryGetCustomErrorName(err) {
197
152
  try {
@@ -203,7 +158,7 @@ export function tryGetCustomErrorName(err) {
203
158
  return revertError.data?.errorName;
204
159
  }
205
160
  }
206
- } catch (_e) {
161
+ } catch {
207
162
  return undefined;
208
163
  }
209
164
  }
@@ -0,0 +1,15 @@
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ /**
3
+ * The address of the zk passport verifier on sepolia
4
+ * get address from: ROOT/l1-contracts/lib/circuits/src/solidity/deployments/deployment-11155111.json
5
+ */
6
+ export declare const ZK_PASSPORT_VERIFIER_ADDRESS: EthAddress;
7
+ /**
8
+ * The default domain of the zk passport site
9
+ */
10
+ export declare const ZK_PASSPORT_DOMAIN = "testnet.aztec.network";
11
+ /**
12
+ * The default scope of the zk passport proofs
13
+ */
14
+ export declare const ZK_PASSPORT_SCOPE = "personhood";
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemtQYXNzcG9ydFZlcmlmaWVyQWRkcmVzcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3prUGFzc3BvcnRWZXJpZmllckFkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNEOzs7R0FHRztBQUNILGVBQU8sTUFBTSw0QkFBNEIsWUFBc0UsQ0FBQztBQUNoSDs7R0FFRztBQUNILGVBQU8sTUFBTSxrQkFBa0IsMEJBQTBCLENBQUM7QUFDMUQ7O0dBRUc7QUFDSCxlQUFPLE1BQU0saUJBQWlCLGVBQWUsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zkPassportVerifierAddress.d.ts","sourceRoot":"","sources":["../src/zkPassportVerifierAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,4BAA4B,YAAsE,CAAC;AAChH;;GAEG;AACH,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAC1D;;GAEG;AACH,eAAO,MAAM,iBAAiB,eAAe,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ /**
3
+ * The address of the zk passport verifier on sepolia
4
+ * get address from: ROOT/l1-contracts/lib/circuits/src/solidity/deployments/deployment-11155111.json
5
+ */ export const ZK_PASSPORT_VERIFIER_ADDRESS = EthAddress.fromString('0x3101Bad9eA5fACadA5554844a1a88F7Fe48D4DE0');
6
+ /**
7
+ * The default domain of the zk passport site
8
+ */ export const ZK_PASSPORT_DOMAIN = 'testnet.aztec.network';
9
+ /**
10
+ * The default scope of the zk passport proofs
11
+ */ export const ZK_PASSPORT_SCOPE = 'personhood';