@aztec/p2p 0.0.1-commit.43c09e3f → 0.0.1-commit.4d3c002

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 (449) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +11 -11
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +55 -17
  5. package/dest/client/interface.d.ts +54 -34
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +41 -52
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +170 -224
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +21 -11
  11. package/dest/config.d.ts +55 -18
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +102 -38
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +2 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +446 -3
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  29. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  30. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/index.js +1 -2
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  35. package/dest/mem_pools/index.d.ts +3 -3
  36. package/dest/mem_pools/index.d.ts.map +1 -1
  37. package/dest/mem_pools/index.js +1 -1
  38. package/dest/mem_pools/instrumentation.d.ts +4 -2
  39. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  40. package/dest/mem_pools/instrumentation.js +16 -14
  41. package/dest/mem_pools/interface.d.ts +5 -5
  42. package/dest/mem_pools/interface.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  47. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  55. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  56. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  59. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  62. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  63. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  64. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  69. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  70. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  72. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  73. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +34 -12
  79. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +78 -15
  82. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +144 -18
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +23 -6
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  92. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +476 -594
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  94. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  99. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  100. package/dest/msg_validators/clock_tolerance.js +4 -3
  101. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  102. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  104. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  105. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  107. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  108. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
  110. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  111. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  112. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  113. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  114. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  115. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  116. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  117. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  118. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  119. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  120. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  122. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  123. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  124. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  125. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  126. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  128. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  129. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  131. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  132. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/factory.js +247 -60
  134. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  135. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  137. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  138. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  140. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  141. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/index.js +2 -0
  143. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  144. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  145. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  146. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  147. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  149. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  150. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  152. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  153. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  154. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  155. package/dest/services/discv5/discV5_service.d.ts +1 -1
  156. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  157. package/dest/services/discv5/discV5_service.js +5 -2
  158. package/dest/services/dummy_service.d.ts +16 -6
  159. package/dest/services/dummy_service.d.ts.map +1 -1
  160. package/dest/services/dummy_service.js +15 -5
  161. package/dest/services/encoding.d.ts +7 -3
  162. package/dest/services/encoding.d.ts.map +1 -1
  163. package/dest/services/encoding.js +18 -11
  164. package/dest/services/gossipsub/index.d.ts +3 -0
  165. package/dest/services/gossipsub/index.d.ts.map +1 -0
  166. package/dest/services/gossipsub/index.js +2 -0
  167. package/dest/services/gossipsub/scoring.d.ts +21 -3
  168. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  169. package/dest/services/gossipsub/scoring.js +24 -7
  170. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  171. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  172. package/dest/services/gossipsub/topic_score_params.js +346 -0
  173. package/dest/services/libp2p/libp2p_service.d.ts +108 -51
  174. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  175. package/dest/services/libp2p/libp2p_service.js +568 -383
  176. package/dest/services/peer-manager/metrics.d.ts +3 -1
  177. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  178. package/dest/services/peer-manager/metrics.js +6 -0
  179. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  180. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  181. package/dest/services/peer-manager/peer_manager.js +24 -9
  182. package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
  183. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  184. package/dest/services/peer-manager/peer_scoring.js +53 -12
  185. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +14 -10
  186. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  187. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +89 -112
  188. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  189. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  190. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  191. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  192. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  193. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  194. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  195. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  196. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  197. package/dest/services/reqresp/interface.d.ts +10 -1
  198. package/dest/services/reqresp/interface.d.ts.map +1 -1
  199. package/dest/services/reqresp/interface.js +15 -1
  200. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  201. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  202. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -11
  203. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +21 -10
  204. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  205. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +27 -11
  206. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  207. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  208. package/dest/services/reqresp/protocols/tx.js +20 -0
  209. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  210. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  211. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  212. package/dest/services/reqresp/reqresp.d.ts +1 -1
  213. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  214. package/dest/services/reqresp/reqresp.js +30 -14
  215. package/dest/services/service.d.ts +45 -4
  216. package/dest/services/service.d.ts.map +1 -1
  217. package/dest/services/tx_collection/config.d.ts +22 -4
  218. package/dest/services/tx_collection/config.d.ts.map +1 -1
  219. package/dest/services/tx_collection/config.js +49 -3
  220. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -8
  221. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  222. package/dest/services/tx_collection/fast_tx_collection.js +88 -88
  223. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  224. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  225. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  226. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  227. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  228. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  229. package/dest/services/tx_collection/index.d.ts +3 -2
  230. package/dest/services/tx_collection/index.d.ts.map +1 -1
  231. package/dest/services/tx_collection/index.js +1 -0
  232. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  233. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  234. package/dest/services/tx_collection/instrumentation.js +2 -1
  235. package/dest/services/tx_collection/proposal_tx_collector.d.ts +15 -15
  236. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  237. package/dest/services/tx_collection/proposal_tx_collector.js +6 -6
  238. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  239. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  240. package/dest/services/tx_collection/request_tracker.js +84 -0
  241. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  242. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  243. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  244. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  245. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  246. package/dest/services/tx_collection/tx_collection.js +75 -3
  247. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  248. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  249. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  250. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  251. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  252. package/dest/services/tx_collection/tx_source.js +26 -7
  253. package/dest/services/tx_file_store/config.d.ts +1 -3
  254. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  255. package/dest/services/tx_file_store/config.js +0 -4
  256. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  257. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  258. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  259. package/dest/services/tx_provider.d.ts +4 -4
  260. package/dest/services/tx_provider.d.ts.map +1 -1
  261. package/dest/services/tx_provider.js +9 -8
  262. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  263. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  264. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  265. package/dest/test-helpers/mock-pubsub.d.ts +37 -4
  266. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  267. package/dest/test-helpers/mock-pubsub.js +113 -5
  268. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  269. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  270. package/dest/test-helpers/reqresp-nodes.js +9 -4
  271. package/dest/test-helpers/testbench-utils.d.ts +43 -38
  272. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  273. package/dest/test-helpers/testbench-utils.js +149 -61
  274. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  275. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  276. package/dest/testbench/p2p_client_testbench_worker.js +58 -28
  277. package/dest/testbench/worker_client_manager.d.ts +3 -1
  278. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  279. package/dest/testbench/worker_client_manager.js +6 -3
  280. package/dest/util.d.ts +9 -5
  281. package/dest/util.d.ts.map +1 -1
  282. package/dest/util.js +2 -10
  283. package/package.json +14 -14
  284. package/src/client/factory.ts +106 -30
  285. package/src/client/interface.ts +65 -35
  286. package/src/client/p2p_client.ts +205 -269
  287. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +34 -15
  288. package/src/config.ts +158 -44
  289. package/src/errors/p2p-service.error.ts +11 -0
  290. package/src/errors/tx-pool.error.ts +12 -0
  291. package/src/index.ts +1 -1
  292. package/src/mem_pools/attestation_pool/attestation_pool.ts +499 -91
  293. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  294. package/src/mem_pools/attestation_pool/index.ts +9 -2
  295. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  296. package/src/mem_pools/index.ts +2 -2
  297. package/src/mem_pools/instrumentation.ts +17 -13
  298. package/src/mem_pools/interface.ts +4 -4
  299. package/src/mem_pools/tx_pool_v2/README.md +112 -17
  300. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  301. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  302. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  303. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  304. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  305. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  306. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  307. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  308. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  309. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  310. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  311. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  312. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  313. package/src/mem_pools/tx_pool_v2/interfaces.ts +34 -12
  314. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +209 -26
  315. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  316. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +37 -8
  317. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +518 -678
  318. package/src/msg_validators/attestation_validator/README.md +49 -0
  319. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  320. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +2 -2
  321. package/src/msg_validators/clock_tolerance.ts +4 -3
  322. package/src/msg_validators/proposal_validator/README.md +123 -0
  323. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  324. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  325. package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
  326. package/src/msg_validators/tx_validator/README.md +119 -0
  327. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  328. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  329. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  330. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  331. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  332. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  333. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  334. package/src/msg_validators/tx_validator/factory.ts +394 -78
  335. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  336. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  337. package/src/msg_validators/tx_validator/index.ts +2 -0
  338. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  339. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  340. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  341. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  342. package/src/services/discv5/discV5_service.ts +5 -2
  343. package/src/services/dummy_service.ts +24 -7
  344. package/src/services/encoding.ts +18 -10
  345. package/src/services/gossipsub/README.md +641 -0
  346. package/src/services/gossipsub/index.ts +2 -0
  347. package/src/services/gossipsub/scoring.ts +29 -5
  348. package/src/services/gossipsub/topic_score_params.ts +487 -0
  349. package/src/services/libp2p/libp2p_service.ts +599 -418
  350. package/src/services/peer-manager/metrics.ts +7 -0
  351. package/src/services/peer-manager/peer_manager.ts +28 -9
  352. package/src/services/peer-manager/peer_scoring.ts +46 -5
  353. package/src/services/reqresp/README.md +229 -0
  354. package/src/services/reqresp/batch-tx-requester/README.md +53 -14
  355. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +89 -122
  356. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  357. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  358. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  359. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  360. package/src/services/reqresp/interface.ts +26 -1
  361. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +23 -14
  362. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +38 -15
  363. package/src/services/reqresp/protocols/tx.ts +22 -0
  364. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  365. package/src/services/reqresp/reqresp.ts +35 -15
  366. package/src/services/service.ts +60 -3
  367. package/src/services/tx_collection/config.ts +74 -6
  368. package/src/services/tx_collection/fast_tx_collection.ts +94 -97
  369. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  370. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  371. package/src/services/tx_collection/index.ts +2 -1
  372. package/src/services/tx_collection/instrumentation.ts +7 -1
  373. package/src/services/tx_collection/proposal_tx_collector.ts +21 -27
  374. package/src/services/tx_collection/request_tracker.ts +127 -0
  375. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  376. package/src/services/tx_collection/tx_collection.ts +114 -19
  377. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  378. package/src/services/tx_collection/tx_source.ts +28 -8
  379. package/src/services/tx_file_store/config.ts +0 -6
  380. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  381. package/src/services/tx_provider.ts +10 -9
  382. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  383. package/src/test-helpers/mock-pubsub.ts +153 -9
  384. package/src/test-helpers/reqresp-nodes.ts +9 -7
  385. package/src/test-helpers/testbench-utils.ts +156 -74
  386. package/src/testbench/p2p_client_testbench_worker.ts +64 -31
  387. package/src/testbench/worker_client_manager.ts +13 -6
  388. package/src/util.ts +15 -16
  389. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  390. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  391. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  392. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  393. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  394. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  395. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  396. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  397. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  398. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  399. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  400. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  401. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  402. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  403. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  404. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  405. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  406. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  407. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  408. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  409. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  410. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  411. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  412. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  413. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  414. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  415. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  416. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  417. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  418. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  419. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  420. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  421. package/dest/mem_pools/tx_pool/index.js +0 -2
  422. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  423. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  424. package/dest/mem_pools/tx_pool/priority.js +0 -15
  425. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  426. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  427. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  428. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  429. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  430. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  431. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  432. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  433. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  434. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  435. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  436. package/src/mem_pools/tx_pool/README.md +0 -270
  437. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  438. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  439. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  440. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  441. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  442. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  443. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  444. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  445. package/src/mem_pools/tx_pool/index.ts +0 -2
  446. package/src/mem_pools/tx_pool/priority.ts +0 -20
  447. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  448. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  449. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -1,11 +1,32 @@
1
+ import { minBigint } from '@aztec/foundation/bigint';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
3
  import { Fr } from '@aztec/foundation/curves/bn254';
2
4
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
3
- import type { L2BlockId } from '@aztec/stdlib/block';
4
- import type { Tx } from '@aztec/stdlib/tx';
5
+ import { BlockHash, type L2BlockId } from '@aztec/stdlib/block';
6
+ import { Gas } from '@aztec/stdlib/gas';
7
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
5
8
 
6
9
  import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
7
- import { getTxPriorityFee } from '../tx_pool/priority.js';
8
- import type { PreAddResult } from './eviction/interfaces.js';
10
+ import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js';
11
+
12
+ /** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
13
+ export type TxMetaValidationData = {
14
+ getNonEmptyNullifiers(): Fr[];
15
+ expirationTimestamp: bigint;
16
+ /** Whether the tx has public calls. Used to select the correct L2 gas minimum. */
17
+ forPublic?: unknown;
18
+ constants: {
19
+ anchorBlockHeader: {
20
+ hash(): Promise<BlockHash>;
21
+ globalVariables: {
22
+ blockNumber: BlockNumber;
23
+ };
24
+ };
25
+ txContext: {
26
+ gasSettings: { gasLimits: Gas };
27
+ };
28
+ };
29
+ };
9
30
 
10
31
  /**
11
32
  * Lightweight in-memory representation of a transaction.
@@ -19,6 +40,9 @@ export type TxMetaData = {
19
40
  /** The transaction hash as hex string */
20
41
  readonly txHash: string;
21
42
 
43
+ /** The transaction hash as bigint (for efficient Fr conversion in comparisons) */
44
+ readonly txHashBigInt: bigint;
45
+
22
46
  /** Block ID (number and hash) in which the transaction was mined (undefined if not mined) */
23
47
  minedL2BlockId?: L2BlockId;
24
48
 
@@ -41,46 +65,114 @@ export type TxMetaData = {
41
65
  readonly nullifiers: readonly string[];
42
66
 
43
67
  /** Timestamp by which the transaction must be included (for expiration checks) */
44
- readonly includeByTimestamp: bigint;
68
+ readonly expirationTimestamp: bigint;
69
+
70
+ /** Whether the tx's setup-phase calls pass the allow list check. Computed at receipt time. */
71
+ readonly allowedSetupCalls: boolean;
72
+
73
+ /** Validator-compatible data, providing the same access patterns as Tx.data */
74
+ readonly data: TxMetaValidationData;
75
+
76
+ /** Timestamp (ms) when the tx was received into the pool. 0 for hydrated txs (always eligible). */
77
+ receivedAt: number;
78
+
79
+ /** Estimated memory footprint of this metadata object in bytes */
80
+ readonly estimatedSizeBytes: number;
45
81
  };
46
82
 
47
83
  /** Transaction state derived from TxMetaData fields and pool protection status */
48
- export type TxState = 'pending' | 'protected' | 'mined';
84
+ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
49
85
 
50
86
  /**
51
87
  * Builds TxMetaData from a full Tx object.
52
88
  * Extracts all relevant fields for efficient in-memory storage and querying.
89
+ * Fr values are captured in closures for zero-cost re-validation.
90
+ *
91
+ * @param allowedSetupCalls - Whether the tx's setup-phase calls pass the allow list.
92
+ * For gossip/RPC txs this is always `true` (already validated by PhasesTxValidator).
93
+ * For req/resp txs this should be computed by the caller using the phases validator.
53
94
  */
54
- export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
55
- const txHash = tx.getTxHash().toString();
56
- const anchorBlockHeaderHash = (await tx.data.constants.anchorBlockHeader.hash()).toString();
95
+ export async function buildTxMetaData(tx: Tx, allowedSetupCalls: boolean = true): Promise<TxMetaData> {
96
+ const txHashObj = tx.getTxHash();
97
+ const txHash = txHashObj.toString();
98
+ const txHashBigInt = txHashObj.toBigInt();
99
+ const nullifierFrs = tx.data.getNonEmptyNullifiers();
100
+ const nullifiers = nullifierFrs.map(n => n.toString());
101
+ const anchorBlockHeaderHashFr = await tx.data.constants.anchorBlockHeader.hash();
102
+ const anchorBlockHeaderHash = anchorBlockHeaderHashFr.toString();
103
+ const expirationTimestamp = tx.data.expirationTimestamp;
104
+ const anchorBlockNumber = tx.data.constants.anchorBlockHeader.globalVariables.blockNumber;
57
105
  const priorityFee = getTxPriorityFee(tx);
58
106
  const feePayer = tx.data.feePayer.toString();
59
- const nullifiers = tx.data.getNonEmptyNullifiers().map(n => n.toString());
60
- const includeByTimestamp = tx.data.includeByTimestamp;
61
107
 
62
108
  const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
63
109
 
110
+ const estimatedSizeBytes = estimateTxMetaDataSize(nullifiers.length);
111
+
64
112
  return {
65
113
  txHash,
114
+ txHashBigInt,
66
115
  anchorBlockHeaderHash,
67
116
  priorityFee,
68
117
  feePayer,
69
118
  claimAmount,
70
119
  feeLimit,
71
120
  nullifiers,
72
- includeByTimestamp,
121
+ expirationTimestamp,
122
+ allowedSetupCalls,
123
+ receivedAt: 0,
124
+ estimatedSizeBytes,
125
+ data: {
126
+ getNonEmptyNullifiers: () => nullifierFrs,
127
+ expirationTimestamp,
128
+ forPublic: !!tx.data.forPublic,
129
+ constants: {
130
+ anchorBlockHeader: {
131
+ hash: () => Promise.resolve(anchorBlockHeaderHashFr),
132
+ globalVariables: { blockNumber: anchorBlockNumber },
133
+ },
134
+ txContext: {
135
+ gasSettings: { gasLimits: tx.data.constants.txContext.gasSettings.gasLimits },
136
+ },
137
+ },
138
+ },
73
139
  };
74
140
  }
75
141
 
142
+ // V8 JS object overhead (~64 bytes for a plain object with hidden class).
143
+ // String overhead: ~32 bytes header + 1 byte per ASCII char (V8 one-byte strings).
144
+ // Hex string (0x + 64 hex chars = 66 chars): ~98 bytes per string.
145
+ // bigint: ~32 bytes. number: 8 bytes. Fr: ~80 bytes (32 data + object overhead).
146
+ const OBJECT_OVERHEAD = 64;
147
+ const HEX_STRING_BYTES = 98;
148
+ const BIGINT_BYTES = 32;
149
+ const FR_BYTES = 80;
150
+ // Fixed cost: object shell + txHash + anchorBlockHeaderHash + feePayer (3 hex strings)
151
+ // + txHashBigInt + priorityFee + claimAmount + feeLimit + includeByTimestamp (5 bigints)
152
+ // + receivedAt (number, 8 bytes) + estimatedSizeBytes (number, 8 bytes)
153
+ // + data closure object (~OBJECT_OVERHEAD + anchorBlockHeaderHashFr Fr + anchorBlockNumber number)
154
+ const FIXED_METADATA_BYTES =
155
+ OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 5 * BIGINT_BYTES + 8 + 8 + OBJECT_OVERHEAD + FR_BYTES + 8;
156
+
157
+ /** Estimates the in-memory size of a TxMetaData object based on the number of nullifiers. */
158
+ function estimateTxMetaDataSize(nullifierCount: number): number {
159
+ // Per nullifier: one hex string in nullifiers[] + one Fr in the captured nullifierFrs[]
160
+ return FIXED_METADATA_BYTES + nullifierCount * (HEX_STRING_BYTES + FR_BYTES);
161
+ }
162
+
163
+ /** Converts a txHash bigint back to the canonical 0x-prefixed 64-char hex string. */
164
+ export function txHashFromBigInt(value: bigint): string {
165
+ return TxHash.fromBigInt(value).toString();
166
+ }
167
+
76
168
  /** Minimal fields required for priority comparison. */
77
- type PriorityComparable = Pick<TxMetaData, 'txHash' | 'priorityFee'>;
169
+ export type PriorityComparable = Pick<TxMetaData, 'txHash' | 'txHashBigInt' | 'priorityFee'>;
78
170
 
79
171
  /**
80
172
  * Compares two priority fees in ascending order.
81
173
  * Returns negative if a < b, positive if a > b, 0 if equal.
82
174
  */
83
- export function compareFee(a: bigint, b: bigint): number {
175
+ export function compareFee(a: bigint, b: bigint): -1 | 0 | 1 {
84
176
  return a < b ? -1 : a > b ? 1 : 0;
85
177
  }
86
178
 
@@ -89,10 +181,8 @@ export function compareFee(a: bigint, b: bigint): number {
89
181
  * Uses field element comparison for deterministic ordering.
90
182
  * Returns negative if a < b, positive if a > b, 0 if equal.
91
183
  */
92
- export function compareTxHash(a: string, b: string): number {
93
- const fieldA = Fr.fromHexString(a);
94
- const fieldB = Fr.fromHexString(b);
95
- return fieldA.cmp(fieldB);
184
+ export function compareTxHash(a: bigint, b: bigint): -1 | 0 | 1 {
185
+ return Fr.cmpAsBigInt(a, b);
96
186
  }
97
187
 
98
188
  /**
@@ -100,29 +190,46 @@ export function compareTxHash(a: string, b: string): number {
100
190
  * Returns negative if a < b, positive if a > b, 0 if equal.
101
191
  * Use with sort() for ascending order, or negate/reverse for descending.
102
192
  */
103
- export function comparePriority(a: PriorityComparable, b: PriorityComparable): number {
193
+ export function comparePriority(a: PriorityComparable, b: PriorityComparable): -1 | 0 | 1 {
104
194
  const feeComparison = compareFee(a.priorityFee, b.priorityFee);
105
195
  if (feeComparison !== 0) {
106
196
  return feeComparison;
107
197
  }
108
- return compareTxHash(a.txHash, b.txHash);
198
+ return compareTxHash(a.txHashBigInt, b.txHashBigInt);
199
+ }
200
+
201
+ /**
202
+ * Returns the minimum fee required to replace an existing tx with the given price bump percentage.
203
+ * Uses integer arithmetic: `existingFee + existingFee * priceBumpPercentage / 100`.
204
+ */
205
+ export function getMinimumPriceBumpFee(existingFee: bigint, priceBumpPercentage: bigint): bigint {
206
+ const bump = (existingFee * priceBumpPercentage) / 100n;
207
+ // Ensure the minimum bump is at least 1, so that replacement always requires
208
+ // paying strictly more — even with 0% bump or zero existing fee.
209
+ const effectiveBump = bump > 0n ? bump : 1n;
210
+ return existingFee + effectiveBump;
109
211
  }
110
212
 
111
213
  /**
112
214
  * Checks for nullifier conflicts between an incoming transaction and existing pool state.
113
215
  *
114
216
  * When the incoming tx shares nullifiers with existing pending txs:
115
- * - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
116
- * - If any conflicting tx has equal or higher priority, ignore the incoming tx
217
+ * - If the incoming tx meets or exceeds the required priority, mark conflicting txs for eviction
218
+ * - Otherwise, ignore the incoming tx
219
+ *
220
+ * When `priceBumpPercentage` is provided (RPC path), uses fee-only comparison with the
221
+ * percentage bump instead of `comparePriority`.
117
222
  *
118
223
  * @param incomingMeta - Metadata for the incoming transaction
119
224
  * @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
120
225
  * @param getMetadata - Accessor to get metadata for a tx hash
226
+ * @param priceBumpPercentage - Optional percentage bump required for fee-based replacement
121
227
  */
122
228
  export function checkNullifierConflict(
123
229
  incomingMeta: TxMetaData,
124
230
  getTxHashByNullifier: (nullifier: string) => string | undefined,
125
231
  getMetadata: (txHash: string) => TxMetaData | undefined,
232
+ priceBumpPercentage?: bigint,
126
233
  ): PreAddResult {
127
234
  const txHashesToEvict: string[] = [];
128
235
 
@@ -143,18 +250,94 @@ export function checkNullifierConflict(
143
250
  continue;
144
251
  }
145
252
 
146
- // If incoming tx has strictly higher priority, mark for eviction
147
- // Otherwise, ignore incoming tx (ties go to existing tx)
148
- if (incomingMeta.priorityFee > conflictingMeta.priorityFee) {
253
+ // When price bump is set (RPC path), require the incoming fee to meet the bumped threshold.
254
+ // Otherwise (P2P path), use full comparePriority with tx hash tiebreaker.
255
+ const isHigherPriority =
256
+ priceBumpPercentage !== undefined
257
+ ? incomingMeta.priorityFee >= getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
258
+ : comparePriority(incomingMeta, conflictingMeta) > 0;
259
+
260
+ if (isHigherPriority) {
149
261
  txHashesToEvict.push(conflictingHashStr);
150
262
  } else {
263
+ const minimumFee =
264
+ priceBumpPercentage !== undefined
265
+ ? getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
266
+ : undefined;
151
267
  return {
152
268
  shouldIgnore: true,
153
269
  txHashesToEvict: [],
154
- reason: `nullifier conflict with ${conflictingHashStr}`,
270
+ reason: {
271
+ code: TxPoolRejectionCode.NULLIFIER_CONFLICT,
272
+ message:
273
+ minimumFee !== undefined
274
+ ? `Nullifier conflict with existing tx ${conflictingHashStr}. Minimum required fee: ${minimumFee}, got: ${incomingMeta.priorityFee}`
275
+ : `Nullifier conflict with existing tx ${conflictingHashStr}`,
276
+ conflictingTxHash: conflictingHashStr,
277
+ minimumPriceBumpFee: minimumFee,
278
+ txPriorityFee: minimumFee !== undefined ? incomingMeta.priorityFee : undefined,
279
+ },
155
280
  };
156
281
  }
157
282
  }
158
283
 
159
284
  return { shouldIgnore: false, txHashesToEvict };
160
285
  }
286
+
287
+ /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
288
+ export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigint } = {}): TxMetaValidationData {
289
+ return {
290
+ getNonEmptyNullifiers: () => [],
291
+ expirationTimestamp: overrides.expirationTimestamp ?? 0n,
292
+ constants: {
293
+ anchorBlockHeader: {
294
+ hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
295
+ globalVariables: { blockNumber: BlockNumber(0) },
296
+ },
297
+ txContext: {
298
+ gasSettings: { gasLimits: Gas.empty() },
299
+ },
300
+ },
301
+ };
302
+ }
303
+
304
+ /** Creates a stub TxMetaData for tests. All fields have sensible defaults and can be overridden. */
305
+ export function stubTxMetaData(
306
+ txHash: string,
307
+ overrides: {
308
+ priorityFee?: bigint;
309
+ feePayer?: string;
310
+ claimAmount?: bigint;
311
+ feeLimit?: bigint;
312
+ nullifiers?: string[];
313
+ expirationTimestamp?: bigint;
314
+ anchorBlockHeaderHash?: string;
315
+ allowedSetupCalls?: boolean;
316
+ } = {},
317
+ ): TxMetaData {
318
+ const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
319
+ // Normalize to canonical zero-padded hex so txHashFromBigInt(txHashBigInt) === normalizedTxHash
320
+ const normalizedTxHash = txHashFromBigInt(txHashBigInt);
321
+ const expirationTimestamp = overrides.expirationTimestamp ?? 0n;
322
+ return {
323
+ txHash: normalizedTxHash,
324
+ txHashBigInt,
325
+ anchorBlockHeaderHash: overrides.anchorBlockHeaderHash ?? '0x1234',
326
+ priorityFee: overrides.priorityFee ?? 100n,
327
+ feePayer: overrides.feePayer ?? '0xfeepayer',
328
+ claimAmount: overrides.claimAmount ?? 0n,
329
+ feeLimit: overrides.feeLimit ?? 100n,
330
+ nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`],
331
+ expirationTimestamp,
332
+ allowedSetupCalls: overrides.allowedSetupCalls ?? true,
333
+ receivedAt: 0,
334
+ estimatedSizeBytes: 0,
335
+ data: stubTxMetaValidationData({ expirationTimestamp }),
336
+ };
337
+ }
338
+
339
+ /** Returns the priority fee for a tx, based on the L2 priority fee capped by the max fee per gas. */
340
+ function getTxPriorityFee(tx: Tx): bigint {
341
+ const { maxPriorityFeesPerGas: priorityFees, maxFeesPerGas } = tx.getGasSettings();
342
+ return minBigint(maxFeesPerGas.feePerL2Gas, priorityFees.feePerL2Gas);
343
+ }