@aztec/p2p 0.0.0-test.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/README.md +7 -0
  2. package/dest/bootstrap/bootstrap.d.ts +38 -0
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -0
  4. package/dest/bootstrap/bootstrap.js +123 -0
  5. package/dest/client/factory.d.ts +21 -0
  6. package/dest/client/factory.d.ts.map +1 -0
  7. package/dest/client/factory.js +37 -0
  8. package/dest/client/index.d.ts +3 -0
  9. package/dest/client/index.d.ts.map +1 -0
  10. package/dest/client/index.js +2 -0
  11. package/dest/client/p2p_client.d.ts +314 -0
  12. package/dest/client/p2p_client.d.ts.map +1 -0
  13. package/dest/client/p2p_client.js +505 -0
  14. package/dest/config.d.ts +180 -0
  15. package/dest/config.d.ts.map +1 -0
  16. package/dest/config.js +193 -0
  17. package/dest/enr/generate-enr.d.ts +9 -0
  18. package/dest/enr/generate-enr.d.ts.map +1 -0
  19. package/dest/enr/generate-enr.js +30 -0
  20. package/dest/enr/index.d.ts +2 -0
  21. package/dest/enr/index.d.ts.map +1 -0
  22. package/dest/enr/index.js +1 -0
  23. package/dest/errors/reqresp.error.d.ts +28 -0
  24. package/dest/errors/reqresp.error.d.ts.map +1 -0
  25. package/dest/errors/reqresp.error.js +30 -0
  26. package/dest/index.d.ts +8 -0
  27. package/dest/index.d.ts.map +1 -0
  28. package/dest/index.js +7 -0
  29. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +57 -0
  30. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
  31. package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -0
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +195 -0
  35. package/dest/mem_pools/attestation_pool/index.d.ts +3 -0
  36. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
  37. package/dest/mem_pools/attestation_pool/index.js +2 -0
  38. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +22 -0
  39. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
  40. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +112 -0
  41. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -0
  42. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -0
  43. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +129 -0
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts +19 -0
  45. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
  46. package/dest/mem_pools/attestation_pool/mocks.js +33 -0
  47. package/dest/mem_pools/index.d.ts +4 -0
  48. package/dest/mem_pools/index.d.ts.map +1 -0
  49. package/dest/mem_pools/index.js +1 -0
  50. package/dest/mem_pools/instrumentation.d.ts +30 -0
  51. package/dest/mem_pools/instrumentation.d.ts.map +1 -0
  52. package/dest/mem_pools/instrumentation.js +84 -0
  53. package/dest/mem_pools/interface.d.ts +11 -0
  54. package/dest/mem_pools/interface.d.ts.map +1 -0
  55. package/dest/mem_pools/interface.js +3 -0
  56. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +66 -0
  57. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +245 -0
  59. package/dest/mem_pools/tx_pool/index.d.ts +4 -0
  60. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
  61. package/dest/mem_pools/tx_pool/index.js +3 -0
  62. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +56 -0
  63. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -0
  64. package/dest/mem_pools/tx_pool/memory_tx_pool.js +141 -0
  65. package/dest/mem_pools/tx_pool/priority.d.ts +8 -0
  66. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
  67. package/dest/mem_pools/tx_pool/priority.js +10 -0
  68. package/dest/mem_pools/tx_pool/tx_pool.d.ts +66 -0
  69. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
  70. package/dest/mem_pools/tx_pool/tx_pool.js +3 -0
  71. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
  72. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
  73. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +169 -0
  74. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
  75. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
  76. package/dest/msg_validators/attestation_validator/attestation_validator.js +19 -0
  77. package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
  78. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
  79. package/dest/msg_validators/attestation_validator/index.js +1 -0
  80. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
  81. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
  82. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -0
  83. package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
  84. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
  85. package/dest/msg_validators/block_proposal_validator/index.js +1 -0
  86. package/dest/msg_validators/index.d.ts +4 -0
  87. package/dest/msg_validators/index.d.ts.map +1 -0
  88. package/dest/msg_validators/index.js +3 -0
  89. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
  90. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
  91. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +31 -0
  92. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +11 -0
  93. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
  94. package/dest/msg_validators/tx_validator/block_header_validator.js +26 -0
  95. package/dest/msg_validators/tx_validator/data_validator.d.ts +6 -0
  96. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
  97. package/dest/msg_validators/tx_validator/data_validator.js +107 -0
  98. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +12 -0
  99. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
  100. package/dest/msg_validators/tx_validator/double_spend_validator.js +41 -0
  101. package/dest/msg_validators/tx_validator/index.d.ts +7 -0
  102. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
  103. package/dest/msg_validators/tx_validator/index.js +6 -0
  104. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -0
  105. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
  106. package/dest/msg_validators/tx_validator/metadata_validator.js +44 -0
  107. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +9 -0
  108. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
  109. package/dest/msg_validators/tx_validator/tx_proof_validator.js +25 -0
  110. package/dest/services/data_store.d.ts +27 -0
  111. package/dest/services/data_store.d.ts.map +1 -0
  112. package/dest/services/data_store.js +188 -0
  113. package/dest/services/discv5/discV5_service.d.ts +42 -0
  114. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  115. package/dest/services/discv5/discV5_service.js +214 -0
  116. package/dest/services/dummy_service.d.ts +85 -0
  117. package/dest/services/dummy_service.d.ts.map +1 -0
  118. package/dest/services/dummy_service.js +92 -0
  119. package/dest/services/encoding.d.ts +31 -0
  120. package/dest/services/encoding.d.ts.map +1 -0
  121. package/dest/services/encoding.js +66 -0
  122. package/dest/services/gossipsub/scoring.d.ts +7 -0
  123. package/dest/services/gossipsub/scoring.d.ts.map +1 -0
  124. package/dest/services/gossipsub/scoring.js +10 -0
  125. package/dest/services/index.d.ts +3 -0
  126. package/dest/services/index.d.ts.map +1 -0
  127. package/dest/services/index.js +2 -0
  128. package/dest/services/libp2p/libp2p_service.d.ts +186 -0
  129. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  130. package/dest/services/libp2p/libp2p_service.js +712 -0
  131. package/dest/services/peer-manager/metrics.d.ts +12 -0
  132. package/dest/services/peer-manager/metrics.d.ts.map +1 -0
  133. package/dest/services/peer-manager/metrics.js +33 -0
  134. package/dest/services/peer-manager/peer_manager.d.ts +94 -0
  135. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
  136. package/dest/services/peer-manager/peer_manager.js +445 -0
  137. package/dest/services/peer-manager/peer_scoring.d.ts +28 -0
  138. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
  139. package/dest/services/peer-manager/peer_scoring.js +86 -0
  140. package/dest/services/reqresp/config.d.ts +16 -0
  141. package/dest/services/reqresp/config.d.ts.map +1 -0
  142. package/dest/services/reqresp/config.js +20 -0
  143. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
  144. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
  145. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +88 -0
  146. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
  147. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
  148. package/dest/services/reqresp/connection-sampler/connection_sampler.js +181 -0
  149. package/dest/services/reqresp/index.d.ts +6 -0
  150. package/dest/services/reqresp/index.d.ts.map +1 -0
  151. package/dest/services/reqresp/index.js +4 -0
  152. package/dest/services/reqresp/interface.d.ts +116 -0
  153. package/dest/services/reqresp/interface.d.ts.map +1 -0
  154. package/dest/services/reqresp/interface.js +84 -0
  155. package/dest/services/reqresp/metrics.d.ts +15 -0
  156. package/dest/services/reqresp/metrics.d.ts.map +1 -0
  157. package/dest/services/reqresp/metrics.js +55 -0
  158. package/dest/services/reqresp/protocols/block.d.ts +4 -0
  159. package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
  160. package/dest/services/reqresp/protocols/block.js +8 -0
  161. package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
  162. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
  163. package/dest/services/reqresp/protocols/goodbye.js +87 -0
  164. package/dest/services/reqresp/protocols/index.d.ts +9 -0
  165. package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
  166. package/dest/services/reqresp/protocols/index.js +7 -0
  167. package/dest/services/reqresp/protocols/ping.d.ts +9 -0
  168. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
  169. package/dest/services/reqresp/protocols/ping.js +7 -0
  170. package/dest/services/reqresp/protocols/status.d.ts +9 -0
  171. package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
  172. package/dest/services/reqresp/protocols/status.js +7 -0
  173. package/dest/services/reqresp/protocols/tx.d.ts +13 -0
  174. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
  175. package/dest/services/reqresp/protocols/tx.js +20 -0
  176. package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
  177. package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
  178. package/dest/services/reqresp/rate-limiter/index.js +1 -0
  179. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +102 -0
  180. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
  181. package/dest/services/reqresp/rate-limiter/rate_limiter.js +184 -0
  182. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
  183. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
  184. package/dest/services/reqresp/rate-limiter/rate_limits.js +54 -0
  185. package/dest/services/reqresp/reqresp.d.ts +166 -0
  186. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  187. package/dest/services/reqresp/reqresp.js +516 -0
  188. package/dest/services/reqresp/status.d.ts +31 -0
  189. package/dest/services/reqresp/status.d.ts.map +1 -0
  190. package/dest/services/reqresp/status.js +51 -0
  191. package/dest/services/service.d.ts +87 -0
  192. package/dest/services/service.d.ts.map +1 -0
  193. package/dest/services/service.js +5 -0
  194. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
  195. package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
  196. package/dest/test-helpers/generate-peer-id-private-keys.js +13 -0
  197. package/dest/test-helpers/get-ports.d.ts +7 -0
  198. package/dest/test-helpers/get-ports.d.ts.map +1 -0
  199. package/dest/test-helpers/get-ports.js +8 -0
  200. package/dest/test-helpers/index.d.ts +6 -0
  201. package/dest/test-helpers/index.d.ts.map +1 -0
  202. package/dest/test-helpers/index.js +5 -0
  203. package/dest/test-helpers/make-enrs.d.ts +16 -0
  204. package/dest/test-helpers/make-enrs.d.ts.map +1 -0
  205. package/dest/test-helpers/make-enrs.js +32 -0
  206. package/dest/test-helpers/make-test-p2p-clients.d.ts +36 -0
  207. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
  208. package/dest/test-helpers/make-test-p2p-clients.js +68 -0
  209. package/dest/test-helpers/reqresp-nodes.d.ts +66 -0
  210. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
  211. package/dest/test-helpers/reqresp-nodes.js +207 -0
  212. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -0
  213. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
  214. package/dest/testbench/p2p_client_testbench_worker.js +132 -0
  215. package/dest/testbench/parse_log_file.d.ts +2 -0
  216. package/dest/testbench/parse_log_file.d.ts.map +1 -0
  217. package/dest/testbench/parse_log_file.js +131 -0
  218. package/dest/testbench/testbench.d.ts +2 -0
  219. package/dest/testbench/testbench.d.ts.map +1 -0
  220. package/dest/testbench/testbench.js +61 -0
  221. package/dest/testbench/worker_client_manager.d.ts +56 -0
  222. package/dest/testbench/worker_client_manager.d.ts.map +1 -0
  223. package/dest/testbench/worker_client_manager.js +266 -0
  224. package/dest/types/index.d.ts +32 -0
  225. package/dest/types/index.d.ts.map +1 -0
  226. package/dest/types/index.js +28 -0
  227. package/dest/util.d.ts +53 -0
  228. package/dest/util.d.ts.map +1 -0
  229. package/dest/util.js +140 -0
  230. package/dest/versioning.d.ts +12 -0
  231. package/dest/versioning.d.ts.map +1 -0
  232. package/dest/versioning.js +33 -0
  233. package/package.json +127 -0
  234. package/src/bootstrap/bootstrap.ts +146 -0
  235. package/src/client/factory.ts +89 -0
  236. package/src/client/index.ts +2 -0
  237. package/src/client/p2p_client.ts +754 -0
  238. package/src/config.ts +371 -0
  239. package/src/enr/generate-enr.ts +39 -0
  240. package/src/enr/index.ts +1 -0
  241. package/src/errors/reqresp.error.ts +35 -0
  242. package/src/index.ts +7 -0
  243. package/src/mem_pools/attestation_pool/attestation_pool.ts +62 -0
  244. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +230 -0
  245. package/src/mem_pools/attestation_pool/index.ts +2 -0
  246. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +159 -0
  247. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +161 -0
  248. package/src/mem_pools/attestation_pool/mocks.ts +44 -0
  249. package/src/mem_pools/index.ts +3 -0
  250. package/src/mem_pools/instrumentation.ts +126 -0
  251. package/src/mem_pools/interface.ts +12 -0
  252. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +309 -0
  253. package/src/mem_pools/tx_pool/index.ts +3 -0
  254. package/src/mem_pools/tx_pool/memory_tx_pool.ts +174 -0
  255. package/src/mem_pools/tx_pool/priority.ts +13 -0
  256. package/src/mem_pools/tx_pool/tx_pool.ts +76 -0
  257. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +130 -0
  258. package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -0
  259. package/src/msg_validators/attestation_validator/index.ts +1 -0
  260. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +29 -0
  261. package/src/msg_validators/block_proposal_validator/index.ts +1 -0
  262. package/src/msg_validators/index.ts +3 -0
  263. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +32 -0
  264. package/src/msg_validators/tx_validator/block_header_validator.ts +25 -0
  265. package/src/msg_validators/tx_validator/data_validator.ts +106 -0
  266. package/src/msg_validators/tx_validator/double_spend_validator.ts +38 -0
  267. package/src/msg_validators/tx_validator/index.ts +6 -0
  268. package/src/msg_validators/tx_validator/metadata_validator.ts +48 -0
  269. package/src/msg_validators/tx_validator/tx_proof_validator.ts +18 -0
  270. package/src/services/data_store.ts +235 -0
  271. package/src/services/discv5/discV5_service.ts +256 -0
  272. package/src/services/dummy_service.ts +134 -0
  273. package/src/services/encoding.ts +79 -0
  274. package/src/services/gossipsub/scoring.ts +13 -0
  275. package/src/services/index.ts +2 -0
  276. package/src/services/libp2p/libp2p_service.ts +871 -0
  277. package/src/services/peer-manager/metrics.ts +41 -0
  278. package/src/services/peer-manager/peer_manager.ts +530 -0
  279. package/src/services/peer-manager/peer_scoring.ts +105 -0
  280. package/src/services/reqresp/config.ts +35 -0
  281. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +94 -0
  282. package/src/services/reqresp/connection-sampler/connection_sampler.ts +217 -0
  283. package/src/services/reqresp/index.ts +4 -0
  284. package/src/services/reqresp/interface.ts +185 -0
  285. package/src/services/reqresp/metrics.ts +57 -0
  286. package/src/services/reqresp/protocols/block.ts +15 -0
  287. package/src/services/reqresp/protocols/goodbye.ts +101 -0
  288. package/src/services/reqresp/protocols/index.ts +8 -0
  289. package/src/services/reqresp/protocols/ping.ts +8 -0
  290. package/src/services/reqresp/protocols/status.ts +8 -0
  291. package/src/services/reqresp/protocols/tx.ts +29 -0
  292. package/src/services/reqresp/rate-limiter/index.ts +1 -0
  293. package/src/services/reqresp/rate-limiter/rate_limiter.ts +228 -0
  294. package/src/services/reqresp/rate-limiter/rate_limits.ts +55 -0
  295. package/src/services/reqresp/reqresp.ts +661 -0
  296. package/src/services/reqresp/status.ts +59 -0
  297. package/src/services/service.ts +112 -0
  298. package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
  299. package/src/test-helpers/get-ports.ts +8 -0
  300. package/src/test-helpers/index.ts +5 -0
  301. package/src/test-helpers/make-enrs.ts +44 -0
  302. package/src/test-helpers/make-test-p2p-clients.ts +122 -0
  303. package/src/test-helpers/reqresp-nodes.ts +289 -0
  304. package/src/testbench/README.md +20 -0
  305. package/src/testbench/p2p_client_testbench_worker.ts +152 -0
  306. package/src/testbench/parse_log_file.ts +175 -0
  307. package/src/testbench/testbench.ts +66 -0
  308. package/src/testbench/worker_client_manager.ts +318 -0
  309. package/src/types/index.ts +36 -0
  310. package/src/util.ts +196 -0
  311. package/src/versioning.ts +50 -0
@@ -0,0 +1,126 @@
1
+ import type { Gossipable } from '@aztec/stdlib/p2p';
2
+ import {
3
+ Attributes,
4
+ type Histogram,
5
+ LmdbMetrics,
6
+ type LmdbStatsCallback,
7
+ Metrics,
8
+ type MetricsType,
9
+ type TelemetryClient,
10
+ type UpDownCounter,
11
+ } from '@aztec/telemetry-client';
12
+
13
+ export enum PoolName {
14
+ TX_POOL = 'TxPool',
15
+ ATTESTATION_POOL = 'AttestationPool',
16
+ }
17
+
18
+ type MetricsLabels = {
19
+ objectInMempool: MetricsType;
20
+ objectSize: MetricsType;
21
+ };
22
+
23
+ /**
24
+ * Get the metrics labels for a given pool name.
25
+ * They must all have different names, as if duplicates appear, it will brick
26
+ * the metrics instance
27
+ */
28
+ function getMetricsLabels(name: PoolName): MetricsLabels {
29
+ if (name === PoolName.TX_POOL) {
30
+ return {
31
+ objectInMempool: Metrics.MEMPOOL_TX_COUNT,
32
+ objectSize: Metrics.MEMPOOL_TX_SIZE,
33
+ };
34
+ } else if (name === PoolName.ATTESTATION_POOL) {
35
+ return {
36
+ objectInMempool: Metrics.MEMPOOL_ATTESTATIONS_COUNT,
37
+ objectSize: Metrics.MEMPOOL_ATTESTATIONS_SIZE,
38
+ };
39
+ }
40
+
41
+ throw new Error('Invalid pool type');
42
+ }
43
+
44
+ /**
45
+ * Instrumentation class for the Pools (TxPool, AttestationPool, etc).
46
+ */
47
+ export class PoolInstrumentation<PoolObject extends Gossipable> {
48
+ /** The number of txs in the mempool */
49
+ private objectsInMempool: UpDownCounter;
50
+ /** Tracks tx size */
51
+ private objectSize: Histogram;
52
+
53
+ private dbMetrics: LmdbMetrics;
54
+
55
+ private defaultAttributes;
56
+
57
+ constructor(telemetry: TelemetryClient, name: PoolName, dbStats?: LmdbStatsCallback) {
58
+ const meter = telemetry.getMeter(name);
59
+ this.defaultAttributes = { [Attributes.POOL_NAME]: name };
60
+
61
+ const metricsLabels = getMetricsLabels(name);
62
+
63
+ this.objectsInMempool = meter.createUpDownCounter(metricsLabels.objectInMempool, {
64
+ description: 'The current number of transactions in the mempool',
65
+ });
66
+
67
+ this.objectSize = meter.createHistogram(metricsLabels.objectSize, {
68
+ unit: 'By',
69
+ description: 'The size of transactions in the mempool',
70
+ });
71
+
72
+ this.dbMetrics = new LmdbMetrics(
73
+ meter,
74
+ {
75
+ [Attributes.DB_DATA_TYPE]: 'tx-pool',
76
+ },
77
+ dbStats,
78
+ );
79
+ }
80
+
81
+ public recordSize(poolObject: PoolObject) {
82
+ this.objectSize.record(poolObject.getSize());
83
+ }
84
+
85
+ /**
86
+ * Updates the metrics with the new objects.
87
+ * @param txs - The objects to record
88
+ */
89
+ public recordAddedObjects(count = 1, status?: string) {
90
+ if (count < 0) {
91
+ throw new Error('Count must be positive');
92
+ }
93
+ if (count === 0) {
94
+ return;
95
+ }
96
+ const attributes = status
97
+ ? {
98
+ ...this.defaultAttributes,
99
+ [Attributes.STATUS]: status,
100
+ }
101
+ : this.defaultAttributes;
102
+
103
+ this.objectsInMempool.add(count, attributes);
104
+ }
105
+
106
+ /**
107
+ * Updates the metrics by removing objects from the mempool.
108
+ * @param count - The number of objects to remove from the mempool
109
+ */
110
+ public recordRemovedObjects(count = 1, status?: string) {
111
+ if (count < 0) {
112
+ throw new Error('Count must be positive');
113
+ }
114
+ if (count === 0) {
115
+ return;
116
+ }
117
+
118
+ const attributes = status
119
+ ? {
120
+ ...this.defaultAttributes,
121
+ [Attributes.STATUS]: status,
122
+ }
123
+ : this.defaultAttributes;
124
+ this.objectsInMempool.add(-1 * count, attributes);
125
+ }
126
+ }
@@ -0,0 +1,12 @@
1
+ import type { P2PClientType } from '@aztec/stdlib/p2p';
2
+
3
+ import type { AttestationPool } from './attestation_pool/attestation_pool.js';
4
+ import type { TxPool } from './tx_pool/tx_pool.js';
5
+
6
+ /**
7
+ * A interface the combines all mempools
8
+ */
9
+ export type MemPools<T extends P2PClientType = P2PClientType.Full> = {
10
+ txPool: TxPool;
11
+ attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined;
12
+ };
@@ -0,0 +1,309 @@
1
+ import { toArray } from '@aztec/foundation/iterable';
2
+ import { type Logger, createLogger } from '@aztec/foundation/log';
3
+ import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncMultiMap } from '@aztec/kv-store';
4
+ import { ClientIvcProof } from '@aztec/stdlib/proofs';
5
+ import type { TxAddedToPoolStats } from '@aztec/stdlib/stats';
6
+ import { Tx, TxHash } from '@aztec/stdlib/tx';
7
+ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
8
+
9
+ import { PoolInstrumentation, PoolName } from '../instrumentation.js';
10
+ import { getPendingTxPriority } from './priority.js';
11
+ import type { TxPool } from './tx_pool.js';
12
+
13
+ /**
14
+ * KV implementation of the Transaction Pool.
15
+ */
16
+ export class AztecKVTxPool implements TxPool {
17
+ #store: AztecAsyncKVStore;
18
+
19
+ /** Our tx pool, stored as a Map, with K: tx hash and V: the transaction. */
20
+ #txs: AztecAsyncMap<string, Buffer>;
21
+
22
+ /** Index from tx hash to the block number in which they were mined, filtered by mined txs. */
23
+ #minedTxHashToBlock: AztecAsyncMap<string, number>;
24
+
25
+ /** Index from tx priority (stored as hex) to its tx hash, filtered by pending txs. */
26
+ #pendingTxPriorityToHash: AztecAsyncMultiMap<string, string>;
27
+
28
+ /** KV store for archived txs. */
29
+ #archive: AztecAsyncKVStore;
30
+
31
+ /** Archived txs map for future lookup. */
32
+ #archivedTxs: AztecAsyncMap<string, Buffer>;
33
+
34
+ /** Indexes of the archived txs by insertion order. */
35
+ #archivedTxIndices: AztecAsyncMap<number, string>;
36
+
37
+ /** Number of txs to archive. */
38
+ #archivedTxLimit: number;
39
+
40
+ #log: Logger;
41
+
42
+ #metrics: PoolInstrumentation<Tx>;
43
+
44
+ /**
45
+ * Class constructor for KV TxPool. Initiates our transaction pool as an AztecMap.
46
+ * @param store - A KV store for live txs in the pool.
47
+ * @param archive - A KV store for archived txs.
48
+ * @param telemetry - A telemetry client.
49
+ * @param archivedTxLimit - The number of txs to archive.
50
+ * @param log - A logger.
51
+ */
52
+ constructor(
53
+ store: AztecAsyncKVStore,
54
+ archive: AztecAsyncKVStore,
55
+ telemetry: TelemetryClient = getTelemetryClient(),
56
+ archivedTxLimit: number = 0,
57
+ log = createLogger('p2p:tx_pool'),
58
+ ) {
59
+ this.#txs = store.openMap('txs');
60
+ this.#minedTxHashToBlock = store.openMap('txHashToBlockMined');
61
+ this.#pendingTxPriorityToHash = store.openMultiMap('pendingTxFeeToHash');
62
+
63
+ this.#archivedTxs = archive.openMap('archivedTxs');
64
+ this.#archivedTxIndices = archive.openMap('archivedTxIndices');
65
+ this.#archivedTxLimit = archivedTxLimit;
66
+
67
+ this.#store = store;
68
+ this.#archive = archive;
69
+ this.#log = log;
70
+ this.#metrics = new PoolInstrumentation(telemetry, PoolName.TX_POOL, () => store.estimateSize());
71
+ }
72
+
73
+ public markAsMined(txHashes: TxHash[], blockNumber: number): Promise<void> {
74
+ if (txHashes.length === 0) {
75
+ return Promise.resolve();
76
+ }
77
+
78
+ let deletedPending = 0;
79
+ return this.#store.transactionAsync(async () => {
80
+ for (const hash of txHashes) {
81
+ const key = hash.toString();
82
+ await this.#minedTxHashToBlock.set(key, blockNumber);
83
+
84
+ const tx = await this.getTxByHash(hash);
85
+ if (tx) {
86
+ deletedPending++;
87
+ const fee = getPendingTxPriority(tx);
88
+ await this.#pendingTxPriorityToHash.deleteValue(fee, key);
89
+ }
90
+ }
91
+ this.#metrics.recordAddedObjects(txHashes.length, 'mined');
92
+ this.#metrics.recordRemovedObjects(deletedPending, 'pending');
93
+ });
94
+ }
95
+
96
+ public markMinedAsPending(txHashes: TxHash[]): Promise<void> {
97
+ if (txHashes.length === 0) {
98
+ return Promise.resolve();
99
+ }
100
+
101
+ let markedAsPending = 0;
102
+ return this.#store.transactionAsync(async () => {
103
+ for (const hash of txHashes) {
104
+ const key = hash.toString();
105
+ await this.#minedTxHashToBlock.delete(key);
106
+
107
+ const tx = await this.getTxByHash(hash);
108
+ if (tx) {
109
+ await this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), key);
110
+ markedAsPending++;
111
+ }
112
+ }
113
+
114
+ this.#metrics.recordAddedObjects(markedAsPending, 'pending');
115
+ this.#metrics.recordRemovedObjects(markedAsPending, 'mined');
116
+ });
117
+ }
118
+
119
+ public async getPendingTxHashes(): Promise<TxHash[]> {
120
+ const vals = await toArray(this.#pendingTxPriorityToHash.valuesAsync({ reverse: true }));
121
+ return vals.map(x => TxHash.fromString(x));
122
+ }
123
+
124
+ public async getMinedTxHashes(): Promise<[TxHash, number][]> {
125
+ const vals = await toArray(this.#minedTxHashToBlock.entriesAsync());
126
+ return vals.map(([txHash, blockNumber]) => [TxHash.fromString(txHash), blockNumber]);
127
+ }
128
+
129
+ public async getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | undefined> {
130
+ const key = txHash.toString();
131
+ const [isMined, isKnown] = await Promise.all([this.#minedTxHashToBlock.hasAsync(key), this.#txs.hasAsync(key)]);
132
+
133
+ if (isMined) {
134
+ return 'mined';
135
+ } else if (isKnown) {
136
+ return 'pending';
137
+ } else {
138
+ return undefined;
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Checks if a transaction exists in the pool and returns it.
144
+ * @param txHash - The generated tx hash.
145
+ * @returns The transaction, if found, 'undefined' otherwise.
146
+ */
147
+ public async getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
148
+ const buffer = await this.#txs.getAsync(txHash.toString());
149
+ if (buffer) {
150
+ const tx = Tx.fromBuffer(buffer);
151
+ tx.setTxHash(txHash);
152
+ return tx;
153
+ }
154
+ return undefined;
155
+ }
156
+
157
+ /**
158
+ * Checks if an archived tx exists and returns it.
159
+ * @param txHash - The tx hash.
160
+ * @returns The transaction metadata, if found, 'undefined' otherwise.
161
+ */
162
+ public async getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined> {
163
+ const buffer = await this.#archivedTxs.getAsync(txHash.toString());
164
+ if (buffer) {
165
+ const tx = Tx.fromBuffer(buffer);
166
+ tx.setTxHash(txHash);
167
+ return tx;
168
+ }
169
+ return undefined;
170
+ }
171
+
172
+ /**
173
+ * Adds a list of transactions to the pool. Duplicates are ignored.
174
+ * @param txs - An array of txs to be added to the pool.
175
+ * @returns Empty promise.
176
+ */
177
+ public async addTxs(txs: Tx[]): Promise<void> {
178
+ const hashesAndStats = await Promise.all(
179
+ txs.map(async tx => ({ txHash: await tx.getTxHash(), txStats: await tx.getStats() })),
180
+ );
181
+ await this.#store.transactionAsync(async () => {
182
+ let pendingCount = 0;
183
+ await Promise.all(
184
+ txs.map(async (tx, i) => {
185
+ const { txHash, txStats } = hashesAndStats[i];
186
+ this.#log.verbose(`Adding tx ${txHash.toString()} to pool`, {
187
+ eventName: 'tx-added-to-pool',
188
+ ...txStats,
189
+ } satisfies TxAddedToPoolStats);
190
+
191
+ const key = txHash.toString();
192
+ await this.#txs.set(key, tx.toBuffer());
193
+
194
+ if (!(await this.#minedTxHashToBlock.hasAsync(key))) {
195
+ pendingCount++;
196
+ // REFACTOR: Use an lmdb conditional write to avoid race conditions with this write tx
197
+ await this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), key);
198
+ this.#metrics.recordSize(tx);
199
+ }
200
+ }),
201
+ );
202
+
203
+ this.#metrics.recordAddedObjects(pendingCount, 'pending');
204
+ });
205
+ }
206
+
207
+ /**
208
+ * Deletes transactions from the pool. Tx hashes that are not present are ignored.
209
+ * @param txHashes - An array of tx hashes to be removed from the tx pool.
210
+ * @returns Empty promise.
211
+ */
212
+ public deleteTxs(txHashes: TxHash[]): Promise<void> {
213
+ let pendingDeleted = 0;
214
+ let minedDeleted = 0;
215
+
216
+ const deletedTxs: Tx[] = [];
217
+ const poolDbTx = this.#store.transactionAsync(async () => {
218
+ for (const hash of txHashes) {
219
+ const key = hash.toString();
220
+ const tx = await this.getTxByHash(hash);
221
+
222
+ if (tx) {
223
+ const fee = getPendingTxPriority(tx);
224
+ await this.#pendingTxPriorityToHash.deleteValue(fee, key);
225
+
226
+ const isMined = await this.#minedTxHashToBlock.hasAsync(key);
227
+ if (isMined) {
228
+ minedDeleted++;
229
+ } else {
230
+ pendingDeleted++;
231
+ }
232
+
233
+ if (this.#archivedTxLimit) {
234
+ deletedTxs.push(tx);
235
+ }
236
+
237
+ await this.#txs.delete(key);
238
+ await this.#minedTxHashToBlock.delete(key);
239
+ }
240
+ }
241
+
242
+ this.#metrics.recordRemovedObjects(pendingDeleted, 'pending');
243
+ this.#metrics.recordRemovedObjects(minedDeleted, 'mined');
244
+ });
245
+
246
+ return this.#archivedTxLimit ? poolDbTx.then(() => this.archiveTxs(deletedTxs)) : poolDbTx;
247
+ }
248
+
249
+ /**
250
+ * Gets all the transactions stored in the pool.
251
+ * @returns Array of tx objects in the order they were added to the pool.
252
+ */
253
+ public async getAllTxs(): Promise<Tx[]> {
254
+ const vals = await toArray(this.#txs.entriesAsync());
255
+ return vals.map(([hash, buffer]) => {
256
+ const tx = Tx.fromBuffer(buffer);
257
+ tx.setTxHash(TxHash.fromString(hash));
258
+ return tx;
259
+ });
260
+ }
261
+
262
+ /**
263
+ * Gets the hashes of all transactions currently in the tx pool.
264
+ * @returns An array of transaction hashes found in the tx pool.
265
+ */
266
+ public async getAllTxHashes(): Promise<TxHash[]> {
267
+ const vals = await toArray(this.#txs.keysAsync());
268
+ return vals.map(x => TxHash.fromString(x));
269
+ }
270
+
271
+ /**
272
+ * Archives a list of txs for future reference. The number of archived txs is limited by the specified archivedTxLimit.
273
+ * @param txs - The list of transactions to archive.
274
+ * @returns Empty promise.
275
+ */
276
+ private async archiveTxs(txs: Tx[]): Promise<void> {
277
+ const txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
278
+ await this.#archive.transactionAsync(async () => {
279
+ // calcualte the head and tail indices of the archived txs by insertion order.
280
+ let headIdx =
281
+ ((await this.#archivedTxIndices.entriesAsync({ limit: 1, reverse: true }).next()).value?.[0] ?? -1) + 1;
282
+ let tailIdx = (await this.#archivedTxIndices.entriesAsync({ limit: 1 }).next()).value?.[0] ?? 0;
283
+
284
+ for (let i = 0; i < txs.length; i++) {
285
+ const tx = txs[i];
286
+ while (headIdx - tailIdx >= this.#archivedTxLimit) {
287
+ const txHash = await this.#archivedTxIndices.getAsync(tailIdx);
288
+ if (txHash) {
289
+ await this.#archivedTxs.delete(txHash);
290
+ await this.#archivedTxIndices.delete(tailIdx);
291
+ }
292
+ tailIdx++;
293
+ }
294
+
295
+ const archivedTx: Tx = new Tx(
296
+ tx.data,
297
+ ClientIvcProof.empty(),
298
+ tx.contractClassLogs,
299
+ tx.enqueuedPublicFunctionCalls,
300
+ tx.publicTeardownFunctionCall,
301
+ );
302
+ const txHash = txHashes[i].toString();
303
+ await this.#archivedTxs.set(txHash, archivedTx.toBuffer());
304
+ await this.#archivedTxIndices.set(headIdx, txHash);
305
+ headIdx++;
306
+ }
307
+ });
308
+ }
309
+ }
@@ -0,0 +1,3 @@
1
+ export * from './tx_pool.js';
2
+ export * from './memory_tx_pool.js';
3
+ export * from './aztec_kv_tx_pool.js';
@@ -0,0 +1,174 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import type { TxAddedToPoolStats } from '@aztec/stdlib/stats';
3
+ import { Tx, TxHash } from '@aztec/stdlib/tx';
4
+ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
5
+
6
+ import { PoolInstrumentation, PoolName } from '../instrumentation.js';
7
+ import { getPendingTxPriority } from './priority.js';
8
+ import type { TxPool } from './tx_pool.js';
9
+
10
+ /**
11
+ * In-memory implementation of the Transaction Pool.
12
+ */
13
+ export class InMemoryTxPool implements TxPool {
14
+ /**
15
+ * Our tx pool, stored as a Map in-memory, with K: tx hash and V: the transaction.
16
+ */
17
+ private txs: Map<bigint, Tx>;
18
+ private minedTxs: Map<bigint, number>;
19
+ private pendingTxs: Set<bigint>;
20
+
21
+ private metrics: PoolInstrumentation<Tx>;
22
+
23
+ /**
24
+ * Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map.
25
+ * @param log - A logger.
26
+ */
27
+ constructor(telemetry: TelemetryClient = getTelemetryClient(), private log = createLogger('p2p:tx_pool')) {
28
+ this.txs = new Map<bigint, Tx>();
29
+ this.minedTxs = new Map();
30
+ this.pendingTxs = new Set();
31
+ this.metrics = new PoolInstrumentation(telemetry, PoolName.TX_POOL);
32
+ }
33
+
34
+ public markAsMined(txHashes: TxHash[], blockNumber: number): Promise<void> {
35
+ const keys = txHashes.map(x => x.toBigInt());
36
+ for (const key of keys) {
37
+ this.minedTxs.set(key, blockNumber);
38
+ this.pendingTxs.delete(key);
39
+ }
40
+ this.metrics.recordRemovedObjects(txHashes.length, 'pending');
41
+ this.metrics.recordAddedObjects(txHashes.length, 'mined');
42
+ return Promise.resolve();
43
+ }
44
+
45
+ public markMinedAsPending(txHashes: TxHash[]): Promise<void> {
46
+ if (txHashes.length === 0) {
47
+ return Promise.resolve();
48
+ }
49
+
50
+ const keys = txHashes.map(x => x.toBigInt());
51
+ let deleted = 0;
52
+ let added = 0;
53
+ for (const key of keys) {
54
+ if (this.minedTxs.delete(key)) {
55
+ deleted++;
56
+ }
57
+
58
+ // only add back to the pending set if we have the tx object
59
+ if (this.txs.has(key)) {
60
+ added++;
61
+ this.pendingTxs.add(key);
62
+ }
63
+ }
64
+
65
+ this.metrics.recordRemovedObjects(deleted, 'mined');
66
+ this.metrics.recordAddedObjects(added, 'pending');
67
+
68
+ return Promise.resolve();
69
+ }
70
+
71
+ public async getPendingTxHashes(): Promise<TxHash[]> {
72
+ const txs = (await this.getAllTxs()).sort(
73
+ (tx1, tx2) => -getPendingTxPriority(tx1).localeCompare(getPendingTxPriority(tx2)),
74
+ );
75
+ const txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
76
+ return txHashes.filter(txHash => this.pendingTxs.has(txHash.toBigInt()));
77
+ }
78
+
79
+ public getMinedTxHashes(): Promise<[TxHash, number][]> {
80
+ return Promise.resolve(
81
+ Array.from(this.minedTxs.entries()).map(([txHash, blockNumber]) => [TxHash.fromBigInt(txHash), blockNumber]),
82
+ );
83
+ }
84
+
85
+ public getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | undefined> {
86
+ const key = txHash.toBigInt();
87
+ if (this.pendingTxs.has(key)) {
88
+ return Promise.resolve('pending');
89
+ }
90
+ if (this.minedTxs.has(key)) {
91
+ return Promise.resolve('mined');
92
+ }
93
+ return Promise.resolve(undefined);
94
+ }
95
+
96
+ /**
97
+ * Checks if a transaction exists in the pool and returns it.
98
+ * @param txHash - The generated tx hash.
99
+ * @returns The transaction, if found, 'undefined' otherwise.
100
+ */
101
+ public getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
102
+ const result = this.txs.get(txHash.toBigInt());
103
+ return Promise.resolve(result === undefined ? undefined : Tx.clone(result));
104
+ }
105
+
106
+ public getArchivedTxByHash(): Promise<Tx | undefined> {
107
+ return Promise.resolve(undefined);
108
+ }
109
+
110
+ /**
111
+ * Adds a list of transactions to the pool. Duplicates are ignored.
112
+ * @param txs - An array of txs to be added to the pool.
113
+ * @returns Empty promise.
114
+ */
115
+ public async addTxs(txs: Tx[]): Promise<void> {
116
+ let pending = 0;
117
+ for (const tx of txs) {
118
+ const txHash = await tx.getTxHash();
119
+ this.log.verbose(`Adding tx ${txHash.toString()} to pool`, {
120
+ eventName: 'tx-added-to-pool',
121
+ ...(await tx.getStats()),
122
+ } satisfies TxAddedToPoolStats);
123
+
124
+ const key = txHash.toBigInt();
125
+ this.txs.set(key, tx);
126
+ if (!this.minedTxs.has(key)) {
127
+ pending++;
128
+ this.metrics.recordSize(tx);
129
+ this.pendingTxs.add(key);
130
+ }
131
+ }
132
+
133
+ this.metrics.recordAddedObjects(pending, 'pending');
134
+ return;
135
+ }
136
+
137
+ /**
138
+ * Deletes transactions from the pool. Tx hashes that are not present are ignored.
139
+ * @param txHashes - An array of tx hashes to be removed from the tx pool.
140
+ * @returns The number of transactions that was deleted from the pool.
141
+ */
142
+ public deleteTxs(txHashes: TxHash[]): Promise<void> {
143
+ let deletedMined = 0;
144
+ let deletedPending = 0;
145
+
146
+ for (const txHash of txHashes) {
147
+ const key = txHash.toBigInt();
148
+ this.txs.delete(key);
149
+ deletedPending += this.pendingTxs.delete(key) ? 1 : 0;
150
+ deletedMined += this.minedTxs.delete(key) ? 1 : 0;
151
+ }
152
+
153
+ this.metrics.recordRemovedObjects(deletedPending, 'pending');
154
+ this.metrics.recordRemovedObjects(deletedMined, 'mined');
155
+
156
+ return Promise.resolve();
157
+ }
158
+
159
+ /**
160
+ * Gets all the transactions stored in the pool.
161
+ * @returns Array of tx objects in the order they were added to the pool.
162
+ */
163
+ public getAllTxs(): Promise<Tx[]> {
164
+ return Promise.resolve(Array.from(this.txs.values()).map(x => Tx.clone(x)));
165
+ }
166
+
167
+ /**
168
+ * Gets the hashes of all transactions currently in the tx pool.
169
+ * @returns An array of transaction hashes found in the tx pool.
170
+ */
171
+ public getAllTxHashes(): Promise<TxHash[]> {
172
+ return Promise.resolve(Array.from(this.txs.keys()).map(x => TxHash.fromBigInt(x)));
173
+ }
174
+ }
@@ -0,0 +1,13 @@
1
+ import { Buffer32 } from '@aztec/foundation/buffer';
2
+ import type { Tx } from '@aztec/stdlib/tx';
3
+
4
+ /**
5
+ * Returns a string representing the priority of a tx.
6
+ * Txs with a higher priority value are returned first when retrieving pending tx hashes.
7
+ * We currently use the sum of the priority fees for the tx for this value, represented as hex.
8
+ */
9
+ export function getPendingTxPriority(tx: Tx): string {
10
+ const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
11
+ const totalFees = priorityFees.feePerDaGas.toBigInt() + priorityFees.feePerL2Gas.toBigInt();
12
+ return Buffer32.fromBigInt(totalFees).toString();
13
+ }