@aztec/ethereum 0.72.1 → 0.73.0

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 (72) hide show
  1. package/dest/{ethereum_chain.d.ts → chain.d.ts} +1 -1
  2. package/dest/chain.d.ts.map +1 -0
  3. package/dest/{ethereum_chain.js → chain.js} +1 -1
  4. package/dest/client.d.ts +16 -0
  5. package/dest/client.d.ts.map +1 -0
  6. package/dest/client.js +35 -0
  7. package/dest/contracts/forwarder.d.ts +23 -0
  8. package/dest/contracts/forwarder.d.ts.map +1 -0
  9. package/dest/contracts/forwarder.js +66 -0
  10. package/dest/contracts/governance.d.ts +14 -0
  11. package/dest/contracts/governance.d.ts.map +1 -0
  12. package/dest/contracts/governance.js +31 -0
  13. package/dest/contracts/governance_proposer.d.ts +13 -0
  14. package/dest/contracts/governance_proposer.d.ts.map +1 -0
  15. package/dest/contracts/governance_proposer.js +40 -0
  16. package/dest/contracts/index.d.ts +4 -0
  17. package/dest/contracts/index.d.ts.map +1 -1
  18. package/dest/contracts/index.js +5 -1
  19. package/dest/contracts/rollup.d.ts +94 -5
  20. package/dest/contracts/rollup.d.ts.map +1 -1
  21. package/dest/contracts/rollup.js +177 -16
  22. package/dest/contracts/slashing_proposer.d.ts +11 -0
  23. package/dest/contracts/slashing_proposer.d.ts.map +1 -0
  24. package/dest/contracts/slashing_proposer.js +19 -0
  25. package/dest/deploy_l1_contracts.d.ts +985 -974
  26. package/dest/deploy_l1_contracts.d.ts.map +1 -1
  27. package/dest/deploy_l1_contracts.js +44 -22
  28. package/dest/index.d.ts +4 -1
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +5 -2
  31. package/dest/l1_reader.d.ts.map +1 -1
  32. package/dest/l1_reader.js +2 -3
  33. package/dest/l1_tx_utils.d.ts +78 -17
  34. package/dest/l1_tx_utils.d.ts.map +1 -1
  35. package/dest/l1_tx_utils.js +182 -20
  36. package/dest/l1_tx_utils_with_blobs.d.ts +12 -0
  37. package/dest/l1_tx_utils_with_blobs.d.ts.map +1 -0
  38. package/dest/l1_tx_utils_with_blobs.js +61 -0
  39. package/dest/queries.d.ts +15 -0
  40. package/dest/queries.d.ts.map +1 -0
  41. package/dest/queries.js +48 -0
  42. package/dest/test/delayed_tx_utils.d.ts +8 -0
  43. package/dest/test/delayed_tx_utils.d.ts.map +1 -0
  44. package/dest/test/delayed_tx_utils.js +21 -0
  45. package/dest/test/index.d.ts +2 -1
  46. package/dest/test/index.d.ts.map +1 -1
  47. package/dest/test/index.js +3 -2
  48. package/dest/types.d.ts +3 -1
  49. package/dest/types.d.ts.map +1 -1
  50. package/dest/utils.d.ts +1 -0
  51. package/dest/utils.d.ts.map +1 -1
  52. package/dest/utils.js +16 -1
  53. package/package.json +7 -4
  54. package/src/client.ts +56 -0
  55. package/src/contracts/forwarder.ts +113 -0
  56. package/src/contracts/governance.ts +50 -0
  57. package/src/contracts/governance_proposer.ts +41 -0
  58. package/src/contracts/index.ts +4 -0
  59. package/src/contracts/rollup.ts +264 -16
  60. package/src/contracts/slashing_proposer.ts +31 -0
  61. package/src/deploy_l1_contracts.ts +68 -26
  62. package/src/index.ts +4 -1
  63. package/src/l1_reader.ts +1 -2
  64. package/src/l1_tx_utils.ts +254 -34
  65. package/src/l1_tx_utils_with_blobs.ts +86 -0
  66. package/src/queries.ts +77 -0
  67. package/src/test/delayed_tx_utils.ts +24 -0
  68. package/src/test/index.ts +2 -1
  69. package/src/types.ts +4 -0
  70. package/src/utils.ts +15 -0
  71. package/dest/ethereum_chain.d.ts.map +0 -1
  72. /package/src/{ethereum_chain.ts → chain.ts} +0 -0
@@ -1,13 +1,16 @@
1
- import { times } from '@aztec/foundation/collection';
1
+ import { toHex } from '@aztec/foundation/bigint-buffer';
2
+ import { compactArray, times } from '@aztec/foundation/collection';
2
3
  import { bigintConfigHelper, getDefaultConfig, numberConfigHelper, } from '@aztec/foundation/config';
3
4
  import { makeBackoff, retry } from '@aztec/foundation/retry';
4
5
  import { sleep } from '@aztec/foundation/sleep';
5
- import { MethodNotFoundRpcError, MethodNotSupportedRpcError, formatGwei, } from 'viem';
6
+ import { MethodNotFoundRpcError, MethodNotSupportedRpcError, formatGwei, getContractError, hexToBytes, } from 'viem';
6
7
  import { formatViemError } from './utils.js';
7
8
  // 1_000_000_000 Gwei = 1 ETH
8
9
  // 1_000_000_000 Wei = 1 Gwei
9
10
  // 1_000_000_000_000_000_000 Wei = 1 ETH
10
11
  const WEI_CONST = 1000000000n;
12
+ // @note using this large gas limit to avoid the issue of `gas limit too low` when estimating gas in reth
13
+ const LARGE_GAS_LIMIT = 10000000n;
11
14
  // setting a minimum bump percentage to 10% due to geth's implementation
12
15
  // https://github.com/ethereum/go-ethereum/blob/e3d61e6db028c412f74bc4d4c7e117a9e29d0de0/core/txpool/legacypool/list.go#L298
13
16
  const MIN_REPLACEMENT_BUMP_PERCENTAGE = 10;
@@ -84,11 +87,27 @@ export class L1TxUtils {
84
87
  this.publicClient = publicClient;
85
88
  this.walletClient = walletClient;
86
89
  this.logger = logger;
90
+ this.interrupted = false;
87
91
  this.config = {
88
92
  ...defaultL1TxUtilsConfig,
89
93
  ...(config || {}),
90
94
  };
91
95
  }
96
+ interrupt() {
97
+ this.interrupted = true;
98
+ }
99
+ restart() {
100
+ this.interrupted = false;
101
+ }
102
+ getSenderAddress() {
103
+ return this.walletClient.account.address;
104
+ }
105
+ getBlock() {
106
+ return this.publicClient.getBlock();
107
+ }
108
+ getBlockNumber() {
109
+ return this.publicClient.getBlockNumber();
110
+ }
92
111
  /**
93
112
  * Sends a transaction with gas estimation and pricing
94
113
  * @param request - The transaction request (to, data, value)
@@ -150,13 +169,17 @@ export class L1TxUtils {
150
169
  * @param params - Parameters used in the initial transaction
151
170
  * @param gasConfig - Optional gas configuration
152
171
  */
153
- async monitorTransaction(request, initialTxHash, params, _gasConfig, _blobInputs) {
172
+ async monitorTransaction(request, initialTxHash, params, _gasConfig, _blobInputs, isCancelTx = false) {
173
+ const isBlobTx = !!_blobInputs;
154
174
  const gasConfig = { ...this.config, ..._gasConfig };
155
175
  const account = this.walletClient.account;
156
176
  const blobInputs = _blobInputs || {};
157
177
  const makeGetTransactionBackoff = () => makeBackoff(times(gasConfig.txPropagationMaxQueryAttempts ?? 3, i => i + 1));
158
178
  // Retry a few times, in case the tx is not yet propagated.
159
179
  const tx = await retry(() => this.publicClient.getTransaction({ hash: initialTxHash }), `Getting L1 transaction ${initialTxHash}`, makeGetTransactionBackoff(), this.logger, true);
180
+ if (!tx) {
181
+ throw new Error(`Failed to get L1 transaction ${initialTxHash} to monitor`);
182
+ }
160
183
  if (tx?.nonce === undefined || tx?.nonce === null) {
161
184
  throw new Error(`Failed to get L1 transaction ${initialTxHash} nonce`);
162
185
  }
@@ -165,10 +188,16 @@ export class L1TxUtils {
165
188
  let currentTxHash = initialTxHash;
166
189
  let attempts = 0;
167
190
  let lastAttemptSent = Date.now();
191
+ let lastGasPrice = {
192
+ maxFeePerGas: tx.maxFeePerGas,
193
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
194
+ maxFeePerBlobGas: tx.maxFeePerBlobGas,
195
+ };
168
196
  const initialTxTime = lastAttemptSent;
169
197
  let txTimedOut = false;
170
198
  const isTimedOut = () => (gasConfig.txTimeoutAt && Date.now() > gasConfig.txTimeoutAt.getTime()) ||
171
199
  (gasConfig.txTimeoutMs !== undefined && Date.now() - initialTxTime > gasConfig.txTimeoutMs) ||
200
+ this.interrupted ||
172
201
  false;
173
202
  while (!txTimedOut) {
174
203
  try {
@@ -209,13 +238,14 @@ export class L1TxUtils {
209
238
  }
210
239
  if (timePassed > gasConfig.stallTimeMs && attempts < gasConfig.maxAttempts) {
211
240
  attempts++;
212
- const newGasPrice = await this.getGasPrice(gasConfig, !!blobInputs, attempts, tx.maxFeePerGas && tx.maxPriorityFeePerGas
241
+ const newGasPrice = await this.getGasPrice(gasConfig, isBlobTx, attempts, tx.maxFeePerGas && tx.maxPriorityFeePerGas
213
242
  ? {
214
243
  maxFeePerGas: tx.maxFeePerGas,
215
244
  maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
216
245
  maxFeePerBlobGas: tx.maxFeePerBlobGas,
217
246
  }
218
247
  : undefined);
248
+ lastGasPrice = newGasPrice;
219
249
  this.logger?.debug(`L1 transaction ${currentTxHash} appears stuck. Attempting speed-up ${attempts}/${gasConfig.maxAttempts} ` +
220
250
  `with new priority fee ${formatGwei(newGasPrice.maxPriorityFeePerGas)} gwei`, {
221
251
  maxFeePerGas: formatGwei(newGasPrice.maxFeePerGas),
@@ -246,10 +276,23 @@ export class L1TxUtils {
246
276
  // Check if tx has timed out.
247
277
  txTimedOut = isTimedOut();
248
278
  }
249
- this.logger?.error(`L1 transaction ${currentTxHash} timed out`, {
250
- txHash: currentTxHash,
251
- ...tx,
252
- });
279
+ if (!isCancelTx) {
280
+ // Fire cancellation without awaiting to avoid blocking the main thread
281
+ this.attemptTxCancellation(nonce, isBlobTx, lastGasPrice, attempts)
282
+ .then(cancelTxHash => {
283
+ this.logger?.debug(`Sent cancellation tx ${cancelTxHash} for timed out tx ${currentTxHash}`);
284
+ })
285
+ .catch(err => {
286
+ const viemError = formatViemError(err);
287
+ this.logger?.error(`Failed to send cancellation for timed out tx ${currentTxHash}:`, viemError.message, {
288
+ metaMessages: viemError.metaMessages,
289
+ });
290
+ });
291
+ this.logger?.error(`L1 transaction ${currentTxHash} timed out`, {
292
+ txHash: currentTxHash,
293
+ ...tx,
294
+ });
295
+ }
253
296
  throw new Error(`L1 transaction ${currentTxHash} timed out`);
254
297
  }
255
298
  /**
@@ -363,27 +406,98 @@ export class L1TxUtils {
363
406
  async estimateGas(account, request, _gasConfig, _blobInputs) {
364
407
  const gasConfig = { ...this.config, ..._gasConfig };
365
408
  let initialEstimate = 0n;
366
- // Viem does not allow blobs to be sent via public client's estimate gas, so any estimation will fail.
367
- // Strangely, the only way to get gas and send blobs is prepareTransactionRequest().
368
- // See: https://github.com/wevm/viem/issues/2075
369
409
  if (_blobInputs) {
410
+ // @note requests with blobs also require maxFeePerBlobGas to be set
370
411
  const gasPrice = await this.getGasPrice(gasConfig, true, 0);
371
- initialEstimate = (await this.walletClient.prepareTransactionRequest({
412
+ initialEstimate = await this.publicClient.estimateGas({
372
413
  account,
373
414
  ...request,
374
415
  ..._blobInputs,
375
416
  maxFeePerBlobGas: gasPrice.maxFeePerBlobGas,
376
- }))?.gas;
377
- this.logger?.debug('L1 gas used in estimateGas by blob tx', { gas: initialEstimate });
417
+ gas: LARGE_GAS_LIMIT,
418
+ });
419
+ this.logger?.debug(`L1 gas used in estimateGas by blob tx: ${initialEstimate}`);
378
420
  }
379
421
  else {
380
- initialEstimate = await this.publicClient.estimateGas({ account, ...request });
381
- this.logger?.debug('L1 gas used in estimateGas by non-blob tx', { gas: initialEstimate });
422
+ initialEstimate = await this.publicClient.estimateGas({ account, ...request, gas: LARGE_GAS_LIMIT });
423
+ this.logger?.debug(`L1 gas used in estimateGas by non-blob tx: ${initialEstimate}`);
382
424
  }
383
425
  // Add buffer based on either fixed amount or percentage
384
426
  const withBuffer = this.bumpGasLimit(initialEstimate, gasConfig);
385
427
  return withBuffer;
386
428
  }
429
+ async getTransactionStats(txHash) {
430
+ const tx = await this.publicClient.getTransaction({ hash: txHash });
431
+ if (!tx) {
432
+ return undefined;
433
+ }
434
+ const calldata = hexToBytes(tx.input);
435
+ return {
436
+ sender: tx.from.toString(),
437
+ transactionHash: tx.hash,
438
+ calldataSize: calldata.length,
439
+ calldataGas: getCalldataGasUsage(calldata),
440
+ };
441
+ }
442
+ async tryGetErrorFromRevertedTx(data, args, blobInputs) {
443
+ try {
444
+ // NB: If this fn starts unexpectedly giving incorrect blob hash errors, it may be because the checkBlob
445
+ // bool is no longer at the slot below. To find the slot, run: forge inspect src/core/Rollup.sol:Rollup storage
446
+ const checkBlobSlot = 9n;
447
+ await this.publicClient.simulateContract({
448
+ ...args,
449
+ account: this.walletClient.account,
450
+ stateOverride: [
451
+ {
452
+ address: args.address,
453
+ stateDiff: [
454
+ {
455
+ slot: toHex(checkBlobSlot, true),
456
+ value: toHex(0n, true),
457
+ },
458
+ ],
459
+ },
460
+ ],
461
+ });
462
+ // If the above passes, we have a blob error. We cannot simulate blob txs, and failed txs no longer throw errors.
463
+ // Strangely, the only way to throw the revert reason as an error and provide blobs is prepareTransactionRequest.
464
+ // See: https://github.com/wevm/viem/issues/2075
465
+ // This throws a EstimateGasExecutionError with the custom error information:
466
+ const request = blobInputs
467
+ ? {
468
+ account: this.walletClient.account,
469
+ to: args.address,
470
+ data,
471
+ blobs: blobInputs.blobs,
472
+ kzg: blobInputs.kzg,
473
+ maxFeePerBlobGas: blobInputs.maxFeePerBlobGas,
474
+ }
475
+ : {
476
+ account: this.walletClient.account,
477
+ to: args.address,
478
+ data,
479
+ };
480
+ await this.walletClient.prepareTransactionRequest(request);
481
+ return undefined;
482
+ }
483
+ catch (simulationErr) {
484
+ // If we don't have a ContractFunctionExecutionError, we have a blob related error => use getContractError to get the error msg.
485
+ const contractErr = simulationErr.name === 'ContractFunctionExecutionError'
486
+ ? simulationErr
487
+ : getContractError(simulationErr, {
488
+ args: [],
489
+ abi: args.abi,
490
+ functionName: args.functionName,
491
+ address: args.address,
492
+ sender: this.walletClient.account.address,
493
+ });
494
+ if (contractErr.name === 'ContractFunctionExecutionError') {
495
+ const execErr = contractErr;
496
+ return tryGetCustomErrorNameContractFunction(execErr);
497
+ }
498
+ this.logger?.error(`Error getting error from simulation`, simulationErr);
499
+ }
500
+ }
387
501
  async simulateGasUsed(request, blockOverrides = {}, stateOverrides = [], _gasConfig) {
388
502
  const gasConfig = { ...this.config, ..._gasConfig };
389
503
  const gasPrice = await this.getGasPrice(gasConfig, false);
@@ -402,7 +516,7 @@ export class L1TxUtils {
402
516
  data: request.data,
403
517
  maxFeePerGas: gasPrice.maxFeePerGas,
404
518
  maxPriorityFeePerGas: gasPrice.maxPriorityFeePerGas,
405
- gas: request.gas ?? 10000000n,
519
+ gas: request.gas ?? LARGE_GAS_LIMIT,
406
520
  nonce,
407
521
  },
408
522
  ],
@@ -422,11 +536,11 @@ export class L1TxUtils {
422
536
  }
423
537
  catch (err) {
424
538
  if (err instanceof MethodNotFoundRpcError || err instanceof MethodNotSupportedRpcError) {
425
- this.logger?.error('Node does not support eth_simulateV1 API');
426
539
  if (gasConfig.fallbackGasEstimate) {
427
- this.logger?.debug(`Using fallback gas estimate: ${gasConfig.fallbackGasEstimate}`);
540
+ this.logger?.warn(`Node does not support eth_simulateV1 API. Using fallback gas estimate: ${gasConfig.fallbackGasEstimate}`);
428
541
  return gasConfig.fallbackGasEstimate;
429
542
  }
543
+ this.logger?.error('Node does not support eth_simulateV1 API');
430
544
  }
431
545
  throw err;
432
546
  }
@@ -435,5 +549,53 @@ export class L1TxUtils {
435
549
  const gasConfig = { ...this.config, ..._gasConfig };
436
550
  return gasLimit + (gasLimit * BigInt((gasConfig?.gasLimitBufferPercentage || 0) * 100)) / 10000n;
437
551
  }
552
+ /**
553
+ * Attempts to cancel a transaction by sending a 0-value tx to self with same nonce but higher gas prices
554
+ * @param nonce - The nonce of the transaction to cancel
555
+ * @param previousGasPrice - The gas price of the previous transaction
556
+ * @param attempts - The number of attempts to cancel the transaction
557
+ * @returns The hash of the cancellation transaction
558
+ */
559
+ async attemptTxCancellation(nonce, isBlobTx = false, previousGasPrice, attempts = 0) {
560
+ if (isBlobTx) {
561
+ throw new Error('Cannot cancel blob transactions, please use L1TxUtilsWithBlobsClass');
562
+ }
563
+ const account = this.walletClient.account;
564
+ // Get gas price with higher priority fee for cancellation
565
+ const cancelGasPrice = await this.getGasPrice({
566
+ ...this.config,
567
+ // Use high bump for cancellation to ensure it replaces the original tx
568
+ priorityFeeRetryBumpPercentage: 150, // 150% bump should be enough to replace any tx
569
+ }, isBlobTx, attempts + 1, previousGasPrice);
570
+ this.logger?.debug(`Attempting to cancel transaction with nonce ${nonce}`, {
571
+ maxFeePerGas: formatGwei(cancelGasPrice.maxFeePerGas),
572
+ maxPriorityFeePerGas: formatGwei(cancelGasPrice.maxPriorityFeePerGas),
573
+ });
574
+ const request = {
575
+ to: account.address,
576
+ value: 0n,
577
+ };
578
+ // Send 0-value tx to self with higher gas price
579
+ const cancelTxHash = await this.walletClient.sendTransaction({
580
+ ...request,
581
+ nonce,
582
+ gas: 21000n, // Standard ETH transfer gas
583
+ maxFeePerGas: cancelGasPrice.maxFeePerGas,
584
+ maxPriorityFeePerGas: cancelGasPrice.maxPriorityFeePerGas,
585
+ });
586
+ const receipt = await this.monitorTransaction(request, cancelTxHash, { gasLimit: 21000n }, undefined, undefined, true);
587
+ return receipt.transactionHash;
588
+ }
589
+ }
590
+ export function tryGetCustomErrorNameContractFunction(err) {
591
+ return compactArray([err.shortMessage, ...(err.metaMessages ?? []).slice(0, 2).map(s => s.trim())]).join(' ');
592
+ }
593
+ /*
594
+ * Returns cost of calldata usage in Ethereum.
595
+ * @param data - Calldata.
596
+ * @returns 4 for each zero byte, 16 for each nonzero.
597
+ */
598
+ export function getCalldataGasUsage(data) {
599
+ return data.filter(byte => byte === 0).length * 4 + data.filter(byte => byte !== 0).length * 16;
438
600
  }
439
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbDFfdHhfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JELE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhELE9BQU8sRUFRTCxzQkFBc0IsRUFDdEIsMEJBQTBCLEVBSzFCLFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFN0MsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUM3Qix3Q0FBd0M7QUFFeEMsTUFBTSxTQUFTLEdBQUcsV0FBYyxDQUFDO0FBRWpDLHdFQUF3RTtBQUN4RSw0SEFBNEg7QUFDNUgsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLENBQUM7QUFFM0MseUVBQXlFO0FBQ3pFLDJIQUEySDtBQUMzSCxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQztBQUVqRCxrQ0FBa0M7QUFDbEMsTUFBTSxhQUFhLEdBQUcsS0FBTSxDQUFDO0FBc0Q3QixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBd0M7SUFDMUUsd0JBQXdCLEVBQUU7UUFDeEIsV0FBVyxFQUFFLDJEQUEyRDtRQUN4RSxHQUFHLEVBQUUsZ0NBQWdDO1FBQ3JDLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDO0tBQzFCO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsV0FBVyxFQUFFLDJCQUEyQjtRQUN4QyxHQUFHLEVBQUUsa0JBQWtCO1FBQ3ZCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDO0tBQzFCO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsV0FBVyxFQUFFLDJCQUEyQjtRQUN4QyxHQUFHLEVBQUUsa0JBQWtCO1FBQ3ZCLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDO0tBQzVCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUFFLGtDQUFrQztRQUMvQyxHQUFHLEVBQUUseUJBQXlCO1FBQzlCLEdBQUcsa0JBQWtCLENBQUMsS0FBTSxDQUFDO0tBQzlCO0lBQ0QseUJBQXlCLEVBQUU7UUFDekIsV0FBVyxFQUFFLGdFQUFnRTtRQUM3RSxHQUFHLEVBQUUsaUNBQWlDO1FBQ3RDLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDO0tBQzFCO0lBQ0QsOEJBQThCLEVBQUU7UUFDOUIsV0FBVyxFQUFFLHNFQUFzRTtRQUNuRixHQUFHLEVBQUUsdUNBQXVDO1FBQzVDLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDO0tBQzFCO0lBQ0Qsc0JBQXNCLEVBQUU7UUFDdEIsV0FBVyxFQUFFLGdGQUFnRjtRQUM3RixHQUFHLEVBQUUsK0JBQStCO1FBQ3BDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUFFLHFDQUFxQztRQUNsRCxHQUFHLEVBQUUsNEJBQTRCO1FBQ2pDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsV0FBVyxFQUFFLDhCQUE4QjtRQUMzQyxHQUFHLEVBQUUsaUNBQWlDO1FBQ3RDLEdBQUcsa0JBQWtCLENBQUMsS0FBTSxDQUFDO0tBQzlCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUFFLHdDQUF3QztRQUNyRCxHQUFHLEVBQUUsNkJBQTZCO1FBQ2xDLEdBQUcsa0JBQWtCLENBQUMsS0FBTSxDQUFDO0tBQzlCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUFFLDhFQUE4RTtRQUMzRixHQUFHLEVBQUUsNkJBQTZCO1FBQ2xDLEdBQUcsa0JBQWtCLENBQUMsTUFBTyxDQUFDLEVBQUUsU0FBUztLQUMxQztJQUNELDZCQUE2QixFQUFFO1FBQzdCLFdBQVcsRUFBRSw4REFBOEQ7UUFDM0UsR0FBRyxFQUFFLHNDQUFzQztRQUMzQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQztLQUN6QjtDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBa0IsdUJBQXVCLENBQUMsQ0FBQztBQW9CakcsTUFBTSxPQUFPLFNBQVM7SUFHcEIsWUFDbUIsWUFBMEIsRUFDMUIsWUFBeUQsRUFDekQsTUFBZSxFQUNoQyxNQUFpQztRQUhoQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBNkM7UUFDekQsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUdoQyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osR0FBRyxzQkFBc0I7WUFDekIsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7U0FDbEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxlQUFlLENBQzFCLE9BQW9CLEVBQ3BCLFVBQWlGLEVBQ2pGLFVBQXlCO1FBRXpCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUM7WUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7WUFDMUMsSUFBSSxRQUFnQixDQUFDO1lBRXJCLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN2QixRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUNoQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRWpFLElBQUksU0FBUyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUVELElBQUksTUFBVyxDQUFDO1lBQ2hCLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7b0JBQy9DLEdBQUcsT0FBTztvQkFDVixHQUFHLFVBQVU7b0JBQ2IsR0FBRyxFQUFFLFFBQVE7b0JBQ2IsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZO29CQUNuQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsb0JBQW9CO29CQUNuRCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsZ0JBQWlCO2lCQUM3QyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7b0JBQy9DLEdBQUcsT0FBTztvQkFDVixHQUFHLEVBQUUsUUFBUTtvQkFDYixZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7b0JBQ25DLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxvQkFBb0I7aUJBQ3BELENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyx1QkFBdUIsTUFBTSxFQUFFLEVBQUU7Z0JBQ3BELFFBQVE7Z0JBQ1IsWUFBWSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO2dCQUMvQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO2dCQUMvRCxHQUFHLENBQUMsUUFBUSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7YUFDOUYsQ0FBQyxDQUFDO1lBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDeEMsQ0FBQztRQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLCtCQUErQixFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDakgsTUFBTSxTQUFTLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQzdCLE9BQW9CLEVBQ3BCLGFBQWtCLEVBQ2xCLE1BQTRCLEVBQzVCLFVBQThELEVBQzlELFdBQTBCO1FBRTFCLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsRUFBRSxDQUNyQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvRSwyREFBMkQ7UUFDM0QsTUFBTSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQ3BCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQy9ELDBCQUEwQixhQUFhLEVBQUUsRUFDekMseUJBQXlCLEVBQUUsRUFDM0IsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQ0wsQ0FBQztRQUVGLElBQUksRUFBRSxFQUFFLEtBQUssS0FBSyxTQUFTLElBQUksRUFBRSxFQUFFLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxhQUFhLFFBQVEsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBRXZCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUM7UUFFdEMsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUN0QixDQUFDLFNBQVMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkUsQ0FBQyxTQUFTLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsYUFBYSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7WUFDM0YsS0FBSyxDQUFDO1FBRVIsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQztnQkFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQy9GLElBQUksWUFBWSxHQUFHLEtBQUssRUFBRSxDQUFDO29CQUN6QixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUM1QixJQUFJLENBQUM7NEJBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs0QkFDeEUsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQ0FDWixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7b0NBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixJQUFJLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQ0FDakUsQ0FBQztxQ0FBTSxDQUFDO29DQUNOLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxDQUFDO2dDQUNyRCxDQUFDO2dDQUNELE9BQU8sT0FBTyxDQUFDOzRCQUNqQixDQUFDO3dCQUNILENBQUM7d0JBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQzs0QkFDYixJQUFJLEdBQUcsWUFBWSxLQUFLLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQ0FDN0QsTUFBTSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQzdCLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsMkRBQTJEO2dCQUMzRCxNQUFNLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FDcEIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFDL0QsMEJBQTBCLGFBQWEsRUFBRSxFQUN6Qyx5QkFBeUIsRUFBRSxFQUMzQixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FDTCxDQUFDO2dCQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxlQUFlLENBQUM7Z0JBRWhELElBQUksRUFBRSxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsV0FBWSxFQUFFLENBQUM7b0JBQzlDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixhQUFhLDBCQUEwQixVQUFVLEtBQUssQ0FBQyxDQUFDO29CQUU3RixrQ0FBa0M7b0JBQ2xDLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDZixNQUFNO29CQUNSLENBQUM7b0JBRUQsTUFBTSxLQUFLLENBQUMsU0FBUyxDQUFDLGVBQWdCLENBQUMsQ0FBQztvQkFDeEMsU0FBUztnQkFDWCxDQUFDO2dCQUVELElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxXQUFZLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxXQUFZLEVBQUUsQ0FBQztvQkFDN0UsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUN4QyxTQUFTLEVBQ1QsQ0FBQyxDQUFDLFVBQVUsRUFDWixRQUFRLEVBQ1IsRUFBRSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsb0JBQW9CO3dCQUN4QyxDQUFDLENBQUM7NEJBQ0UsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZOzRCQUM3QixvQkFBb0IsRUFBRSxFQUFFLENBQUMsb0JBQW9COzRCQUM3QyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsZ0JBQWdCO3lCQUN0Qzt3QkFDSCxDQUFDLENBQUMsU0FBUyxDQUNkLENBQUM7b0JBRUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQ2hCLGtCQUFrQixhQUFhLHVDQUF1QyxRQUFRLElBQUksU0FBUyxDQUFDLFdBQVcsR0FBRzt3QkFDeEcseUJBQXlCLFVBQVUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUM5RTt3QkFDRSxZQUFZLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7d0JBQ2xELG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUM7d0JBQ2xFLEdBQUcsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztxQkFDcEcsQ0FDRixDQUFDO29CQUVGLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO3dCQUN0RCxHQUFHLE9BQU87d0JBQ1YsR0FBRyxVQUFVO3dCQUNiLEtBQUs7d0JBQ0wsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRO3dCQUNwQixZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVk7d0JBQ3RDLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyxvQkFBb0I7cUJBQ3ZELENBQUMsQ0FBQztvQkFFSCxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUM1QixlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMvQixDQUFDO2dCQUNELE1BQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFnQixDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUNBQW1DLGFBQWEsR0FBRyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUYsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUM1QyxNQUFNLFNBQVMsQ0FBQztnQkFDbEIsQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQyxTQUFTLENBQUMsZUFBZ0IsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFDRCw2QkFBNkI7WUFDN0IsVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsYUFBYSxZQUFZLEVBQUU7WUFDOUQsTUFBTSxFQUFFLGFBQWE7WUFDckIsR0FBRyxFQUFFO1NBQ04sQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsYUFBYSxZQUFZLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMseUJBQXlCLENBQ3BDLE9BQW9CLEVBQ3BCLFNBQWdGLEVBQ2hGLFVBQXlCO1FBRXpCLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xHLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUN2QixVQUE0QixFQUM1QixXQUFvQixLQUFLLEVBQ3pCLFVBQWtCLENBQUMsRUFDbkIsZ0JBQThEO1FBRTlELE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1FBRTFDLGlDQUFpQztRQUNqQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDdEYsV0FBVyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsSUFBSSxXQUFtQixDQUFDO1FBQ3hCLElBQUksU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMscUNBQXFDLEVBQUU7Z0JBQ3hELHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxzQkFBc0I7YUFDekQsQ0FBQyxDQUFDO1lBQ0gsOENBQThDO1lBQzlDLFdBQVcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLHNCQUFzQixHQUFHLE9BQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7YUFBTSxDQUFDO1lBQ04sNENBQTRDO1lBQzVDLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBRTNCLElBQUksZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBRW5DLDJEQUEyRDtRQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFZLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDcEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25DLG1EQUFtRDtZQUNuRCxZQUFZLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxLQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFNLENBQUM7WUFDekQsd0JBQXdCO1lBQ3hCLGdCQUFnQixHQUFHLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxLQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFNLENBQUM7UUFDbkUsQ0FBQztRQUVELElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sVUFBVSxHQUNkLFNBQVMsQ0FBQyw4QkFBOEIsSUFBSSxzQkFBc0IsQ0FBQyw4QkFBK0IsQ0FBQztZQUVyRyxnRUFBZ0U7WUFDaEUsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQztZQUU1RyxNQUFNLGNBQWMsR0FBRyxVQUFVLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7WUFFdkYsNERBQTREO1lBQzVELDZEQUE2RDtZQUM3RCxNQUFNLGNBQWMsR0FDbEIsQ0FBQyxnQkFBaUIsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLE1BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxHQUFHLEdBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFPLENBQUM7WUFDakcsTUFBTSxTQUFTLEdBQUcsQ0FBQyxnQkFBaUIsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxNQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsR0FBRyxHQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTyxDQUFDO1lBRXpHLG1DQUFtQztZQUNuQyxZQUFZLElBQUksV0FBVyxDQUFDO1lBRTVCLHlFQUF5RTtZQUN6RSxXQUFXLEdBQUcsV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDMUUsWUFBWSxHQUFHLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3JFLENBQUM7YUFBTSxDQUFDO1lBQ04sb0VBQW9FO1lBQ3BFLDZEQUE2RDtZQUM3RCxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3RDLFdBQVcsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMseUJBQXlCLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU8sQ0FBQztZQUNoSCxDQUFDO1lBQ0QsWUFBWSxJQUFJLFdBQVcsQ0FBQztRQUM5QixDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFRLEdBQUcsU0FBUyxDQUFDO1FBQ3BELFlBQVksR0FBRyxZQUFZLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUV6RSxxQ0FBcUM7UUFDckMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFdBQVksR0FBRyxTQUFTLENBQUM7WUFDNUQsZ0JBQWdCLEdBQUcsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvRixDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFFckYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDdEQsTUFBTSxjQUFjLEdBQ2xCLFNBQVMsQ0FBQyw4QkFBK0IsR0FBRyxvQ0FBb0M7Z0JBQzlFLENBQUMsQ0FBQyxTQUFTLENBQUMsOEJBQStCO2dCQUMzQyxDQUFDLENBQUMsb0NBQW9DLENBQUM7WUFFM0MsbURBQW1EO1lBQ25ELE1BQU0sVUFBVSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxNQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsR0FBRyxHQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTyxDQUFDO1lBRTdHLGlFQUFpRTtZQUNqRSxnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDbkYsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixFQUFFO1lBQzFDLE9BQU87WUFDUCxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUM1QixZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUN0QyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsb0JBQW9CLENBQUM7WUFDdEQsR0FBRyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztTQUM1RSxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsWUFBWTtZQUNaLG9CQUFvQjtZQUNwQixHQUFHLENBQUMsZ0JBQWdCLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1NBQ2hFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUN0QixPQUFnQixFQUNoQixPQUFvQixFQUNwQixVQUE0QixFQUM1QixXQUEwQjtRQUUxQixNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQ3BELElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUN6QixzR0FBc0c7UUFDdEcsb0ZBQW9GO1FBQ3BGLGdEQUFnRDtRQUNoRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVELGVBQWUsR0FBRyxDQUNoQixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQUM7Z0JBQ2hELE9BQU87Z0JBQ1AsR0FBRyxPQUFPO2dCQUNWLEdBQUcsV0FBVztnQkFDZCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsZ0JBQWlCO2FBQzdDLENBQUMsQ0FDSCxFQUFFLEdBQUcsQ0FBQztZQUNQLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLHVDQUF1QyxFQUFFLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQzthQUFNLENBQUM7WUFDTixlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsMkNBQTJDLEVBQUUsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBRUQsd0RBQXdEO1FBQ3hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWpFLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUMxQixPQUF1QyxFQUN2QyxpQkFBaUQsRUFBRSxFQUNuRCxpQkFBZ0MsRUFBRSxFQUNsQyxVQUErRDtRQUUvRCxNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQ3BELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFMUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFMUcsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztnQkFDOUMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLE1BQU0sRUFBRTtvQkFDTjt3QkFDRSxjQUFjO3dCQUNkLGNBQWM7d0JBQ2QsS0FBSyxFQUFFOzRCQUNMO2dDQUNFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2dDQUN2QyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUc7Z0NBQ2YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dDQUNsQixZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7Z0NBQ25DLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxvQkFBb0I7Z0NBQ25ELEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLFNBQVc7Z0NBQy9CLEtBQUs7NkJBQ047eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDN0UsTUFBTTthQUNQLENBQUMsQ0FBQztZQUNILElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGtDQUFrQyxFQUFFO29CQUNyRCxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO2lCQUNoQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN0RyxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQzNCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxHQUFHLFlBQVksc0JBQXNCLElBQUksR0FBRyxZQUFZLDBCQUEwQixFQUFFLENBQUM7Z0JBQ3ZGLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7Z0JBQy9ELElBQUksU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGdDQUFnQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO29CQUNwRixPQUFPLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFDLFFBQWdCLEVBQUUsVUFBNEI7UUFDaEUsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUNwRCxPQUFPLFFBQVEsR0FBRyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsd0JBQXdCLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBSSxDQUFDLENBQUMsR0FBRyxNQUFPLENBQUM7SUFDckcsQ0FBQztDQUNGIn0=
601
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbDFfdHhfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUVMLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEdBQ25CLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEQsT0FBTyxFQVdMLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFLMUIsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTdDLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0Isd0NBQXdDO0FBRXhDLE1BQU0sU0FBUyxHQUFHLFdBQWMsQ0FBQztBQUVqQyx5R0FBeUc7QUFDekcsTUFBTSxlQUFlLEdBQUcsU0FBVyxDQUFDO0FBRXBDLHdFQUF3RTtBQUN4RSw0SEFBNEg7QUFDNUgsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLENBQUM7QUFFM0MseUVBQXlFO0FBQ3pFLDJIQUEySDtBQUMzSCxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQztBQUVqRCxrQ0FBa0M7QUFDbEMsTUFBTSxhQUFhLEdBQUcsS0FBTSxDQUFDO0FBc0Q3QixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBd0M7SUFDMUUsd0JBQXdCLEVBQUU7UUFDeEIsV0FBVyxFQUFFLDJEQUEyRDtRQUN4RSxHQUFHLEVBQUUsZ0NBQWdDO1FBQ3JDLEdBQUcsa0JBQWtCLENB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
@@ -0,0 +1,12 @@
1
+ import { type GasPrice, L1TxUtils } from './l1_tx_utils.js';
2
+ export declare class L1TxUtilsWithBlobs extends L1TxUtils {
3
+ /**
4
+ * Attempts to cancel a transaction by sending a 0-value tx to self with same nonce but higher gas prices
5
+ * @param nonce - The nonce of the transaction to cancel
6
+ * @param previousGasPrice - The gas price of the previous transaction
7
+ * @param attempts - The number of attempts to cancel the transaction
8
+ * @returns The hash of the cancellation transaction
9
+ */
10
+ attemptTxCancellation(nonce: number, isBlobTx?: boolean, previousGasPrice?: GasPrice, attempts?: number): Promise<`0x${string}`>;
11
+ }
12
+ //# sourceMappingURL=l1_tx_utils_with_blobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1_tx_utils_with_blobs.d.ts","sourceRoot":"","sources":["../src/l1_tx_utils_with_blobs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE5D,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C;;;;;;OAMG;IACY,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,UAAQ,EAAE,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,SAAI;CAuEhH"}
@@ -0,0 +1,61 @@
1
+ import { Blob } from '@aztec/foundation/blob';
2
+ import { formatGwei } from 'viem';
3
+ import { L1TxUtils } from './l1_tx_utils.js';
4
+ export class L1TxUtilsWithBlobs extends L1TxUtils {
5
+ /**
6
+ * Attempts to cancel a transaction by sending a 0-value tx to self with same nonce but higher gas prices
7
+ * @param nonce - The nonce of the transaction to cancel
8
+ * @param previousGasPrice - The gas price of the previous transaction
9
+ * @param attempts - The number of attempts to cancel the transaction
10
+ * @returns The hash of the cancellation transaction
11
+ */
12
+ async attemptTxCancellation(nonce, isBlobTx = false, previousGasPrice, attempts = 0) {
13
+ const account = this.walletClient.account;
14
+ // Get gas price with higher priority fee for cancellation
15
+ const cancelGasPrice = await this.getGasPrice({
16
+ ...this.config,
17
+ // Use high bump for cancellation to ensure it replaces the original tx
18
+ priorityFeeRetryBumpPercentage: 150, // 150% bump should be enough to replace any tx
19
+ }, isBlobTx, attempts + 1, previousGasPrice);
20
+ this.logger?.debug(`Attempting to cancel transaction with nonce ${nonce}`, {
21
+ maxFeePerGas: formatGwei(cancelGasPrice.maxFeePerGas),
22
+ maxPriorityFeePerGas: formatGwei(cancelGasPrice.maxPriorityFeePerGas),
23
+ });
24
+ const request = {
25
+ to: account.address,
26
+ value: 0n,
27
+ };
28
+ // Send 0-value tx to self with higher gas price
29
+ if (!isBlobTx) {
30
+ const cancelTxHash = await this.walletClient.sendTransaction({
31
+ ...request,
32
+ nonce,
33
+ gas: 21000n, // Standard ETH transfer gas
34
+ maxFeePerGas: cancelGasPrice.maxFeePerGas,
35
+ maxPriorityFeePerGas: cancelGasPrice.maxPriorityFeePerGas,
36
+ });
37
+ const receipt = await this.monitorTransaction(request, cancelTxHash, { gasLimit: 21000n }, undefined, undefined, true);
38
+ return receipt.transactionHash;
39
+ }
40
+ else {
41
+ const blobData = new Uint8Array(131072).fill(0);
42
+ const kzg = Blob.getViemKzgInstance();
43
+ const blobInputs = {
44
+ blobs: [blobData],
45
+ kzg,
46
+ maxFeePerBlobGas: cancelGasPrice.maxFeePerBlobGas,
47
+ };
48
+ const cancelTxHash = await this.walletClient.sendTransaction({
49
+ ...request,
50
+ ...blobInputs,
51
+ nonce,
52
+ gas: 21000n,
53
+ maxFeePerGas: cancelGasPrice.maxFeePerGas,
54
+ maxPriorityFeePerGas: cancelGasPrice.maxPriorityFeePerGas,
55
+ });
56
+ const receipt = await this.monitorTransaction(request, cancelTxHash, { gasLimit: 21000n }, undefined, blobInputs, true);
57
+ return receipt.transactionHash;
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHNfd2l0aF9ibG9icy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sMV90eF91dGlsc193aXRoX2Jsb2JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBaUIsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFNBQVM7SUFDL0M7Ozs7OztPQU1HO0lBQ00sS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQWEsRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLGdCQUEyQixFQUFFLFFBQVEsR0FBRyxDQUFDO1FBQzdHLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBRTFDLDBEQUEwRDtRQUMxRCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQzNDO1lBQ0UsR0FBRyxJQUFJLENBQUMsTUFBTTtZQUNkLHVFQUF1RTtZQUN2RSw4QkFBOEIsRUFBRSxHQUFHLEVBQUUsK0NBQStDO1NBQ3JGLEVBQ0QsUUFBUSxFQUNSLFFBQVEsR0FBRyxDQUFDLEVBQ1osZ0JBQWdCLENBQ2pCLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQywrQ0FBK0MsS0FBSyxFQUFFLEVBQUU7WUFDekUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO1lBQ3JELG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUM7U0FDdEUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUc7WUFDZCxFQUFFLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDbkIsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7Z0JBQzNELEdBQUcsT0FBTztnQkFDVixLQUFLO2dCQUNMLEdBQUcsRUFBRSxNQUFPLEVBQUUsNEJBQTRCO2dCQUMxQyxZQUFZLEVBQUUsY0FBYyxDQUFDLFlBQVk7Z0JBQ3pDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxvQkFBb0I7YUFDMUQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQzNDLE9BQU8sRUFDUCxZQUFZLEVBQ1osRUFBRSxRQUFRLEVBQUUsTUFBTyxFQUFFLEVBQ3JCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsSUFBSSxDQUNMLENBQUM7WUFFRixPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdEMsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDakIsR0FBRztnQkFDSCxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsZ0JBQWlCO2FBQ25ELENBQUM7WUFDRixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO2dCQUMzRCxHQUFHLE9BQU87Z0JBQ1YsR0FBRyxVQUFVO2dCQUNiLEtBQUs7Z0JBQ0wsR0FBRyxFQUFFLE1BQU87Z0JBQ1osWUFBWSxFQUFFLGNBQWMsQ0FBQyxZQUFZO2dCQUN6QyxvQkFBb0IsRUFBRSxjQUFjLENBQUMsb0JBQW9CO2FBQzFELENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUMzQyxPQUFPLEVBQ1AsWUFBWSxFQUNaLEVBQUUsUUFBUSxFQUFFLE1BQU8sRUFBRSxFQUNyQixTQUFTLEVBQ1QsVUFBVSxFQUNWLElBQUksQ0FDTCxDQUFDO1lBRUYsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,15 @@
1
+ import { type EthAddress } from '@aztec/foundation/eth-address';
2
+ import { type Chain, type HttpTransport, type PublicClient } from 'viem';
3
+ import { type L1ContractsConfig } from './config.js';
4
+ import { type L1ContractAddresses } from './l1_contract_addresses.js';
5
+ /** Given the Governance contract address, reads the addresses from all other contracts from L1. */
6
+ export declare function getL1ContractsAddresses(publicClient: PublicClient<HttpTransport, Chain>, governanceAddress: EthAddress): Promise<Omit<L1ContractAddresses, 'slashFactoryAddress' | 'coinIssuerAddress'>>;
7
+ /** Reads the L1ContractsConfig from L1 contracts. */
8
+ export declare function getL1ContractsConfig(publicClient: PublicClient<HttpTransport, Chain>, addresses: {
9
+ governanceAddress: EthAddress;
10
+ rollupAddress?: EthAddress;
11
+ }): Promise<Omit<L1ContractsConfig, 'ethereumSlotDuration'> & {
12
+ l1StartBlock: bigint;
13
+ l1GenesisTime: bigint;
14
+ }>;
15
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,MAAM,CAAC;AAEzE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,mGAAmG;AACnG,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,EAChD,iBAAiB,EAAE,UAAU,GAC5B,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,qBAAqB,GAAG,mBAAmB,CAAC,CAAC,CAWjF;AAED,qDAAqD;AACrD,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,EAChD,SAAS,EAAE;IAAE,iBAAiB,EAAE,UAAU,CAAC;IAAC,aAAa,CAAC,EAAE,UAAU,CAAA;CAAE,GACvE,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CA8C5G"}
@@ -0,0 +1,48 @@
1
+ import { GovernanceContract } from './contracts/governance.js';
2
+ import { RollupContract } from './contracts/rollup.js';
3
+ /** Given the Governance contract address, reads the addresses from all other contracts from L1. */
4
+ export async function getL1ContractsAddresses(publicClient, governanceAddress) {
5
+ const governance = new GovernanceContract(publicClient, governanceAddress.toString());
6
+ const governanceAddresses = await governance.getGovernanceAddresses();
7
+ const rollup = new RollupContract(publicClient, governanceAddresses.rollupAddress.toString());
8
+ const rollupAddresses = await rollup.getRollupAddresses();
9
+ return {
10
+ ...governanceAddresses,
11
+ ...rollupAddresses,
12
+ };
13
+ }
14
+ /** Reads the L1ContractsConfig from L1 contracts. */
15
+ export async function getL1ContractsConfig(publicClient, addresses) {
16
+ const governance = new GovernanceContract(publicClient, addresses.governanceAddress.toString());
17
+ const governanceProposer = await governance.getProposer();
18
+ const rollupAddress = addresses.rollupAddress ?? (await governance.getGovernanceAddresses()).rollupAddress;
19
+ const rollup = new RollupContract(publicClient, rollupAddress.toString());
20
+ const slasherProposer = await rollup.getSlashingProposer();
21
+ const [l1StartBlock, l1GenesisTime, aztecEpochDuration, aztecEpochProofClaimWindowInL2Slots, aztecSlotDuration, aztecTargetCommitteeSize, minimumStake, governanceProposerQuorum, governanceProposerRoundSize, slashingQuorum, slashingRoundSize,] = await Promise.all([
22
+ rollup.getL1StartBlock(),
23
+ rollup.getL1GenesisTime(),
24
+ rollup.getEpochDuration(),
25
+ rollup.getClaimDurationInL2Slots(),
26
+ rollup.getSlotDuration(),
27
+ rollup.getTargetCommitteeSize(),
28
+ rollup.getMinimumStake(),
29
+ governanceProposer.getQuorumSize(),
30
+ governanceProposer.getRoundSize(),
31
+ slasherProposer.getQuorumSize(),
32
+ slasherProposer.getRoundSize(),
33
+ ]);
34
+ return {
35
+ l1StartBlock,
36
+ l1GenesisTime,
37
+ aztecEpochDuration: Number(aztecEpochDuration),
38
+ aztecEpochProofClaimWindowInL2Slots: Number(aztecEpochProofClaimWindowInL2Slots),
39
+ aztecSlotDuration: Number(aztecSlotDuration),
40
+ aztecTargetCommitteeSize: Number(aztecTargetCommitteeSize),
41
+ governanceProposerQuorum: Number(governanceProposerQuorum),
42
+ governanceProposerRoundSize: Number(governanceProposerRoundSize),
43
+ minimumStake,
44
+ slashingQuorum: Number(slashingQuorum),
45
+ slashingRoundSize: Number(slashingRoundSize),
46
+ };
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWVyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUd2RCxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsWUFBZ0QsRUFDaEQsaUJBQTZCO0lBRTdCLE1BQU0sVUFBVSxHQUFHLElBQUksa0JBQWtCLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEYsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBRXRFLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM5RixNQUFNLGVBQWUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBRTFELE9BQU87UUFDTCxHQUFHLG1CQUFtQjtRQUN0QixHQUFHLGVBQWU7S0FDbkIsQ0FBQztBQUNKLENBQUM7QUFFRCxxREFBcUQ7QUFDckQsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsWUFBZ0QsRUFDaEQsU0FBd0U7SUFFeEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDaEcsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsYUFBYSxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUMzRyxNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUUsTUFBTSxlQUFlLEdBQUcsTUFBTSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUUzRCxNQUFNLENBQ0osWUFBWSxFQUNaLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsbUNBQW1DLEVBQ25DLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsWUFBWSxFQUNaLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0IsY0FBYyxFQUNkLGlCQUFpQixFQUNsQixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNwQixNQUFNLENBQUMsZUFBZSxFQUFFO1FBQ3hCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixNQUFNLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsTUFBTSxDQUFDLHlCQUF5QixFQUFFO1FBQ2xDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7UUFDeEIsTUFBTSxDQUFDLHNCQUFzQixFQUFFO1FBQy9CLE1BQU0sQ0FBQyxlQUFlLEVBQUU7UUFDeEIsa0JBQWtCLENBQUMsYUFBYSxFQUFFO1FBQ2xDLGtCQUFrQixDQUFDLFlBQVksRUFBRTtRQUNqQyxlQUFlLENBQUMsYUFBYSxFQUFFO1FBQy9CLGVBQWUsQ0FBQyxZQUFZLEVBQUU7S0FDdEIsQ0FBQyxDQUFDO0lBRVosT0FBTztRQUNMLFlBQVk7UUFDWixhQUFhO1FBQ2Isa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1FBQzlDLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQztRQUNoRixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUM7UUFDNUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDO1FBQzFELHdCQUF3QixFQUFFLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQztRQUMxRCwyQkFBMkIsRUFBRSxNQUFNLENBQUMsMkJBQTJCLENBQUM7UUFDaEUsWUFBWTtRQUNaLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ3RDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztLQUM3QyxDQUFDO0FBQ0osQ0FBQyJ9
@@ -0,0 +1,8 @@
1
+ import { L1TxUtilsWithBlobs } from '../l1_tx_utils_with_blobs.js';
2
+ import { type Delayer } from './tx_delayer.js';
3
+ export declare class DelayedTxUtils extends L1TxUtilsWithBlobs {
4
+ delayer: Delayer | undefined;
5
+ static fromL1TxUtils(l1TxUtils: L1TxUtilsWithBlobs, ethereumSlotDuration: number): DelayedTxUtils;
6
+ enableDelayer(ethereumSlotDuration: number): void;
7
+ }
8
+ //# sourceMappingURL=delayed_tx_utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delayed_tx_utils.d.ts","sourceRoot":"","sources":["../../src/test/delayed_tx_utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,KAAK,OAAO,EAAe,MAAM,iBAAiB,CAAC;AAE5D,qBAAa,cAAe,SAAQ,kBAAkB;IAC7C,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;WAEtB,aAAa,CAAC,SAAS,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM;IAUhF,aAAa,CAAC,oBAAoB,EAAE,MAAM;CAOlD"}
@@ -0,0 +1,21 @@
1
+ import { L1TxUtilsWithBlobs } from '../l1_tx_utils_with_blobs.js';
2
+ import { withDelayer } from './tx_delayer.js';
3
+ export class DelayedTxUtils extends L1TxUtilsWithBlobs {
4
+ static fromL1TxUtils(l1TxUtils, ethereumSlotDuration) {
5
+ const { client, delayer } = withDelayer(l1TxUtils.walletClient, {
6
+ ethereumSlotDuration,
7
+ });
8
+ const casted = l1TxUtils;
9
+ casted.delayer = delayer;
10
+ casted.walletClient = client;
11
+ return casted;
12
+ }
13
+ enableDelayer(ethereumSlotDuration) {
14
+ const { client, delayer } = withDelayer(this.walletClient, {
15
+ ethereumSlotDuration,
16
+ });
17
+ this.delayer = delayer;
18
+ this.walletClient = client;
19
+ }
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsYXllZF90eF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2RlbGF5ZWRfdHhfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFnQixXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxNQUFNLE9BQU8sY0FBZSxTQUFRLGtCQUFrQjtJQUc3QyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQTZCLEVBQUUsb0JBQTRCO1FBQ3JGLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUU7WUFDOUQsb0JBQW9CO1NBQ3JCLENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLFNBQXNDLENBQUM7UUFDdEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDekIsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDN0IsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLGFBQWEsQ0FBQyxvQkFBNEI7UUFDL0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN6RCxvQkFBb0I7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7SUFDN0IsQ0FBQztDQUNGIn0=
@@ -1,4 +1,5 @@
1
+ export * from './delayed_tx_utils.js';
2
+ export * from './eth_cheat_codes_with_state.js';
1
3
  export * from './start_anvil.js';
2
4
  export * from './tx_delayer.js';
3
- export * from './eth_cheat_codes_with_state.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
@@ -1,4 +1,5 @@
1
+ export * from './delayed_tx_utils.js';
2
+ export * from './eth_cheat_codes_with_state.js';
1
3
  export * from './start_anvil.js';
2
4
  export * from './tx_delayer.js';
3
- export * from './eth_cheat_codes_with_state.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQ0FBaUMsQ0FBQyJ9
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGlCQUFpQixDQUFDIn0=