@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,169 @@
1
+ import { unfreeze } from '@aztec/foundation/types';
2
+ import { GasFees } from '@aztec/stdlib/gas';
3
+ import { mockTx } from '@aztec/stdlib/testing';
4
+ /**
5
+ * Tests a TxPool implementation.
6
+ * @param getTxPool - Gets a fresh TxPool
7
+ */ export function describeTxPool(getTxPool) {
8
+ let pool;
9
+ beforeEach(()=>{
10
+ pool = getTxPool();
11
+ });
12
+ it('Adds txs to the pool as pending', async ()=>{
13
+ const tx1 = await mockTx();
14
+ await pool.addTxs([
15
+ tx1
16
+ ]);
17
+ const poolTx = await pool.getTxByHash(await tx1.getTxHash());
18
+ expect(await poolTx.getTxHash()).toEqual(await tx1.getTxHash());
19
+ await expect(pool.getTxStatus(await tx1.getTxHash())).resolves.toEqual('pending');
20
+ await expect(pool.getPendingTxHashes()).resolves.toEqual([
21
+ await tx1.getTxHash()
22
+ ]);
23
+ });
24
+ it('Removes txs from the pool', async ()=>{
25
+ const tx1 = await mockTx();
26
+ await pool.addTxs([
27
+ tx1
28
+ ]);
29
+ await pool.deleteTxs([
30
+ await tx1.getTxHash()
31
+ ]);
32
+ await expect(pool.getTxByHash(await tx1.getTxHash())).resolves.toBeFalsy();
33
+ await expect(pool.getTxStatus(await tx1.getTxHash())).resolves.toBeUndefined();
34
+ });
35
+ it('Marks txs as mined', async ()=>{
36
+ const tx1 = await mockTx(1);
37
+ const tx2 = await mockTx(2);
38
+ await pool.addTxs([
39
+ tx1,
40
+ tx2
41
+ ]);
42
+ await pool.markAsMined([
43
+ await tx1.getTxHash()
44
+ ], 1);
45
+ await expect(pool.getTxByHash(await tx1.getTxHash())).resolves.toEqual(tx1);
46
+ await expect(pool.getTxStatus(await tx1.getTxHash())).resolves.toEqual('mined');
47
+ await expect(pool.getMinedTxHashes()).resolves.toEqual([
48
+ [
49
+ await tx1.getTxHash(),
50
+ 1
51
+ ]
52
+ ]);
53
+ await expect(pool.getPendingTxHashes()).resolves.toEqual([
54
+ await tx2.getTxHash()
55
+ ]);
56
+ });
57
+ it('Marks txs as pending after being mined', async ()=>{
58
+ const tx1 = await mockTx(1);
59
+ const tx2 = await mockTx(2);
60
+ await pool.addTxs([
61
+ tx1,
62
+ tx2
63
+ ]);
64
+ await pool.markAsMined([
65
+ await tx1.getTxHash()
66
+ ], 1);
67
+ await pool.markMinedAsPending([
68
+ await tx1.getTxHash()
69
+ ]);
70
+ await expect(pool.getMinedTxHashes()).resolves.toEqual([]);
71
+ const pending = await pool.getPendingTxHashes();
72
+ expect(pending).toHaveLength(2);
73
+ expect(pending).toEqual(expect.arrayContaining([
74
+ await tx1.getTxHash(),
75
+ await tx2.getTxHash()
76
+ ]));
77
+ });
78
+ it('Only marks txs as pending if they are known', async ()=>{
79
+ const tx1 = await mockTx(1);
80
+ // simulate a situation where not all peers have all the txs
81
+ const tx2 = await mockTx(2);
82
+ const someTxHashThatThisPeerDidNotSee = await tx2.getTxHash();
83
+ await pool.addTxs([
84
+ tx1
85
+ ]);
86
+ // this peer knows that tx2 was mined, but it does not have the tx object
87
+ await pool.markAsMined([
88
+ await tx1.getTxHash(),
89
+ someTxHashThatThisPeerDidNotSee
90
+ ], 1);
91
+ expect(await pool.getMinedTxHashes()).toEqual(expect.arrayContaining([
92
+ [
93
+ await tx1.getTxHash(),
94
+ 1
95
+ ],
96
+ [
97
+ someTxHashThatThisPeerDidNotSee,
98
+ 1
99
+ ]
100
+ ]));
101
+ // reorg: both txs should now become available again
102
+ await pool.markMinedAsPending([
103
+ await tx1.getTxHash(),
104
+ someTxHashThatThisPeerDidNotSee
105
+ ]);
106
+ await expect(pool.getMinedTxHashes()).resolves.toEqual([]);
107
+ await expect(pool.getPendingTxHashes()).resolves.toEqual([
108
+ await tx1.getTxHash()
109
+ ]); // tx2 is not in the pool
110
+ });
111
+ it('Returns all transactions in the pool', async ()=>{
112
+ const tx1 = await mockTx(1);
113
+ const tx2 = await mockTx(2);
114
+ const tx3 = await mockTx(3);
115
+ await pool.addTxs([
116
+ tx1,
117
+ tx2,
118
+ tx3
119
+ ]);
120
+ const poolTxs = await pool.getAllTxs();
121
+ expect(poolTxs).toHaveLength(3);
122
+ expect(poolTxs).toEqual(expect.arrayContaining([
123
+ tx1,
124
+ tx2,
125
+ tx3
126
+ ]));
127
+ });
128
+ it('Returns all txHashes in the pool', async ()=>{
129
+ const tx1 = await mockTx(1);
130
+ const tx2 = await mockTx(2);
131
+ const tx3 = await mockTx(3);
132
+ await pool.addTxs([
133
+ tx1,
134
+ tx2,
135
+ tx3
136
+ ]);
137
+ const poolTxHashes = await pool.getAllTxHashes();
138
+ expect(poolTxHashes).toHaveLength(3);
139
+ expect(poolTxHashes).toEqual(expect.arrayContaining([
140
+ await tx1.getTxHash(),
141
+ await tx2.getTxHash(),
142
+ await tx3.getTxHash()
143
+ ]));
144
+ });
145
+ it('Returns pending tx hashes sorted by priority', async ()=>{
146
+ const withPriorityFee = (tx, fee)=>{
147
+ unfreeze(tx.data.constants.txContext.gasSettings).maxPriorityFeesPerGas = new GasFees(fee, fee);
148
+ return tx;
149
+ };
150
+ const tx1 = withPriorityFee(await mockTx(0), 1000);
151
+ const tx2 = withPriorityFee(await mockTx(1), 100);
152
+ const tx3 = withPriorityFee(await mockTx(2), 200);
153
+ const tx4 = withPriorityFee(await mockTx(3), 3000);
154
+ await pool.addTxs([
155
+ tx1,
156
+ tx2,
157
+ tx3,
158
+ tx4
159
+ ]);
160
+ const poolTxHashes = await pool.getPendingTxHashes();
161
+ expect(poolTxHashes).toHaveLength(4);
162
+ expect(poolTxHashes).toEqual(await Promise.all([
163
+ tx4,
164
+ tx1,
165
+ tx3,
166
+ tx2
167
+ ].map((tx)=>tx.getTxHash())));
168
+ });
169
+ }
@@ -0,0 +1,8 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { type BlockAttestation, type P2PValidator, PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+ export declare class AttestationValidator implements P2PValidator<BlockAttestation> {
4
+ private epochCache;
5
+ constructor(epochCache: EpochCacheInterface);
6
+ validate(message: BlockAttestation): Promise<PeerErrorSeverity | undefined>;
7
+ }
8
+ //# sourceMappingURL=attestation_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEhG,qBAAa,oBAAqB,YAAW,YAAY,CAAC,gBAAgB,CAAC;IACzE,OAAO,CAAC,UAAU,CAAsB;gBAE5B,UAAU,EAAE,mBAAmB;IAIrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;CAelF"}
@@ -0,0 +1,19 @@
1
+ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
2
+ export class AttestationValidator {
3
+ epochCache;
4
+ constructor(epochCache){
5
+ this.epochCache = epochCache;
6
+ }
7
+ async validate(message) {
8
+ const { currentSlot, nextSlot } = await this.epochCache.getProposerInCurrentOrNextSlot();
9
+ const slotNumberBigInt = message.payload.header.globalVariables.slotNumber.toBigInt();
10
+ if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
11
+ return PeerErrorSeverity.HighToleranceError;
12
+ }
13
+ const attester = await message.getSender();
14
+ if (!await this.epochCache.isInCommittee(attester)) {
15
+ return PeerErrorSeverity.HighToleranceError;
16
+ }
17
+ return undefined;
18
+ }
19
+ }
@@ -0,0 +1,2 @@
1
+ export * from './attestation_validator.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './attestation_validator.js';
@@ -0,0 +1,8 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { type BlockProposal, type P2PValidator, PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+ export declare class BlockProposalValidator implements P2PValidator<BlockProposal> {
4
+ private epochCache;
5
+ constructor(epochCache: EpochCacheInterface);
6
+ validate(block: BlockProposal): Promise<PeerErrorSeverity | undefined>;
7
+ }
8
+ //# sourceMappingURL=block_proposal_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/block_proposal_validator/block_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE7F,qBAAa,sBAAuB,YAAW,YAAY,CAAC,aAAa,CAAC;IACxE,OAAO,CAAC,UAAU,CAAsB;gBAE5B,UAAU,EAAE,mBAAmB;IAIrC,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;CAkB7E"}
@@ -0,0 +1,21 @@
1
+ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
2
+ export class BlockProposalValidator {
3
+ epochCache;
4
+ constructor(epochCache){
5
+ this.epochCache = epochCache;
6
+ }
7
+ async validate(block) {
8
+ const { currentProposer, nextProposer, currentSlot, nextSlot } = await this.epochCache.getProposerInCurrentOrNextSlot();
9
+ // Check that the attestation is for the current or next slot
10
+ const slotNumberBigInt = block.payload.header.globalVariables.slotNumber.toBigInt();
11
+ if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
12
+ return PeerErrorSeverity.HighToleranceError;
13
+ }
14
+ // Check that the block proposal is from the current or next proposer
15
+ const proposer = await block.getSender();
16
+ if (!proposer.equals(currentProposer) && !proposer.equals(nextProposer)) {
17
+ return PeerErrorSeverity.HighToleranceError;
18
+ }
19
+ return undefined;
20
+ }
21
+ }
@@ -0,0 +1,2 @@
1
+ export * from './block_proposal_validator.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/block_proposal_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './block_proposal_validator.js';
@@ -0,0 +1,4 @@
1
+ export * from './tx_validator/index.js';
2
+ export * from './block_proposal_validator/index.js';
3
+ export * from './attestation_validator/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/msg_validators/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './tx_validator/index.js';
2
+ export * from './block_proposal_validator/index.js';
3
+ export * from './attestation_validator/index.js';
@@ -0,0 +1,7 @@
1
+ import type { ProcessedTx, Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
2
+ export declare class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
3
+ #private;
4
+ constructor(...validators: TxValidator<T>[]);
5
+ validateTx(tx: T): Promise<TxValidationResult>;
6
+ }
7
+ //# sourceMappingURL=aggregate_tx_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEzF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAEzE,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;IAQrC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAmBrD"}
@@ -0,0 +1,31 @@
1
+ export class AggregateTxValidator {
2
+ #validators;
3
+ constructor(...validators){
4
+ if (validators.length === 0) {
5
+ throw new Error('At least one validator must be provided');
6
+ }
7
+ this.#validators = validators;
8
+ }
9
+ async validateTx(tx) {
10
+ const aggregate = {
11
+ result: 'valid',
12
+ reason: []
13
+ };
14
+ for (const validator of this.#validators){
15
+ const result = await validator.validateTx(tx);
16
+ if (result.result === 'invalid') {
17
+ aggregate.result = 'invalid';
18
+ aggregate.reason.push(...result.reason);
19
+ } else if (result.result === 'skipped') {
20
+ if (aggregate.result === 'valid') {
21
+ aggregate.result = 'skipped';
22
+ }
23
+ aggregate.reason.push(...result.reason);
24
+ }
25
+ }
26
+ if (aggregate.result === 'valid') {
27
+ delete aggregate.reason;
28
+ }
29
+ return aggregate;
30
+ }
31
+ }
@@ -0,0 +1,11 @@
1
+ import type { Fr } from '@aztec/foundation/fields';
2
+ import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
+ export interface ArchiveSource {
4
+ getArchiveIndices: (archives: Fr[]) => Promise<(bigint | undefined)[]>;
5
+ }
6
+ export declare class BlockHeaderTxValidator<T extends AnyTx> implements TxValidator<T> {
7
+ #private;
8
+ constructor(archiveSource: ArchiveSource);
9
+ validateTx(tx: T): Promise<TxValidationResult>;
10
+ }
11
+ //# sourceMappingURL=block_header_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_header_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/block_header_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE7F,MAAM,WAAW,aAAa;IAC5B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;CACxE;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAIhE,aAAa,EAAE,aAAa;IAIlC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAQrD"}
@@ -0,0 +1,26 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { Tx } from '@aztec/stdlib/tx';
3
+ export class BlockHeaderTxValidator {
4
+ #log = createLogger('p2p:tx_validator:tx_block_header');
5
+ #archiveSource;
6
+ constructor(archiveSource){
7
+ this.#archiveSource = archiveSource;
8
+ }
9
+ async validateTx(tx) {
10
+ const [index] = await this.#archiveSource.getArchiveIndices([
11
+ await tx.data.constants.historicalHeader.hash()
12
+ ]);
13
+ if (index === undefined) {
14
+ this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for referencing an unknown block header`);
15
+ return {
16
+ result: 'invalid',
17
+ reason: [
18
+ 'Block header not found'
19
+ ]
20
+ };
21
+ }
22
+ return {
23
+ result: 'valid'
24
+ };
25
+ }
26
+ }
@@ -0,0 +1,6 @@
1
+ import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
2
+ export declare class DataTxValidator implements TxValidator<Tx> {
3
+ #private;
4
+ validateTx(tx: Tx): Promise<TxValidationResult>;
5
+ }
6
+ //# sourceMappingURL=data_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/data_validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEjF,qBAAa,eAAgB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG/C,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAkGtD"}
@@ -0,0 +1,107 @@
1
+ import { MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
2
+ import { createLogger } from '@aztec/foundation/log';
3
+ import { Tx } from '@aztec/stdlib/tx';
4
+ export class DataTxValidator {
5
+ #log = createLogger('p2p:tx_validator:tx_data');
6
+ async validateTx(tx) {
7
+ const execRequestRes = this.#hasCorrectExecutionRequests(tx);
8
+ // Note: If we ever skip txs here, must change this return statement to account for them.
9
+ return (await execRequestRes).result === 'invalid' ? execRequestRes : this.#hasCorrectContractClassLogs(tx);
10
+ }
11
+ async #hasCorrectExecutionRequests(tx) {
12
+ const callRequests = [
13
+ ...tx.data.getRevertiblePublicCallRequests(),
14
+ ...tx.data.getNonRevertiblePublicCallRequests()
15
+ ];
16
+ if (callRequests.length !== tx.enqueuedPublicFunctionCalls.length) {
17
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatch number of execution requests for public calls. Expected ${callRequests.length}. Got ${tx.enqueuedPublicFunctionCalls.length}.`);
18
+ return {
19
+ result: 'invalid',
20
+ reason: [
21
+ 'Wrong number of execution requests for public calls'
22
+ ]
23
+ };
24
+ }
25
+ if (tx.getTotalPublicArgsCount() > MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS) {
26
+ this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because the total length of args to public enqueued calls is greater than ${MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS}`);
27
+ return {
28
+ result: 'invalid',
29
+ reason: [
30
+ 'Too many args in total to enqueued public calls'
31
+ ]
32
+ };
33
+ }
34
+ const invalidExecutionRequestIndex = (await Promise.all(tx.enqueuedPublicFunctionCalls.map(async (execRequest, i)=>!await execRequest.isForCallRequest(callRequests[i])))).findIndex(Boolean);
35
+ if (invalidExecutionRequestIndex !== -1) {
36
+ this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect execution requests for public call at index ${invalidExecutionRequestIndex}.`);
37
+ return {
38
+ result: 'invalid',
39
+ reason: [
40
+ 'Incorrect execution request for public call'
41
+ ]
42
+ };
43
+ }
44
+ const teardownCallRequest = tx.data.getTeardownPublicCallRequest();
45
+ const isInvalidTeardownExecutionRequest = !teardownCallRequest && !tx.publicTeardownFunctionCall.isEmpty() || teardownCallRequest && !await tx.publicTeardownFunctionCall.isForCallRequest(teardownCallRequest);
46
+ if (isInvalidTeardownExecutionRequest) {
47
+ this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect teardown execution requests.`);
48
+ return {
49
+ result: 'invalid',
50
+ reason: [
51
+ 'Incorrect teardown execution request'
52
+ ]
53
+ };
54
+ }
55
+ return {
56
+ result: 'valid'
57
+ };
58
+ }
59
+ async #hasCorrectContractClassLogs(tx) {
60
+ const contractClassLogsHashes = tx.data.getNonEmptyContractClassLogsHashes();
61
+ const hashedContractClasslogs = await Promise.all(tx.contractClassLogs.map((l)=>l.hash()));
62
+ if (contractClassLogsHashes.length !== hashedContractClasslogs.length) {
63
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatched number of contract class logs. Expected ${contractClassLogsHashes.length}. Got ${hashedContractClasslogs.length}.`);
64
+ return {
65
+ result: 'invalid',
66
+ reason: [
67
+ 'Mismatched number of contract class logs'
68
+ ]
69
+ };
70
+ }
71
+ for (const [i, logHash] of contractClassLogsHashes.entries()){
72
+ const hashedLog = hashedContractClasslogs[i];
73
+ if (!logHash.value.equals(hashedLog)) {
74
+ if (hashedContractClasslogs.some((l)=>logHash.value.equals(l))) {
75
+ const matchingLogIndex = hashedContractClasslogs.findIndex((l)=>logHash.value.equals(l));
76
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs indices. Expected ${i} from the kernel's log hashes. Got ${matchingLogIndex} in the tx.`);
77
+ return {
78
+ result: 'invalid',
79
+ reason: [
80
+ 'Incorrectly sorted contract class logs'
81
+ ]
82
+ };
83
+ } else {
84
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs. Expected hash ${logHash.value} from the kernels. Got ${hashedLog} in the tx.`);
85
+ return {
86
+ result: 'invalid',
87
+ reason: [
88
+ 'Mismatched contract class logs'
89
+ ]
90
+ };
91
+ }
92
+ }
93
+ if (logHash.logHash.length !== tx.contractClassLogs[i].getEmittedLength()) {
94
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs length. Expected ${logHash.logHash.length} from the kernel's log hashes. Got ${tx.contractClassLogs[i].getEmittedLength()} in the tx.`);
95
+ return {
96
+ result: 'invalid',
97
+ reason: [
98
+ 'Mismatched contract class logs length'
99
+ ]
100
+ };
101
+ }
102
+ }
103
+ return {
104
+ result: 'valid'
105
+ };
106
+ }
107
+ }
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
4
+ export interface NullifierSource {
5
+ nullifiersExist: (nullifiers: Buffer[]) => Promise<boolean[]>;
6
+ }
7
+ export declare class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
8
+ #private;
9
+ constructor(nullifierSource: NullifierSource);
10
+ validateTx(tx: T): Promise<TxValidationResult>;
11
+ }
12
+ //# sourceMappingURL=double_spend_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/double_spend_validator.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAkB,MAAM,kBAAkB,CAAC;AAE7G,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC/D;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAIhE,eAAe,EAAE,eAAe;IAItC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsBrD"}
@@ -0,0 +1,41 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { Tx, hasPublicCalls } from '@aztec/stdlib/tx';
3
+ export class DoubleSpendTxValidator {
4
+ #log = createLogger('p2p:tx_validator:tx_double_spend');
5
+ #nullifierSource;
6
+ constructor(nullifierSource){
7
+ this.#nullifierSource = nullifierSource;
8
+ }
9
+ async validateTx(tx) {
10
+ // Don't need to check for duplicate nullifiers if the tx has public calls
11
+ // because the AVM will perform merkle insertions as it goes and will fail on
12
+ // duplicate nullifier. In fact we CANNOT check here because the nullifiers
13
+ // have already been inserted, and so they will exist in nullifierSource.
14
+ if (!hasPublicCalls(tx)) {
15
+ const nullifiers = tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers;
16
+ // Ditch this tx if it has repeated nullifiers
17
+ const uniqueNullifiers = new Set(nullifiers);
18
+ if (uniqueNullifiers.size !== nullifiers.length) {
19
+ this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for emitting duplicate nullifiers`);
20
+ return {
21
+ result: 'invalid',
22
+ reason: [
23
+ 'Duplicate nullifier in tx'
24
+ ]
25
+ };
26
+ }
27
+ if ((await this.#nullifierSource.nullifiersExist(nullifiers.map((n)=>n.toBuffer()))).some(Boolean)) {
28
+ this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for repeating a nullifier`);
29
+ return {
30
+ result: 'invalid',
31
+ reason: [
32
+ 'Existing nullifier'
33
+ ]
34
+ };
35
+ }
36
+ }
37
+ return {
38
+ result: 'valid'
39
+ };
40
+ }
41
+ }
@@ -0,0 +1,7 @@
1
+ export * from './aggregate_tx_validator.js';
2
+ export * from './data_validator.js';
3
+ export * from './double_spend_validator.js';
4
+ export * from './metadata_validator.js';
5
+ export * from './tx_proof_validator.js';
6
+ export * from './block_header_validator.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './aggregate_tx_validator.js';
2
+ export * from './data_validator.js';
3
+ export * from './double_spend_validator.js';
4
+ export * from './metadata_validator.js';
5
+ export * from './tx_proof_validator.js';
6
+ export * from './block_header_validator.js';
@@ -0,0 +1,10 @@
1
+ import type { Fr } from '@aztec/foundation/fields';
2
+ import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
+ export declare class MetadataTxValidator<T extends AnyTx> implements TxValidator<T> {
4
+ #private;
5
+ private chainId;
6
+ private blockNumber;
7
+ constructor(chainId: Fr, blockNumber: Fr);
8
+ validateTx(tx: T): Promise<TxValidationResult>;
9
+ }
10
+ //# sourceMappingURL=metadata_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE7F,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAG7D,OAAO,CAAC,OAAO;IAAM,OAAO,CAAC,WAAW;gBAAhC,OAAO,EAAE,EAAE,EAAU,WAAW,EAAE,EAAE;IAElD,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsCrD"}
@@ -0,0 +1,44 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { Tx } from '@aztec/stdlib/tx';
3
+ export class MetadataTxValidator {
4
+ chainId;
5
+ blockNumber;
6
+ #log;
7
+ constructor(chainId, blockNumber){
8
+ this.chainId = chainId;
9
+ this.blockNumber = blockNumber;
10
+ this.#log = createLogger('p2p:tx_validator:tx_metadata');
11
+ }
12
+ async validateTx(tx) {
13
+ const errors = [];
14
+ if (!await this.#hasCorrectChainId(tx)) {
15
+ errors.push('Incorrect chain id');
16
+ }
17
+ if (!await this.#isValidForBlockNumber(tx)) {
18
+ errors.push('Invalid block number');
19
+ }
20
+ return errors.length > 0 ? {
21
+ result: 'invalid',
22
+ reason: errors
23
+ } : {
24
+ result: 'valid'
25
+ };
26
+ }
27
+ async #hasCorrectChainId(tx) {
28
+ if (!tx.data.constants.txContext.chainId.equals(this.chainId)) {
29
+ this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect chain ${tx.data.constants.txContext.chainId.toNumber()} != ${this.chainId.toNumber()}`);
30
+ return false;
31
+ } else {
32
+ return true;
33
+ }
34
+ }
35
+ async #isValidForBlockNumber(tx) {
36
+ const maxBlockNumber = tx.data.rollupValidationRequests.maxBlockNumber;
37
+ if (maxBlockNumber.isSome && maxBlockNumber.value < this.blockNumber) {
38
+ this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for low max block number. Tx max block number: ${maxBlockNumber.value}, current block number: ${this.blockNumber}.`);
39
+ return false;
40
+ } else {
41
+ return true;
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,9 @@
1
+ import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server';
2
+ import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
+ export declare class TxProofValidator implements TxValidator<Tx> {
4
+ #private;
5
+ private verifier;
6
+ constructor(verifier: ClientProtocolCircuitVerifier);
7
+ validateTx(tx: Tx): Promise<TxValidationResult>;
8
+ }
9
+ //# sourceMappingURL=tx_proof_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx_proof_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/tx_proof_validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,EAAE,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEjF,qBAAa,gBAAiB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG1C,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,6BAA6B;IAErD,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAQtD"}