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
@@ -2,14 +2,17 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import logging
5
+ import math
5
6
  import random
6
- from dataclasses import dataclass
7
- from typing import Optional, cast
7
+ from dataclasses import dataclass, field
8
+ from typing import cast
8
9
 
9
10
  import pytest
11
+ from chia_rs import G2Element, SpendBundle
10
12
  from chia_rs.sized_bytes import bytes32
13
+ from chia_rs.sized_ints import uint64
11
14
 
12
- from chia.full_node.tx_processing_queue import TransactionQueue, TransactionQueueEntry, TransactionQueueFull
15
+ from chia.full_node.tx_processing_queue import PeerWithTx, TransactionQueue, TransactionQueueEntry, TransactionQueueFull
13
16
  from chia.util.task_referencer import create_referenced_task
14
17
 
15
18
  log = logging.getLogger(__name__)
@@ -17,12 +20,17 @@ log = logging.getLogger(__name__)
17
20
 
18
21
  @dataclass(frozen=True)
19
22
  class FakeTransactionQueueEntry:
20
- index: int
21
- peer_id: Optional[bytes32]
23
+ index: int = field(compare=False)
24
+ peer_id: bytes32 | None = field(compare=False)
25
+ peers_with_tx: dict[bytes32, PeerWithTx] | None = field(compare=False)
22
26
 
23
27
 
24
- def get_transaction_queue_entry(peer_id: Optional[bytes32], tx_index: int) -> TransactionQueueEntry: # easy shortcut
25
- return cast(TransactionQueueEntry, FakeTransactionQueueEntry(index=tx_index, peer_id=peer_id))
28
+ def get_transaction_queue_entry(
29
+ peer_id: bytes32 | None, tx_index: int, peers_with_tx: dict[bytes32, PeerWithTx] | None = None
30
+ ) -> TransactionQueueEntry: # easy shortcut
31
+ if peers_with_tx is None:
32
+ peers_with_tx = {}
33
+ return cast(TransactionQueueEntry, FakeTransactionQueueEntry(tx_index, peer_id, peers_with_tx))
26
34
 
27
35
 
28
36
  @pytest.mark.anyio
@@ -30,7 +38,7 @@ async def test_local_txs(seeded_random: random.Random) -> None:
30
38
  transaction_queue = TransactionQueue(1000, log)
31
39
  # test 1 tx
32
40
  first_tx = get_transaction_queue_entry(None, 0)
33
- await transaction_queue.put(first_tx, None)
41
+ transaction_queue.put(first_tx, None)
34
42
 
35
43
  result1 = await transaction_queue.pop()
36
44
 
@@ -40,7 +48,7 @@ async def test_local_txs(seeded_random: random.Random) -> None:
40
48
  num_txs = 2000
41
49
  list_txs = [get_transaction_queue_entry(bytes32.random(seeded_random), i) for i in range(num_txs)]
42
50
  for tx in list_txs:
43
- await transaction_queue.put(tx, None)
51
+ transaction_queue.put(tx, None)
44
52
 
45
53
  resulting_txs = []
46
54
  for _ in range(num_txs):
@@ -58,12 +66,12 @@ async def test_one_peer_and_await(seeded_random: random.Random) -> None:
58
66
 
59
67
  list_txs = [get_transaction_queue_entry(peer_id, i) for i in range(num_txs)]
60
68
  for tx in list_txs:
61
- await transaction_queue.put(tx, peer_id)
69
+ transaction_queue.put(tx, peer_id)
62
70
 
63
71
  # test transaction priority
64
72
  local_txs = [get_transaction_queue_entry(None, i) for i in range(int(num_txs / 5))] # 20 txs
65
73
  for tx in local_txs:
66
- await transaction_queue.put(tx, None)
74
+ transaction_queue.put(tx, None)
67
75
 
68
76
  resulting_txs = []
69
77
  for _ in range(num_txs + len(local_txs)):
@@ -80,7 +88,7 @@ async def test_one_peer_and_await(seeded_random: random.Random) -> None:
80
88
  with pytest.raises(asyncio.InvalidStateError): # task is not done, so we expect an error when getting result
81
89
  task.result()
82
90
  # add a tx to test task completion
83
- await transaction_queue.put(get_transaction_queue_entry(None, 0), None)
91
+ transaction_queue.put(get_transaction_queue_entry(None, 0), None)
84
92
  await asyncio.wait_for(task, 1) # we should never time out here
85
93
 
86
94
 
@@ -95,7 +103,7 @@ async def test_lots_of_peers(seeded_random: random.Random) -> None:
95
103
  # 100 txs per peer
96
104
  list_txs = [get_transaction_queue_entry(peer_id, i) for peer_id in peer_ids for i in range(num_txs)]
97
105
  for tx in list_txs:
98
- await transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
106
+ transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
99
107
 
100
108
  resulting_txs = []
101
109
  for _ in range(total_txs):
@@ -117,11 +125,11 @@ async def test_full_queue(seeded_random: random.Random) -> None:
117
125
  # 999 txs per peer then 1 to fail later
118
126
  list_txs = [get_transaction_queue_entry(peer_id, i) for peer_id in peer_ids for i in range(num_txs)]
119
127
  for tx in list_txs:
120
- await transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
128
+ transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
121
129
 
122
130
  # test failure case.
123
131
  with pytest.raises(TransactionQueueFull):
124
- await transaction_queue.put(get_transaction_queue_entry(peer_ids[0], 1001), peer_ids[0])
132
+ transaction_queue.put(get_transaction_queue_entry(peer_ids[0], 1001), peer_ids[0])
125
133
 
126
134
  resulting_txs = []
127
135
  for _ in range(total_txs):
@@ -135,20 +143,96 @@ async def test_queue_cleanup_and_fairness(seeded_random: random.Random) -> None:
135
143
  peer_b = bytes32.random(seeded_random)
136
144
  peer_c = bytes32.random(seeded_random)
137
145
 
146
+ higher_tx_cost = uint64(20)
147
+ lower_tx_cost = uint64(10)
148
+ higher_tx_fee = uint64(5)
149
+ lower_tx_fee = uint64(1)
138
150
  # 2 for a, 1 for b, 2 for c
139
- peer_tx_a = [get_transaction_queue_entry(peer_a, i) for i in range(2)]
140
- peer_tx_b = [get_transaction_queue_entry(peer_b, 0)]
141
- peer_tx_c = [get_transaction_queue_entry(peer_c, i) for i in range(2)]
151
+ peer_tx_a = [
152
+ get_transaction_queue_entry(peer_a, 0, {peer_a: PeerWithTx(str(peer_a), lower_tx_fee, higher_tx_cost)}),
153
+ get_transaction_queue_entry(peer_a, 1, {peer_a: PeerWithTx(str(peer_a), higher_tx_fee, lower_tx_cost)}),
154
+ ]
155
+ peer_tx_b = [
156
+ get_transaction_queue_entry(peer_b, 0, {peer_b: PeerWithTx(str(peer_b), higher_tx_fee, lower_tx_cost)})
157
+ ]
158
+ peer_tx_c = [
159
+ get_transaction_queue_entry(peer_c, 0, {peer_c: PeerWithTx(str(peer_c), higher_tx_fee, lower_tx_cost)}),
160
+ get_transaction_queue_entry(peer_c, 1, {peer_c: PeerWithTx(str(peer_c), lower_tx_fee, higher_tx_cost)}),
161
+ ]
142
162
 
143
163
  list_txs = peer_tx_a + peer_tx_b + peer_tx_c
144
164
  for tx in list_txs:
145
- await transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
165
+ transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
146
166
 
147
- resulting_ids = []
167
+ entries = []
148
168
  for _ in range(3): # we validate we get one transaction per peer
149
- resulting_ids.append((await transaction_queue.pop()).peer_id) # type: ignore[attr-defined]
150
- assert [peer_a, peer_b, peer_c] == resulting_ids # all peers have been properly included in the queue.
151
- second_resulting_ids = []
169
+ entry = await transaction_queue.pop()
170
+ entries.append((entry.peer_id, entry.index)) # type: ignore[attr-defined]
171
+ assert [(peer_a, 1), (peer_b, 0), (peer_c, 0)] == entries # all peers have been properly included in the queue.
172
+ second_entries = []
152
173
  for _ in range(2): # we validate that we properly queue the last 2 transactions
153
- second_resulting_ids.append((await transaction_queue.pop()).peer_id) # type: ignore[attr-defined]
154
- assert [peer_a, peer_c] == second_resulting_ids
174
+ entry = await transaction_queue.pop()
175
+ second_entries.append((entry.peer_id, entry.index)) # type: ignore[attr-defined]
176
+ assert [(peer_a, 0), (peer_c, 1)] == second_entries
177
+
178
+
179
+ def test_tx_queue_entry_order_compare() -> None:
180
+ """
181
+ Tests that `TransactionQueueEntry` orders and compares using transaction
182
+ IDs regardless of other fields.
183
+ """
184
+ # Let's create two items with the same transaction ID but different data
185
+ sb = SpendBundle([], G2Element())
186
+ sb_name = sb.name()
187
+ item1 = TransactionQueueEntry(
188
+ transaction=sb, transaction_bytes=bytes(sb), spend_name=sb_name, peer=None, test=False, peers_with_tx={}
189
+ )
190
+ item2 = TransactionQueueEntry(
191
+ transaction=sb, transaction_bytes=None, spend_name=sb_name, peer=None, test=True, peers_with_tx={}
192
+ )
193
+ # They should be ordered and compared (considered equal) by `spend_name`
194
+ # regardless of other fields.
195
+ assert (item1 < item2) is False
196
+ assert item1 == item2
197
+
198
+
199
+ @pytest.mark.anyio
200
+ async def test_peer_queue_prioritization_fallback() -> None:
201
+ """
202
+ Tests prioritization fallback, when `peer_id` is not in `peers_with_tx`.
203
+ """
204
+ queue = TransactionQueue(42, log)
205
+ peer1 = bytes32.random()
206
+ peer2 = bytes32.random()
207
+ # We'll be using this peer to test the fallback, so we don't include it in
208
+ # peers with transactions maps.
209
+ peer3 = bytes32.random()
210
+ peers_with_tx1 = {
211
+ # This has FPC of 5.0
212
+ peer1: PeerWithTx(str(peer1), uint64(10), uint64(2)),
213
+ # This has FPC of 2.0 but higher advertised cost
214
+ peer2: PeerWithTx(str(peer2), uint64(20), uint64(10)),
215
+ }
216
+ tx1 = get_transaction_queue_entry(peer3, 0, peers_with_tx1)
217
+ queue.put(tx1, peer3)
218
+ peers_with_tx2 = {
219
+ # This has FPC of 3.0
220
+ peer1: PeerWithTx(str(peer1), uint64(30), uint64(10)),
221
+ # This has FPC of 4.0 but lower advertised cost
222
+ peer2: PeerWithTx(str(peer2), uint64(20), uint64(5)),
223
+ # This has FPC of 1.0 but lower advertised cost
224
+ peer3: PeerWithTx(str(peer3), uint64(4), uint64(4)),
225
+ }
226
+ tx2 = get_transaction_queue_entry(peer3, 1, peers_with_tx2)
227
+ queue.put(tx2, peer3)
228
+ # tx2 gets top priority with FPC 1.0
229
+ assert math.isclose(queue._queue_dict[peer3].queue[0][0], -1.0)
230
+ entry = await queue.pop()
231
+ # NOTE: This whole test file uses `index` as an addition to
232
+ # `TransactionQueueEntry` for easier testing, hence this type ignore here
233
+ # and everywhere else.
234
+ assert entry.index == 1 # type: ignore[attr-defined]
235
+ # tx1 comes next due to lowest priority fallback
236
+ assert math.isinf(queue._queue_dict[peer3].queue[0][0])
237
+ entry = await queue.pop()
238
+ assert entry.index == 0 # type: ignore[attr-defined]
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import dataclasses
4
4
  import logging
5
5
  import random
6
- from typing import Callable, Optional
6
+ from collections.abc import Callable
7
7
 
8
8
  import pytest
9
9
  from chia_rs import (
@@ -26,6 +26,7 @@ from clvm_tools.binutils import assemble
26
26
 
27
27
  from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
28
28
  from chia._tests.connection_utils import add_dummy_connection, connect_and_get_peer
29
+ from chia._tests.core.full_node.test_full_node import find_reward_coin
29
30
  from chia._tests.core.mempool.test_mempool_manager import (
30
31
  IDENTITY_PUZZLE_HASH,
31
32
  TEST_COIN,
@@ -100,7 +101,7 @@ def wallet_a(bt: BlockTools) -> WalletTool:
100
101
  def generate_test_spend_bundle(
101
102
  wallet: WalletTool,
102
103
  coin: Coin,
103
- condition_dic: Optional[dict[ConditionOpcode, list[ConditionWithArgs]]] = None,
104
+ condition_dic: dict[ConditionOpcode, list[ConditionWithArgs]] | None = None,
104
105
  fee: uint64 = uint64(0),
105
106
  amount: uint64 = uint64(1000),
106
107
  new_puzzle_hash: bytes32 = BURN_PUZZLE_HASH,
@@ -350,7 +351,7 @@ async def respond_transaction(
350
351
  peer: WSChiaConnection,
351
352
  tx_bytes: bytes = b"",
352
353
  test: bool = False,
353
- ) -> tuple[MempoolInclusionStatus, Optional[Err]]:
354
+ ) -> tuple[MempoolInclusionStatus, Err | None]:
354
355
  """
355
356
  Receives a full transaction from peer.
356
357
  If tx is added to mempool, send tx_id to others. (new_transaction)
@@ -380,7 +381,6 @@ async def next_block(full_node_1: FullNodeSimulator, wallet_a: WalletTool, bt: B
380
381
  block_list_input=blocks,
381
382
  guarantee_transaction_block=True,
382
383
  farmer_reward_puzzle_hash=reward_ph,
383
- pool_reward_puzzle_hash=reward_ph,
384
384
  genesis_timestamp=uint64(10_000),
385
385
  time_per_block=10,
386
386
  )
@@ -395,7 +395,7 @@ co = ConditionOpcode
395
395
  mis = MempoolInclusionStatus
396
396
 
397
397
 
398
- async def send_sb(node: FullNodeAPI, sb: SpendBundle) -> Optional[Message]:
398
+ async def send_sb(node: FullNodeAPI, sb: SpendBundle) -> Message | None:
399
399
  tx = wallet_protocol.SendTransaction(sb)
400
400
  return await node.send_transaction(tx, test=True)
401
401
 
@@ -576,14 +576,14 @@ class TestMempoolManager:
576
576
  block_list_input=blocks,
577
577
  guarantee_transaction_block=True,
578
578
  farmer_reward_puzzle_hash=reward_ph,
579
- pool_reward_puzzle_hash=reward_ph,
580
579
  )
581
580
  peer = await connect_and_get_peer(server_1, server_2, self_hostname)
582
581
 
583
582
  await add_blocks_in_batches(blocks, full_node_1.full_node)
584
583
  await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + 3)
585
584
 
586
- spend_bundle1 = generate_test_spend_bundle(wallet_a, blocks[-1].get_included_reward_coins()[0])
585
+ coin_1 = find_reward_coin(blocks[-1], reward_ph)
586
+ spend_bundle1 = generate_test_spend_bundle(wallet_a, coin_1)
587
587
 
588
588
  assert spend_bundle1 is not None
589
589
  tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
@@ -591,9 +591,10 @@ class TestMempoolManager:
591
591
  assert err is None
592
592
  assert status == MempoolInclusionStatus.SUCCESS
593
593
 
594
+ coin_1 = find_reward_coin(blocks[-1], reward_ph)
594
595
  spend_bundle2 = generate_test_spend_bundle(
595
596
  wallet_a,
596
- blocks[-1].get_included_reward_coins()[0],
597
+ coin_1,
597
598
  new_puzzle_hash=BURN_PUZZLE_HASH_2,
598
599
  )
599
600
  assert spend_bundle2 is not None
@@ -621,7 +622,6 @@ class TestMempoolManager:
621
622
  block_list_input=blocks,
622
623
  guarantee_transaction_block=True,
623
624
  farmer_reward_puzzle_hash=reward_ph,
624
- pool_reward_puzzle_hash=reward_ph,
625
625
  )
626
626
 
627
627
  invariant_check_mempool(full_node_1.full_node.mempool_manager.mempool)
@@ -704,19 +704,17 @@ class TestMempoolManager:
704
704
  block_list_input=blocks,
705
705
  guarantee_transaction_block=True,
706
706
  farmer_reward_puzzle_hash=reward_ph,
707
- pool_reward_puzzle_hash=reward_ph,
708
707
  )
709
708
 
710
709
  await add_blocks_in_batches(blocks, full_node_1.full_node)
711
710
  await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + 3)
712
711
 
713
- coins = iter(blocks[-1].get_included_reward_coins())
714
- coin1 = next(coins)
712
+ coin1 = find_reward_coin(blocks[-1], reward_ph)
715
713
 
716
714
  sb: SpendBundle = generate_test_spend_bundle(wallet_a, coin1)
717
715
  assert sb.aggregated_signature != G2Element.generator()
718
716
  sb = sb.replace(aggregated_signature=G2Element.generator())
719
- res: Optional[Message] = await send_sb(full_node_1, sb)
717
+ res: Message | None = await send_sb(full_node_1, sb)
720
718
  assert res is not None
721
719
  ack: TransactionAck = TransactionAck.from_bytes(res.data)
722
720
  assert ack.status == MempoolInclusionStatus.FAILED.value
@@ -730,8 +728,8 @@ class TestMempoolManager:
730
728
  dic: dict[ConditionOpcode, list[ConditionWithArgs]],
731
729
  fee: int = 0,
732
730
  num_blocks: int = 3,
733
- coin: Optional[Coin] = None,
734
- ) -> tuple[list[FullBlock], SpendBundle, WSChiaConnection, MempoolInclusionStatus, Optional[Err]]:
731
+ coin: Coin | None = None,
732
+ ) -> tuple[list[FullBlock], SpendBundle, WSChiaConnection, MempoolInclusionStatus, Err | None]:
735
733
  reward_ph = wallet_a.get_new_puzzlehash()
736
734
  full_node_1, server_1, bt = one_node_one_block
737
735
  blocks = await full_node_1.get_all_full_blocks()
@@ -741,7 +739,6 @@ class TestMempoolManager:
741
739
  block_list_input=blocks,
742
740
  guarantee_transaction_block=True,
743
741
  farmer_reward_puzzle_hash=reward_ph,
744
- pool_reward_puzzle_hash=reward_ph,
745
742
  )
746
743
  _, dummy_node_id = await add_dummy_connection(server_1, bt.config["self_hostname"], 100)
747
744
  for node_id, wsc in server_1.all_connections.items():
@@ -755,9 +752,8 @@ class TestMempoolManager:
755
752
 
756
753
  await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + num_blocks)
757
754
 
758
- spend_bundle1 = generate_test_spend_bundle(
759
- wallet_a, coin or blocks[-num_blocks + 2].get_included_reward_coins()[0], dic, uint64(fee)
760
- )
755
+ coin1 = find_reward_coin(blocks[2 - num_blocks], reward_ph)
756
+ spend_bundle1 = generate_test_spend_bundle(wallet_a, coin or coin1, dic, uint64(fee))
761
757
 
762
758
  assert spend_bundle1 is not None
763
759
 
@@ -772,7 +768,7 @@ class TestMempoolManager:
772
768
  node_server_bt: tuple[FullNodeSimulator, ChiaServer, BlockTools],
773
769
  wallet_a: WalletTool,
774
770
  test_fun: Callable[[Coin, Coin], SpendBundle],
775
- ) -> tuple[list[FullBlock], SpendBundle, MempoolInclusionStatus, Optional[Err]]:
771
+ ) -> tuple[list[FullBlock], SpendBundle, MempoolInclusionStatus, Err | None]:
776
772
  reward_ph = wallet_a.get_new_puzzlehash()
777
773
  full_node_1, server_1, bt = node_server_bt
778
774
  blocks = await full_node_1.get_all_full_blocks()
@@ -782,7 +778,6 @@ class TestMempoolManager:
782
778
  block_list_input=blocks,
783
779
  guarantee_transaction_block=True,
784
780
  farmer_reward_puzzle_hash=reward_ph,
785
- pool_reward_puzzle_hash=reward_ph,
786
781
  time_per_block=10,
787
782
  )
788
783
  _, dummy_node_id = await add_dummy_connection(server_1, bt.config["self_hostname"], 100)
@@ -797,8 +792,8 @@ class TestMempoolManager:
797
792
 
798
793
  await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + 3)
799
794
 
800
- coin_1 = blocks[-2].get_included_reward_coins()[0]
801
- coin_2 = blocks[-1].get_included_reward_coins()[0]
795
+ coin_1 = find_reward_coin(blocks[-2], reward_ph)
796
+ coin_2 = find_reward_coin(blocks[-1], reward_ph)
802
797
 
803
798
  bundle = test_fun(coin_1, coin_2)
804
799
 
@@ -1256,7 +1251,7 @@ class TestMempoolManager:
1256
1251
  self,
1257
1252
  assert_garbage: bool,
1258
1253
  announce_garbage: bool,
1259
- expected: Optional[Err],
1254
+ expected: Err | None,
1260
1255
  expected_included: MempoolInclusionStatus,
1261
1256
  one_node_one_block: tuple[FullNodeSimulator, ChiaServer, BlockTools],
1262
1257
  wallet_a: WalletTool,
@@ -1469,7 +1464,7 @@ class TestMempoolManager:
1469
1464
  self,
1470
1465
  assert_garbage: bool,
1471
1466
  announce_garbage: bool,
1472
- expected: Optional[Err],
1467
+ expected: Err | None,
1473
1468
  expected_included: MempoolInclusionStatus,
1474
1469
  one_node_one_block: tuple[FullNodeSimulator, ChiaServer, BlockTools],
1475
1470
  wallet_a: WalletTool,
@@ -1741,7 +1736,6 @@ class TestMempoolManager:
1741
1736
  block_list_input=blocks,
1742
1737
  guarantee_transaction_block=True,
1743
1738
  farmer_reward_puzzle_hash=reward_ph,
1744
- pool_reward_puzzle_hash=reward_ph,
1745
1739
  )
1746
1740
 
1747
1741
  peer = await connect_and_get_peer(server_1, server_2, bt.config["self_hostname"])
@@ -1757,7 +1751,7 @@ class TestMempoolManager:
1757
1751
 
1758
1752
  fee = 9
1759
1753
 
1760
- coin_1 = blocks[-2].get_included_reward_coins()[0]
1754
+ coin_1 = find_reward_coin(blocks[-2], reward_ph)
1761
1755
  coin_2 = None
1762
1756
  for coin in blocks[-1].get_included_reward_coins():
1763
1757
  if coin.amount == coin_1.amount:
@@ -1801,13 +1795,12 @@ class TestMempoolManager:
1801
1795
  block_list_input=blocks,
1802
1796
  guarantee_transaction_block=True,
1803
1797
  farmer_reward_puzzle_hash=reward_ph,
1804
- pool_reward_puzzle_hash=reward_ph,
1805
1798
  )
1806
1799
 
1807
1800
  await add_blocks_in_batches(blocks, full_node_1.full_node)
1808
1801
 
1809
1802
  await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + 3)
1810
- # coin = blocks[-1].get_included_reward_coins()[0]
1803
+ # coin = find_reward_coin(blocks[-1], reward_ph)
1811
1804
  # spend_bundle1 = generate_test_spend_bundle(wallet_a, coin)
1812
1805
  coin = await next_block(full_node_1, wallet_a, bt)
1813
1806
  spend_bundle1 = generate_test_spend_bundle(wallet_a, coin)
@@ -1849,7 +1842,6 @@ class TestMempoolManager:
1849
1842
  block_list_input=blocks,
1850
1843
  guarantee_transaction_block=True,
1851
1844
  farmer_reward_puzzle_hash=reward_ph,
1852
- pool_reward_puzzle_hash=reward_ph,
1853
1845
  )
1854
1846
 
1855
1847
  await add_blocks_in_batches(blocks, full_node_1.full_node)
@@ -2530,7 +2522,7 @@ class TestGeneratorConditions:
2530
2522
  ],
2531
2523
  )
2532
2524
  def test_softfork_condition(
2533
- self, mempool: bool, condition: str, expect_error: Optional[int], softfork_height: uint32
2525
+ self, mempool: bool, condition: str, expect_error: int | None, softfork_height: uint32
2534
2526
  ) -> None:
2535
2527
  npc_result = generator_condition_tester(condition, mempool_mode=mempool, height=softfork_height)
2536
2528
  print(npc_result)
@@ -2550,7 +2542,7 @@ class TestGeneratorConditions:
2550
2542
  ],
2551
2543
  )
2552
2544
  def test_message_condition(
2553
- self, mempool: bool, condition: str, expect_error: Optional[int], softfork_height: uint32
2545
+ self, mempool: bool, condition: str, expect_error: int | None, softfork_height: uint32
2554
2546
  ) -> None:
2555
2547
  npc_result = generator_condition_tester(condition, mempool_mode=mempool, height=softfork_height)
2556
2548
  print(npc_result)
@@ -2854,14 +2846,14 @@ class TestMaliciousGenerators:
2854
2846
  5,
2855
2847
  guarantee_transaction_block=True,
2856
2848
  farmer_reward_puzzle_hash=reward_ph,
2857
- pool_reward_puzzle_hash=reward_ph,
2858
2849
  )
2859
2850
 
2860
2851
  await add_blocks_in_batches(blocks, full_node_1.full_node)
2861
2852
 
2862
2853
  await time_out_assert(60, node_height_at_least, True, full_node_1, blocks[-1].height)
2863
2854
 
2864
- spend_bundle = generate_test_spend_bundle(wallet_a, blocks[-1].get_included_reward_coins()[0])
2855
+ coin_1 = find_reward_coin(blocks[-1], reward_ph)
2856
+ spend_bundle = generate_test_spend_bundle(wallet_a, coin_1)
2865
2857
  cs = spend_bundle.coin_spends[0]
2866
2858
  c = cs.coin
2867
2859
  coin_0 = Coin(c.parent_coin_info, bytes32([1] * 32), c.amount)
@@ -2920,7 +2912,7 @@ def test_items_by_feerate(items: list[MempoolItem], expected: list[Coin]) -> Non
2920
2912
 
2921
2913
  assert len(ordered_items) == len(expected)
2922
2914
 
2923
- last_fpc: Optional[float] = None
2915
+ last_fpc: float | None = None
2924
2916
  for mi, expected_coin in zip(ordered_items, expected):
2925
2917
  assert len(mi.bundle_coin_spends) == 1
2926
2918
  assert next(iter(mi.bundle_coin_spends.values())).coin_spend.coin == expected_coin
@@ -3413,7 +3405,7 @@ async def test_lineage_cache(seeded_random: random.Random) -> None:
3413
3405
  bytes32.random(seeded_random), bytes32.random(seeded_random), bytes32.random(seeded_random)
3414
3406
  )
3415
3407
 
3416
- async def callback1(ph: bytes32) -> Optional[UnspentLineageInfo]:
3408
+ async def callback1(ph: bytes32) -> UnspentLineageInfo | None:
3417
3409
  nonlocal called
3418
3410
  called += 1
3419
3411
  return info1
@@ -3432,7 +3424,7 @@ async def test_lineage_cache(seeded_random: random.Random) -> None:
3432
3424
 
3433
3425
  called = 0
3434
3426
 
3435
- async def callback_none(ph: bytes32) -> Optional[UnspentLineageInfo]:
3427
+ async def callback_none(ph: bytes32) -> UnspentLineageInfo | None:
3436
3428
  nonlocal called
3437
3429
  called += 1
3438
3430
  return None
@@ -62,43 +62,43 @@ async def test_basics() -> None:
62
62
  async def test_fee_increase() -> None:
63
63
  async with DBConnection(db_version=2) as db_wrapper:
64
64
  coin_store = await CoinStore.create(db_wrapper)
65
- mempool_manager = MempoolManager(
65
+ async with MempoolManager.managed(
66
66
  coin_store.get_coin_records, coin_store.get_unspent_lineage_info_for_puzzle_hash, test_constants
67
- )
68
- assert test_constants.MAX_BLOCK_COST_CLVM == mempool_manager.constants.MAX_BLOCK_COST_CLVM
69
- btc_fee_estimator: BitcoinFeeEstimator = mempool_manager.mempool.fee_estimator # type: ignore
70
- fee_tracker = btc_fee_estimator.get_tracker()
71
- estimator = SmartFeeEstimator(fee_tracker, uint64(test_constants.MAX_BLOCK_COST_CLVM))
72
- random = Random(x=1)
73
- for i in range(300, 700):
74
- items = []
75
- for _ in range(20):
76
- fee = uint64(0)
77
- included_height = uint32(random.randint(i - 60, i - 1))
78
- cost = uint64(5000000)
79
- mempool_item = MempoolItemInfo(
80
- cost,
81
- fee,
82
- included_height,
83
- )
84
- items.append(mempool_item)
85
-
86
- fee_tracker.process_block(uint32(i), items)
87
-
88
- short, med, long = fee_tracker.estimate_fees()
89
- mempool_info = mempool_manager.mempool.fee_estimator.get_mempool_info()
90
-
91
- result = estimator.get_estimates(mempool_info, ignore_mempool=True)
92
-
93
- assert short.median == -1
94
- assert med.median == -1
95
- assert long.median == 0.0
96
-
97
- assert result.error is None
98
- short_estimate = result.estimates[0].estimated_fee_rate
99
- med_estimate = result.estimates[1].estimated_fee_rate
100
- long_estimate = result.estimates[2].estimated_fee_rate
101
-
102
- assert short_estimate.mojos_per_clvm_cost == uint64(fee_tracker.buckets[3] / 1000)
103
- assert med_estimate.mojos_per_clvm_cost == uint64(fee_tracker.buckets[3] / 1000)
104
- assert long_estimate.mojos_per_clvm_cost == uint64(0)
67
+ ) as mempool_manager:
68
+ assert test_constants.MAX_BLOCK_COST_CLVM == mempool_manager.constants.MAX_BLOCK_COST_CLVM
69
+ btc_fee_estimator: BitcoinFeeEstimator = mempool_manager.mempool.fee_estimator # type: ignore
70
+ fee_tracker = btc_fee_estimator.get_tracker()
71
+ estimator = SmartFeeEstimator(fee_tracker, uint64(test_constants.MAX_BLOCK_COST_CLVM))
72
+ random = Random(x=1)
73
+ for i in range(300, 700):
74
+ items = []
75
+ for _ in range(20):
76
+ fee = uint64(0)
77
+ included_height = uint32(random.randint(i - 60, i - 1))
78
+ cost = uint64(5000000)
79
+ mempool_item = MempoolItemInfo(
80
+ cost,
81
+ fee,
82
+ included_height,
83
+ )
84
+ items.append(mempool_item)
85
+
86
+ fee_tracker.process_block(uint32(i), items)
87
+
88
+ short, med, long = fee_tracker.estimate_fees()
89
+ mempool_info = mempool_manager.mempool.fee_estimator.get_mempool_info()
90
+
91
+ result = estimator.get_estimates(mempool_info, ignore_mempool=True)
92
+
93
+ assert short.median == -1
94
+ assert med.median == -1
95
+ assert long.median == 0.0
96
+
97
+ assert result.error is None
98
+ short_estimate = result.estimates[0].estimated_fee_rate
99
+ med_estimate = result.estimates[1].estimated_fee_rate
100
+ long_estimate = result.estimates[2].estimated_fee_rate
101
+
102
+ assert short_estimate.mojos_per_clvm_cost == uint64(fee_tracker.buckets[3] / 1000)
103
+ assert med_estimate.mojos_per_clvm_cost == uint64(fee_tracker.buckets[3] / 1000)
104
+ assert long_estimate.mojos_per_clvm_cost == uint64(0)
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import datetime
4
- from typing import Union
5
4
 
6
5
  import pytest
7
6
  from chia_rs.sized_ints import uint64
@@ -20,9 +19,7 @@ from chia.wallet.wallet import Wallet
20
19
 
21
20
  @pytest.mark.anyio
22
21
  async def test_protocol_messages(
23
- simulator_and_wallet: tuple[
24
- list[Union[FullNodeAPI, FullNodeSimulator]], list[tuple[Wallet, ChiaServer]], BlockTools
25
- ],
22
+ simulator_and_wallet: tuple[list[FullNodeAPI | FullNodeSimulator], list[tuple[Wallet, ChiaServer]], BlockTools],
26
23
  ) -> None:
27
24
  full_nodes, _wallets, bt = simulator_and_wallet
28
25
  a_wallet = bt.get_pool_wallet_tool()
@@ -31,10 +28,9 @@ async def test_protocol_messages(
31
28
  35,
32
29
  guarantee_transaction_block=True,
33
30
  farmer_reward_puzzle_hash=reward_ph,
34
- pool_reward_puzzle_hash=reward_ph,
35
31
  )
36
32
 
37
- full_node_sim: Union[FullNodeAPI, FullNodeSimulator] = full_nodes[0]
33
+ full_node_sim: FullNodeAPI | FullNodeSimulator = full_nodes[0]
38
34
 
39
35
  for block in blocks:
40
36
  await full_node_sim.full_node.add_block(block)