@aztec/ethereum 0.0.0-test.1 → 0.0.1-commit.001888fc

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 (289) hide show
  1. package/dest/account.d.ts +2 -0
  2. package/dest/account.d.ts.map +1 -0
  3. package/dest/account.js +4 -0
  4. package/dest/chain.d.ts +1 -1
  5. package/dest/client.d.ts +14 -4
  6. package/dest/client.d.ts.map +1 -1
  7. package/dest/client.js +27 -3
  8. package/dest/config.d.ts +70 -23
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +155 -34
  11. package/dest/constants.d.ts +1 -1
  12. package/dest/contracts/empire_base.d.ts +27 -8
  13. package/dest/contracts/empire_base.d.ts.map +1 -1
  14. package/dest/contracts/empire_base.js +75 -2
  15. package/dest/contracts/empire_slashing_proposer.d.ts +69 -0
  16. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -0
  17. package/dest/contracts/empire_slashing_proposer.js +216 -0
  18. package/dest/contracts/errors.d.ts +7 -0
  19. package/dest/contracts/errors.d.ts.map +1 -0
  20. package/dest/contracts/errors.js +12 -0
  21. package/dest/contracts/fee_asset_handler.d.ts +20 -0
  22. package/dest/contracts/fee_asset_handler.d.ts.map +1 -0
  23. package/dest/contracts/fee_asset_handler.js +59 -0
  24. package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
  25. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  26. package/dest/contracts/fee_asset_price_oracle.js +651 -0
  27. package/dest/contracts/fee_juice.d.ts +6 -7
  28. package/dest/contracts/fee_juice.d.ts.map +1 -1
  29. package/dest/contracts/fee_juice.js +27 -20
  30. package/dest/contracts/governance.d.ts +45 -32
  31. package/dest/contracts/governance.d.ts.map +1 -1
  32. package/dest/contracts/governance.js +98 -85
  33. package/dest/contracts/governance_proposer.d.ts +19 -13
  34. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  35. package/dest/contracts/governance_proposer.js +441 -26
  36. package/dest/contracts/gse.d.ts +32 -0
  37. package/dest/contracts/gse.d.ts.map +1 -0
  38. package/dest/contracts/gse.js +72 -0
  39. package/dest/contracts/inbox.d.ts +47 -0
  40. package/dest/contracts/inbox.d.ts.map +1 -0
  41. package/dest/contracts/inbox.js +80 -0
  42. package/dest/contracts/index.d.ts +12 -3
  43. package/dest/contracts/index.d.ts.map +1 -1
  44. package/dest/contracts/index.js +11 -2
  45. package/dest/contracts/log.d.ts +13 -0
  46. package/dest/contracts/log.d.ts.map +1 -0
  47. package/dest/contracts/log.js +1 -0
  48. package/dest/contracts/multicall.d.ts +21 -0
  49. package/dest/contracts/multicall.d.ts.map +1 -0
  50. package/dest/contracts/multicall.js +157 -0
  51. package/dest/contracts/outbox.d.ts +41 -0
  52. package/dest/contracts/outbox.d.ts.map +1 -0
  53. package/dest/contracts/outbox.js +86 -0
  54. package/dest/contracts/registry.d.ts +12 -5
  55. package/dest/contracts/registry.d.ts.map +1 -1
  56. package/dest/contracts/registry.js +74 -17
  57. package/dest/contracts/rollup.d.ts +311 -53
  58. package/dest/contracts/rollup.d.ts.map +1 -1
  59. package/dest/contracts/rollup.js +1180 -116
  60. package/dest/contracts/slasher_contract.d.ts +44 -0
  61. package/dest/contracts/slasher_contract.d.ts.map +1 -0
  62. package/dest/contracts/slasher_contract.js +75 -0
  63. package/dest/contracts/tally_slashing_proposer.d.ts +140 -0
  64. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -0
  65. package/dest/contracts/tally_slashing_proposer.js +320 -0
  66. package/dest/contracts/utils.d.ts +3 -0
  67. package/dest/contracts/utils.d.ts.map +1 -0
  68. package/dest/contracts/utils.js +11 -0
  69. package/dest/deploy_aztec_l1_contracts.d.ts +259 -0
  70. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
  71. package/dest/deploy_aztec_l1_contracts.js +413 -0
  72. package/dest/deploy_l1_contract.d.ts +68 -0
  73. package/dest/deploy_l1_contract.d.ts.map +1 -0
  74. package/dest/deploy_l1_contract.js +312 -0
  75. package/dest/eth-signer/eth-signer.d.ts +21 -0
  76. package/dest/eth-signer/eth-signer.d.ts.map +1 -0
  77. package/dest/eth-signer/eth-signer.js +5 -0
  78. package/dest/eth-signer/index.d.ts +2 -0
  79. package/dest/eth-signer/index.d.ts.map +1 -0
  80. package/dest/eth-signer/index.js +1 -0
  81. package/dest/forwarder_proxy.d.ts +32 -0
  82. package/dest/forwarder_proxy.d.ts.map +1 -0
  83. package/dest/forwarder_proxy.js +93 -0
  84. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  85. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  86. package/dest/generated/l1-contracts-defaults.js +30 -0
  87. package/dest/l1_artifacts.d.ts +81744 -0
  88. package/dest/l1_artifacts.d.ts.map +1 -0
  89. package/dest/l1_artifacts.js +166 -0
  90. package/dest/l1_contract_addresses.d.ts +24 -4
  91. package/dest/l1_contract_addresses.d.ts.map +1 -1
  92. package/dest/l1_contract_addresses.js +25 -21
  93. package/dest/l1_reader.d.ts +6 -2
  94. package/dest/l1_reader.d.ts.map +1 -1
  95. package/dest/l1_reader.js +20 -9
  96. package/dest/l1_tx_utils/config.d.ts +65 -0
  97. package/dest/l1_tx_utils/config.d.ts.map +1 -0
  98. package/dest/l1_tx_utils/config.js +109 -0
  99. package/dest/l1_tx_utils/constants.d.ts +12 -0
  100. package/dest/l1_tx_utils/constants.d.ts.map +1 -0
  101. package/dest/l1_tx_utils/constants.js +39 -0
  102. package/dest/l1_tx_utils/factory.d.ts +32 -0
  103. package/dest/l1_tx_utils/factory.d.ts.map +1 -0
  104. package/dest/l1_tx_utils/factory.js +22 -0
  105. package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
  106. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
  107. package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
  108. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
  109. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
  110. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
  111. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
  112. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
  113. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
  114. package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
  115. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
  116. package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
  117. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
  118. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
  119. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +42 -0
  120. package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
  121. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
  122. package/dest/l1_tx_utils/index-blobs.js +2 -0
  123. package/dest/l1_tx_utils/index.d.ts +13 -0
  124. package/dest/l1_tx_utils/index.d.ts.map +1 -0
  125. package/dest/l1_tx_utils/index.js +13 -0
  126. package/dest/l1_tx_utils/interfaces.d.ts +76 -0
  127. package/dest/l1_tx_utils/interfaces.d.ts.map +1 -0
  128. package/dest/l1_tx_utils/interfaces.js +4 -0
  129. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
  130. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
  131. package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
  132. package/dest/l1_tx_utils/l1_tx_utils.d.ts +105 -0
  133. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
  134. package/dest/l1_tx_utils/l1_tx_utils.js +639 -0
  135. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +83 -0
  136. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -0
  137. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +327 -0
  138. package/dest/l1_tx_utils/signer.d.ts +4 -0
  139. package/dest/l1_tx_utils/signer.d.ts.map +1 -0
  140. package/dest/l1_tx_utils/signer.js +16 -0
  141. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  142. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  143. package/dest/l1_tx_utils/tx_delayer.js +221 -0
  144. package/dest/l1_tx_utils/types.d.ts +67 -0
  145. package/dest/l1_tx_utils/types.d.ts.map +1 -0
  146. package/dest/l1_tx_utils/types.js +26 -0
  147. package/dest/l1_tx_utils/utils.d.ts +4 -0
  148. package/dest/l1_tx_utils/utils.d.ts.map +1 -0
  149. package/dest/l1_tx_utils/utils.js +14 -0
  150. package/dest/l1_types.d.ts +6 -0
  151. package/dest/l1_types.d.ts.map +1 -0
  152. package/dest/l1_types.js +1 -0
  153. package/dest/publisher_manager.d.ts +16 -0
  154. package/dest/publisher_manager.d.ts.map +1 -0
  155. package/dest/publisher_manager.js +88 -0
  156. package/dest/queries.d.ts +5 -3
  157. package/dest/queries.d.ts.map +1 -1
  158. package/dest/queries.js +61 -12
  159. package/dest/test/chain_monitor.d.ts +94 -0
  160. package/dest/test/chain_monitor.d.ts.map +1 -0
  161. package/dest/test/chain_monitor.js +244 -0
  162. package/dest/test/eth_cheat_codes.d.ts +229 -0
  163. package/dest/test/eth_cheat_codes.d.ts.map +1 -0
  164. package/dest/test/eth_cheat_codes.js +560 -0
  165. package/dest/test/eth_cheat_codes_with_state.d.ts +2 -2
  166. package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
  167. package/dest/test/eth_cheat_codes_with_state.js +1 -1
  168. package/dest/test/index.d.ts +4 -3
  169. package/dest/test/index.d.ts.map +1 -1
  170. package/dest/test/index.js +3 -2
  171. package/dest/test/rollup_cheat_codes.d.ts +90 -0
  172. package/dest/test/rollup_cheat_codes.d.ts.map +1 -0
  173. package/dest/test/rollup_cheat_codes.js +292 -0
  174. package/dest/test/start_anvil.d.ts +23 -2
  175. package/dest/test/start_anvil.d.ts.map +1 -1
  176. package/dest/test/start_anvil.js +133 -24
  177. package/dest/test/upgrade_utils.d.ts +6 -5
  178. package/dest/test/upgrade_utils.d.ts.map +1 -1
  179. package/dest/test/upgrade_utils.js +23 -16
  180. package/dest/types.d.ts +62 -8
  181. package/dest/types.d.ts.map +1 -1
  182. package/dest/types.js +3 -1
  183. package/dest/utils.d.ts +17 -3
  184. package/dest/utils.d.ts.map +1 -1
  185. package/dest/utils.js +111 -88
  186. package/dest/zkPassportVerifierAddress.d.ts +15 -0
  187. package/dest/zkPassportVerifierAddress.d.ts.map +1 -0
  188. package/dest/zkPassportVerifierAddress.js +11 -0
  189. package/package.json +51 -25
  190. package/src/account.ts +5 -0
  191. package/src/client.ts +51 -5
  192. package/src/config.ts +222 -43
  193. package/src/contracts/README.md +157 -0
  194. package/src/contracts/empire_base.ts +79 -7
  195. package/src/contracts/empire_slashing_proposer.ts +265 -0
  196. package/src/contracts/errors.ts +13 -0
  197. package/src/contracts/fee_asset_handler.ts +66 -0
  198. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  199. package/src/contracts/fee_juice.ts +29 -15
  200. package/src/contracts/governance.ts +90 -78
  201. package/src/contracts/governance_proposer.ts +81 -25
  202. package/src/contracts/gse.ts +88 -0
  203. package/src/contracts/inbox.ts +115 -0
  204. package/src/contracts/index.ts +11 -2
  205. package/src/contracts/log.ts +13 -0
  206. package/src/contracts/multicall.ts +158 -0
  207. package/src/contracts/outbox.ts +98 -0
  208. package/src/contracts/registry.ts +81 -26
  209. package/src/contracts/rollup.ts +940 -89
  210. package/src/contracts/slasher_contract.ts +89 -0
  211. package/src/contracts/tally_slashing_proposer.ts +322 -0
  212. package/src/contracts/utils.ts +14 -0
  213. package/src/deploy_aztec_l1_contracts.ts +650 -0
  214. package/src/deploy_l1_contract.ts +362 -0
  215. package/src/eth-signer/eth-signer.ts +25 -0
  216. package/src/eth-signer/index.ts +1 -0
  217. package/src/forwarder_proxy.ts +108 -0
  218. package/src/generated/l1-contracts-defaults.ts +32 -0
  219. package/src/l1_artifacts.ts +254 -0
  220. package/src/l1_contract_addresses.ts +49 -34
  221. package/src/l1_reader.ts +30 -10
  222. package/src/l1_tx_utils/README.md +177 -0
  223. package/src/l1_tx_utils/config.ts +181 -0
  224. package/src/l1_tx_utils/constants.ts +29 -0
  225. package/src/l1_tx_utils/factory.ts +64 -0
  226. package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
  227. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
  228. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
  229. package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
  230. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +108 -0
  231. package/src/l1_tx_utils/index-blobs.ts +2 -0
  232. package/src/l1_tx_utils/index.ts +15 -0
  233. package/src/l1_tx_utils/interfaces.ts +86 -0
  234. package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
  235. package/src/l1_tx_utils/l1_tx_utils.ts +766 -0
  236. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +423 -0
  237. package/src/l1_tx_utils/signer.ts +28 -0
  238. package/src/l1_tx_utils/tx_delayer.ts +294 -0
  239. package/src/l1_tx_utils/types.ts +85 -0
  240. package/src/l1_tx_utils/utils.ts +16 -0
  241. package/src/l1_types.ts +6 -0
  242. package/src/publisher_manager.ts +108 -0
  243. package/src/queries.ts +82 -16
  244. package/src/test/chain_monitor.ts +302 -0
  245. package/src/test/eth_cheat_codes.ts +588 -0
  246. package/src/test/eth_cheat_codes_with_state.ts +1 -1
  247. package/src/test/index.ts +3 -2
  248. package/src/test/rollup_cheat_codes.ts +330 -0
  249. package/src/test/start_anvil.ts +166 -22
  250. package/src/test/upgrade_utils.ts +30 -21
  251. package/src/types.ts +71 -7
  252. package/src/utils.ts +137 -93
  253. package/src/zkPassportVerifierAddress.ts +15 -0
  254. package/dest/contracts/forwarder.d.ts +0 -24
  255. package/dest/contracts/forwarder.d.ts.map +0 -1
  256. package/dest/contracts/forwarder.js +0 -101
  257. package/dest/contracts/slashing_proposer.d.ts +0 -21
  258. package/dest/contracts/slashing_proposer.d.ts.map +0 -1
  259. package/dest/contracts/slashing_proposer.js +0 -47
  260. package/dest/deploy_l1_contracts.d.ts +0 -21210
  261. package/dest/deploy_l1_contracts.d.ts.map +0 -1
  262. package/dest/deploy_l1_contracts.js +0 -687
  263. package/dest/eth_cheat_codes.d.ts +0 -147
  264. package/dest/eth_cheat_codes.d.ts.map +0 -1
  265. package/dest/eth_cheat_codes.js +0 -303
  266. package/dest/index.d.ts +0 -14
  267. package/dest/index.d.ts.map +0 -1
  268. package/dest/index.js +0 -13
  269. package/dest/l1_tx_utils.d.ts +0 -192
  270. package/dest/l1_tx_utils.d.ts.map +0 -1
  271. package/dest/l1_tx_utils.js +0 -641
  272. package/dest/l1_tx_utils_with_blobs.d.ts +0 -12
  273. package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
  274. package/dest/l1_tx_utils_with_blobs.js +0 -64
  275. package/dest/test/delayed_tx_utils.d.ts +0 -8
  276. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  277. package/dest/test/delayed_tx_utils.js +0 -21
  278. package/dest/test/tx_delayer.d.ts +0 -25
  279. package/dest/test/tx_delayer.d.ts.map +0 -1
  280. package/dest/test/tx_delayer.js +0 -116
  281. package/src/contracts/forwarder.ts +0 -132
  282. package/src/contracts/slashing_proposer.ts +0 -51
  283. package/src/deploy_l1_contracts.ts +0 -948
  284. package/src/eth_cheat_codes.ts +0 -314
  285. package/src/index.ts +0 -13
  286. package/src/l1_tx_utils.ts +0 -847
  287. package/src/l1_tx_utils_with_blobs.ts +0 -86
  288. package/src/test/delayed_tx_utils.ts +0 -24
  289. package/src/test/tx_delayer.ts +0 -163
@@ -0,0 +1,181 @@
1
+ import {
2
+ type ConfigMappingsType,
3
+ booleanConfigHelper,
4
+ floatConfigHelper,
5
+ getConfigFromMappings,
6
+ getDefaultConfig,
7
+ numberConfigHelper,
8
+ optionalNumberConfigHelper,
9
+ } from '@aztec/foundation/config';
10
+
11
+ export interface L1TxUtilsConfig {
12
+ /**
13
+ * How much to increase calculated gas limit.
14
+ */
15
+ gasLimitBufferPercentage?: number;
16
+ /**
17
+ * Maximum gas price in gwei
18
+ */
19
+ maxGwei?: number;
20
+ /**
21
+ * Maximum blob fee per gas in gwei
22
+ */
23
+ maxBlobGwei?: number;
24
+ /**
25
+ * Priority fee bump percentage
26
+ */
27
+ priorityFeeBumpPercentage?: number;
28
+ /**
29
+ * How much to increase priority fee by each attempt (percentage)
30
+ */
31
+ priorityFeeRetryBumpPercentage?: number;
32
+ /**
33
+ * Minimum priority fee per gas in Gwei. Acts as a floor for the computed priority fee.
34
+ */
35
+ minimumPriorityFeePerGas?: number;
36
+ /**
37
+ * Maximum number of speed-up attempts
38
+ */
39
+ maxSpeedUpAttempts?: number;
40
+ /**
41
+ * How often to check tx status
42
+ */
43
+ checkIntervalMs?: number;
44
+ /**
45
+ * How long before considering tx stalled
46
+ */
47
+ stallTimeMs?: number;
48
+ /**
49
+ * How long to wait for a tx to be mined before giving up
50
+ */
51
+ txTimeoutMs?: number;
52
+ /**
53
+ * Whether to attempt to cancel a tx if it's not mined after txTimeoutMs
54
+ */
55
+ cancelTxOnTimeout?: boolean;
56
+ /**
57
+ * How long to wait for a cancellation tx to be mined after its last attempt before giving up
58
+ */
59
+ txCancellationFinalTimeoutMs?: number;
60
+ /**
61
+ * How long a tx nonce can be unseen in the mempool before considering it dropped
62
+ */
63
+ txUnseenConsideredDroppedMs?: number;
64
+ /** Enable tx delayer. When true, wraps the viem client to intercept and delay txs. Test-only. */
65
+ enableDelayer?: boolean;
66
+ /** Max seconds into an L1 slot for tx inclusion. Txs sent later are deferred to next slot. Only used when enableDelayer is true. */
67
+ txDelayerMaxInclusionTimeIntoSlot?: number;
68
+ /** How many seconds an L1 slot lasts. */
69
+ ethereumSlotDuration?: number;
70
+ }
71
+
72
+ export const l1TxUtilsConfigMappings: ConfigMappingsType<L1TxUtilsConfig> = {
73
+ gasLimitBufferPercentage: {
74
+ description: 'How much to increase calculated gas limit by (percentage)',
75
+ env: 'L1_GAS_LIMIT_BUFFER_PERCENTAGE',
76
+ ...numberConfigHelper(20),
77
+ },
78
+ maxGwei: {
79
+ description: 'Maximum gas price in gwei to be used for transactions.',
80
+ env: 'L1_GAS_PRICE_MAX',
81
+ fallback: ['L1_FEE_PER_GAS_GWEI_MAX'],
82
+ ...floatConfigHelper(2000),
83
+ },
84
+ maxBlobGwei: {
85
+ description: 'Maximum blob fee per gas in gwei',
86
+ env: 'L1_BLOB_FEE_PER_GAS_MAX',
87
+ fallback: ['L1_BLOB_FEE_PER_GAS_GWEI_MAX'],
88
+ ...floatConfigHelper(3000),
89
+ },
90
+ priorityFeeBumpPercentage: {
91
+ description: 'How much to increase priority fee by each attempt (percentage)',
92
+ env: 'L1_PRIORITY_FEE_BUMP_PERCENTAGE',
93
+ ...numberConfigHelper(20),
94
+ },
95
+ priorityFeeRetryBumpPercentage: {
96
+ description: 'How much to increase priority fee by each retry attempt (percentage)',
97
+ env: 'L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE',
98
+ ...numberConfigHelper(50),
99
+ },
100
+ minimumPriorityFeePerGas: {
101
+ description:
102
+ 'Minimum priority fee per gas in Gwei. Acts as a floor for the computed priority fee. If network conditions require a higher fee, the higher fee will be used.',
103
+ env: 'L1_MINIMUM_PRIORITY_FEE_PER_GAS_GWEI',
104
+ fallback: ['L1_FIXED_PRIORITY_FEE_PER_GAS', 'L1_FIXED_PRIORITY_FEE_PER_GAS_GWEI'],
105
+ deprecatedFallback: [
106
+ {
107
+ env: 'L1_FIXED_PRIORITY_FEE_PER_GAS',
108
+ message: deprecatedFixedFeeMessage('L1_FIXED_PRIORITY_FEE_PER_GAS'),
109
+ },
110
+ {
111
+ env: 'L1_FIXED_PRIORITY_FEE_PER_GAS_GWEI',
112
+ message: deprecatedFixedFeeMessage('L1_FIXED_PRIORITY_FEE_PER_GAS_GWEI'),
113
+ },
114
+ ],
115
+ ...floatConfigHelper(0),
116
+ },
117
+ maxSpeedUpAttempts: {
118
+ description: 'Maximum number of speed-up attempts',
119
+ env: 'L1_TX_MONITOR_MAX_ATTEMPTS',
120
+ ...numberConfigHelper(3),
121
+ },
122
+ checkIntervalMs: {
123
+ description: 'How often to check tx status',
124
+ env: 'L1_TX_MONITOR_CHECK_INTERVAL_MS',
125
+ ...numberConfigHelper(1_000),
126
+ },
127
+ stallTimeMs: {
128
+ description: 'How long before considering tx stalled',
129
+ env: 'L1_TX_MONITOR_STALL_TIME_MS',
130
+ ...numberConfigHelper(12_000), // 12s, 1 ethereum slot
131
+ },
132
+ txTimeoutMs: {
133
+ description: 'How long to wait for a tx to be mined before giving up. Set to 0 to disable.',
134
+ env: 'L1_TX_MONITOR_TX_TIMEOUT_MS',
135
+ ...numberConfigHelper(120_000), // 2 mins
136
+ },
137
+ cancelTxOnTimeout: {
138
+ description: "Whether to attempt to cancel a tx if it's not mined after txTimeoutMs",
139
+ env: 'L1_TX_MONITOR_CANCEL_TX_ON_TIMEOUT',
140
+ ...booleanConfigHelper(true),
141
+ },
142
+ txCancellationFinalTimeoutMs: {
143
+ description: 'How long to wait for a cancellation tx after its last attempt before giving up',
144
+ env: 'L1_TX_MONITOR_TX_CANCELLATION_TIMEOUT_MS',
145
+ ...numberConfigHelper(24 * 12 * 1000), // 24 L1 blocks
146
+ },
147
+ txUnseenConsideredDroppedMs: {
148
+ description: 'How long a tx nonce can be unseen in the mempool before considering it dropped',
149
+ env: 'L1_TX_MONITOR_TX_UNSEEN_CONSIDERED_DROPPED_MS',
150
+ ...numberConfigHelper(6 * 12 * 1000), // 6 L1 blocks
151
+ },
152
+ enableDelayer: {
153
+ description: 'Enable tx delayer for testing.',
154
+ ...booleanConfigHelper(false),
155
+ },
156
+ txDelayerMaxInclusionTimeIntoSlot: {
157
+ description: 'Max seconds into L1 slot for tx inclusion when delayer is enabled.',
158
+ ...optionalNumberConfigHelper(),
159
+ },
160
+ ethereumSlotDuration: {
161
+ env: 'ETHEREUM_SLOT_DURATION',
162
+ description: 'How many seconds an L1 slot lasts.',
163
+ ...numberConfigHelper(12),
164
+ },
165
+ };
166
+
167
+ // We abuse the fact that all mappings above have a non null default value and force-type this to Required
168
+ export const defaultL1TxUtilsConfig = getDefaultConfig<L1TxUtilsConfig>(
169
+ l1TxUtilsConfigMappings,
170
+ ) as Required<L1TxUtilsConfig>;
171
+
172
+ export function getL1TxUtilsConfigEnvVars(): L1TxUtilsConfig {
173
+ return getConfigFromMappings(l1TxUtilsConfigMappings);
174
+ }
175
+
176
+ function deprecatedFixedFeeMessage(envVar: string): string {
177
+ return (
178
+ `Environment variable ${envVar} is deprecated. It is now used as a MINIMUM priority fee rather than a fixed value. ` +
179
+ 'Please use L1_MINIMUM_PRIORITY_FEE_PER_GAS_GWEI instead. If network conditions require a higher fee, the higher fee will be used.'
180
+ );
181
+ }
@@ -0,0 +1,29 @@
1
+ // 1_000_000_000 Gwei = 1 ETH
2
+ // 1_000_000_000 Wei = 1 Gwei
3
+ // 1_000_000_000_000_000_000 Wei = 1 ETH
4
+ export const WEI_CONST = 1_000_000_000n;
5
+
6
+ // EIP-7825: protocol-level cap on tx gas limit (2^24). Clients reject above this.
7
+ export const MAX_L1_TX_LIMIT = 16_777_216n;
8
+
9
+ // setting a minimum bump percentage to 10% due to geth's implementation
10
+ // https://github.com/ethereum/go-ethereum/blob/e3d61e6db028c412f74bc4d4c7e117a9e29d0de0/core/txpool/legacypool/list.go#L298
11
+ export const MIN_REPLACEMENT_BUMP_PERCENTAGE = 10;
12
+
13
+ // setting a minimum bump percentage to 100% due to geth's implementation
14
+ // https://github.com/ethereum/go-ethereum/blob/e3d61e6db028c412f74bc4d4c7e117a9e29d0de0/core/txpool/blobpool/config.go#L34
15
+ export const MIN_BLOB_REPLACEMENT_BUMP_PERCENTAGE = 100;
16
+
17
+ // Avg ethereum block time is ~12s
18
+ export const BLOCK_TIME_MS = 12_000;
19
+
20
+ // Gas per blob (EIP-4844)
21
+ export const GAS_PER_BLOB = 131072n;
22
+
23
+ // Blob capacity schedule based on Ethereum upgrades
24
+ export const BLOB_CAPACITY_SCHEDULE = [
25
+ { timestamp: 1734357600, target: 14, max: 21 }, // BPO2: Dec 17, 2025
26
+ { timestamp: 1733752800, target: 10, max: 15 }, // BPO1: Dec 9, 2025
27
+ { timestamp: 1733234400, target: 6, max: 9 }, // Fusaka: Dec 3, 2025
28
+ { timestamp: 0, target: 6, max: 9 }, // Pectra/earlier
29
+ ];
@@ -0,0 +1,64 @@
1
+ import type { BlobKzgInstance } from '@aztec/blob-lib/types';
2
+ import { EthAddress } from '@aztec/foundation/eth-address';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import { DateProvider } from '@aztec/foundation/timer';
5
+
6
+ import type { EthSigner } from '../eth-signer/eth-signer.js';
7
+ import type { ExtendedViemWalletClient, ViemClient } from '../types.js';
8
+ import type { L1TxUtilsConfig } from './config.js';
9
+ import type { IL1TxMetrics, IL1TxStore } from './interfaces.js';
10
+ import { L1TxUtils } from './l1_tx_utils.js';
11
+ import { createViemSigner } from './signer.js';
12
+ import { Delayer } from './tx_delayer.js';
13
+ import type { SigningCallback } from './types.js';
14
+
15
+ /** Source of signing capability: either a wallet client or a separate client + signer. */
16
+ export type L1SignerSource = ExtendedViemWalletClient | { client: ViemClient; signer: EthSigner };
17
+
18
+ export function resolveSignerSource(source: L1SignerSource): {
19
+ client: ViemClient;
20
+ address: EthAddress;
21
+ signingCallback: SigningCallback;
22
+ } {
23
+ if ('account' in source && source.account) {
24
+ return {
25
+ client: source as ExtendedViemWalletClient,
26
+ address: EthAddress.fromString((source as ExtendedViemWalletClient).account.address),
27
+ signingCallback: createViemSigner(source as ExtendedViemWalletClient),
28
+ };
29
+ }
30
+ const { client, signer } = source as { client: ViemClient; signer: EthSigner };
31
+ return {
32
+ client,
33
+ address: signer.address,
34
+ signingCallback: async (tx, _addr) => (await signer.signTransaction(tx)).toViemTransactionSignature(),
35
+ };
36
+ }
37
+
38
+ export function createL1TxUtils(
39
+ source: L1SignerSource,
40
+ deps?: {
41
+ logger?: Logger;
42
+ dateProvider?: DateProvider;
43
+ store?: IL1TxStore;
44
+ metrics?: IL1TxMetrics;
45
+ kzg?: BlobKzgInstance;
46
+ delayer?: Delayer;
47
+ },
48
+ config?: Partial<L1TxUtilsConfig> & { debugMaxGasLimit?: boolean },
49
+ ): L1TxUtils {
50
+ const { client, address, signingCallback } = resolveSignerSource(source);
51
+ return new L1TxUtils(
52
+ client,
53
+ address,
54
+ signingCallback,
55
+ deps?.logger,
56
+ deps?.dateProvider,
57
+ config,
58
+ config?.debugMaxGasLimit ?? false,
59
+ deps?.store,
60
+ deps?.metrics,
61
+ deps?.kzg,
62
+ deps?.delayer,
63
+ );
64
+ }
@@ -0,0 +1,22 @@
1
+ import { P75AllTxsPriorityFeeStrategy } from './p75_competitive.js';
2
+ import { P75BlobTxsOnlyPriorityFeeStrategy } from './p75_competitive_blob_txs_only.js';
3
+ import type { PriorityFeeStrategy } from './types.js';
4
+
5
+ export {
6
+ HISTORICAL_BLOCK_COUNT,
7
+ type PriorityFeeStrategy,
8
+ type PriorityFeeStrategyContext,
9
+ type PriorityFeeStrategyResult,
10
+ } from './types.js';
11
+
12
+ export { P75AllTxsPriorityFeeStrategy } from './p75_competitive.js';
13
+ export { P75BlobTxsOnlyPriorityFeeStrategy } from './p75_competitive_blob_txs_only.js';
14
+
15
+ /**
16
+ * Default list of priority fee strategies to analyze.
17
+ * Add more strategies here for comparison.
18
+ */
19
+ export const DEFAULT_PRIORITY_FEE_STRATEGIES: PriorityFeeStrategy[] = [
20
+ P75AllTxsPriorityFeeStrategy,
21
+ P75BlobTxsOnlyPriorityFeeStrategy,
22
+ ];
@@ -0,0 +1,163 @@
1
+ import { median } from '@aztec/foundation/collection';
2
+
3
+ import { formatGwei } from 'viem';
4
+
5
+ import type { ViemClient } from '../../types.js';
6
+ import { calculatePercentile } from '../../utils.js';
7
+ import { WEI_CONST } from '../constants.js';
8
+ import {
9
+ HISTORICAL_BLOCK_COUNT,
10
+ type PriorityFeeStrategy,
11
+ type PriorityFeeStrategyContext,
12
+ type PriorityFeeStrategyResult,
13
+ } from './types.js';
14
+
15
+ /**
16
+ * Our current competitive priority fee strategy.
17
+ * Analyzes p75 of pending transactions and 5-block fee history to determine a competitive priority fee.
18
+ * Falls back to network estimate if data is unavailable.
19
+ */
20
+ export const P75AllTxsPriorityFeeStrategy: PriorityFeeStrategy = {
21
+ name: 'Competitive (P75 + History) - CURRENT',
22
+ id: 'p75_pending_txs_and_history_all_txs',
23
+
24
+ async execute(client: ViemClient, context: PriorityFeeStrategyContext): Promise<PriorityFeeStrategyResult> {
25
+ const { isBlobTx, logger } = context;
26
+
27
+ // Fire all RPC calls in parallel
28
+ const [latestBlockResult, blobBaseFeeResult, networkEstimateResult, pendingBlockResult, feeHistoryResult] =
29
+ await Promise.allSettled([
30
+ client.getBlock({ blockTag: 'latest' }),
31
+ isBlobTx ? client.getBlobBaseFee() : Promise.resolve(undefined),
32
+ client.estimateMaxPriorityFeePerGas().catch(() => 0n),
33
+ client.getBlock({ blockTag: 'pending', includeTransactions: true }).catch(() => null),
34
+ client
35
+ .getFeeHistory({
36
+ blockCount: HISTORICAL_BLOCK_COUNT,
37
+ rewardPercentiles: [75],
38
+ blockTag: 'latest',
39
+ })
40
+ .catch(() => null),
41
+ ]);
42
+
43
+ // Extract latest block
44
+ if (latestBlockResult.status === 'rejected') {
45
+ throw new Error(`Failed to get latest block: ${latestBlockResult.reason}`);
46
+ }
47
+ const latestBlock = latestBlockResult.value;
48
+
49
+ // Extract blob base fee (only for blob txs)
50
+ let blobBaseFee: bigint | undefined;
51
+ if (isBlobTx) {
52
+ if (blobBaseFeeResult.status === 'fulfilled' && typeof blobBaseFeeResult.value === 'bigint') {
53
+ blobBaseFee = blobBaseFeeResult.value;
54
+ } else {
55
+ logger?.warn('Failed to get L1 blob base fee');
56
+ }
57
+ }
58
+
59
+ // Extract network estimate
60
+ const networkEstimate =
61
+ networkEstimateResult.status === 'fulfilled' && typeof networkEstimateResult.value === 'bigint'
62
+ ? networkEstimateResult.value
63
+ : 0n;
64
+
65
+ let competitiveFee = networkEstimate;
66
+ const debugInfo: Record<string, string | number> = {
67
+ networkEstimateGwei: formatGwei(networkEstimate),
68
+ };
69
+
70
+ // Extract pending block
71
+ const pendingBlock = pendingBlockResult.status === 'fulfilled' ? pendingBlockResult.value : null;
72
+
73
+ // Analyze pending block transactions
74
+ if (pendingBlock?.transactions && pendingBlock.transactions.length > 0) {
75
+ const pendingFees = pendingBlock.transactions
76
+ .map(tx => {
77
+ if (typeof tx === 'string') {
78
+ return 0n;
79
+ }
80
+ return tx.maxPriorityFeePerGas || 0n;
81
+ })
82
+ .filter((fee: bigint) => fee > 0n);
83
+
84
+ if (pendingFees.length > 0) {
85
+ // Use 75th percentile of pending fees to be competitive
86
+ const pendingCompetitiveFee = calculatePercentile(pendingFees, 75);
87
+
88
+ if (pendingCompetitiveFee > competitiveFee) {
89
+ competitiveFee = pendingCompetitiveFee;
90
+ }
91
+
92
+ debugInfo.pendingTxCount = pendingFees.length;
93
+ debugInfo.pendingP75Gwei = formatGwei(pendingCompetitiveFee);
94
+
95
+ logger?.debug('Analyzed pending transactions for competitive pricing', {
96
+ pendingTxCount: pendingFees.length,
97
+ pendingP75: formatGwei(pendingCompetitiveFee),
98
+ });
99
+ }
100
+ }
101
+
102
+ // Extract fee history
103
+ const feeHistory = feeHistoryResult.status === 'fulfilled' ? feeHistoryResult.value : null;
104
+
105
+ // Analyze fee history
106
+ if (feeHistory?.reward && feeHistory.reward.length > 0) {
107
+ // Extract 75th percentile fees from each block
108
+ const percentile75Fees = feeHistory.reward.map(rewards => rewards[0] || 0n).filter(fee => fee > 0n);
109
+
110
+ if (percentile75Fees.length > 0) {
111
+ // Calculate median of the 75th percentile fees across blocks
112
+ const medianHistoricalFee = median(percentile75Fees) ?? 0n;
113
+
114
+ // Debug: Log suspicious fees from history
115
+ if (medianHistoricalFee > 100n * WEI_CONST) {
116
+ logger?.warn('Suspicious high fee in history', {
117
+ historicalMedian: formatGwei(medianHistoricalFee),
118
+ allP75Fees: percentile75Fees.map(f => formatGwei(f)),
119
+ });
120
+ }
121
+
122
+ if (medianHistoricalFee > competitiveFee) {
123
+ competitiveFee = medianHistoricalFee;
124
+ }
125
+
126
+ debugInfo.historicalMedianGwei = formatGwei(medianHistoricalFee);
127
+
128
+ logger?.debug('Analyzed fee history for competitive pricing', {
129
+ historicalMedian: formatGwei(medianHistoricalFee),
130
+ });
131
+ }
132
+ }
133
+
134
+ // Sanity check: cap competitive fee at 100x network estimate to avoid using unrealistic fees
135
+ const maxReasonableFee = networkEstimate * 100n;
136
+ if (competitiveFee > maxReasonableFee && networkEstimate > 0n) {
137
+ logger?.debug('Competitive fee exceeds sanity cap, using capped value', {
138
+ competitiveFee: formatGwei(competitiveFee),
139
+ networkEstimate: formatGwei(networkEstimate),
140
+ cappedTo: formatGwei(maxReasonableFee),
141
+ });
142
+ competitiveFee = maxReasonableFee;
143
+ debugInfo.cappedToGwei = formatGwei(maxReasonableFee);
144
+ }
145
+
146
+ // Log final decision
147
+ if (competitiveFee > networkEstimate) {
148
+ logger?.debug('Using competitive fee from market analysis', {
149
+ networkEstimate: formatGwei(networkEstimate),
150
+ competitive: formatGwei(competitiveFee),
151
+ });
152
+ }
153
+
154
+ debugInfo.finalFeeGwei = formatGwei(competitiveFee);
155
+
156
+ return {
157
+ priorityFee: competitiveFee,
158
+ latestBlock,
159
+ blobBaseFee,
160
+ debugInfo,
161
+ };
162
+ },
163
+ };