chia-blockchain 2.5.7rc3__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl

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 (528) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_build_chains.py +2 -4
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  7. chia/_tests/clvm/coin_store.py +4 -7
  8. chia/_tests/clvm/test_clvm_step.py +4 -4
  9. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  10. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  11. chia/_tests/clvm/test_singletons.py +2 -4
  12. chia/_tests/clvm/test_spend_sim.py +2 -2
  13. chia/_tests/cmds/cmd_test_utils.py +27 -45
  14. chia/_tests/cmds/test_cmd_framework.py +6 -6
  15. chia/_tests/cmds/test_daemon.py +3 -3
  16. chia/_tests/cmds/test_show.py +4 -4
  17. chia/_tests/cmds/test_tx_config_args.py +1 -2
  18. chia/_tests/cmds/testing_classes.py +4 -5
  19. chia/_tests/cmds/wallet/test_did.py +24 -27
  20. chia/_tests/cmds/wallet/test_nft.py +12 -10
  21. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  22. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  23. chia/_tests/conftest.py +59 -30
  24. chia/_tests/connection_utils.py +2 -2
  25. chia/_tests/core/cmds/test_beta.py +4 -4
  26. chia/_tests/core/cmds/test_keys.py +2 -3
  27. chia/_tests/core/cmds/test_wallet.py +15 -15
  28. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  29. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  30. chia/_tests/core/daemon/test_daemon.py +11 -11
  31. chia/_tests/core/data_layer/conftest.py +2 -2
  32. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  33. chia/_tests/core/data_layer/test_data_store.py +10 -10
  34. chia/_tests/core/data_layer/util.py +11 -11
  35. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  36. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  37. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  38. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  39. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  40. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  41. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  42. chia/_tests/core/full_node/test_conditions.py +21 -23
  43. chia/_tests/core/full_node/test_full_node.py +225 -62
  44. chia/_tests/core/full_node/test_hint_management.py +2 -4
  45. chia/_tests/core/full_node/test_performance.py +0 -1
  46. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  47. chia/_tests/core/full_node/test_transactions.py +1 -2
  48. chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
  49. chia/_tests/core/mempool/test_mempool.py +29 -37
  50. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  51. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  52. chia/_tests/core/mempool/test_mempool_manager.py +963 -839
  53. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  54. chia/_tests/core/server/serve.py +7 -7
  55. chia/_tests/core/server/test_dos.py +1 -2
  56. chia/_tests/core/server/test_event_loop.py +12 -4
  57. chia/_tests/core/server/test_loop.py +7 -8
  58. chia/_tests/core/server/test_rate_limits.py +9 -8
  59. chia/_tests/core/server/test_server.py +61 -1
  60. chia/_tests/core/services/test_services.py +2 -2
  61. chia/_tests/core/ssl/test_ssl.py +2 -2
  62. chia/_tests/core/test_cost_calculation.py +2 -6
  63. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  64. chia/_tests/core/test_filter.py +0 -1
  65. chia/_tests/core/test_full_node_rpc.py +2 -2
  66. chia/_tests/core/test_merkle_set.py +1 -2
  67. chia/_tests/core/test_seeder.py +4 -4
  68. chia/_tests/core/util/test_config.py +4 -4
  69. chia/_tests/core/util/test_jsonify.py +2 -2
  70. chia/_tests/core/util/test_keychain.py +3 -3
  71. chia/_tests/core/util/test_lockfile.py +2 -1
  72. chia/_tests/core/util/test_log_exceptions.py +1 -2
  73. chia/_tests/core/util/test_streamable.py +17 -17
  74. chia/_tests/db/test_db_wrapper.py +3 -2
  75. chia/_tests/environments/wallet.py +14 -14
  76. chia/_tests/ether.py +4 -3
  77. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  78. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  79. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  80. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  81. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  82. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  83. chia/_tests/harvester/test_harvester_api.py +11 -4
  84. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  85. chia/_tests/plot_sync/test_receiver.py +11 -10
  86. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  87. chia/_tests/plot_sync/util.py +1 -2
  88. chia/_tests/plotting/test_plot_manager.py +7 -6
  89. chia/_tests/plotting/test_prover.py +30 -38
  90. chia/_tests/pools/test_pool_cmdline.py +4 -6
  91. chia/_tests/pools/test_pool_rpc.py +203 -61
  92. chia/_tests/pools/test_pool_wallet.py +3 -3
  93. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  94. chia/_tests/process_junit.py +2 -2
  95. chia/_tests/rpc/test_rpc_client.py +4 -4
  96. chia/_tests/rpc/test_rpc_server.py +3 -3
  97. chia/_tests/simulation/test_simulation.py +12 -25
  98. chia/_tests/solver/test_solver_service.py +13 -4
  99. chia/_tests/testconfig.py +2 -2
  100. chia/_tests/timelord/test_new_peak.py +22 -11
  101. chia/_tests/tools/test_run_block.py +0 -2
  102. chia/_tests/tools/test_virtual_project.py +2 -1
  103. chia/_tests/util/benchmarks.py +1 -0
  104. chia/_tests/util/blockchain.py +38 -36
  105. chia/_tests/util/blockchain_mock.py +11 -11
  106. chia/_tests/util/build_network_protocol_files.py +2 -1
  107. chia/_tests/util/coin_store.py +2 -1
  108. chia/_tests/util/config.py +1 -1
  109. chia/_tests/util/db_connection.py +2 -3
  110. chia/_tests/util/full_sync.py +9 -11
  111. chia/_tests/util/gen_ssl_certs.py +4 -5
  112. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  113. chia/_tests/util/misc.py +24 -24
  114. chia/_tests/util/network_protocol_data.py +20 -3
  115. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  116. chia/_tests/util/protocol_messages_json.py +292 -3
  117. chia/_tests/util/setup_nodes.py +62 -47
  118. chia/_tests/util/spend_sim.py +57 -57
  119. chia/_tests/util/test_async_pool.py +2 -3
  120. chia/_tests/util/test_chia_version.py +1 -3
  121. chia/_tests/util/test_config.py +3 -3
  122. chia/_tests/util/test_full_block_utils.py +6 -3
  123. chia/_tests/util/test_limited_semaphore.py +1 -2
  124. chia/_tests/util/test_misc.py +2 -2
  125. chia/_tests/util/test_network.py +1 -2
  126. chia/_tests/util/test_priority_mutex.py +3 -3
  127. chia/_tests/util/test_recursive_replace.py +5 -6
  128. chia/_tests/util/test_replace_str_to_bytes.py +8 -10
  129. chia/_tests/util/test_testnet_overrides.py +3 -3
  130. chia/_tests/util/time_out_assert.py +2 -2
  131. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  132. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  133. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  134. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  135. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  136. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  137. chia/_tests/wallet/conftest.py +6 -6
  138. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  139. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  140. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  141. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  142. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  145. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  146. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  147. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  148. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  149. chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
  150. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  151. chia/_tests/wallet/test_coin_management.py +2 -2
  152. chia/_tests/wallet/test_conditions.py +45 -51
  153. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  154. chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
  155. chia/_tests/wallet/test_notifications.py +14 -14
  156. chia/_tests/wallet/test_signer_protocol.py +5 -5
  157. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  158. chia/_tests/wallet/test_transaction_store.py +20 -20
  159. chia/_tests/wallet/test_util.py +2 -2
  160. chia/_tests/wallet/test_wallet.py +380 -228
  161. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  162. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  163. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  164. chia/_tests/wallet/test_wallet_node.py +14 -14
  165. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  166. chia/_tests/wallet/test_wallet_utils.py +2 -3
  167. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  168. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  169. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  170. chia/_tests/wallet/wallet_block_tools.py +12 -11
  171. chia/_tests/weight_proof/config.py +1 -0
  172. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  173. chia/apis/__init__.py +21 -0
  174. chia/apis/farmer_stub.py +102 -0
  175. chia/apis/full_node_stub.py +372 -0
  176. chia/apis/harvester_stub.py +57 -0
  177. chia/apis/introducer_stub.py +35 -0
  178. chia/apis/solver_stub.py +30 -0
  179. chia/apis/stub_protocol_registry.py +21 -0
  180. chia/apis/timelord_stub.py +39 -0
  181. chia/apis/wallet_stub.py +161 -0
  182. chia/cmds/beta.py +3 -4
  183. chia/cmds/beta_funcs.py +4 -3
  184. chia/cmds/check_wallet_db.py +4 -4
  185. chia/cmds/chia.py +1 -2
  186. chia/cmds/cmd_classes.py +11 -13
  187. chia/cmds/cmd_helpers.py +11 -11
  188. chia/cmds/cmds_util.py +15 -15
  189. chia/cmds/coin_funcs.py +6 -7
  190. chia/cmds/coins.py +2 -3
  191. chia/cmds/configure.py +1 -2
  192. chia/cmds/data.py +42 -42
  193. chia/cmds/data_funcs.py +81 -81
  194. chia/cmds/db.py +4 -5
  195. chia/cmds/db_backup_func.py +2 -2
  196. chia/cmds/db_upgrade_func.py +3 -3
  197. chia/cmds/db_validate_func.py +2 -2
  198. chia/cmds/dev/data.py +4 -4
  199. chia/cmds/dev/gh.py +5 -5
  200. chia/cmds/dev/installers.py +2 -3
  201. chia/cmds/dev/mempool.py +3 -4
  202. chia/cmds/dev/mempool_funcs.py +4 -4
  203. chia/cmds/dev/sim.py +8 -8
  204. chia/cmds/dump_keyring.py +3 -3
  205. chia/cmds/farm.py +6 -8
  206. chia/cmds/farm_funcs.py +25 -24
  207. chia/cmds/init_funcs.py +4 -4
  208. chia/cmds/keys.py +16 -18
  209. chia/cmds/keys_funcs.py +36 -36
  210. chia/cmds/netspace.py +1 -3
  211. chia/cmds/netspace_funcs.py +1 -2
  212. chia/cmds/options.py +3 -2
  213. chia/cmds/param_types.py +17 -16
  214. chia/cmds/passphrase.py +6 -7
  215. chia/cmds/passphrase_funcs.py +11 -13
  216. chia/cmds/peer.py +1 -3
  217. chia/cmds/peer_funcs.py +3 -3
  218. chia/cmds/plotnft.py +6 -7
  219. chia/cmds/plotnft_funcs.py +37 -26
  220. chia/cmds/rpc.py +3 -3
  221. chia/cmds/show.py +3 -5
  222. chia/cmds/show_funcs.py +9 -9
  223. chia/cmds/sim_funcs.py +25 -26
  224. chia/cmds/solver.py +1 -3
  225. chia/cmds/solver_funcs.py +1 -2
  226. chia/cmds/start_funcs.py +2 -2
  227. chia/cmds/wallet.py +76 -81
  228. chia/cmds/wallet_funcs.py +206 -177
  229. chia/consensus/augmented_chain.py +6 -6
  230. chia/consensus/block_body_validation.py +19 -15
  231. chia/consensus/block_creation.py +25 -21
  232. chia/consensus/block_header_validation.py +27 -13
  233. chia/consensus/block_height_map.py +3 -6
  234. chia/consensus/block_height_map_protocol.py +2 -2
  235. chia/consensus/block_record.py +2 -4
  236. chia/consensus/blockchain.py +58 -40
  237. chia/consensus/blockchain_interface.py +7 -7
  238. chia/consensus/coin_store_protocol.py +5 -6
  239. chia/consensus/condition_tools.py +4 -4
  240. chia/consensus/cost_calculator.py +2 -3
  241. chia/consensus/default_constants.py +16 -13
  242. chia/consensus/deficit.py +1 -3
  243. chia/consensus/difficulty_adjustment.py +3 -5
  244. chia/consensus/find_fork_point.py +2 -4
  245. chia/consensus/full_block_to_block_record.py +11 -13
  246. chia/consensus/generator_tools.py +2 -3
  247. chia/consensus/get_block_challenge.py +42 -26
  248. chia/consensus/get_block_generator.py +2 -3
  249. chia/consensus/make_sub_epoch_summary.py +8 -7
  250. chia/consensus/multiprocess_validation.py +31 -20
  251. chia/consensus/pos_quality.py +6 -23
  252. chia/consensus/pot_iterations.py +17 -44
  253. chia/consensus/signage_point.py +4 -5
  254. chia/consensus/vdf_info_computation.py +2 -4
  255. chia/daemon/client.py +8 -8
  256. chia/daemon/keychain_proxy.py +31 -37
  257. chia/daemon/server.py +32 -33
  258. chia/daemon/windows_signal.py +4 -3
  259. chia/data_layer/data_layer.py +86 -77
  260. chia/data_layer/data_layer_rpc_api.py +9 -9
  261. chia/data_layer/data_layer_rpc_client.py +13 -15
  262. chia/data_layer/data_layer_server.py +3 -3
  263. chia/data_layer/data_layer_util.py +14 -14
  264. chia/data_layer/data_layer_wallet.py +94 -101
  265. chia/data_layer/data_store.py +50 -50
  266. chia/data_layer/dl_wallet_store.py +9 -12
  267. chia/data_layer/download_data.py +8 -9
  268. chia/data_layer/s3_plugin_service.py +5 -9
  269. chia/data_layer/start_data_layer.py +5 -5
  270. chia/farmer/farmer.py +31 -31
  271. chia/farmer/farmer_api.py +45 -33
  272. chia/farmer/farmer_rpc_api.py +5 -4
  273. chia/farmer/farmer_rpc_client.py +6 -6
  274. chia/farmer/start_farmer.py +12 -7
  275. chia/full_node/block_store.py +13 -16
  276. chia/full_node/check_fork_next_block.py +1 -2
  277. chia/full_node/coin_store.py +15 -16
  278. chia/full_node/eligible_coin_spends.py +3 -3
  279. chia/full_node/fee_estimate_store.py +2 -3
  280. chia/full_node/fee_tracker.py +1 -2
  281. chia/full_node/full_block_utils.py +4 -4
  282. chia/full_node/full_node.py +238 -224
  283. chia/full_node/full_node_api.py +193 -150
  284. chia/full_node/full_node_rpc_api.py +53 -31
  285. chia/full_node/full_node_rpc_client.py +18 -19
  286. chia/full_node/full_node_store.py +45 -43
  287. chia/full_node/hint_management.py +2 -2
  288. chia/full_node/mempool.py +17 -19
  289. chia/full_node/mempool_manager.py +89 -42
  290. chia/full_node/pending_tx_cache.py +2 -3
  291. chia/full_node/start_full_node.py +5 -5
  292. chia/full_node/sync_store.py +3 -4
  293. chia/full_node/tx_processing_queue.py +34 -13
  294. chia/full_node/weight_proof.py +61 -48
  295. chia/harvester/harvester.py +25 -24
  296. chia/harvester/harvester_api.py +61 -38
  297. chia/harvester/harvester_rpc_api.py +10 -10
  298. chia/harvester/start_harvester.py +4 -4
  299. chia/introducer/introducer.py +3 -3
  300. chia/introducer/introducer_api.py +6 -4
  301. chia/introducer/start_introducer.py +4 -4
  302. chia/legacy/keyring.py +3 -3
  303. chia/plot_sync/delta.py +1 -2
  304. chia/plot_sync/receiver.py +20 -17
  305. chia/plot_sync/sender.py +15 -10
  306. chia/plotters/bladebit.py +7 -7
  307. chia/plotters/chiapos.py +2 -2
  308. chia/plotters/madmax.py +4 -4
  309. chia/plotters/plotters.py +4 -4
  310. chia/plotters/plotters_util.py +3 -3
  311. chia/plotting/cache.py +20 -14
  312. chia/plotting/check_plots.py +26 -35
  313. chia/plotting/create_plots.py +22 -23
  314. chia/plotting/manager.py +21 -14
  315. chia/plotting/prover.py +59 -42
  316. chia/plotting/util.py +16 -16
  317. chia/pools/pool_config.py +2 -1
  318. chia/pools/pool_puzzles.py +11 -12
  319. chia/pools/pool_wallet.py +34 -57
  320. chia/pools/pool_wallet_info.py +39 -10
  321. chia/protocols/farmer_protocol.py +8 -9
  322. chia/protocols/fee_estimate.py +3 -4
  323. chia/protocols/full_node_protocol.py +3 -4
  324. chia/protocols/harvester_protocol.py +27 -15
  325. chia/protocols/outbound_message.py +3 -3
  326. chia/protocols/pool_protocol.py +8 -9
  327. chia/protocols/shared_protocol.py +1 -2
  328. chia/protocols/solver_protocol.py +9 -2
  329. chia/protocols/timelord_protocol.py +4 -7
  330. chia/protocols/wallet_protocol.py +11 -12
  331. chia/rpc/rpc_client.py +9 -9
  332. chia/rpc/rpc_server.py +17 -17
  333. chia/rpc/util.py +2 -2
  334. chia/seeder/crawler.py +8 -8
  335. chia/seeder/crawler_api.py +21 -27
  336. chia/seeder/crawler_rpc_api.py +2 -2
  337. chia/seeder/dns_server.py +21 -21
  338. chia/seeder/start_crawler.py +4 -4
  339. chia/server/address_manager.py +15 -16
  340. chia/server/api_protocol.py +11 -11
  341. chia/server/chia_policy.py +46 -26
  342. chia/server/introducer_peers.py +2 -3
  343. chia/server/node_discovery.py +19 -19
  344. chia/server/rate_limit_numbers.py +4 -5
  345. chia/server/rate_limits.py +4 -4
  346. chia/server/resolve_peer_info.py +4 -4
  347. chia/server/server.py +49 -52
  348. chia/server/signal_handlers.py +6 -6
  349. chia/server/start_service.py +17 -17
  350. chia/server/upnp.py +4 -6
  351. chia/server/ws_connection.py +52 -37
  352. chia/simulator/add_blocks_in_batches.py +1 -3
  353. chia/simulator/block_tools.py +312 -200
  354. chia/simulator/full_node_simulator.py +56 -35
  355. chia/simulator/keyring.py +2 -3
  356. chia/simulator/setup_services.py +16 -15
  357. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  358. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  359. chia/simulator/simulator_protocol.py +1 -2
  360. chia/simulator/simulator_test_tools.py +3 -3
  361. chia/simulator/start_simulator.py +7 -7
  362. chia/simulator/wallet_tools.py +10 -10
  363. chia/solver/solver.py +10 -10
  364. chia/solver/solver_api.py +10 -8
  365. chia/solver/solver_rpc_api.py +2 -2
  366. chia/solver/start_solver.py +4 -4
  367. chia/ssl/cacert.pem +148 -90
  368. chia/ssl/chia_ca.crt +14 -10
  369. chia/ssl/chia_ca_old.crt +19 -0
  370. chia/ssl/create_ssl.py +4 -4
  371. chia/ssl/renewedselfsignedca.conf +4 -0
  372. chia/ssl/ssl_check.py +1 -2
  373. chia/timelord/iters_from_block.py +1 -4
  374. chia/timelord/start_timelord.py +4 -4
  375. chia/timelord/timelord.py +44 -40
  376. chia/timelord/timelord_api.py +6 -4
  377. chia/timelord/timelord_launcher.py +2 -2
  378. chia/timelord/timelord_rpc_api.py +2 -2
  379. chia/timelord/timelord_state.py +11 -12
  380. chia/types/block_protocol.py +1 -3
  381. chia/types/blockchain_format/coin.py +1 -3
  382. chia/types/blockchain_format/program.py +11 -8
  383. chia/types/blockchain_format/proof_of_space.py +123 -76
  384. chia/types/blockchain_format/tree_hash.py +3 -3
  385. chia/types/blockchain_format/vdf.py +1 -2
  386. chia/types/coin_spend.py +3 -3
  387. chia/types/mempool_item.py +5 -5
  388. chia/types/mempool_submission_status.py +2 -3
  389. chia/types/peer_info.py +1 -2
  390. chia/types/unfinished_header_block.py +3 -4
  391. chia/types/validation_state.py +1 -2
  392. chia/util/action_scope.py +8 -8
  393. chia/util/async_pool.py +5 -5
  394. chia/util/bech32m.py +1 -2
  395. chia/util/beta_metrics.py +2 -2
  396. chia/util/block_cache.py +4 -4
  397. chia/util/chia_logging.py +2 -2
  398. chia/util/chia_version.py +1 -2
  399. chia/util/config.py +15 -16
  400. chia/util/db_wrapper.py +26 -27
  401. chia/util/default_root.py +1 -2
  402. chia/util/errors.py +3 -3
  403. chia/util/file_keyring.py +14 -14
  404. chia/util/files.py +2 -3
  405. chia/util/hash.py +4 -4
  406. chia/util/initial-config.yaml +3 -5
  407. chia/util/inline_executor.py +2 -1
  408. chia/util/ip_address.py +1 -2
  409. chia/util/keychain.py +25 -27
  410. chia/util/keyring_wrapper.py +18 -19
  411. chia/util/lock.py +3 -4
  412. chia/util/log_exceptions.py +1 -2
  413. chia/util/lru_cache.py +2 -2
  414. chia/util/network.py +6 -6
  415. chia/util/path.py +2 -3
  416. chia/util/priority_mutex.py +2 -2
  417. chia/util/profiler.py +1 -2
  418. chia/util/safe_cancel_task.py +1 -2
  419. chia/util/streamable.py +22 -8
  420. chia/util/task_referencer.py +1 -1
  421. chia/util/timing.py +3 -3
  422. chia/util/virtual_project_analysis.py +6 -5
  423. chia/util/ws_message.py +2 -2
  424. chia/wallet/cat_wallet/cat_info.py +3 -4
  425. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  426. chia/wallet/cat_wallet/cat_utils.py +3 -4
  427. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  428. chia/wallet/cat_wallet/lineage_store.py +3 -4
  429. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  430. chia/wallet/coin_selection.py +9 -10
  431. chia/wallet/conditions.py +120 -105
  432. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  433. chia/wallet/derivation_record.py +1 -2
  434. chia/wallet/derive_keys.py +2 -4
  435. chia/wallet/did_wallet/did_info.py +10 -11
  436. chia/wallet/did_wallet/did_wallet.py +36 -82
  437. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  438. chia/wallet/driver_protocol.py +5 -7
  439. chia/wallet/lineage_proof.py +4 -4
  440. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  441. chia/wallet/nft_wallet/nft_info.py +8 -9
  442. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  443. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  444. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  445. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  446. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  447. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  448. chia/wallet/notification_manager.py +3 -3
  449. chia/wallet/notification_store.py +44 -61
  450. chia/wallet/outer_puzzles.py +6 -7
  451. chia/wallet/puzzle_drivers.py +34 -6
  452. chia/wallet/puzzles/clawback/drivers.py +6 -6
  453. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  454. chia/wallet/puzzles/load_clvm.py +1 -1
  455. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  456. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  457. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  458. chia/wallet/puzzles/tails.py +3 -3
  459. chia/wallet/singleton.py +5 -7
  460. chia/wallet/singleton_record.py +3 -3
  461. chia/wallet/start_wallet.py +5 -5
  462. chia/wallet/trade_manager.py +37 -58
  463. chia/wallet/trade_record.py +4 -4
  464. chia/wallet/trading/offer.py +59 -46
  465. chia/wallet/trading/trade_store.py +8 -9
  466. chia/wallet/transaction_record.py +8 -8
  467. chia/wallet/uncurried_puzzle.py +1 -2
  468. chia/wallet/util/clvm_streamable.py +12 -12
  469. chia/wallet/util/compute_hints.py +4 -5
  470. chia/wallet/util/curry_and_treehash.py +1 -2
  471. chia/wallet/util/merkle_tree.py +2 -3
  472. chia/wallet/util/peer_request_cache.py +8 -8
  473. chia/wallet/util/signing.py +85 -0
  474. chia/wallet/util/tx_config.py +15 -6
  475. chia/wallet/util/wallet_sync_utils.py +14 -16
  476. chia/wallet/util/wallet_types.py +2 -2
  477. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  478. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  479. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  480. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  481. chia/wallet/vc_wallet/vc_store.py +5 -6
  482. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  483. chia/wallet/wallet.py +50 -78
  484. chia/wallet/wallet_action_scope.py +11 -11
  485. chia/wallet/wallet_blockchain.py +12 -12
  486. chia/wallet/wallet_coin_record.py +12 -6
  487. chia/wallet/wallet_coin_store.py +24 -25
  488. chia/wallet/wallet_interested_store.py +3 -5
  489. chia/wallet/wallet_nft_store.py +10 -11
  490. chia/wallet/wallet_node.py +53 -61
  491. chia/wallet/wallet_node_api.py +5 -3
  492. chia/wallet/wallet_protocol.py +23 -23
  493. chia/wallet/wallet_puzzle_store.py +15 -18
  494. chia/wallet/wallet_request_types.py +778 -114
  495. chia/wallet/wallet_retry_store.py +1 -3
  496. chia/wallet/wallet_rpc_api.py +572 -909
  497. chia/wallet/wallet_rpc_client.py +87 -279
  498. chia/wallet/wallet_singleton_store.py +3 -4
  499. chia/wallet/wallet_state_manager.py +332 -106
  500. chia/wallet/wallet_transaction_store.py +11 -14
  501. chia/wallet/wallet_user_store.py +4 -6
  502. chia/wallet/wallet_weight_proof_handler.py +4 -4
  503. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
  505. chia/apis.py +0 -21
  506. chia/consensus/check_time_locks.py +0 -57
  507. chia/data_layer/puzzles/__init__.py +0 -0
  508. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  509. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  510. chia/types/coin_record.py +0 -44
  511. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  512. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  513. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  514. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  515. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  516. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  517. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  518. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  520. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  521. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  522. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  524. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  525. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  526. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
@@ -1,21 +1,25 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import contextlib
4
5
  import logging
5
6
  import time
6
- from collections.abc import Awaitable, Collection
7
+ from collections.abc import AsyncIterator, Awaitable, Callable, Collection
7
8
  from concurrent.futures import Executor, ThreadPoolExecutor
8
9
  from dataclasses import dataclass, field
9
- from typing import Callable, Optional, TypeVar
10
+ from types import TracebackType
11
+ from typing import TypeVar
10
12
 
11
13
  from chia_rs import (
12
14
  ELIGIBLE_FOR_DEDUP,
13
15
  ELIGIBLE_FOR_FF,
14
16
  MEMPOOL_MODE,
15
17
  BLSCache,
18
+ CoinRecord,
16
19
  ConsensusConstants,
17
20
  SpendBundle,
18
21
  SpendBundleConditions,
22
+ check_time_locks,
19
23
  get_flags_for_height_and_constants,
20
24
  supports_fast_forward,
21
25
  validate_clvm_and_signature,
@@ -23,9 +27,9 @@ from chia_rs import (
23
27
  from chia_rs.sized_bytes import bytes32
24
28
  from chia_rs.sized_ints import uint32, uint64
25
29
  from chiabip158 import PyBIP158
30
+ from typing_extensions import Self
26
31
 
27
32
  from chia.consensus.block_record import BlockRecordProtocol
28
- from chia.consensus.check_time_locks import check_time_locks
29
33
  from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator
30
34
  from chia.full_node.fee_estimation import FeeBlockInfo, MempoolInfo, MempoolItemInfo
31
35
  from chia.full_node.fee_estimator_interface import FeeEstimatorInterface
@@ -33,7 +37,6 @@ from chia.full_node.mempool import MEMPOOL_ITEM_FEE_LIMIT, Mempool, MempoolRemov
33
37
  from chia.full_node.pending_tx_cache import ConflictTxCache, PendingTxCache
34
38
  from chia.types.blockchain_format.coin import Coin
35
39
  from chia.types.clvm_cost import CLVMCost
36
- from chia.types.coin_record import CoinRecord
37
40
  from chia.types.fee_rate import FeeRate
38
41
  from chia.types.generator_types import NewBlockGenerator
39
42
  from chia.types.mempool_inclusion_status import MempoolInclusionStatus
@@ -53,16 +56,16 @@ MEMPOOL_MIN_FEE_INCREASE = uint64(10000000)
53
56
  class TimelockConditions:
54
57
  assert_height: uint32 = uint32(0)
55
58
  assert_seconds: uint64 = uint64(0)
56
- assert_before_height: Optional[uint32] = None
57
- assert_before_seconds: Optional[uint64] = None
59
+ assert_before_height: uint32 | None = None
60
+ assert_before_seconds: uint64 | None = None
58
61
 
59
62
 
60
63
  @dataclass
61
64
  class LineageInfoCache:
62
- _fun: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]]
63
- _cache: dict[bytes32, Optional[UnspentLineageInfo]] = field(default_factory=dict)
65
+ _fun: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]]
66
+ _cache: dict[bytes32, UnspentLineageInfo | None] = field(default_factory=dict)
64
67
 
65
- async def get_unspent_lineage_info(self, puzzle_hash: bytes32) -> Optional[UnspentLineageInfo]:
68
+ async def get_unspent_lineage_info(self, puzzle_hash: bytes32) -> UnspentLineageInfo | None:
66
69
  # we rely on KeyError to distinguish between a stored
67
70
  # None value and a missing entry
68
71
  try:
@@ -125,10 +128,10 @@ def compute_assert_height(
125
128
 
126
129
  @dataclass
127
130
  class SpendBundleAddInfo:
128
- cost: Optional[uint64]
131
+ cost: uint64 | None
129
132
  status: MempoolInclusionStatus
130
133
  removals: list[MempoolRemoveInfo]
131
- error: Optional[Err]
134
+ error: Err | None
132
135
 
133
136
 
134
137
  @dataclass
@@ -233,7 +236,7 @@ def check_removals(
233
236
  bundle_coin_spends: dict[bytes32, BundleCoinSpend],
234
237
  *,
235
238
  get_items_by_coin_ids: Callable[[list[bytes32]], list[MempoolItem]],
236
- ) -> tuple[Optional[Err], list[MempoolItem]]:
239
+ ) -> tuple[Err | None, list[MempoolItem]]:
237
240
  """
238
241
  This function checks for double spends, unknown spends and conflicting transactions in mempool.
239
242
  Returns Error (if any), the set of existing MempoolItems with conflicting spends (if any).
@@ -299,7 +302,7 @@ class MempoolManager:
299
302
  constants: ConsensusConstants
300
303
  seen_bundle_hashes: dict[bytes32, bytes32]
301
304
  get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]]
302
- get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]]
305
+ get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]]
303
306
  nonzero_fee_minimum_fpc: int
304
307
  mempool_max_total_cost: int
305
308
  # a cache of MempoolItems that conflict with existing items in the pool
@@ -307,7 +310,9 @@ class MempoolManager:
307
310
  # cache of MempoolItems with height conditions making them not valid yet
308
311
  _pending_cache: PendingTxCache
309
312
  seen_cache_size: int
310
- peak: Optional[BlockRecordProtocol]
313
+ # the peak is only ever set to a transaction block. We use it to validate
314
+ # timelocks against, so it must have a timestamp.
315
+ peak: BlockRecordProtocol | None
311
316
  mempool: Mempool
312
317
  _worker_queue_size: int
313
318
  max_block_clvm_cost: uint64
@@ -316,11 +321,11 @@ class MempoolManager:
316
321
  def __init__(
317
322
  self,
318
323
  get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
319
- get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
324
+ get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]],
320
325
  consensus_constants: ConsensusConstants,
321
326
  *,
322
327
  single_threaded: bool = False,
323
- max_tx_clvm_cost: Optional[uint64] = None,
328
+ max_tx_clvm_cost: uint64 | None = None,
324
329
  ):
325
330
  self.constants: ConsensusConstants = consensus_constants
326
331
 
@@ -356,7 +361,7 @@ class MempoolManager:
356
361
  self.pool = ThreadPoolExecutor(max_workers=2, thread_name_prefix="mempool-")
357
362
 
358
363
  # The mempool will correspond to a certain peak
359
- self.peak: Optional[BlockRecordProtocol] = None
364
+ self.peak: BlockRecordProtocol | None = None
360
365
  self.fee_estimator: FeeEstimatorInterface = create_bitcoin_fee_estimator(self.max_block_clvm_cost)
361
366
  mempool_info = MempoolInfo(
362
367
  CLVMCost(uint64(self.mempool_max_total_cost)),
@@ -365,11 +370,45 @@ class MempoolManager:
365
370
  )
366
371
  self.mempool: Mempool = Mempool(mempool_info, self.fee_estimator)
367
372
 
373
+ @classmethod
374
+ @contextlib.asynccontextmanager
375
+ async def managed(
376
+ cls,
377
+ get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
378
+ get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]],
379
+ consensus_constants: ConsensusConstants,
380
+ single_threaded: bool = False,
381
+ max_tx_clvm_cost: uint64 | None = None,
382
+ ) -> AsyncIterator[Self]:
383
+ self = cls(
384
+ get_coin_records,
385
+ get_unspent_lineage_info_for_puzzle_hash,
386
+ consensus_constants,
387
+ single_threaded=single_threaded,
388
+ max_tx_clvm_cost=max_tx_clvm_cost,
389
+ )
390
+ try:
391
+ yield self
392
+ finally:
393
+ self.shut_down()
394
+
368
395
  def shut_down(self) -> None:
369
396
  self.pool.shutdown(wait=True)
397
+ self.mempool.close()
398
+
399
+ def __enter__(self) -> Self:
400
+ return self
401
+
402
+ def __exit__(
403
+ self,
404
+ exc_type: type[BaseException] | None,
405
+ exc: BaseException | None,
406
+ traceback: TracebackType | None,
407
+ ) -> None:
408
+ self.shut_down()
370
409
 
371
410
  # TODO: remove this, use create_generator() instead
372
- def create_bundle_from_mempool(self, last_tb_header_hash: bytes32) -> Optional[tuple[SpendBundle, list[Coin]]]:
411
+ def create_bundle_from_mempool(self, last_tb_header_hash: bytes32) -> tuple[SpendBundle, list[Coin]] | None:
373
412
  """
374
413
  Returns aggregated spendbundle that can be used for creating new block,
375
414
  additions and removals in that spend_bundle
@@ -378,7 +417,7 @@ class MempoolManager:
378
417
  return None
379
418
  return self.mempool.create_bundle_from_mempool_items(self.constants, self.peak.height)
380
419
 
381
- def create_block_generator(self, last_tb_header_hash: bytes32, timeout: float) -> Optional[NewBlockGenerator]:
420
+ def create_block_generator(self, last_tb_header_hash: bytes32, timeout: float) -> NewBlockGenerator | None:
382
421
  """
383
422
  Returns a block generator program, the aggregate signature and all additions and removals, for a new block
384
423
  """
@@ -386,7 +425,7 @@ class MempoolManager:
386
425
  return None
387
426
  return self.mempool.create_block_generator(self.constants, self.peak.height, timeout)
388
427
 
389
- def create_block_generator2(self, last_tb_header_hash: bytes32, timeout: float) -> Optional[NewBlockGenerator]:
428
+ def create_block_generator2(self, last_tb_header_hash: bytes32, timeout: float) -> NewBlockGenerator | None:
390
429
  """
391
430
  Returns a block generator program, the aggregate signature and all additions, for a new block
392
431
  """
@@ -435,7 +474,7 @@ class MempoolManager:
435
474
  self.seen_bundle_hashes.pop(bundle_hash)
436
475
 
437
476
  async def pre_validate_spendbundle(
438
- self, spend_bundle: SpendBundle, spend_bundle_id: Optional[bytes32] = None, bls_cache: Optional[BLSCache] = None
477
+ self, spend_bundle: SpendBundle, spend_bundle_id: bytes32 | None = None, bls_cache: BLSCache | None = None
439
478
  ) -> SpendBundleConditions:
440
479
  """
441
480
  Errors are included within the cached_result.
@@ -469,6 +508,12 @@ class MempoolManager:
469
508
  finally:
470
509
  self._worker_queue_size -= 1
471
510
 
511
+ if sbc.num_atoms > sbc.cost * 60_000_000 / self.constants.MAX_BLOCK_COST_CLVM:
512
+ raise ValidationError(Err.INVALID_SPEND_BUNDLE, "too many atoms")
513
+
514
+ if sbc.num_pairs > sbc.cost * 60_000_000 / self.constants.MAX_BLOCK_COST_CLVM:
515
+ raise ValidationError(Err.INVALID_SPEND_BUNDLE, "too many pairs")
516
+
472
517
  if bls_cache is not None:
473
518
  bls_cache.update(new_cache_entries)
474
519
 
@@ -488,10 +533,9 @@ class MempoolManager:
488
533
  conds: SpendBundleConditions,
489
534
  spend_name: bytes32,
490
535
  first_added_height: uint32,
491
- get_coin_records: Optional[Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]]] = None,
492
- get_unspent_lineage_info_for_puzzle_hash: Optional[
493
- Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]]
494
- ] = None,
536
+ get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]] | None = None,
537
+ get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]]
538
+ | None = None,
495
539
  ) -> SpendBundleAddInfo:
496
540
  """
497
541
  Validates and adds to mempool a new_spend with the given
@@ -561,8 +605,8 @@ class MempoolManager:
561
605
  spend_name: bytes32,
562
606
  first_added_height: uint32,
563
607
  get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
564
- get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
565
- ) -> tuple[Optional[Err], Optional[MempoolItem], list[bytes32]]:
608
+ get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]],
609
+ ) -> tuple[Err | None, MempoolItem | None, list[bytes32]]:
566
610
  """
567
611
  Validates new_spend with the given SpendBundleConditions, and
568
612
  spend_name, and the current mempool. The mempool should
@@ -724,12 +768,15 @@ class MempoolManager:
724
768
  # point-of-view of the next block to be farmed. Therefore we pass in the
725
769
  # current peak's height and timestamp
726
770
  assert self.peak.timestamp is not None
727
- tl_error: Optional[Err] = check_time_locks(
771
+ tl_error_rust: int | None = check_time_locks(
728
772
  removal_record_dict,
729
773
  conds,
730
774
  self.peak.height,
731
775
  self.peak.timestamp,
732
776
  )
777
+ tl_error: Err | None = None
778
+ if tl_error_rust is not None:
779
+ tl_error = Err(tl_error_rust)
733
780
 
734
781
  timelocks: TimelockConditions = compute_assert_height(removal_record_dict, conds)
735
782
 
@@ -777,14 +824,14 @@ class MempoolManager:
777
824
 
778
825
  return None, potential, [item.name for item in conflicts]
779
826
 
780
- def get_spendbundle(self, bundle_hash: bytes32) -> Optional[SpendBundle]:
827
+ def get_spendbundle(self, bundle_hash: bytes32) -> SpendBundle | None:
781
828
  """Returns a full SpendBundle if it's inside one the mempools"""
782
- item: Optional[MempoolItem] = self.mempool.get_item_by_id(bundle_hash)
829
+ item: MempoolItem | None = self.mempool.get_item_by_id(bundle_hash)
783
830
  if item is not None:
784
831
  return item.to_spend_bundle()
785
832
  return None
786
833
 
787
- def get_mempool_item(self, bundle_hash: bytes32, include_pending: bool = False) -> Optional[MempoolItem]:
834
+ def get_mempool_item(self, bundle_hash: bytes32, include_pending: bool = False) -> MempoolItem | None:
788
835
  """
789
836
  Returns the MempoolItem in the mempool that matches the provided spend bundle hash (id)
790
837
  or None if not found.
@@ -800,9 +847,7 @@ class MempoolManager:
800
847
 
801
848
  return item
802
849
 
803
- async def new_peak(
804
- self, new_peak: Optional[BlockRecordProtocol], spent_coins: Optional[list[bytes32]]
805
- ) -> NewPeakInfo:
850
+ async def new_peak(self, new_peak: BlockRecordProtocol | None, spent_coins: list[bytes32] | None) -> NewPeakInfo:
806
851
  """
807
852
  Called when a new peak is available, we try to recreate a mempool for the new tip.
808
853
  new_peak should always be the most recent *transaction* block of the chain. Since
@@ -967,6 +1012,8 @@ class MempoolManager:
967
1012
  # Item is most likely included in the block.
968
1013
  included_items.append(MempoolItemInfo(item.cost, item.fee, item.height_added_to_mempool))
969
1014
 
1015
+ old_pool.close()
1016
+
970
1017
  potential_txs = self._pending_cache.drain(new_peak.height)
971
1018
  potential_txs.update(self._conflict_cache.drain())
972
1019
  txs_added = []
@@ -992,8 +1039,8 @@ class MempoolManager:
992
1039
  log.log(logging.WARNING if duration > 1 else logging.INFO, f"new_peak() took {duration:0.2f} seconds")
993
1040
  return NewPeakInfo(txs_added, mempool_item_removals)
994
1041
 
995
- def get_items_not_in_filter(self, mempool_filter: PyBIP158, limit: int = 100) -> list[SpendBundle]:
996
- items: list[SpendBundle] = []
1042
+ def get_items_not_in_filter(self, mempool_filter: PyBIP158, limit: int = 100) -> list[MempoolItem]:
1043
+ items: list[MempoolItem] = []
997
1044
 
998
1045
  assert limit > 0
999
1046
 
@@ -1003,7 +1050,7 @@ class MempoolManager:
1003
1050
  return items
1004
1051
  if mempool_filter.Match(bytearray(item.spend_bundle_name)):
1005
1052
  continue
1006
- items.append(item.to_spend_bundle())
1053
+ items.append(item)
1007
1054
 
1008
1055
  return items
1009
1056
 
@@ -1011,11 +1058,11 @@ class MempoolManager:
1011
1058
  T = TypeVar("T", uint32, uint64)
1012
1059
 
1013
1060
 
1014
- def optional_min(a: Optional[T], b: Optional[T]) -> Optional[T]:
1061
+ def optional_min(a: T | None, b: T | None) -> T | None:
1015
1062
  return min((v for v in [a, b] if v is not None), default=None)
1016
1063
 
1017
1064
 
1018
- def optional_max(a: Optional[T], b: Optional[T]) -> Optional[T]:
1065
+ def optional_max(a: T | None, b: T | None) -> T | None:
1019
1066
  return max((v for v in [a, b] if v is not None), default=None)
1020
1067
 
1021
1068
 
@@ -1029,9 +1076,9 @@ def can_replace(conflicting_items: list[MempoolItem], new_item: MempoolItem) ->
1029
1076
 
1030
1077
  conflicting_fees = 0
1031
1078
  conflicting_cost = 0
1032
- assert_height: Optional[uint32] = None
1033
- assert_before_height: Optional[uint32] = None
1034
- assert_before_seconds: Optional[uint64] = None
1079
+ assert_height: uint32 | None = None
1080
+ assert_before_height: uint32 | None = None
1081
+ assert_before_seconds: uint64 | None = None
1035
1082
  # we don't allow replacing mempool items with new ones that remove
1036
1083
  # eligibility for dedup and fast-forward. Doing so could be abused by
1037
1084
  # denying such spends from operating as intended
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import Optional
5
4
 
6
5
  from chia_rs.sized_bytes import bytes32
7
6
  from chia_rs.sized_ints import uint32
@@ -17,7 +16,7 @@ class ConflictTxCache:
17
16
  _cache_cost: int = field(default=0, init=False)
18
17
  _txs: dict[bytes32, MempoolItem] = field(default_factory=dict, init=False)
19
18
 
20
- def get(self, bundle_name: bytes32) -> Optional[MempoolItem]:
19
+ def get(self, bundle_name: bytes32) -> MempoolItem | None:
21
20
  return self._txs.get(bundle_name, None)
22
21
 
23
22
  def add(self, item: MempoolItem) -> None:
@@ -56,7 +55,7 @@ class PendingTxCache:
56
55
  _txs: dict[bytes32, MempoolItem] = field(default_factory=dict, init=False)
57
56
  _by_height: SortedDict[uint32, dict[bytes32, MempoolItem]] = field(default_factory=SortedDict, init=False)
58
57
 
59
- def get(self, bundle_name: bytes32) -> Optional[MempoolItem]:
58
+ def get(self, bundle_name: bytes32) -> MempoolItem | None:
60
59
  return self._txs.get(bundle_name, None)
61
60
 
62
61
  def add(self, item: MempoolItem) -> None:
@@ -4,12 +4,12 @@ import os
4
4
  import pathlib
5
5
  import sys
6
6
  from multiprocessing import freeze_support
7
- from typing import Any, Optional
7
+ from typing import Any
8
8
 
9
9
  from chia_rs import ConsensusConstants
10
10
  from chia_rs.sized_ints import uint16
11
11
 
12
- from chia.apis import ApiProtocolRegistry
12
+ from chia.apis import StubMetadataRegistry
13
13
  from chia.consensus.constants import replace_str_to_bytes
14
14
  from chia.consensus.default_constants import DEFAULT_CONSTANTS, update_testnet_overrides
15
15
  from chia.full_node.full_node import FullNode
@@ -36,7 +36,7 @@ async def create_full_node_service(
36
36
  config: dict[str, Any],
37
37
  consensus_constants: ConsensusConstants,
38
38
  connect_to_daemon: bool = True,
39
- override_capabilities: Optional[list[tuple[uint16, str]]] = None,
39
+ override_capabilities: list[tuple[uint16, str]] | None = None,
40
40
  ) -> FullNodeService:
41
41
  service_config = config[SERVICE_NAME]
42
42
 
@@ -52,7 +52,7 @@ async def create_full_node_service(
52
52
  )
53
53
  peer_api = FullNodeAPI(node)
54
54
 
55
- rpc_info: Optional[RpcInfo[FullNodeRpcApi]] = None
55
+ rpc_info: RpcInfo[FullNodeRpcApi] | None = None
56
56
  if service_config.get("start_rpc_server", True):
57
57
  rpc_info = (FullNodeRpcApi, service_config["rpc_port"])
58
58
 
@@ -71,7 +71,7 @@ async def create_full_node_service(
71
71
  rpc_info=rpc_info,
72
72
  connect_to_daemon=connect_to_daemon,
73
73
  override_capabilities=override_capabilities,
74
- class_for_type=ApiProtocolRegistry,
74
+ stub_metadata_for_type=StubMetadataRegistry,
75
75
  )
76
76
 
77
77
 
@@ -6,7 +6,6 @@ import logging
6
6
  from collections import OrderedDict
7
7
  from collections import OrderedDict as orderedDict
8
8
  from dataclasses import dataclass, field
9
- from typing import Optional
10
9
 
11
10
  import typing_extensions
12
11
  from chia_rs.sized_bytes import bytes32
@@ -33,7 +32,7 @@ class SyncStore:
33
32
  # peer node id : Peak
34
33
  peer_to_peak: dict[bytes32, Peak] = field(default_factory=dict)
35
34
  # Peak we are syncing towards
36
- target_peak: Optional[Peak] = None
35
+ target_peak: Peak | None = None
37
36
  peers_changed: asyncio.Event = field(default_factory=asyncio.Event)
38
37
  # Set of nodes which we are batch syncing from
39
38
  batch_syncing: set[bytes32] = field(default_factory=set)
@@ -103,7 +102,7 @@ class SyncStore:
103
102
  ret[peer_id] = peak
104
103
  return ret
105
104
 
106
- def get_heaviest_peak(self) -> Optional[Peak]:
105
+ def get_heaviest_peak(self) -> Peak | None:
107
106
  """
108
107
  Returns: the header_hash, height, and weight of the heaviest block that one of our peers has notified
109
108
  us of.
@@ -111,7 +110,7 @@ class SyncStore:
111
110
 
112
111
  if len(self.peer_to_peak) == 0:
113
112
  return None
114
- heaviest_peak: Optional[Peak] = None
113
+ heaviest_peak: Peak | None = None
115
114
  for peak in self.peer_to_peak.values():
116
115
  if peak.header_hash not in self.peak_to_peer:
117
116
  continue
@@ -4,11 +4,12 @@ import asyncio
4
4
  import dataclasses
5
5
  import logging
6
6
  from dataclasses import dataclass, field
7
- from queue import SimpleQueue
8
- from typing import ClassVar, Generic, Optional, TypeVar, Union
7
+ from queue import PriorityQueue, SimpleQueue
8
+ from typing import ClassVar, Generic, TypeVar
9
9
 
10
10
  from chia_rs import SpendBundle
11
11
  from chia_rs.sized_bytes import bytes32
12
+ from chia_rs.sized_ints import uint64
12
13
 
13
14
  from chia.server.ws_connection import WSChiaConnection
14
15
  from chia.types.mempool_inclusion_status import MempoolInclusionStatus
@@ -30,7 +31,7 @@ class ValuedEvent(Generic[T]):
30
31
  _value_sentinel: ClassVar[ValuedEventSentinel] = ValuedEventSentinel()
31
32
 
32
33
  _event: asyncio.Event = dataclasses.field(default_factory=asyncio.Event)
33
- _value: Union[ValuedEventSentinel, T] = _value_sentinel
34
+ _value: ValuedEventSentinel | T = _value_sentinel
34
35
 
35
36
  def set(self, value: T) -> None:
36
37
  if not isinstance(self._value, ValuedEventSentinel):
@@ -45,18 +46,28 @@ class ValuedEvent(Generic[T]):
45
46
  return self._value
46
47
 
47
48
 
48
- @dataclass(frozen=True)
49
+ @dataclasses.dataclass(frozen=True)
50
+ class PeerWithTx:
51
+ peer_host: str
52
+ advertised_fee: uint64
53
+ advertised_cost: uint64
54
+
55
+
56
+ @dataclass(frozen=True, order=True)
49
57
  class TransactionQueueEntry:
50
58
  """
51
59
  A transaction received from peer. This is put into a queue, and not yet in the mempool.
52
60
  """
53
61
 
54
62
  transaction: SpendBundle = field(compare=False)
55
- transaction_bytes: Optional[bytes] = field(compare=False)
63
+ transaction_bytes: bytes | None = field(compare=False)
56
64
  spend_name: bytes32
57
- peer: Optional[WSChiaConnection] = field(compare=False)
65
+ peer: WSChiaConnection | None = field(compare=False)
58
66
  test: bool = field(compare=False)
59
- done: ValuedEvent[tuple[MempoolInclusionStatus, Optional[Err]]] = field(
67
+ # IDs of peers that advertised this transaction via new_transaction, along
68
+ # with their hostname, fee and cost.
69
+ peers_with_tx: dict[bytes32, PeerWithTx] = field(default_factory=dict, compare=False)
70
+ done: ValuedEvent[tuple[MempoolInclusionStatus, Err | None]] = field(
60
71
  default_factory=ValuedEvent,
61
72
  compare=False,
62
73
  )
@@ -74,7 +85,7 @@ class TransactionQueue:
74
85
  _list_cursor: int # this is which index
75
86
  _queue_length: asyncio.Semaphore
76
87
  _index_to_peer_map: list[bytes32]
77
- _queue_dict: dict[bytes32, SimpleQueue[TransactionQueueEntry]]
88
+ _queue_dict: dict[bytes32, PriorityQueue[tuple[float, TransactionQueueEntry]]]
78
89
  _high_priority_queue: SimpleQueue[TransactionQueueEntry]
79
90
  peer_size_limit: int
80
91
  log: logging.Logger
@@ -88,15 +99,25 @@ class TransactionQueue:
88
99
  self.peer_size_limit = peer_size_limit
89
100
  self.log = log
90
101
 
91
- async def put(self, tx: TransactionQueueEntry, peer_id: Optional[bytes32], high_priority: bool = False) -> None:
102
+ def put(self, tx: TransactionQueueEntry, peer_id: bytes32 | None, high_priority: bool = False) -> None:
92
103
  if peer_id is None or high_priority: # when it's local there is no peer_id.
93
104
  self._high_priority_queue.put(tx)
94
105
  else:
95
106
  if peer_id not in self._queue_dict:
96
- self._queue_dict[peer_id] = SimpleQueue()
107
+ self._queue_dict[peer_id] = PriorityQueue()
97
108
  self._index_to_peer_map.append(peer_id)
98
109
  if self._queue_dict[peer_id].qsize() < self.peer_size_limit:
99
- self._queue_dict[peer_id].put(tx)
110
+ tx_info = tx.peers_with_tx.get(peer_id)
111
+ if tx_info is not None and tx_info.advertised_cost > 0:
112
+ fpc = tx_info.advertised_fee / tx_info.advertised_cost
113
+ # PriorityQueue returns lowest first so we invert
114
+ priority = -fpc
115
+ else:
116
+ # This peer didn't advertise cost and fee information for
117
+ # this transaction (it sent a `RespondTransaction` message
118
+ # instead of a `NewTransaction` one).
119
+ priority = float("inf")
120
+ self._queue_dict[peer_id].put((priority, tx))
100
121
  else:
101
122
  self.log.warning(f"Transaction queue full for peer {peer_id}")
102
123
  raise TransactionQueueFull(f"Transaction queue full for peer {peer_id}")
@@ -106,11 +127,11 @@ class TransactionQueue:
106
127
  await self._queue_length.acquire()
107
128
  if not self._high_priority_queue.empty():
108
129
  return self._high_priority_queue.get()
109
- result: Optional[TransactionQueueEntry] = None
130
+ result: TransactionQueueEntry | None = None
110
131
  while True:
111
132
  peer_queue = self._queue_dict[self._index_to_peer_map[self._list_cursor]]
112
133
  if not peer_queue.empty():
113
- result = peer_queue.get()
134
+ _, result = peer_queue.get()
114
135
  self._list_cursor += 1
115
136
  if self._list_cursor > len(self._index_to_peer_map) - 1:
116
137
  # reset iterator