@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.
Files changed (226) hide show
  1. package/dest/account.d.ts +1 -1
  2. package/dest/chain.d.ts +1 -1
  3. package/dest/client.d.ts +1 -1
  4. package/dest/client.js +6 -2
  5. package/dest/config.d.ts +22 -68
  6. package/dest/config.d.ts.map +1 -1
  7. package/dest/config.js +61 -348
  8. package/dest/constants.d.ts +1 -1
  9. package/dest/contracts/empire_base.d.ts +9 -5
  10. package/dest/contracts/empire_base.d.ts.map +1 -1
  11. package/dest/contracts/empire_base.js +1 -1
  12. package/dest/contracts/empire_slashing_proposer.d.ts +8 -4
  13. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
  14. package/dest/contracts/empire_slashing_proposer.js +39 -17
  15. package/dest/contracts/errors.d.ts +1 -1
  16. package/dest/contracts/errors.d.ts.map +1 -1
  17. package/dest/contracts/fee_asset_handler.d.ts +6 -5
  18. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  19. package/dest/contracts/fee_asset_handler.js +11 -9
  20. package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
  21. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  22. package/dest/contracts/fee_asset_price_oracle.js +651 -0
  23. package/dest/contracts/fee_juice.d.ts +1 -1
  24. package/dest/contracts/fee_juice.d.ts.map +1 -1
  25. package/dest/contracts/governance.d.ts +18 -16
  26. package/dest/contracts/governance.d.ts.map +1 -1
  27. package/dest/contracts/governance.js +14 -4
  28. package/dest/contracts/governance_proposer.d.ts +8 -4
  29. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  30. package/dest/contracts/governance_proposer.js +412 -11
  31. package/dest/contracts/gse.d.ts +1 -1
  32. package/dest/contracts/gse.d.ts.map +1 -1
  33. package/dest/contracts/inbox.d.ts +24 -3
  34. package/dest/contracts/inbox.d.ts.map +1 -1
  35. package/dest/contracts/inbox.js +36 -1
  36. package/dest/contracts/index.d.ts +4 -1
  37. package/dest/contracts/index.d.ts.map +1 -1
  38. package/dest/contracts/index.js +3 -0
  39. package/dest/contracts/log.d.ts +13 -0
  40. package/dest/contracts/log.d.ts.map +1 -0
  41. package/dest/contracts/log.js +1 -0
  42. package/dest/contracts/multicall.d.ts +2 -2
  43. package/dest/contracts/multicall.d.ts.map +1 -1
  44. package/dest/contracts/multicall.js +2 -1
  45. package/dest/contracts/outbox.d.ts +41 -0
  46. package/dest/contracts/outbox.d.ts.map +1 -0
  47. package/dest/contracts/outbox.js +86 -0
  48. package/dest/contracts/registry.d.ts +1 -1
  49. package/dest/contracts/registry.d.ts.map +1 -1
  50. package/dest/contracts/rollup.d.ts +195 -123
  51. package/dest/contracts/rollup.d.ts.map +1 -1
  52. package/dest/contracts/rollup.js +755 -187
  53. package/dest/contracts/slasher_contract.d.ts +1 -1
  54. package/dest/contracts/slasher_contract.d.ts.map +1 -1
  55. package/dest/contracts/tally_slashing_proposer.d.ts +9 -7
  56. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
  57. package/dest/contracts/tally_slashing_proposer.js +11 -4
  58. package/dest/contracts/utils.d.ts +1 -1
  59. package/dest/deploy_aztec_l1_contracts.d.ts +259 -0
  60. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
  61. package/dest/deploy_aztec_l1_contracts.js +413 -0
  62. package/dest/deploy_l1_contract.d.ts +68 -0
  63. package/dest/deploy_l1_contract.d.ts.map +1 -0
  64. package/dest/deploy_l1_contract.js +312 -0
  65. package/dest/eth-signer/eth-signer.d.ts +1 -1
  66. package/dest/eth-signer/index.d.ts +1 -1
  67. package/dest/forwarder_proxy.d.ts +32 -0
  68. package/dest/forwarder_proxy.d.ts.map +1 -0
  69. package/dest/forwarder_proxy.js +93 -0
  70. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  71. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  72. package/dest/generated/l1-contracts-defaults.js +30 -0
  73. package/dest/l1_artifacts.d.ts +11884 -1956
  74. package/dest/l1_artifacts.d.ts.map +1 -1
  75. package/dest/l1_contract_addresses.d.ts +3 -3
  76. package/dest/l1_contract_addresses.d.ts.map +1 -1
  77. package/dest/l1_contract_addresses.js +3 -3
  78. package/dest/l1_reader.d.ts +3 -1
  79. package/dest/l1_reader.d.ts.map +1 -1
  80. package/dest/l1_reader.js +6 -0
  81. package/dest/l1_tx_utils/config.d.ts +11 -5
  82. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  83. package/dest/l1_tx_utils/config.js +45 -9
  84. package/dest/l1_tx_utils/constants.d.ts +8 -2
  85. package/dest/l1_tx_utils/constants.d.ts.map +1 -1
  86. package/dest/l1_tx_utils/constants.js +27 -2
  87. package/dest/l1_tx_utils/factory.d.ts +18 -10
  88. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  89. package/dest/l1_tx_utils/factory.js +17 -7
  90. package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
  91. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
  92. package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
  93. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
  94. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
  95. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
  96. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
  97. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
  98. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
  99. package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
  100. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
  101. package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
  102. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
  103. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
  104. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +42 -0
  105. package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
  106. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
  107. package/dest/l1_tx_utils/index-blobs.js +2 -0
  108. package/dest/l1_tx_utils/index.d.ts +4 -1
  109. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  110. package/dest/l1_tx_utils/index.js +3 -0
  111. package/dest/l1_tx_utils/interfaces.d.ts +2 -2
  112. package/dest/l1_tx_utils/interfaces.d.ts.map +1 -1
  113. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
  114. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
  115. package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
  116. package/dest/l1_tx_utils/l1_tx_utils.d.ts +15 -6
  117. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  118. package/dest/l1_tx_utils/l1_tx_utils.js +64 -17
  119. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +19 -17
  120. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  121. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +69 -40
  122. package/dest/l1_tx_utils/signer.d.ts +1 -1
  123. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  124. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  125. package/dest/{test → l1_tx_utils}/tx_delayer.js +65 -36
  126. package/dest/l1_tx_utils/types.d.ts +1 -1
  127. package/dest/l1_tx_utils/types.d.ts.map +1 -1
  128. package/dest/l1_tx_utils/utils.d.ts +1 -1
  129. package/dest/l1_types.d.ts +1 -1
  130. package/dest/publisher_manager.d.ts +3 -2
  131. package/dest/publisher_manager.d.ts.map +1 -1
  132. package/dest/publisher_manager.js +2 -2
  133. package/dest/queries.d.ts +2 -2
  134. package/dest/queries.d.ts.map +1 -1
  135. package/dest/queries.js +16 -6
  136. package/dest/test/chain_monitor.d.ts +27 -24
  137. package/dest/test/chain_monitor.d.ts.map +1 -1
  138. package/dest/test/chain_monitor.js +33 -36
  139. package/dest/test/eth_cheat_codes.d.ts +11 -3
  140. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  141. package/dest/test/eth_cheat_codes.js +11 -3
  142. package/dest/test/eth_cheat_codes_with_state.d.ts +1 -1
  143. package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
  144. package/dest/test/index.d.ts +1 -3
  145. package/dest/test/index.d.ts.map +1 -1
  146. package/dest/test/index.js +0 -2
  147. package/dest/test/rollup_cheat_codes.d.ts +17 -13
  148. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  149. package/dest/test/rollup_cheat_codes.js +62 -38
  150. package/dest/test/start_anvil.d.ts +4 -1
  151. package/dest/test/start_anvil.d.ts.map +1 -1
  152. package/dest/test/start_anvil.js +3 -2
  153. package/dest/test/upgrade_utils.d.ts +1 -1
  154. package/dest/test/upgrade_utils.js +2 -2
  155. package/dest/types.d.ts +57 -2
  156. package/dest/types.d.ts.map +1 -1
  157. package/dest/utils.d.ts +16 -3
  158. package/dest/utils.d.ts.map +1 -1
  159. package/dest/utils.js +64 -0
  160. package/dest/zkPassportVerifierAddress.d.ts +1 -1
  161. package/package.json +34 -14
  162. package/src/client.ts +2 -2
  163. package/src/config.ts +74 -424
  164. package/src/contracts/README.md +157 -0
  165. package/src/contracts/empire_base.ts +8 -5
  166. package/src/contracts/empire_slashing_proposer.ts +38 -32
  167. package/src/contracts/fee_asset_handler.ts +10 -7
  168. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  169. package/src/contracts/governance.ts +13 -4
  170. package/src/contracts/governance_proposer.ts +26 -6
  171. package/src/contracts/inbox.ts +55 -3
  172. package/src/contracts/index.ts +3 -0
  173. package/src/contracts/log.ts +13 -0
  174. package/src/contracts/multicall.ts +5 -2
  175. package/src/contracts/outbox.ts +98 -0
  176. package/src/contracts/rollup.ts +432 -167
  177. package/src/contracts/tally_slashing_proposer.ts +15 -8
  178. package/src/deploy_aztec_l1_contracts.ts +650 -0
  179. package/src/deploy_l1_contract.ts +362 -0
  180. package/src/forwarder_proxy.ts +108 -0
  181. package/src/generated/l1-contracts-defaults.ts +32 -0
  182. package/src/l1_contract_addresses.ts +22 -20
  183. package/src/l1_reader.ts +8 -0
  184. package/src/l1_tx_utils/config.ts +54 -13
  185. package/src/l1_tx_utils/constants.ts +13 -2
  186. package/src/l1_tx_utils/factory.ts +31 -31
  187. package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
  188. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
  189. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
  190. package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
  191. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +108 -0
  192. package/src/l1_tx_utils/index-blobs.ts +2 -0
  193. package/src/l1_tx_utils/index.ts +3 -0
  194. package/src/l1_tx_utils/interfaces.ts +1 -1
  195. package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
  196. package/src/l1_tx_utils/l1_tx_utils.ts +76 -21
  197. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +92 -45
  198. package/src/{test → l1_tx_utils}/tx_delayer.ts +82 -52
  199. package/src/publisher_manager.ts +4 -2
  200. package/src/queries.ts +17 -6
  201. package/src/test/chain_monitor.ts +51 -49
  202. package/src/test/eth_cheat_codes.ts +9 -3
  203. package/src/test/index.ts +0 -2
  204. package/src/test/rollup_cheat_codes.ts +63 -43
  205. package/src/test/start_anvil.ts +5 -1
  206. package/src/test/upgrade_utils.ts +2 -2
  207. package/src/types.ts +62 -0
  208. package/src/utils.ts +83 -1
  209. package/dest/deploy_l1_contracts.d.ts +0 -226
  210. package/dest/deploy_l1_contracts.d.ts.map +0 -1
  211. package/dest/deploy_l1_contracts.js +0 -1460
  212. package/dest/index.d.ts +0 -18
  213. package/dest/index.d.ts.map +0 -1
  214. package/dest/index.js +0 -17
  215. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  216. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  217. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  218. package/dest/test/delayed_tx_utils.d.ts +0 -13
  219. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  220. package/dest/test/delayed_tx_utils.js +0 -28
  221. package/dest/test/tx_delayer.d.ts +0 -36
  222. package/dest/test/tx_delayer.d.ts.map +0 -1
  223. package/src/deploy_l1_contracts.ts +0 -1838
  224. package/src/index.ts +0 -17
  225. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  226. 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 { LARGE_GAS_LIMIT } from './constants.js';
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
- constructor(client, address, signer, logger = createLogger('ethereum:publisher'), dateProvider = new DateProvider(), config, debugMaxGasLimit = false, store, metrics){
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
- // Convert loaded states (which have id) to the txs format
79
- this.txs = loadedStates;
80
- this.logger.info(`Rehydrated ${loadedStates.length} tx states for account ${account}`);
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 = loadedStates.filter((state)=>!TerminalTxUtilsState.includes(state.status));
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 = LARGE_GAS_LIMIT;
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 ?? LARGE_GAS_LIMIT
546
+ gas: request.gas ?? MAX_L1_TX_LIMIT
513
547
  };
514
548
  if (!request.gas && !gasConfig.ignoreBlockGasLimit) {
515
- // LARGE_GAS_LIMIT is set as call.gas, increase block gasLimit
516
- blockOverrides.gasLimit = LARGE_GAS_LIMIT * 2n;
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. To be overridden in L1TxUtilsWithBlobs. */ makeEmptyBlobInputs(_maxFeePerBlobGas) {
608
- throw new Error('Cannot make empty blob inputs for cancellation');
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: Hex;
23
+ extraData: `0x${string}`;
27
24
  gasLimit: bigint;
28
25
  gasUsed: bigint;
29
- miner: import("viem").Address;
30
- mixHash: import("viem").Hash;
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: import("viem").Hash;
33
- receiptsRoot: Hex;
34
- sealFields: Hex[];
35
- sha3Uncles: import("viem").Hash;
33
+ parentHash: `0x${string}`;
34
+ receiptsRoot: `0x${string}`;
35
+ sealFields: `0x${string}`[];
36
+ sha3Uncles: `0x${string}`;
36
37
  size: bigint;
37
- stateRoot: import("viem").Hash;
38
+ stateRoot: `0x${string}`;
38
39
  timestamp: bigint;
39
40
  totalDifficulty: bigint | null;
40
- transactionsRoot: import("viem").Hash;
41
- uncles: import("viem").Hash[];
42
- withdrawals?: import("viem").Withdrawal[] | undefined | 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=readonly_l1_tx_utils.d.ts.map
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":"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"}
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, LARGE_GAS_LIMIT, MIN_BLOB_REPLACEMENT_BUMP_PERCENTAGE, MIN_REPLACEMENT_BUMP_PERCENTAGE, WEI_CONST } from './constants.js';
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
- const block = await this.client.getBlock({
42
- blockTag: 'latest'
43
- });
44
- const baseFee = block.baseFeePerGas ?? 0n;
45
- // Get blob base fee if available
46
- let blobBaseFee = 0n;
47
- if (isBlobTx) {
48
- try {
49
- blobBaseFee = await retry(()=>this.client.getBlobBaseFee(), 'Getting L1 blob base fee', makeBackoff(times(2, ()=>1)), this.logger, true);
50
- } catch {
51
- this.logger?.warn('Failed to get L1 blob base fee', attempt);
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 (gasConfig.fixedPriorityFeePerGas) {
56
- this.logger?.debug('Using fixed priority fee per L1 gas', {
57
- fixedPriorityFeePerGas: gasConfig.fixedPriorityFeePerGas
58
- });
59
- // try to maintain precision up to 1000000 wei
60
- priorityFee = BigInt(gasConfig.fixedPriorityFeePerGas * 1_000_000) * (WEI_CONST / 1_000_000n);
61
- } else {
62
- // Get initial priority fee from the network
63
- priorityFee = await this.client.estimateMaxPriorityFeePerGas();
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
- // Add priority fee to maxFeePerGas
85
- maxFeePerGas += priorityFee;
86
- // Use maximum between current network values and minimum required values
87
- priorityFee = priorityFee > minPriorityFee ? priorityFee : minPriorityFee;
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
- // first attempt, just bump priority fee, unless it's a fixed config
113
+ // First attempt: apply configured bump percentage to competitive fee
91
114
  // multiply by 100 & divide by 100 to maintain some precision
92
- if (!gasConfig.fixedPriorityFeePerGas) {
93
- priorityFee = priorityFee * (100_00n + BigInt((gasConfig.priorityFeeBumpPercentage || 0) * 1_00)) / 100_00n;
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
- const maxGweiInWei = gasConfig.maxGwei * WEI_CONST;
99
- maxFeePerGas = maxFeePerGas > maxGweiInWei ? maxGweiInWei : maxFeePerGas;
125
+ if (effectiveMaxGwei > 0n) {
126
+ maxFeePerGas = maxFeePerGas > effectiveMaxGwei ? effectiveMaxGwei : maxFeePerGas;
127
+ }
100
128
  // Ensure we don't exceed maxBlobGwei
101
- if (maxFeePerBlobGas) {
102
- const maxBlobGweiInWei = gasConfig.maxBlobGwei * WEI_CONST;
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: LARGE_GAS_LIMIT
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: LARGE_GAS_LIMIT
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=signer.d.ts.map
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"}