chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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 (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
@@ -1,8 +1,5 @@
1
- # flake8: noqa: E501
2
1
  from __future__ import annotations
3
2
 
4
- from chia_rs import AugSchemeMPL, PrivateKey
5
-
6
3
  from chia.pools.pool_config import PoolWalletConfig
7
4
  from chia.util.config import create_default_chia_config, load_config, lock_config, save_config
8
5
 
@@ -18,9 +15,10 @@ def test_pool_config(tmp_path):
18
15
  eg_config.rename(to_config)
19
16
  config = load_config(test_root, "test_pool_config.yaml")
20
17
 
21
- auth_sk: PrivateKey = AugSchemeMPL.key_gen(b"1" * 32)
22
18
  d = {
23
- "owner_public_key": "84c3fcf9d5581c1ddc702cb0f3b4a06043303b334dd993ab42b2c320ebfa98e5ce558448615b3f69638ba92cf7f43da5",
19
+ "owner_public_key": (
20
+ "84c3fcf9d5581c1ddc702cb0f3b4a06043303b334dd993ab42b2c320ebfa98e5ce558448615b3f69638ba92cf7f43da5"
21
+ ),
24
22
  "p2_singleton_puzzle_hash": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
25
23
  "payout_instructions": "c2b08e41d766da4116e388357ed957d04ad754623a915f3fd65188a8746cf3e8",
26
24
  "pool_url": "localhost",
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import copy
4
- from typing import List
5
4
  from unittest import TestCase
6
5
 
7
6
  import pytest
@@ -205,7 +204,7 @@ class TestPoolPuzzles(TestCase):
205
204
  assert launcher_id_to_p2_puzzle_hash(launcher_id, DELAY_TIME, DELAY_PH) == p2_singleton_ph
206
205
  assert get_seconds_and_delayed_puzhash_from_p2_singleton_puzzle(p2_singleton_puz) == (DELAY_TIME, DELAY_PH)
207
206
  coin_db.farm_coin(p2_singleton_ph, time, 1750000000000)
208
- coin_sols: List[CoinSpend] = create_absorb_spend(
207
+ coin_sols: list[CoinSpend] = create_absorb_spend(
209
208
  launcher_coinsol,
210
209
  pool_state,
211
210
  launcher_coin,
@@ -220,13 +219,13 @@ class TestPoolPuzzles(TestCase):
220
219
  )
221
220
 
222
221
  # ABSORB A NON EXISTENT REWARD (Negative test)
223
- last_coinsol: CoinSpend = list(
222
+ last_coinsol: CoinSpend = next(
224
223
  filter(
225
224
  lambda e: e.coin.amount == START_AMOUNT,
226
225
  coin_sols,
227
226
  )
228
- )[0]
229
- coin_sols: List[CoinSpend] = create_absorb_spend(
227
+ )
228
+ coin_sols: list[CoinSpend] = create_absorb_spend(
230
229
  last_coinsol,
231
230
  pool_state,
232
231
  launcher_coin,
@@ -236,12 +235,12 @@ class TestPoolPuzzles(TestCase):
236
235
  DELAY_PH, # height
237
236
  )
238
237
  # pick the larger coin, otherwise we'll fail with Err.MINTING_COIN
239
- singleton_coinsol: CoinSpend = list(
238
+ singleton_coinsol: CoinSpend = next(
240
239
  filter(
241
240
  lambda e: e.coin.amount != START_AMOUNT,
242
241
  coin_sols,
243
242
  )
244
- )[0]
243
+ )
245
244
  # Spend it and hope it fails!
246
245
  with pytest.raises(
247
246
  BadSpendBundleError, match="condition validation failure Err.ASSERT_ANNOUNCE_CONSUMED_FAILED"
@@ -332,7 +331,7 @@ class TestPoolPuzzles(TestCase):
332
331
  # create the farming reward
333
332
  coin_db.farm_coin(p2_singleton_ph, time, 1750000000000)
334
333
  # generate relevant coin solutions
335
- coin_sols: List[CoinSpend] = create_absorb_spend(
334
+ coin_sols: list[CoinSpend] = create_absorb_spend(
336
335
  travel_coinsol,
337
336
  target_pool_state,
338
337
  launcher_coin,
@@ -349,12 +348,12 @@ class TestPoolPuzzles(TestCase):
349
348
  # LEAVE THE WAITING ROOM
350
349
  time = CoinTimestamp(20000000, 10000)
351
350
  # find the singleton
352
- singleton_coinsol: CoinSpend = list(
351
+ singleton_coinsol: CoinSpend = next(
353
352
  filter(
354
353
  lambda e: e.coin.amount == START_AMOUNT,
355
354
  coin_sols,
356
355
  )
357
- )[0]
356
+ )
358
357
  singleton: Coin = get_most_recent_singleton_coin_from_coin_spend(singleton_coinsol)
359
358
  # get the relevant coin solution
360
359
  return_coinsol, _ = create_travel_spend(
@@ -383,7 +382,7 @@ class TestPoolPuzzles(TestCase):
383
382
  time = CoinTimestamp(20000000, 10005)
384
383
  # create the farming reward
385
384
  coin_db.farm_coin(p2_singleton_ph, time, 1750000000000)
386
- coin_sols: List[CoinSpend] = create_absorb_spend(
385
+ coin_sols: list[CoinSpend] = create_absorb_spend(
387
386
  return_coinsol,
388
387
  pool_state,
389
388
  launcher_coin,
@@ -4,10 +4,11 @@ import asyncio
4
4
  import contextlib
5
5
  import logging
6
6
  import tempfile
7
+ from collections.abc import AsyncIterator
7
8
  from dataclasses import dataclass
8
9
  from pathlib import Path
9
10
  from shutil import rmtree
10
- from typing import Any, AsyncIterator, Dict, List, Tuple
11
+ from typing import Any, Union
11
12
 
12
13
  import pytest
13
14
 
@@ -15,12 +16,14 @@ import pytest
15
16
  from _pytest.fixtures import SubRequest
16
17
  from chia_rs import G1Element
17
18
 
19
+ from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
18
20
  from chia._tests.util.setup_nodes import setup_simulators_and_wallets_service
19
21
  from chia._tests.util.time_out_assert import time_out_assert
20
22
  from chia.consensus.constants import ConsensusConstants
21
23
  from chia.pools.pool_puzzles import SINGLETON_LAUNCHER_HASH
22
24
  from chia.pools.pool_wallet_info import PoolSingletonState, PoolWalletInfo
23
25
  from chia.rpc.wallet_rpc_client import WalletRpcClient
26
+ from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
24
27
  from chia.simulator.block_tools import BlockTools, get_plot_dir
25
28
  from chia.simulator.full_node_simulator import FullNodeSimulator
26
29
  from chia.simulator.simulator_protocol import ReorgProtocol
@@ -34,15 +37,21 @@ from chia.util.config import load_config
34
37
  from chia.util.ints import uint32, uint64
35
38
  from chia.wallet.derive_keys import find_authentication_sk, find_owner_sk
36
39
  from chia.wallet.transaction_record import TransactionRecord
40
+ from chia.wallet.util.transaction_type import TransactionType
37
41
  from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
38
42
  from chia.wallet.util.wallet_types import WalletType
39
43
  from chia.wallet.wallet_node import WalletNode
44
+ from chia.wallet.wallet_state_manager import WalletStateManager
40
45
 
41
46
  # TODO: Compare deducted fees in all tests against reported total_fee
42
47
 
48
+ # limit to plain consensus mode for all tests
49
+ pytestmark = [pytest.mark.limit_consensus_modes(reason="irrelevant")]
50
+
43
51
  log = logging.getLogger(__name__)
44
52
  FEE_AMOUNT = uint64(29_000)
45
53
  MAX_WAIT_SECS = 30 # A high value for WAIT_SECS is useful when paused in the debugger
54
+ LOCK_HEIGHT = uint32(5)
46
55
 
47
56
 
48
57
  def get_pool_plot_dir() -> Path:
@@ -91,7 +100,7 @@ def fee(trusted: bool) -> uint64:
91
100
  return uint64(0)
92
101
 
93
102
 
94
- OneWalletNodeAndRpc = Tuple[WalletRpcClient, Any, FullNodeSimulator, int, BlockTools]
103
+ OneWalletNodeAndRpc = tuple[WalletRpcClient, Any, FullNodeSimulator, int, BlockTools]
95
104
 
96
105
 
97
106
  @pytest.fixture(scope="function")
@@ -129,17 +138,17 @@ async def one_wallet_node_and_rpc(
129
138
  await client.await_closed()
130
139
 
131
140
 
132
- Setup = Tuple[FullNodeSimulator, WalletNode, bytes32, int, WalletRpcClient]
141
+ Setup = tuple[FullNodeSimulator, WalletNode, bytes32, int, WalletRpcClient]
133
142
 
134
143
 
135
144
  @pytest.fixture(scope="function")
136
145
  async def setup(
137
- one_wallet_and_one_simulator_services: Tuple[List[SimulatorFullNodeService], List[WalletService], BlockTools],
146
+ one_wallet_and_one_simulator_services: tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools],
138
147
  trusted: bool,
139
148
  self_hostname: str,
140
149
  ) -> AsyncIterator[Setup]:
141
150
  rmtree(get_pool_plot_dir(), ignore_errors=True)
142
- [full_node_service], [wallet_service], bt = one_wallet_and_one_simulator_services
151
+ [full_node_service], [wallet_service], _bt = one_wallet_and_one_simulator_services
143
152
  full_node_api: FullNodeSimulator = full_node_service._api
144
153
  wallet_node = wallet_service._node
145
154
  our_ph_record = await wallet_node.wallet_state_manager.get_unused_derivation_record(uint32(1), hardened=True)
@@ -180,6 +189,90 @@ async def setup(
180
189
  await client.await_closed()
181
190
 
182
191
 
192
+ async def verify_pool_state(wallet_rpc: WalletRpcClient, w_id: int, expected_state: PoolSingletonState) -> bool:
193
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(w_id))[0]
194
+ return pw_status.current.state == expected_state.value
195
+
196
+
197
+ async def process_plotnft_create(
198
+ wallet_test_framework: WalletTestFramework, expected_state: PoolSingletonState, second_nft: bool = False
199
+ ) -> int:
200
+ wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
201
+
202
+ pre_block_balance_updates: dict[Union[int, str], dict[str, int]] = {
203
+ 1: {
204
+ "confirmed_wallet_balance": 0,
205
+ "unconfirmed_wallet_balance": -1,
206
+ "<=#spendable_balance": 1,
207
+ "<=#max_send_amount": 1,
208
+ ">=#pending_change": 1, # any amount increase
209
+ "pending_coin_removal_count": 1,
210
+ }
211
+ }
212
+
213
+ post_block_balance_updates: dict[Union[int, str], dict[str, int]] = {
214
+ 1: {
215
+ "confirmed_wallet_balance": -1,
216
+ "unconfirmed_wallet_balance": 0,
217
+ ">=#spendable_balance": 1,
218
+ ">=#max_send_amount": 1,
219
+ "<=#pending_change": 1, # any amount decrease
220
+ "<=#pending_coin_removal_count": 1,
221
+ },
222
+ }
223
+
224
+ if second_nft:
225
+ post_block = post_block_balance_updates | {
226
+ 2: {
227
+ "set_remainder": True, # TODO: sometimes this fails with pending_coin_removal_count
228
+ },
229
+ 3: {"init": True, "unspent_coin_count": 1},
230
+ }
231
+ else:
232
+ post_block = post_block_balance_updates | {2: {"init": True, "unspent_coin_count": 1}}
233
+
234
+ await wallet_test_framework.process_pending_states(
235
+ [
236
+ WalletStateTransition(
237
+ pre_block_balance_updates=pre_block_balance_updates,
238
+ post_block_balance_updates=post_block,
239
+ )
240
+ ]
241
+ )
242
+
243
+ summaries_response = await wallet_rpc.get_wallets(WalletType.POOLING_WALLET)
244
+ assert len(summaries_response) == 2 if second_nft else 1
245
+ wallet_id: int = summaries_response[-1]["id"]
246
+
247
+ await verify_pool_state(wallet_rpc, wallet_id, expected_state=expected_state)
248
+ return wallet_id
249
+
250
+
251
+ async def create_new_plotnft(
252
+ wallet_test_framework: WalletTestFramework, self_pool: bool = False, second_nft: bool = False
253
+ ) -> int:
254
+ wallet_state_manager: WalletStateManager = wallet_test_framework.environments[0].wallet_state_manager
255
+ wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
256
+
257
+ our_ph = await wallet_state_manager.main_wallet.get_new_puzzlehash()
258
+
259
+ await wallet_rpc.create_new_pool_wallet(
260
+ target_puzzlehash=our_ph,
261
+ backup_host="",
262
+ mode="new",
263
+ relative_lock_height=uint32(0) if self_pool else LOCK_HEIGHT,
264
+ state="SELF_POOLING" if self_pool else "FARMING_TO_POOL",
265
+ pool_url="" if self_pool else "http://pool.example.com",
266
+ fee=uint64(0),
267
+ )
268
+
269
+ return await process_plotnft_create(
270
+ wallet_test_framework=wallet_test_framework,
271
+ expected_state=PoolSingletonState.SELF_POOLING if self_pool else PoolSingletonState.FARMING_TO_POOL,
272
+ second_nft=second_nft,
273
+ )
274
+
275
+
183
276
  class TestPoolWalletRpc:
184
277
  @pytest.mark.anyio
185
278
  async def test_create_new_pool_wallet_self_farm(
@@ -188,7 +281,7 @@ class TestPoolWalletRpc:
188
281
  fee: uint64,
189
282
  self_hostname: str,
190
283
  ) -> None:
191
- client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
284
+ client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
192
285
  wallet = wallet_node.wallet_state_manager.main_wallet
193
286
 
194
287
  our_ph = await wallet.get_new_puzzlehash()
@@ -216,8 +309,8 @@ class TestPoolWalletRpc:
216
309
  assert status.current.relative_lock_height == 0
217
310
  assert status.current.version == 1
218
311
  # Check that config has been written properly
219
- full_config: Dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
220
- pool_list: List[Dict[str, Any]] = full_config["pool"]["pool_list"]
312
+ full_config: dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
313
+ pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
221
314
  assert len(pool_list) == 1
222
315
  pool_config = pool_list[0]
223
316
  assert (
@@ -240,7 +333,7 @@ class TestPoolWalletRpc:
240
333
  fee: uint64,
241
334
  self_hostname: str,
242
335
  ) -> None:
243
- client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
336
+ client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
244
337
  wallet = wallet_node.wallet_state_manager.main_wallet
245
338
 
246
339
  our_ph = await wallet.get_new_puzzlehash()
@@ -269,8 +362,8 @@ class TestPoolWalletRpc:
269
362
  assert status.current.relative_lock_height == 10
270
363
  assert status.current.version == 1
271
364
  # Check that config has been written properly
272
- full_config: Dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
273
- pool_list: List[Dict[str, Any]] = full_config["pool"]["pool_list"]
365
+ full_config: dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
366
+ pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
274
367
  assert len(pool_list) == 1
275
368
  pool_config = pool_list[0]
276
369
  assert (
@@ -294,7 +387,7 @@ class TestPoolWalletRpc:
294
387
  fee: uint64,
295
388
  self_hostname: str,
296
389
  ) -> None:
297
- client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
390
+ client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
298
391
 
299
392
  wallet = wallet_node.wallet_state_manager.main_wallet
300
393
 
@@ -333,7 +426,7 @@ class TestPoolWalletRpc:
333
426
  assert status_3.current.state == PoolSingletonState.SELF_POOLING.value
334
427
 
335
428
  full_config = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
336
- pool_list: List[Dict[str, Any]] = full_config["pool"]["pool_list"]
429
+ pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
337
430
  assert len(pool_list) == 2
338
431
 
339
432
  assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
@@ -403,7 +496,7 @@ class TestPoolWalletRpc:
403
496
  async def test_absorb_self(
404
497
  self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
405
498
  ) -> None:
406
- client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
499
+ client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
407
500
  bt = full_node_api.bt
408
501
 
409
502
  wallet = wallet_node.wallet_state_manager.main_wallet
@@ -430,19 +523,28 @@ class TestPoolWalletRpc:
430
523
  guarantee_transaction_block=True,
431
524
  )
432
525
 
433
- for block in blocks[-3:]:
434
- await full_node_api.full_node.add_block(block)
526
+ await add_blocks_in_batches(blocks[-3:], full_node_api.full_node)
435
527
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
436
528
 
437
529
  bal = await client.get_wallet_balance(2)
438
530
  assert bal["confirmed_wallet_balance"] == 2 * 1_750_000_000_000
439
531
 
440
532
  # Claim 2 * 1.75, and farm a new 1.75
441
- absorb_txs: List[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
533
+ absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
442
534
  await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs)
443
535
  await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
444
536
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
445
537
  await full_node_api.check_transactions_confirmed(wallet_node.wallet_state_manager, absorb_txs)
538
+ assert (
539
+ len(
540
+ [
541
+ tx
542
+ for tx in await wallet_node.wallet_state_manager.tx_store.get_all_transactions()
543
+ if TransactionType(tx.type) is TransactionType.INCOMING_TX and tx.amount == 1_750_000_000_000
544
+ ]
545
+ )
546
+ == 2
547
+ )
446
548
  new_status: PoolWalletInfo = (await client.pw_status(2))[0]
447
549
  assert status.current == new_status.current
448
550
  assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
@@ -450,7 +552,7 @@ class TestPoolWalletRpc:
450
552
  assert bal["confirmed_wallet_balance"] == 1 * 1_750_000_000_000
451
553
 
452
554
  # Claim another 1.75
453
- absorb_txs1: List[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
555
+ absorb_txs1: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
454
556
 
455
557
  await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs1)
456
558
 
@@ -520,8 +622,7 @@ class TestPoolWalletRpc:
520
622
  )
521
623
 
522
624
  block_count = 3
523
- for block in blocks[-block_count:]:
524
- await full_node_api.full_node.add_block(block)
625
+ await add_blocks_in_batches(blocks[-block_count:], full_node_api.full_node)
525
626
  await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
526
627
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
527
628
 
@@ -534,7 +635,7 @@ class TestPoolWalletRpc:
534
635
  assert bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
535
636
 
536
637
  # Claim
537
- absorb_txs: List[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee), 1))["transactions"]
638
+ absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee), 1))["transactions"]
538
639
  await full_node_api.process_transaction_records(records=absorb_txs)
539
640
  main_expected_confirmed_balance -= fee
540
641
  main_expected_confirmed_balance += 1_750_000_000_000
@@ -592,8 +693,7 @@ class TestPoolWalletRpc:
592
693
  )
593
694
 
594
695
  block_count = 3
595
- for block in blocks[-block_count:]:
596
- await full_node_api.full_node.add_block(block)
696
+ await add_blocks_in_batches(blocks[-block_count:], full_node_api.full_node)
597
697
  await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
598
698
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
599
699
  # Pooled plots don't have balance
@@ -603,7 +703,7 @@ class TestPoolWalletRpc:
603
703
 
604
704
  # Claim block_count * 1.75
605
705
  ret = await client.pw_absorb_rewards(2, uint64(fee))
606
- absorb_txs: List[TransactionRecord] = ret["transactions"]
706
+ absorb_txs: list[TransactionRecord] = ret["transactions"]
607
707
  if fee == 0:
608
708
  assert ret["fee_transaction"] is None
609
709
  else:
@@ -652,8 +752,7 @@ class TestPoolWalletRpc:
652
752
  block_list_input=blocks,
653
753
  guarantee_transaction_block=True,
654
754
  )
655
- for block in blocks[-2:]:
656
- await full_node_api.full_node.add_block(block)
755
+ await add_blocks_in_batches(blocks[-2:], full_node_api.full_node)
657
756
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
658
757
 
659
758
  # Absorb the farmed reward
@@ -679,8 +778,8 @@ class TestPoolWalletRpc:
679
778
  if fee != 0:
680
779
  pytest.skip("need to fix this test for non-zero fees")
681
780
 
682
- full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
683
- pool_ph = bytes32([0] * 32)
781
+ full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
782
+ pool_ph = bytes32.zeros
684
783
 
685
784
  assert wallet_node._wallet_state_manager is not None
686
785
 
@@ -715,7 +814,7 @@ class TestPoolWalletRpc:
715
814
  assert status_2.target is None
716
815
 
717
816
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
718
- join_pool: Dict[str, Any] = await client.pw_join_pool(
817
+ join_pool: dict[str, Any] = await client.pw_join_pool(
719
818
  wallet_id,
720
819
  pool_ph,
721
820
  "https://pool.example.com",
@@ -727,7 +826,7 @@ class TestPoolWalletRpc:
727
826
  assert join_pool_tx is not None
728
827
  await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx])
729
828
 
730
- join_pool_2: Dict[str, Any] = await client.pw_join_pool(
829
+ join_pool_2: dict[str, Any] = await client.pw_join_pool(
731
830
  wallet_id_2, pool_ph, "https://pool.example.com", uint32(10), uint64(fee)
732
831
  )
733
832
  assert join_pool_2["success"]
@@ -760,8 +859,8 @@ class TestPoolWalletRpc:
760
859
  @pytest.mark.anyio
761
860
  async def test_leave_pool(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
762
861
  """This tests self-pooling -> pooling -> escaping -> self pooling"""
763
- full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
764
- pool_ph = bytes32([0] * 32)
862
+ full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
863
+ pool_ph = bytes32.zeros
765
864
 
766
865
  assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
767
866
 
@@ -820,7 +919,7 @@ class TestPoolWalletRpc:
820
919
 
821
920
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
822
921
 
823
- leave_pool_tx: Dict[str, Any] = await client.pw_self_pool(wallet_id, uint64(fee))
922
+ leave_pool_tx: dict[str, Any] = await client.pw_self_pool(wallet_id, uint64(fee))
824
923
  assert leave_pool_tx["transaction"].wallet_id == wallet_id
825
924
  assert leave_pool_tx["transaction"].amount == 1
826
925
  await full_node_api.wait_transaction_records_entered_mempool(records=leave_pool_tx["transactions"])
@@ -856,80 +955,95 @@ class TestPoolWalletRpc:
856
955
  await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_self_pooling)
857
956
  assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
858
957
 
958
+ @pytest.mark.parametrize(
959
+ "wallet_environments",
960
+ [
961
+ {
962
+ "num_environments": 1,
963
+ "blocks_needed": [10],
964
+ }
965
+ ],
966
+ indirect=True,
967
+ )
859
968
  @pytest.mark.anyio
860
- async def test_change_pools(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
969
+ async def test_change_pools(
970
+ self,
971
+ fee: uint64,
972
+ wallet_environments: WalletTestFramework,
973
+ ) -> None:
861
974
  """This tests Pool A -> escaping -> Pool B"""
862
- full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
863
- pool_a_ph = bytes32([0] * 32)
864
- pool_b_ph = bytes32([0] * 32)
865
-
866
- WAIT_SECS = 200
867
- assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
868
-
869
- await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
870
-
871
- creation_tx: TransactionRecord = await client.create_new_pool_wallet(
872
- pool_a_ph, "https://pool-a.org", uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
873
- )
874
-
875
- await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
876
-
877
- await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
878
- assert not full_node_api.txs_in_mempool(txs=[creation_tx])
879
-
880
- await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
881
975
 
882
- summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
883
- assert len(summaries_response) == 1
884
- wallet_id: int = summaries_response[0]["id"]
885
- status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
886
-
887
- assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
888
- assert status.target is None
889
-
890
- async def status_is_farming_to_pool() -> bool:
891
- await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
892
- pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
893
- return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
976
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
977
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
894
978
 
895
- await time_out_assert(timeout=WAIT_SECS, function=status_is_farming_to_pool)
979
+ wallet_state_manager.config["reuse_public_key_for_change"][
980
+ str(wallet_state_manager.root_pubkey.get_fingerprint())
981
+ ] = wallet_environments.tx_config.reuse_puzhash
896
982
 
897
- pw_info: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
898
- assert pw_info.current.pool_url == "https://pool-a.org"
899
- assert pw_info.current.relative_lock_height == 5
983
+ # Create a farming plotnft to url http://pool.example.com
984
+ wallet_id = await create_new_plotnft(wallet_environments)
900
985
 
901
- await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
986
+ # Join a different pool
902
987
  join_pool_tx: TransactionRecord = (
903
- await client.pw_join_pool(
988
+ await wallet_rpc.pw_join_pool(
904
989
  wallet_id,
905
- pool_b_ph,
990
+ bytes32.zeros,
906
991
  "https://pool-b.org",
907
- uint32(10),
992
+ LOCK_HEIGHT,
908
993
  uint64(fee),
909
994
  )
910
995
  )["transaction"]
911
996
  assert join_pool_tx is not None
912
997
 
913
- async def status_is_leaving() -> bool:
914
- await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
915
- pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
916
- return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
998
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
999
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.LEAVING_POOL)
1000
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(
1001
+ count=LOCK_HEIGHT + 2, guarantee_transaction_blocks=True
1002
+ )
1003
+ await wallet_environments.full_node.wait_for_wallet_synced(
1004
+ wallet_node=wallet_environments.environments[0].node, timeout=20
1005
+ )
917
1006
 
918
- await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving)
919
- pw_info = (await client.pw_status(wallet_id))[0]
1007
+ async def farm_blocks_until_state(
1008
+ state: PoolSingletonState,
1009
+ wallet_rpc: WalletRpcClient,
1010
+ wallet_id: int,
1011
+ full_node: FullNodeSimulator,
1012
+ wallet_node: WalletNode,
1013
+ max_blocks: int = 10 * (LOCK_HEIGHT + 2),
1014
+ ) -> bool:
1015
+ block_chunk = LOCK_HEIGHT + 2
1016
+ total_blocks_farmed = 0
1017
+ while total_blocks_farmed < max_blocks:
1018
+ await full_node.farm_blocks_to_puzzlehash(count=block_chunk, guarantee_transaction_blocks=True)
1019
+ total_blocks_farmed += block_chunk
1020
+ print(f"Checking state after {total_blocks_farmed} blocks")
1021
+
1022
+ await full_node.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
1023
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
1024
+ if pw_status.current.state == state.value:
1025
+ return True
1026
+ return False
1027
+
1028
+ assert await farm_blocks_until_state(
1029
+ PoolSingletonState.FARMING_TO_POOL,
1030
+ wallet_rpc,
1031
+ wallet_id,
1032
+ wallet_environments.full_node,
1033
+ wallet_environments.environments[0].node,
1034
+ )
920
1035
 
921
- await time_out_assert(timeout=WAIT_SECS, function=status_is_farming_to_pool)
922
- pw_info = (await client.pw_status(wallet_id))[0]
923
- assert pw_info.current.pool_url == "https://pool-b.org"
924
- assert pw_info.current.relative_lock_height == 10
925
- assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
1036
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
1037
+ assert pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
1038
+ assert pw_status.current.pool_url == "https://pool-b.org"
1039
+ assert pw_status.current.relative_lock_height == LOCK_HEIGHT
926
1040
 
927
1041
  @pytest.mark.anyio
928
1042
  async def test_change_pools_reorg(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
929
1043
  """This tests Pool A -> escaping -> reorg -> escaping -> Pool B"""
930
- full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
931
- pool_a_ph = bytes32([0] * 32)
932
- pool_b_ph = bytes32([0] * 32)
1044
+ full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
1045
+ pool_a_ph = bytes32.zeros
1046
+ pool_b_ph = bytes32.zeros
933
1047
  WAIT_SECS = 30
934
1048
 
935
1049
  assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
@@ -965,7 +1079,7 @@ class TestPoolWalletRpc:
965
1079
  assert pw_info.current.pool_url == "https://pool-a.org"
966
1080
  assert pw_info.current.relative_lock_height == 5
967
1081
 
968
- join_pool_txs: List[TransactionRecord] = (
1082
+ join_pool_txs: list[TransactionRecord] = (
969
1083
  await client.pw_join_pool(
970
1084
  wallet_id,
971
1085
  pool_b_ph,
@@ -995,8 +1109,7 @@ class TestPoolWalletRpc:
995
1109
  transaction_data=next(tx.spend_bundle for tx in join_pool_txs if tx.spend_bundle is not None),
996
1110
  )
997
1111
 
998
- for block in more_blocks[-3:]:
999
- await full_node_api.full_node.add_block(block)
1112
+ await add_blocks_in_batches(more_blocks[-3:], full_node_api.full_node)
1000
1113
 
1001
1114
  await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
1002
1115