@aztec/ethereum 0.0.1-fake-c83136db25 → 0.0.2-commit.217f559981
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/account.d.ts +1 -1
- package/dest/chain.d.ts +1 -1
- package/dest/client.d.ts +1 -1
- package/dest/client.js +6 -2
- package/dest/config.d.ts +22 -68
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +61 -348
- package/dest/constants.d.ts +1 -1
- package/dest/contracts/empire_base.d.ts +9 -5
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/empire_base.js +1 -1
- package/dest/contracts/empire_slashing_proposer.d.ts +8 -4
- package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.js +39 -17
- package/dest/contracts/errors.d.ts +1 -1
- package/dest/contracts/errors.d.ts.map +1 -1
- package/dest/contracts/fee_asset_handler.d.ts +6 -5
- package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
- package/dest/contracts/fee_asset_handler.js +11 -9
- package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
- package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
- package/dest/contracts/fee_asset_price_oracle.js +651 -0
- package/dest/contracts/fee_juice.d.ts +1 -1
- package/dest/contracts/fee_juice.d.ts.map +1 -1
- package/dest/contracts/governance.d.ts +18 -16
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +14 -4
- package/dest/contracts/governance_proposer.d.ts +8 -4
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +412 -11
- package/dest/contracts/gse.d.ts +1 -1
- package/dest/contracts/gse.d.ts.map +1 -1
- package/dest/contracts/inbox.d.ts +24 -3
- package/dest/contracts/inbox.d.ts.map +1 -1
- package/dest/contracts/inbox.js +36 -1
- package/dest/contracts/index.d.ts +4 -1
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +3 -0
- package/dest/contracts/log.d.ts +13 -0
- package/dest/contracts/log.d.ts.map +1 -0
- package/dest/contracts/log.js +1 -0
- package/dest/contracts/multicall.d.ts +2 -2
- package/dest/contracts/multicall.d.ts.map +1 -1
- package/dest/contracts/multicall.js +2 -1
- package/dest/contracts/outbox.d.ts +41 -0
- package/dest/contracts/outbox.d.ts.map +1 -0
- package/dest/contracts/outbox.js +86 -0
- package/dest/contracts/registry.d.ts +1 -1
- package/dest/contracts/registry.d.ts.map +1 -1
- package/dest/contracts/rollup.d.ts +195 -123
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +755 -187
- package/dest/contracts/slasher_contract.d.ts +1 -1
- package/dest/contracts/slasher_contract.d.ts.map +1 -1
- package/dest/contracts/tally_slashing_proposer.d.ts +9 -7
- package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/tally_slashing_proposer.js +11 -4
- package/dest/contracts/utils.d.ts +1 -1
- package/dest/deploy_aztec_l1_contracts.d.ts +259 -0
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
- package/dest/deploy_aztec_l1_contracts.js +413 -0
- package/dest/deploy_l1_contract.d.ts +68 -0
- package/dest/deploy_l1_contract.d.ts.map +1 -0
- package/dest/deploy_l1_contract.js +312 -0
- package/dest/eth-signer/eth-signer.d.ts +1 -1
- package/dest/eth-signer/index.d.ts +1 -1
- package/dest/forwarder_proxy.d.ts +32 -0
- package/dest/forwarder_proxy.d.ts.map +1 -0
- package/dest/forwarder_proxy.js +93 -0
- package/dest/generated/l1-contracts-defaults.d.ts +30 -0
- package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
- package/dest/generated/l1-contracts-defaults.js +30 -0
- package/dest/l1_artifacts.d.ts +11884 -1956
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_contract_addresses.d.ts +3 -3
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +3 -3
- package/dest/l1_reader.d.ts +3 -1
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +6 -0
- package/dest/l1_tx_utils/config.d.ts +11 -5
- package/dest/l1_tx_utils/config.d.ts.map +1 -1
- package/dest/l1_tx_utils/config.js +45 -9
- package/dest/l1_tx_utils/constants.d.ts +8 -2
- package/dest/l1_tx_utils/constants.d.ts.map +1 -1
- package/dest/l1_tx_utils/constants.js +27 -2
- package/dest/l1_tx_utils/factory.d.ts +18 -10
- package/dest/l1_tx_utils/factory.d.ts.map +1 -1
- package/dest/l1_tx_utils/factory.js +17 -7
- package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
- package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
- package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
- package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +42 -0
- package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
- package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
- package/dest/l1_tx_utils/index-blobs.js +2 -0
- package/dest/l1_tx_utils/index.d.ts +4 -1
- package/dest/l1_tx_utils/index.d.ts.map +1 -1
- package/dest/l1_tx_utils/index.js +3 -0
- package/dest/l1_tx_utils/interfaces.d.ts +2 -2
- package/dest/l1_tx_utils/interfaces.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
- package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts +15 -6
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_tx_utils.js +64 -17
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +19 -17
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/readonly_l1_tx_utils.js +69 -40
- package/dest/l1_tx_utils/signer.d.ts +1 -1
- package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
- package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
- package/dest/{test → l1_tx_utils}/tx_delayer.js +65 -36
- package/dest/l1_tx_utils/types.d.ts +1 -1
- package/dest/l1_tx_utils/types.d.ts.map +1 -1
- package/dest/l1_tx_utils/utils.d.ts +1 -1
- package/dest/l1_types.d.ts +1 -1
- package/dest/publisher_manager.d.ts +3 -2
- package/dest/publisher_manager.d.ts.map +1 -1
- package/dest/publisher_manager.js +2 -2
- package/dest/queries.d.ts +2 -2
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +16 -6
- package/dest/test/chain_monitor.d.ts +27 -24
- package/dest/test/chain_monitor.d.ts.map +1 -1
- package/dest/test/chain_monitor.js +33 -36
- package/dest/test/eth_cheat_codes.d.ts +11 -3
- package/dest/test/eth_cheat_codes.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes.js +11 -3
- package/dest/test/eth_cheat_codes_with_state.d.ts +1 -1
- package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
- package/dest/test/index.d.ts +1 -3
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +0 -2
- package/dest/test/rollup_cheat_codes.d.ts +17 -13
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.js +62 -38
- package/dest/test/start_anvil.d.ts +4 -1
- package/dest/test/start_anvil.d.ts.map +1 -1
- package/dest/test/start_anvil.js +3 -2
- package/dest/test/upgrade_utils.d.ts +1 -1
- package/dest/test/upgrade_utils.js +2 -2
- package/dest/types.d.ts +57 -2
- package/dest/types.d.ts.map +1 -1
- package/dest/utils.d.ts +16 -3
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +64 -0
- package/dest/zkPassportVerifierAddress.d.ts +1 -1
- package/package.json +34 -14
- package/src/client.ts +2 -2
- package/src/config.ts +74 -424
- package/src/contracts/README.md +157 -0
- package/src/contracts/empire_base.ts +8 -5
- package/src/contracts/empire_slashing_proposer.ts +38 -32
- package/src/contracts/fee_asset_handler.ts +10 -7
- package/src/contracts/fee_asset_price_oracle.ts +280 -0
- package/src/contracts/governance.ts +13 -4
- package/src/contracts/governance_proposer.ts +26 -6
- package/src/contracts/inbox.ts +55 -3
- package/src/contracts/index.ts +3 -0
- package/src/contracts/log.ts +13 -0
- package/src/contracts/multicall.ts +5 -2
- package/src/contracts/outbox.ts +98 -0
- package/src/contracts/rollup.ts +432 -167
- package/src/contracts/tally_slashing_proposer.ts +15 -8
- package/src/deploy_aztec_l1_contracts.ts +650 -0
- package/src/deploy_l1_contract.ts +362 -0
- package/src/forwarder_proxy.ts +108 -0
- package/src/generated/l1-contracts-defaults.ts +32 -0
- package/src/l1_contract_addresses.ts +22 -20
- package/src/l1_reader.ts +8 -0
- package/src/l1_tx_utils/config.ts +54 -13
- package/src/l1_tx_utils/constants.ts +13 -2
- package/src/l1_tx_utils/factory.ts +31 -31
- package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
- package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
- package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
- package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
- package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +108 -0
- package/src/l1_tx_utils/index-blobs.ts +2 -0
- package/src/l1_tx_utils/index.ts +3 -0
- package/src/l1_tx_utils/interfaces.ts +1 -1
- package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
- package/src/l1_tx_utils/l1_tx_utils.ts +76 -21
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +92 -45
- package/src/{test → l1_tx_utils}/tx_delayer.ts +82 -52
- package/src/publisher_manager.ts +4 -2
- package/src/queries.ts +17 -6
- package/src/test/chain_monitor.ts +51 -49
- package/src/test/eth_cheat_codes.ts +9 -3
- package/src/test/index.ts +0 -2
- package/src/test/rollup_cheat_codes.ts +63 -43
- package/src/test/start_anvil.ts +5 -1
- package/src/test/upgrade_utils.ts +2 -2
- package/src/types.ts +62 -0
- package/src/utils.ts +83 -1
- package/dest/deploy_l1_contracts.d.ts +0 -226
- package/dest/deploy_l1_contracts.d.ts.map +0 -1
- package/dest/deploy_l1_contracts.js +0 -1460
- package/dest/index.d.ts +0 -18
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -17
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
- package/dest/test/delayed_tx_utils.d.ts +0 -13
- package/dest/test/delayed_tx_utils.d.ts.map +0 -1
- package/dest/test/delayed_tx_utils.js +0 -28
- package/dest/test/tx_delayer.d.ts +0 -36
- package/dest/test/tx_delayer.d.ts.map +0 -1
- package/src/deploy_l1_contracts.ts +0 -1838
- package/src/index.ts +0 -17
- package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
- package/src/test/delayed_tx_utils.ts +0 -52
|
@@ -11,8 +11,9 @@ import { createNonceManager, formatGwei, serializeTransaction } from 'viem';
|
|
|
11
11
|
import { jsonRpc } from 'viem/nonce';
|
|
12
12
|
import { formatViemError } from '../utils.js';
|
|
13
13
|
import { l1TxUtilsConfigMappings } from './config.js';
|
|
14
|
-
import {
|
|
14
|
+
import { MAX_L1_TX_LIMIT } from './constants.js';
|
|
15
15
|
import { ReadOnlyL1TxUtils } from './readonly_l1_tx_utils.js';
|
|
16
|
+
import { createDelayer, wrapClientWithDelayer } from './tx_delayer.js';
|
|
16
17
|
import { DroppedTransactionError, TerminalTxUtilsState, TxUtilsState, UnknownMinedTxError } from './types.js';
|
|
17
18
|
const MAX_L1_TX_STATES = 32;
|
|
18
19
|
export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
@@ -23,11 +24,28 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
23
24
|
metrics;
|
|
24
25
|
nonceManager;
|
|
25
26
|
txs;
|
|
26
|
-
|
|
27
|
+
/** Tx delayer for testing. Only set when enableDelayer config is true. */ delayer;
|
|
28
|
+
/** KZG instance for blob operations. */ kzg;
|
|
29
|
+
constructor(client, address, signer, logger = createLogger('ethereum:publisher'), dateProvider = new DateProvider(), config, debugMaxGasLimit = false, store, metrics, kzg, delayer){
|
|
27
30
|
super(client, logger, dateProvider, config, debugMaxGasLimit), this.client = client, this.address = address, this.signer = signer, this.store = store, this.metrics = metrics, this.txs = [];
|
|
28
31
|
this.nonceManager = createNonceManager({
|
|
29
32
|
source: jsonRpc()
|
|
30
33
|
});
|
|
34
|
+
this.kzg = kzg;
|
|
35
|
+
// Set up delayer: use provided one or create new
|
|
36
|
+
if (config?.enableDelayer && config?.ethereumSlotDuration) {
|
|
37
|
+
this.delayer = delayer ?? this.createDelayer({
|
|
38
|
+
ethereumSlotDuration: config.ethereumSlotDuration
|
|
39
|
+
}, logger.getBindings());
|
|
40
|
+
this.client = wrapClientWithDelayer(this.client, this.delayer);
|
|
41
|
+
if (config.txDelayerMaxInclusionTimeIntoSlot !== undefined) {
|
|
42
|
+
this.delayer.setMaxInclusionTimeIntoSlot(config.txDelayerMaxInclusionTimeIntoSlot);
|
|
43
|
+
}
|
|
44
|
+
} else if (delayer) {
|
|
45
|
+
// Delayer provided but enableDelayer not set — just store it without wrapping
|
|
46
|
+
logger.warn('Delayer provided but enableDelayer config is not set; delayer will not be used');
|
|
47
|
+
this.delayer = delayer;
|
|
48
|
+
}
|
|
31
49
|
}
|
|
32
50
|
get state() {
|
|
33
51
|
return this.txs.at(-1)?.status ?? TxUtilsState.IDLE;
|
|
@@ -75,11 +93,24 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
75
93
|
this.logger.debug(`No states to rehydrate for account ${account}`);
|
|
76
94
|
return;
|
|
77
95
|
}
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
|
|
96
|
+
// Clean up excess states if we have more than MAX_L1_TX_STATES
|
|
97
|
+
if (loadedStates.length > MAX_L1_TX_STATES) {
|
|
98
|
+
this.logger.warn(`Found ${loadedStates.length} tx states for account ${account}, pruning to most recent ${MAX_L1_TX_STATES}`);
|
|
99
|
+
// Keep only the most recent MAX_L1_TX_STATES
|
|
100
|
+
const statesToKeep = loadedStates.slice(-MAX_L1_TX_STATES);
|
|
101
|
+
const statesToDelete = loadedStates.slice(0, -MAX_L1_TX_STATES);
|
|
102
|
+
// Batch delete old states in a transaction for efficiency
|
|
103
|
+
const idsToDelete = statesToDelete.map((s)=>s.id);
|
|
104
|
+
await this.store.deleteState(account, ...idsToDelete);
|
|
105
|
+
this.txs = statesToKeep;
|
|
106
|
+
this.logger.info(`Cleaned up ${statesToDelete.length} old tx states, kept ${statesToKeep.length} for account ${account}`);
|
|
107
|
+
} else {
|
|
108
|
+
// Convert loaded states (which have id) to the txs format
|
|
109
|
+
this.txs = loadedStates;
|
|
110
|
+
this.logger.info(`Rehydrated ${loadedStates.length} tx states for account ${account}`);
|
|
111
|
+
}
|
|
81
112
|
// Find all pending states and resume monitoring
|
|
82
|
-
const pendingStates =
|
|
113
|
+
const pendingStates = this.txs.filter((state)=>!TerminalTxUtilsState.includes(state.status));
|
|
83
114
|
if (pendingStates.length === 0) {
|
|
84
115
|
return;
|
|
85
116
|
}
|
|
@@ -121,7 +152,7 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
121
152
|
const account = this.getSenderAddress().toString();
|
|
122
153
|
let gasLimit;
|
|
123
154
|
if (this.debugMaxGasLimit) {
|
|
124
|
-
gasLimit =
|
|
155
|
+
gasLimit = MAX_L1_TX_LIMIT;
|
|
125
156
|
} else if (gasConfig.gasLimit) {
|
|
126
157
|
gasLimit = gasConfig.gasLimit;
|
|
127
158
|
} else {
|
|
@@ -135,6 +166,13 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
135
166
|
if (this.interrupted) {
|
|
136
167
|
throw new InterruptError(`Transaction sending is interrupted`);
|
|
137
168
|
}
|
|
169
|
+
// Check timeout before consuming nonce to avoid leaking a nonce that was never sent.
|
|
170
|
+
// A leaked nonce creates a gap (e.g. nonce 107 consumed but unsent), so all subsequent
|
|
171
|
+
// transactions (108, 109, ...) can never be mined since the chain expects 107 first.
|
|
172
|
+
const now = new Date(await this.getL1Timestamp());
|
|
173
|
+
if (gasConfig.txTimeoutAt && now > gasConfig.txTimeoutAt) {
|
|
174
|
+
throw new TimeoutError(`Transaction timed out before sending (now ${now.toISOString()} > timeoutAt ${gasConfig.txTimeoutAt.toISOString()})`);
|
|
175
|
+
}
|
|
138
176
|
const nonce = await this.nonceManager.consume({
|
|
139
177
|
client: this.client,
|
|
140
178
|
address: account,
|
|
@@ -150,10 +188,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
150
188
|
const txData = this.makeTxData(baseState, {
|
|
151
189
|
isCancelTx: false
|
|
152
190
|
});
|
|
153
|
-
const now = new Date(await this.getL1Timestamp());
|
|
154
|
-
if (gasConfig.txTimeoutAt && now > gasConfig.txTimeoutAt) {
|
|
155
|
-
throw new TimeoutError(`Transaction timed out before sending (now ${now.toISOString()} > timeoutAt ${gasConfig.txTimeoutAt.toISOString()})`);
|
|
156
|
-
}
|
|
157
191
|
// Send the new tx
|
|
158
192
|
const signedRequest = await this.prepareSignedTransaction(txData);
|
|
159
193
|
const txHash = await this.client.sendRawTransaction({
|
|
@@ -204,7 +238,7 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
204
238
|
};
|
|
205
239
|
} catch (err) {
|
|
206
240
|
const viemError = formatViemError(err, request.abi);
|
|
207
|
-
this.logger.error(`Failed to send L1 transaction`, viemError, {
|
|
241
|
+
this.logger.error(`Failed to send L1 transaction: ${viemError.message}`, viemError, {
|
|
208
242
|
request: pick(request, 'to', 'value')
|
|
209
243
|
});
|
|
210
244
|
throw viemError;
|
|
@@ -509,11 +543,11 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
509
543
|
from: request.from ?? this.getSenderAddress().toString(),
|
|
510
544
|
maxFeePerGas: gasPrice.maxFeePerGas,
|
|
511
545
|
maxPriorityFeePerGas: gasPrice.maxPriorityFeePerGas,
|
|
512
|
-
gas: request.gas ??
|
|
546
|
+
gas: request.gas ?? MAX_L1_TX_LIMIT
|
|
513
547
|
};
|
|
514
548
|
if (!request.gas && !gasConfig.ignoreBlockGasLimit) {
|
|
515
|
-
//
|
|
516
|
-
blockOverrides.gasLimit =
|
|
549
|
+
// MAX_L1_TX_LIMIT is set as call.gas, ensure block gasLimit is sufficient
|
|
550
|
+
blockOverrides.gasLimit = MAX_L1_TX_LIMIT;
|
|
517
551
|
}
|
|
518
552
|
return this._simulate(call, blockOverrides, stateOverrides, gasConfig, abi);
|
|
519
553
|
}
|
|
@@ -604,7 +638,20 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
604
638
|
});
|
|
605
639
|
return Number(timestamp) * 1000;
|
|
606
640
|
}
|
|
607
|
-
/** Makes empty blob inputs for the cancellation tx.
|
|
608
|
-
|
|
641
|
+
/** Makes empty blob inputs for the cancellation tx. */ makeEmptyBlobInputs(maxFeePerBlobGas) {
|
|
642
|
+
if (!this.kzg) {
|
|
643
|
+
throw new Error('Cannot make empty blob inputs for cancellation without kzg');
|
|
644
|
+
}
|
|
645
|
+
const blobData = new Uint8Array(131072).fill(0);
|
|
646
|
+
return {
|
|
647
|
+
blobs: [
|
|
648
|
+
blobData
|
|
649
|
+
],
|
|
650
|
+
kzg: this.kzg,
|
|
651
|
+
maxFeePerBlobGas
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
/** Creates a new delayer instance. */ createDelayer(opts, bindings) {
|
|
655
|
+
return createDelayer(this.dateProvider, opts, bindings);
|
|
609
656
|
}
|
|
610
657
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
1
2
|
import { type Logger } from '@aztec/foundation/log';
|
|
2
3
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
3
|
-
import { type Abi, type Account, type BlockOverrides, type Hex, type StateOverride } from 'viem';
|
|
4
|
+
import { type Abi, type Account, type BlockOverrides, type GetCodeReturnType, type Hex, type StateOverride } from 'viem';
|
|
4
5
|
import type { ViemClient } from '../types.js';
|
|
5
6
|
import { type L1TxUtilsConfig } from './config.js';
|
|
6
7
|
import type { GasPrice, L1BlobInputs, L1TxRequest, TransactionStats } from './types.js';
|
|
@@ -15,35 +16,36 @@ export declare class ReadOnlyL1TxUtils {
|
|
|
15
16
|
interrupt(): void;
|
|
16
17
|
restart(): void;
|
|
17
18
|
getBlock(): Promise<{
|
|
18
|
-
number: bigint;
|
|
19
|
-
hash: `0x${string}`;
|
|
20
|
-
nonce: `0x${string}`;
|
|
21
|
-
logsBloom: `0x${string}`;
|
|
22
19
|
baseFeePerGas: bigint | null;
|
|
23
20
|
blobGasUsed: bigint;
|
|
24
21
|
difficulty: bigint;
|
|
25
22
|
excessBlobGas: bigint;
|
|
26
|
-
extraData:
|
|
23
|
+
extraData: `0x${string}`;
|
|
27
24
|
gasLimit: bigint;
|
|
28
25
|
gasUsed: bigint;
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
hash: `0x${string}`;
|
|
27
|
+
logsBloom: `0x${string}`;
|
|
28
|
+
miner: `0x${string}`;
|
|
29
|
+
mixHash: `0x${string}`;
|
|
30
|
+
nonce: `0x${string}`;
|
|
31
|
+
number: bigint;
|
|
31
32
|
parentBeaconBlockRoot?: `0x${string}` | undefined;
|
|
32
|
-
parentHash:
|
|
33
|
-
receiptsRoot:
|
|
34
|
-
sealFields:
|
|
35
|
-
sha3Uncles:
|
|
33
|
+
parentHash: `0x${string}`;
|
|
34
|
+
receiptsRoot: `0x${string}`;
|
|
35
|
+
sealFields: `0x${string}`[];
|
|
36
|
+
sha3Uncles: `0x${string}`;
|
|
36
37
|
size: bigint;
|
|
37
|
-
stateRoot:
|
|
38
|
+
stateRoot: `0x${string}`;
|
|
38
39
|
timestamp: bigint;
|
|
39
40
|
totalDifficulty: bigint | null;
|
|
40
|
-
transactionsRoot:
|
|
41
|
-
uncles:
|
|
42
|
-
withdrawals?: import("viem").Withdrawal[] | undefined
|
|
41
|
+
transactionsRoot: `0x${string}`;
|
|
42
|
+
uncles: `0x${string}`[];
|
|
43
|
+
withdrawals?: import("viem").Withdrawal[] | undefined;
|
|
43
44
|
withdrawalsRoot?: `0x${string}` | undefined;
|
|
44
45
|
transactions: `0x${string}`[];
|
|
45
46
|
}>;
|
|
46
47
|
getBlockNumber(): Promise<bigint>;
|
|
48
|
+
getCode(address: EthAddress): Promise<GetCodeReturnType>;
|
|
47
49
|
/**
|
|
48
50
|
* Gets the current gas price with bounds checking
|
|
49
51
|
*/
|
|
@@ -78,4 +80,4 @@ export declare class ReadOnlyL1TxUtils {
|
|
|
78
80
|
}>;
|
|
79
81
|
bumpGasLimit(gasLimit: bigint, _gasConfig?: L1TxUtilsConfig): bigint;
|
|
80
82
|
}
|
|
81
|
-
//# sourceMappingURL=
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHlfbDFfdHhfdXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy9yZWFkb25seV9sMV90eF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXZELE9BQU8sRUFDTCxLQUFLLEdBQUcsRUFDUixLQUFLLE9BQU8sRUFFWixLQUFLLGNBQWMsRUFFbkIsS0FBSyxpQkFBaUIsRUFDdEIsS0FBSyxHQUFHLEVBR1IsS0FBSyxhQUFhLEVBS25CLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBbUQsTUFBTSxhQUFhLENBQUM7QUFTcEcsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFNeEYscUJBQWEsaUJBQWlCO0lBS25CLE1BQU0sRUFBRSxVQUFVO0lBQ3pCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTTthQUNSLFlBQVksRUFBRSxZQUFZO0lBRTFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPO0lBUjlCLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekMsU0FBUyxDQUFDLFdBQVcsVUFBUztJQUU5QixZQUNTLE1BQU0sRUFBRSxVQUFVLEVBQ2YsTUFBTSxvQkFBcUQsRUFDckQsWUFBWSxFQUFFLFlBQVksRUFDMUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUN2QixnQkFBZ0IsR0FBRSxPQUFlLEVBRzVDO0lBRU0sU0FBUyxTQUVmO0lBRU0sT0FBTyxTQUViO0lBRU0sUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQUVkO0lBRU0sY0FBYyxvQkFFcEI7SUFFTSxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FFOUQ7SUFFRDs7T0FFRztJQUNVLFdBQVcsQ0FDdEIsa0JBQWtCLENBQUMsRUFBRSxlQUFlLEVBQ3BDLFFBQVEsR0FBRSxPQUFlLEVBQ3pCLE9BQU8sR0FBRSxNQUFVLEVBQ25CLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxPQUFPLFNBQVMsQ0FBQyxHQUFHLEtBQUssR0FBRyxRQUFRLEdBQzdELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FtSm5CO0lBRUQ7O09BRUc7SUFDVSxXQUFXLENBQ3RCLE9BQU8sRUFBRSxPQUFPLEdBQUcsR0FBRyxFQUN0QixPQUFPLEVBQUUsV0FBVyxFQUNwQixVQUFVLENBQUMsRUFBRSxlQUFlLEVBQzVCLFdBQVcsQ0FBQyxFQUFFLFlBQVksR0FDekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQThCakI7SUFFSyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsQ0FZL0U7SUFFWSx5QkFBeUIsQ0FDcEMsSUFBSSxFQUFFLEdBQUcsRUFDVCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNyQixZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQ3JCLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDVCxPQUFPLEVBQUUsR0FBRyxDQUFDO0tBQ2QsRUFDRCxVQUFVLEVBQUUsQ0FBQyxZQUFZLEdBQUc7UUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLEdBQUcsU0FBUyxFQUNyRSxhQUFhLEdBQUUsYUFBa0IsK0JBZ0RsQztJQUVZLFFBQVEsQ0FDbkIsT0FBTyxFQUFFLFdBQVcsR0FBRztRQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQTtLQUFFLEVBQ25ELGNBQWMsR0FBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBTSxFQUNuRCxjQUFjLEdBQUUsYUFBa0IsRUFDbEMsR0FBRyxHQUFFLEdBQWUsRUFDcEIsVUFBVSxDQUFDLEVBQUUsZUFBZSxHQUFHO1FBQUUsbUJBQW1CLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBRSxHQUM5RCxPQUFPLENBQUM7UUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQUMsTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUE7S0FBRSxDQUFDLENBVXJEO0lBRUQsVUFBZ0IsU0FBUyxDQUN2QixJQUFJLEVBQUUsR0FBRyxFQUNULGNBQWMsNENBQXFDLEVBQ25ELGNBQWMsMkJBQW9CLEVBQ2xDLFNBQVMsRUFBRSxlQUFlLEdBQUc7UUFBRSxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQzdELEdBQUcsRUFBRSxHQUFHOzs7T0FvQ1Q7SUFFTSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxlQUFlLEdBQUcsTUFBTSxDQVcxRTtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readonly_l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/readonly_l1_tx_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,OAAO,EACL,KAAK,GAAG,EACR,KAAK,OAAO,EAEZ,KAAK,cAAc,EAEnB,KAAK,GAAG,EAGR,KAAK,aAAa,EAKnB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,KAAK,eAAe,EAAmD,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"readonly_l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/readonly_l1_tx_utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,11 @@ import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
|
5
5
|
import pickBy from 'lodash.pickby';
|
|
6
6
|
import { MethodNotFoundRpcError, MethodNotSupportedRpcError, decodeErrorResult, formatGwei, getContractError, hexToBytes } from 'viem';
|
|
7
7
|
import { defaultL1TxUtilsConfig, l1TxUtilsConfigMappings } from './config.js';
|
|
8
|
-
import { BLOCK_TIME_MS,
|
|
8
|
+
import { BLOCK_TIME_MS, MAX_L1_TX_LIMIT, MIN_BLOB_REPLACEMENT_BUMP_PERCENTAGE, MIN_REPLACEMENT_BUMP_PERCENTAGE, WEI_CONST } from './constants.js';
|
|
9
|
+
import { P75AllTxsPriorityFeeStrategy } from './fee-strategies/index.js';
|
|
9
10
|
import { getCalldataGasUsage, tryGetCustomErrorNameContractFunction } from './utils.js';
|
|
11
|
+
// Change this to the current strategy we want to use
|
|
12
|
+
const CurrentStrategy = P75AllTxsPriorityFeeStrategy;
|
|
10
13
|
export class ReadOnlyL1TxUtils {
|
|
11
14
|
client;
|
|
12
15
|
logger;
|
|
@@ -34,36 +37,43 @@ export class ReadOnlyL1TxUtils {
|
|
|
34
37
|
getBlockNumber() {
|
|
35
38
|
return this.client.getBlockNumber();
|
|
36
39
|
}
|
|
40
|
+
getCode(address) {
|
|
41
|
+
return this.client.getCode({
|
|
42
|
+
address: address.toString()
|
|
43
|
+
});
|
|
44
|
+
}
|
|
37
45
|
/**
|
|
38
46
|
* Gets the current gas price with bounds checking
|
|
39
47
|
*/ async getGasPrice(gasConfigOverrides, isBlobTx = false, attempt = 0, previousGasPrice) {
|
|
40
48
|
const gasConfig = merge(this.config, gasConfigOverrides);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
// Execute strategy - it handles all RPC calls internally and returns everything we need
|
|
50
|
+
const strategyResult = await retry(()=>CurrentStrategy.execute(this.client, {
|
|
51
|
+
gasConfig,
|
|
52
|
+
isBlobTx,
|
|
53
|
+
logger: this.logger
|
|
54
|
+
}), 'Executing priority fee strategy', makeBackoff(times(2, ()=>0)), this.logger, true);
|
|
55
|
+
const { latestBlock, blobBaseFee, priorityFee: strategyPriorityFee } = strategyResult;
|
|
56
|
+
// Extract base fee from latest block
|
|
57
|
+
const baseFee = latestBlock.baseFeePerGas ?? 0n;
|
|
58
|
+
// Handle blob base fee
|
|
59
|
+
if (isBlobTx && blobBaseFee === undefined) {
|
|
60
|
+
this.logger?.warn('Failed to get L1 blob base fee', attempt);
|
|
53
61
|
}
|
|
54
|
-
let priorityFee;
|
|
55
|
-
if
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
let priorityFee = strategyPriorityFee;
|
|
63
|
+
// Apply minimum priority fee floor if configured
|
|
64
|
+
if (gasConfig.minimumPriorityFeePerGas) {
|
|
65
|
+
const minimumPriorityFee = BigInt(Math.trunc(gasConfig.minimumPriorityFeePerGas * Number(WEI_CONST)));
|
|
66
|
+
if (priorityFee < minimumPriorityFee) {
|
|
67
|
+
this.logger?.debug('Applying minimum priority fee floor', {
|
|
68
|
+
calculatedPriorityFee: formatGwei(priorityFee),
|
|
69
|
+
minimumPriorityFeePerGas: gasConfig.minimumPriorityFeePerGas,
|
|
70
|
+
appliedFee: formatGwei(minimumPriorityFee)
|
|
71
|
+
});
|
|
72
|
+
priorityFee = minimumPriorityFee;
|
|
73
|
+
}
|
|
64
74
|
}
|
|
65
75
|
let maxFeePerGas = baseFee;
|
|
66
|
-
let maxFeePerBlobGas = blobBaseFee;
|
|
76
|
+
let maxFeePerBlobGas = blobBaseFee ?? 0n;
|
|
67
77
|
// Bump base fee so it's valid for next blocks if it stalls
|
|
68
78
|
const numBlocks = Math.ceil(gasConfig.stallTimeMs / BLOCK_TIME_MS);
|
|
69
79
|
for(let i = 0; i < numBlocks; i++){
|
|
@@ -81,26 +91,43 @@ export class ReadOnlyL1TxUtils {
|
|
|
81
91
|
// multiply by 100 & divide by 100 to maintain some precision
|
|
82
92
|
const minPriorityFee = previousGasPrice.maxPriorityFeePerGas * (100_00n + BigInt(bumpPercentage * 1_00)) / 100_00n;
|
|
83
93
|
const minMaxFee = previousGasPrice.maxFeePerGas * (100_00n + BigInt(bumpPercentage * 1_00)) / 100_00n;
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
94
|
+
// Apply bump percentage to competitive fee
|
|
95
|
+
const competitivePriorityFee = priorityFee * (100_00n + BigInt(configBump * 1_00)) / 100_00n;
|
|
96
|
+
this.logger?.debug(`Speed-up attempt ${attempt}: using competitive fee strategy`, {
|
|
97
|
+
networkEstimate: formatGwei(priorityFee),
|
|
98
|
+
competitiveFee: formatGwei(competitivePriorityFee),
|
|
99
|
+
minRequired: formatGwei(minPriorityFee),
|
|
100
|
+
bumpPercentage: configBump
|
|
101
|
+
});
|
|
102
|
+
// Use maximum between competitive fee and minimum required bump
|
|
103
|
+
const finalPriorityFee = competitivePriorityFee > minPriorityFee ? competitivePriorityFee : minPriorityFee;
|
|
104
|
+
const feeSource = finalPriorityFee === competitivePriorityFee ? 'competitive' : 'minimum-bump';
|
|
105
|
+
priorityFee = finalPriorityFee;
|
|
106
|
+
// Add the final priority fee to maxFeePerGas
|
|
107
|
+
maxFeePerGas += finalPriorityFee;
|
|
88
108
|
maxFeePerGas = maxFeePerGas > minMaxFee ? maxFeePerGas : minMaxFee;
|
|
109
|
+
this.logger?.debug(`Speed-up fee decision: using ${feeSource} fee`, {
|
|
110
|
+
finalPriorityFee: formatGwei(finalPriorityFee)
|
|
111
|
+
});
|
|
89
112
|
} else {
|
|
90
|
-
//
|
|
113
|
+
// First attempt: apply configured bump percentage to competitive fee
|
|
91
114
|
// multiply by 100 & divide by 100 to maintain some precision
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
115
|
+
priorityFee = priorityFee * (100_00n + BigInt((gasConfig.priorityFeeBumpPercentage || 0) * 1_00)) / 100_00n;
|
|
116
|
+
this.logger?.debug('Initial transaction: using competitive fee from market analysis', {
|
|
117
|
+
networkEstimate: formatGwei(priorityFee)
|
|
118
|
+
});
|
|
95
119
|
maxFeePerGas += priorityFee;
|
|
96
120
|
}
|
|
121
|
+
// maxGwei and maxBlobGwei are hard limits
|
|
122
|
+
const effectiveMaxGwei = BigInt(Math.trunc(gasConfig.maxGwei * Number(WEI_CONST)));
|
|
123
|
+
const effectiveMaxBlobGwei = BigInt(Math.trunc(gasConfig.maxBlobGwei * Number(WEI_CONST)));
|
|
97
124
|
// Ensure we don't exceed maxGwei
|
|
98
|
-
|
|
99
|
-
|
|
125
|
+
if (effectiveMaxGwei > 0n) {
|
|
126
|
+
maxFeePerGas = maxFeePerGas > effectiveMaxGwei ? effectiveMaxGwei : maxFeePerGas;
|
|
127
|
+
}
|
|
100
128
|
// Ensure we don't exceed maxBlobGwei
|
|
101
|
-
if (maxFeePerBlobGas) {
|
|
102
|
-
|
|
103
|
-
maxFeePerBlobGas = maxFeePerBlobGas > maxBlobGweiInWei ? maxBlobGweiInWei : maxFeePerBlobGas;
|
|
129
|
+
if (maxFeePerBlobGas && effectiveMaxBlobGwei > 0n) {
|
|
130
|
+
maxFeePerBlobGas = maxFeePerBlobGas > effectiveMaxBlobGwei ? effectiveMaxBlobGwei : maxFeePerBlobGas;
|
|
104
131
|
}
|
|
105
132
|
// Ensure priority fee doesn't exceed max fee
|
|
106
133
|
const maxPriorityFeePerGas = priorityFee > maxFeePerGas ? maxFeePerGas : priorityFee;
|
|
@@ -116,7 +143,7 @@ export class ReadOnlyL1TxUtils {
|
|
|
116
143
|
baseFee: formatGwei(baseFee),
|
|
117
144
|
maxFeePerGas: formatGwei(maxFeePerGas),
|
|
118
145
|
maxPriorityFeePerGas: formatGwei(maxPriorityFeePerGas),
|
|
119
|
-
blobBaseFee: formatGwei(blobBaseFee),
|
|
146
|
+
blobBaseFee: formatGwei(blobBaseFee ?? 0n),
|
|
120
147
|
maxFeePerBlobGas: formatGwei(maxFeePerBlobGas)
|
|
121
148
|
});
|
|
122
149
|
return {
|
|
@@ -143,14 +170,16 @@ export class ReadOnlyL1TxUtils {
|
|
|
143
170
|
...request,
|
|
144
171
|
..._blobInputs,
|
|
145
172
|
maxFeePerBlobGas: gasPrice.maxFeePerBlobGas,
|
|
146
|
-
gas:
|
|
173
|
+
gas: MAX_L1_TX_LIMIT,
|
|
174
|
+
blockTag: 'latest'
|
|
147
175
|
});
|
|
148
176
|
this.logger?.trace(`Estimated gas for blob tx: ${initialEstimate}`);
|
|
149
177
|
} else {
|
|
150
178
|
initialEstimate = await this.client.estimateGas({
|
|
151
179
|
account,
|
|
152
180
|
...request,
|
|
153
|
-
gas:
|
|
181
|
+
gas: MAX_L1_TX_LIMIT,
|
|
182
|
+
blockTag: 'latest'
|
|
154
183
|
});
|
|
155
184
|
this.logger?.trace(`Estimated gas for non-blob tx: ${initialEstimate}`);
|
|
156
185
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type WalletClient } from 'viem';
|
|
2
2
|
import type { SigningCallback } from './types.js';
|
|
3
3
|
export declare function createViemSigner(client: WalletClient): SigningCallback;
|
|
4
|
-
//# sourceMappingURL=
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbDFfdHhfdXRpbHMvc2lnbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBZ0MsS0FBSyxZQUFZLEVBQW9CLE1BQU0sTUFBTSxDQUFDO0FBRXpGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVsRCx3QkFBZ0IsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFlBQVksbUJBb0JwRCJ9
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type Logger, type LoggerBindings } from '@aztec/foundation/log';
|
|
2
|
+
import type { DateProvider } from '@aztec/foundation/timer';
|
|
3
|
+
import { type Client, type Hex } from 'viem';
|
|
4
|
+
import type { ViemClient } from '../types.js';
|
|
5
|
+
export declare function waitUntilBlock<T extends Client>(client: T, blockNumber: number | bigint, logger?: Logger, timeout?: number): Promise<boolean>;
|
|
6
|
+
export declare function waitUntilL1Timestamp<T extends Client>(client: T, timestamp: number | bigint, logger?: Logger, timeout?: number): Promise<boolean>;
|
|
7
|
+
/** Manages tx delaying for testing, intercepting sendRawTransaction calls to delay or cancel them. */
|
|
8
|
+
export declare class Delayer {
|
|
9
|
+
dateProvider: DateProvider;
|
|
10
|
+
private logger;
|
|
11
|
+
maxInclusionTimeIntoSlot: number | undefined;
|
|
12
|
+
ethereumSlotDuration: bigint;
|
|
13
|
+
nextWait: {
|
|
14
|
+
l1Timestamp: bigint;
|
|
15
|
+
} | {
|
|
16
|
+
l1BlockNumber: bigint;
|
|
17
|
+
} | {
|
|
18
|
+
indefinitely: true;
|
|
19
|
+
} | undefined;
|
|
20
|
+
sentTxHashes: Hex[];
|
|
21
|
+
cancelledTxs: Hex[];
|
|
22
|
+
constructor(dateProvider: DateProvider, opts: {
|
|
23
|
+
ethereumSlotDuration: bigint | number;
|
|
24
|
+
}, bindings: LoggerBindings);
|
|
25
|
+
/** Returns the logger instance used by this delayer. */
|
|
26
|
+
getLogger(): Logger;
|
|
27
|
+
/** Returns the hashes of all effectively sent txs. */
|
|
28
|
+
getSentTxHashes(): `0x${string}`[];
|
|
29
|
+
/** Returns the raw hex for all cancelled txs. */
|
|
30
|
+
getCancelledTxs(): Hex[];
|
|
31
|
+
/** Delays the next tx to be sent so it lands on the given L1 block number. */
|
|
32
|
+
pauseNextTxUntilBlock(l1BlockNumber: number | bigint): void;
|
|
33
|
+
/** Delays the next tx to be sent so it lands on the given timestamp. */
|
|
34
|
+
pauseNextTxUntilTimestamp(l1Timestamp: number | bigint): void;
|
|
35
|
+
/** Delays the next tx to be sent indefinitely. */
|
|
36
|
+
cancelNextTx(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Sets max inclusion time into slot. If more than this many seconds have passed
|
|
39
|
+
* since the last L1 block was mined, then any tx will not be mined in the current
|
|
40
|
+
* L1 slot but will be deferred for the next one.
|
|
41
|
+
*/
|
|
42
|
+
setMaxInclusionTimeIntoSlot(seconds: number | undefined): void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Creates a new Delayer instance. Exposed so callers can create a single shared delayer
|
|
46
|
+
* and pass it to multiple `wrapClientWithDelayer` calls.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createDelayer(dateProvider: DateProvider, opts: {
|
|
49
|
+
ethereumSlotDuration: bigint | number;
|
|
50
|
+
}, bindings: LoggerBindings): Delayer;
|
|
51
|
+
/**
|
|
52
|
+
* Wraps a viem client with tx delaying logic. Returns the wrapped client.
|
|
53
|
+
* The delayer intercepts sendRawTransaction calls and delays them based on the delayer's state.
|
|
54
|
+
*/
|
|
55
|
+
export declare function wrapClientWithDelayer<T extends ViemClient>(client: T, delayer: Delayer): T;
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfZGVsYXllci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2wxX3R4X3V0aWxzL3R4X2RlbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVELE9BQU8sRUFDTCxLQUFLLE1BQU0sRUFDWCxLQUFLLEdBQUcsRUFVVCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sS0FBSyxFQUE0QixVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJeEUsd0JBQWdCLGNBQWMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxFQUM3QyxNQUFNLEVBQUUsQ0FBQyxFQUNULFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUM1QixNQUFNLENBQUMsRUFBRSxNQUFNLEVBQ2YsT0FBTyxDQUFDLEVBQUUsTUFBTSxvQkFpQmpCO0FBRUQsd0JBQWdCLG9CQUFvQixDQUFDLENBQUMsU0FBUyxNQUFNLEVBQ25ELE1BQU0sRUFBRSxDQUFDLEVBQ1QsU0FBUyxFQUFFLE1BQU0sR0FBRyxNQUFNLEVBQzFCLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFDZixPQUFPLENBQUMsRUFBRSxNQUFNLG9CQXdCakI7QUFFRCxzR0FBc0c7QUFDdEcscUJBQWEsT0FBTztJQVVULFlBQVksRUFBRSxZQUFZO0lBVG5DLE9BQU8sQ0FBQyxNQUFNLENBQVM7SUFFaEIsd0JBQXdCLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBYTtJQUN6RCxvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IsUUFBUSxFQUFFO1FBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEdBQUc7UUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFBO0tBQUUsR0FBRztRQUFFLFlBQVksRUFBRSxJQUFJLENBQUE7S0FBRSxHQUFHLFNBQVMsQ0FBYTtJQUMvRyxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQU07SUFDekIsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFNO0lBRWhDLFlBQ1MsWUFBWSxFQUFFLFlBQVksRUFDakMsSUFBSSxFQUFFO1FBQUUsb0JBQW9CLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQTtLQUFFLEVBQy9DLFFBQVEsRUFBRSxjQUFjLEVBSXpCO0lBRUQsd0RBQXdEO0lBQ3hELFNBQVMsSUFBSSxNQUFNLENBRWxCO0lBRUQsc0RBQXNEO0lBQ3RELGVBQWUsb0JBRWQ7SUFFRCxpREFBaUQ7SUFDakQsZUFBZSxJQUFJLEdBQUcsRUFBRSxDQUV2QjtJQUVELDhFQUE4RTtJQUM5RSxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxHQUFHLE1BQU0sUUFFbkQ7SUFFRCx3RUFBd0U7SUFDeEUseUJBQXlCLENBQUMsV0FBVyxFQUFFLE1BQU0sR0FBRyxNQUFNLFFBRXJEO0lBRUQsa0RBQWtEO0lBQ2xELFlBQVksU0FFWDtJQUVEOzs7O09BSUc7SUFDSCwyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLFNBQVMsUUFFdEQ7Q0FDRjtBQUVEOzs7R0FHRztBQUNILHdCQUFnQixhQUFhLENBQzNCLFlBQVksRUFBRSxZQUFZLEVBQzFCLElBQUksRUFBRTtJQUFFLG9CQUFvQixFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUE7Q0FBRSxFQUMvQyxRQUFRLEVBQUUsY0FBYyxHQUN2QixPQUFPLENBRVQ7QUFhRDs7O0dBR0c7QUFDSCx3QkFBZ0IscUJBQXFCLENBQUMsQ0FBQyxTQUFTLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQWtIMUYifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_delayer.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/tx_delayer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EACL,KAAK,MAAM,EACX,KAAK,GAAG,EAUT,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAA4B,UAAU,EAAE,MAAM,aAAa,CAAC;AAIxE,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,MAAM,EAAE,CAAC,EACT,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,oBAiBjB;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EACnD,MAAM,EAAE,CAAC,EACT,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,oBAwBjB;AAED,sGAAsG;AACtG,qBAAa,OAAO;IAUT,YAAY,EAAE,YAAY;IATnC,OAAO,CAAC,MAAM,CAAS;IAEhB,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAa;IACzD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,YAAY,EAAE,IAAI,CAAA;KAAE,GAAG,SAAS,CAAa;IAC/G,YAAY,EAAE,GAAG,EAAE,CAAM;IACzB,YAAY,EAAE,GAAG,EAAE,CAAM;IAEhC,YACS,YAAY,EAAE,YAAY,EACjC,IAAI,EAAE;QAAE,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,EAC/C,QAAQ,EAAE,cAAc,EAIzB;IAED,wDAAwD;IACxD,SAAS,IAAI,MAAM,CAElB;IAED,sDAAsD;IACtD,eAAe,oBAEd;IAED,iDAAiD;IACjD,eAAe,IAAI,GAAG,EAAE,CAEvB;IAED,8EAA8E;IAC9E,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,QAEnD;IAED,wEAAwE;IACxE,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,QAErD;IAED,kDAAkD;IAClD,YAAY,SAEX;IAED;;;;OAIG;IACH,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,QAEtD;CACF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE;IAAE,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAC/C,QAAQ,EAAE,cAAc,GACvB,OAAO,CAET;AAaD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,CAkH1F"}
|