@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.
- package/dest/{ethereum_chain.d.ts → chain.d.ts} +1 -1
- package/dest/chain.d.ts.map +1 -0
- package/dest/{ethereum_chain.js → chain.js} +1 -1
- package/dest/client.d.ts +16 -0
- package/dest/client.d.ts.map +1 -0
- package/dest/client.js +35 -0
- package/dest/contracts/forwarder.d.ts +23 -0
- package/dest/contracts/forwarder.d.ts.map +1 -0
- package/dest/contracts/forwarder.js +66 -0
- package/dest/contracts/governance.d.ts +14 -0
- package/dest/contracts/governance.d.ts.map +1 -0
- package/dest/contracts/governance.js +31 -0
- package/dest/contracts/governance_proposer.d.ts +13 -0
- package/dest/contracts/governance_proposer.d.ts.map +1 -0
- package/dest/contracts/governance_proposer.js +40 -0
- package/dest/contracts/index.d.ts +4 -0
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +5 -1
- package/dest/contracts/rollup.d.ts +94 -5
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +177 -16
- package/dest/contracts/slashing_proposer.d.ts +11 -0
- package/dest/contracts/slashing_proposer.d.ts.map +1 -0
- package/dest/contracts/slashing_proposer.js +19 -0
- package/dest/deploy_l1_contracts.d.ts +985 -974
- package/dest/deploy_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_l1_contracts.js +44 -22
- package/dest/index.d.ts +4 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +5 -2
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +2 -3
- package/dest/l1_tx_utils.d.ts +78 -17
- package/dest/l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils.js +182 -20
- package/dest/l1_tx_utils_with_blobs.d.ts +12 -0
- package/dest/l1_tx_utils_with_blobs.d.ts.map +1 -0
- package/dest/l1_tx_utils_with_blobs.js +61 -0
- package/dest/queries.d.ts +15 -0
- package/dest/queries.d.ts.map +1 -0
- package/dest/queries.js +48 -0
- package/dest/test/delayed_tx_utils.d.ts +8 -0
- package/dest/test/delayed_tx_utils.d.ts.map +1 -0
- package/dest/test/delayed_tx_utils.js +21 -0
- package/dest/test/index.d.ts +2 -1
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +3 -2
- package/dest/types.d.ts +3 -1
- package/dest/types.d.ts.map +1 -1
- package/dest/utils.d.ts +1 -0
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +16 -1
- package/package.json +7 -4
- package/src/client.ts +56 -0
- package/src/contracts/forwarder.ts +113 -0
- package/src/contracts/governance.ts +50 -0
- package/src/contracts/governance_proposer.ts +41 -0
- package/src/contracts/index.ts +4 -0
- package/src/contracts/rollup.ts +264 -16
- package/src/contracts/slashing_proposer.ts +31 -0
- package/src/deploy_l1_contracts.ts +68 -26
- package/src/index.ts +4 -1
- package/src/l1_reader.ts +1 -2
- package/src/l1_tx_utils.ts +254 -34
- package/src/l1_tx_utils_with_blobs.ts +86 -0
- package/src/queries.ts +77 -0
- package/src/test/delayed_tx_utils.ts +24 -0
- package/src/test/index.ts +2 -1
- package/src/types.ts +4 -0
- package/src/utils.ts +15 -0
- package/dest/ethereum_chain.d.ts.map +0 -1
- /package/src/{ethereum_chain.ts → chain.ts} +0 -0
package/dest/l1_tx_utils.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import {
|
|
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,
|
|
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
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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 =
|
|
412
|
+
initialEstimate = await this.publicClient.estimateGas({
|
|
372
413
|
account,
|
|
373
414
|
...request,
|
|
374
415
|
..._blobInputs,
|
|
375
416
|
maxFeePerBlobGas: gasPrice.maxFeePerBlobGas,
|
|
376
|
-
|
|
377
|
-
|
|
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(
|
|
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 ??
|
|
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?.
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbDFfdHhfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JELE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhELE9BQU8sRUFRTCxzQkFBc0IsRUFDdEIsMEJBQTBCLEVBSzFCLFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFN0MsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUM3Qix3Q0FBd0M7QUFFeEMsTUFBTSxTQUFTLEdBQUcsV0FBYyxDQUFDO0FBRWpDLHdFQUF3RTtBQUN4RSw0SEFBNEg7QUFDNUgsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLENBQUM7QUFFM0MseUVBQXlFO0FBQ3pFLDJIQUEySDtBQUMzSCxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQztBQUVqRCxrQ0FBa0M7QUFDbEMsTUFBTSxhQUFhLEdBQUcsS0FBTSxDQUFDO0FBc0Q3QixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBd0M7SUFDMUUsd0JBQXdCLEVBQUU7UUFDeEIsV0FBVyxFQUFFLDJEQUEyRDtRQUN4RSxHQUFHLEVBQUUsZ0NBQWdDO1FBQ3JDLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDO0tBQzFCO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsV0FBVyxFQUFFLDJCQUEyQjtRQUN4QyxHQUFHLEVBQUUsa0JBQWtCO1FBQ3ZCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDO0tBQzFCO0lB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
|
|
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"}
|
package/dest/queries.js
ADDED
|
@@ -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=
|
package/dest/test/index.d.ts
CHANGED
package/dest/test/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,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"}
|
package/dest/test/index.js
CHANGED
|
@@ -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
|
-
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQ0FBaUMsQ0FBQyJ9
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGlCQUFpQixDQUFDIn0=
|