chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.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.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/daemon/server.py CHANGED
@@ -10,15 +10,15 @@ import signal
10
10
  import ssl
11
11
  import subprocess
12
12
  import sys
13
- import time
14
13
  import traceback
15
14
  import uuid
15
+ from collections.abc import AsyncIterator
16
16
  from concurrent.futures import ThreadPoolExecutor
17
17
  from contextlib import asynccontextmanager
18
18
  from enum import Enum
19
19
  from pathlib import Path
20
20
  from types import FrameType
21
- from typing import Any, AsyncIterator, Dict, List, Optional, Set, TextIO, Tuple
21
+ from typing import Any, Optional, TextIO
22
22
 
23
23
  from chia_rs import G1Element
24
24
  from typing_extensions import Protocol
@@ -44,8 +44,10 @@ from chia.util.keychain import Keychain, KeyData, passphrase_requirements, suppo
44
44
  from chia.util.lock import Lockfile, LockfileError
45
45
  from chia.util.log_exceptions import log_exceptions
46
46
  from chia.util.network import WebServer
47
+ from chia.util.safe_cancel_task import cancel_task_safe
47
48
  from chia.util.service_groups import validate_service
48
49
  from chia.util.setproctitle import setproctitle
50
+ from chia.util.task_referencer import create_referenced_task
49
51
  from chia.util.ws_message import WsRpcMessage, create_payload, format_response
50
52
  from chia.wallet.derive_keys import (
51
53
  master_pk_to_wallet_pk_unhardened,
@@ -117,16 +119,16 @@ else:
117
119
  return cmd_to_exec if cmd_to_exec is not None else service_name
118
120
 
119
121
 
120
- async def ping() -> Dict[str, Any]:
122
+ async def ping() -> dict[str, Any]:
121
123
  response = {"success": True, "value": "pong"}
122
124
  return response
123
125
 
124
126
 
125
127
  class Command(Protocol):
126
- async def __call__(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]: ...
128
+ async def __call__(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]: ...
127
129
 
128
130
 
129
- def _get_keys_by_fingerprints(fingerprints: Optional[List[uint32]]) -> Tuple[List[KeyData], Set[uint32]]:
131
+ def _get_keys_by_fingerprints(fingerprints: Optional[list[uint32]]) -> tuple[list[KeyData], set[uint32]]:
130
132
  all_keys = Keychain().get_keys(include_secrets=True)
131
133
  missing_fingerprints = set()
132
134
 
@@ -153,7 +155,7 @@ class StatusMessage:
153
155
  command: str
154
156
  destination: str
155
157
  origin: str
156
- data: Dict[str, Any]
158
+ data: dict[str, Any]
157
159
 
158
160
  def create_payload(self) -> str:
159
161
  return create_payload(command=self.command, data=self.data, origin=self.origin, destination=self.destination)
@@ -171,9 +173,9 @@ class WebSocketServer:
171
173
  ):
172
174
  self.root_path = root_path
173
175
  self.log = log
174
- self.services: Dict[str, List[subprocess.Popen]] = dict()
175
- self.plots_queue: List[Dict] = []
176
- self.connections: Dict[str, Set[WebSocketResponse]] = dict() # service name : {WebSocketResponse}
176
+ self.services: dict[str, list[subprocess.Popen]] = dict()
177
+ self.plots_queue: list[dict] = []
178
+ self.connections: dict[str, set[WebSocketResponse]] = dict() # service name : {WebSocketResponse}
177
179
  self.ping_job: Optional[asyncio.Task] = None
178
180
  self.net_config = load_config(root_path, "config.yaml")
179
181
  self.self_hostname = self.net_config["self_hostname"]
@@ -211,7 +213,7 @@ class WebSocketServer:
211
213
  ssl.OPENSSL_VERSION,
212
214
  )
213
215
 
214
- self.state_changed_task = asyncio.create_task(self._process_state_changed_queue())
216
+ self.state_changed_task = create_referenced_task(self._process_state_changed_queue())
215
217
  self.webserver = await WebServer.create(
216
218
  hostname=self.self_hostname,
217
219
  port=self.daemon_port,
@@ -240,22 +242,15 @@ class WebSocketServer:
240
242
  self.log.info("Received signal %s (%s), shutting down.", signal_.name, signal_.value)
241
243
  await self.stop()
242
244
 
243
- def cancel_task_safe(self, task: Optional[asyncio.Task]):
244
- if task is not None:
245
- try:
246
- task.cancel()
247
- except Exception as e:
248
- self.log.error(f"Error while canceling task.{e} {task}")
249
-
250
- async def stop_command(self, websocket: WebSocketResponse, request: Dict[str, Any] = {}) -> Dict[str, Any]:
245
+ async def stop_command(self, websocket: WebSocketResponse, request: dict[str, Any] = {}) -> dict[str, Any]:
251
246
  return await self.stop()
252
247
 
253
- async def stop(self) -> Dict[str, Any]:
254
- self.cancel_task_safe(self.ping_job)
255
- self.cancel_task_safe(self.state_changed_task)
248
+ async def stop(self) -> dict[str, Any]:
249
+ cancel_task_safe(self.ping_job, self.log)
250
+ cancel_task_safe(self.state_changed_task, self.log)
256
251
  service_names = list(self.services.keys())
257
252
  stop_service_jobs = [
258
- asyncio.create_task(kill_service(self.root_path, self.services, s_n)) for s_n in service_names
253
+ create_referenced_task(kill_service(self.root_path, self.services, s_n)) for s_n in service_names
259
254
  ]
260
255
  if stop_service_jobs:
261
256
  await asyncio.wait(stop_service_jobs)
@@ -330,7 +325,7 @@ class WebSocketServer:
330
325
 
331
326
  return ws
332
327
 
333
- async def send_all_responses(self, connections: Set[WebSocketResponse], response: str) -> None:
328
+ async def send_all_responses(self, connections: set[WebSocketResponse], response: str) -> None:
334
329
  for connection in connections.copy():
335
330
  try:
336
331
  await connection.send_str(response)
@@ -348,7 +343,7 @@ class WebSocketServer:
348
343
 
349
344
  await connection.close()
350
345
 
351
- def remove_connection(self, websocket: WebSocketResponse) -> List[str]:
346
+ def remove_connection(self, websocket: WebSocketResponse) -> list[str]:
352
347
  """Returns a list of service names from which the connection was removed"""
353
348
  service_names = []
354
349
  for service_name, connections in self.connections.items():
@@ -396,7 +391,7 @@ class WebSocketServer:
396
391
 
397
392
  async def handle_message(
398
393
  self, websocket: WebSocketResponse, message: WsRpcMessage
399
- ) -> Optional[Tuple[str, Set[WebSocketResponse]]]:
394
+ ) -> Optional[tuple[str, set[WebSocketResponse]]]:
400
395
  """
401
396
  This function gets called when new message is received via websocket.
402
397
  """
@@ -437,7 +432,7 @@ class WebSocketServer:
437
432
  full_response = format_response(message, response)
438
433
  return full_response, {websocket}
439
434
 
440
- def get_command_mapping(self) -> Dict[str, Command]:
435
+ def get_command_mapping(self) -> dict[str, Command]:
441
436
  """
442
437
  Returns a mapping of commands to their respective function calls.
443
438
  """
@@ -465,11 +460,11 @@ class WebSocketServer:
465
460
  "get_network_info": self.get_network_info,
466
461
  }
467
462
 
468
- async def get_network_info(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
463
+ async def get_network_info(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
469
464
  network_name = self.net_config["selected_network"]
470
465
  address_prefix = self.net_config["network_overrides"]["config"][network_name]["address_prefix"]
471
466
  genesis_challenge = self.net_config["network_overrides"]["constants"][network_name]["GENESIS_CHALLENGE"]
472
- response: Dict[str, Any] = {
467
+ response: dict[str, Any] = {
473
468
  "success": True,
474
469
  "network_name": network_name,
475
470
  "network_prefix": address_prefix,
@@ -477,22 +472,22 @@ class WebSocketServer:
477
472
  }
478
473
  return response
479
474
 
480
- async def is_keyring_locked(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
475
+ async def is_keyring_locked(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
481
476
  locked: bool = Keychain.is_keyring_locked()
482
- response: Dict[str, Any] = {"success": True, "is_keyring_locked": locked}
477
+ response: dict[str, Any] = {"success": True, "is_keyring_locked": locked}
483
478
  return response
484
479
 
485
- async def keyring_status_command(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
480
+ async def keyring_status_command(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
486
481
  return await self.keyring_status()
487
482
 
488
- async def keyring_status(self) -> Dict[str, Any]:
483
+ async def keyring_status(self) -> dict[str, Any]:
489
484
  can_save_passphrase: bool = supports_os_passphrase_storage()
490
485
  user_passphrase_is_set: bool = Keychain.has_master_passphrase() and not using_default_passphrase()
491
486
  locked: bool = Keychain.is_keyring_locked()
492
487
  can_set_passphrase_hint: bool = True
493
488
  passphrase_hint: str = Keychain.get_master_passphrase_hint() or ""
494
- requirements: Dict[str, Any] = passphrase_requirements()
495
- response: Dict[str, Any] = {
489
+ requirements: dict[str, Any] = passphrase_requirements()
490
+ response: dict[str, Any] = {
496
491
  "success": True,
497
492
  "is_keyring_locked": locked,
498
493
  "can_save_passphrase": can_save_passphrase,
@@ -505,7 +500,7 @@ class WebSocketServer:
505
500
  self.log.debug(f"Keyring status: {response}")
506
501
  return response
507
502
 
508
- async def unlock_keyring(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
503
+ async def unlock_keyring(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
509
504
  success: bool = False
510
505
  error: Optional[str] = None
511
506
  key: Optional[str] = request.get("key", None)
@@ -534,14 +529,14 @@ class WebSocketServer:
534
529
  tb = traceback.format_exc()
535
530
  self.log.error(f"check_keys failed after unlocking keyring: {e} {tb}")
536
531
 
537
- response: Dict[str, Any] = {"success": success, "error": error}
532
+ response: dict[str, Any] = {"success": success, "error": error}
538
533
  return response
539
534
 
540
535
  async def validate_keyring_passphrase(
541
536
  self,
542
537
  websocket: WebSocketResponse,
543
- request: Dict[str, Any],
544
- ) -> Dict[str, Any]:
538
+ request: dict[str, Any],
539
+ ) -> dict[str, Any]:
545
540
  success: bool = False
546
541
  error: Optional[str] = None
547
542
  key: Optional[str] = request.get("key", None)
@@ -555,10 +550,10 @@ class WebSocketServer:
555
550
  self.log.error(f"Keyring passphrase validation failed: {e} {tb}")
556
551
  error = "validation exception"
557
552
 
558
- response: Dict[str, Any] = {"success": success, "error": error}
553
+ response: dict[str, Any] = {"success": success, "error": error}
559
554
  return response
560
555
 
561
- async def set_keyring_passphrase(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
556
+ async def set_keyring_passphrase(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
562
557
  success: bool = False
563
558
  error: Optional[str] = None
564
559
  current_passphrase: Optional[str] = None
@@ -599,10 +594,10 @@ class WebSocketServer:
599
594
  # Inform the GUI of keyring status changes
600
595
  self.keyring_status_changed(await self.keyring_status(), "wallet_ui")
601
596
 
602
- response: Dict[str, Any] = {"success": success, "error": error}
597
+ response: dict[str, Any] = {"success": success, "error": error}
603
598
  return response
604
599
 
605
- async def remove_keyring_passphrase(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
600
+ async def remove_keyring_passphrase(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
606
601
  success: bool = False
607
602
  error: Optional[str] = None
608
603
  current_passphrase: Optional[str] = None
@@ -626,28 +621,28 @@ class WebSocketServer:
626
621
  # Inform the GUI of keyring status changes
627
622
  self.keyring_status_changed(await self.keyring_status(), "wallet_ui")
628
623
 
629
- response: Dict[str, Any] = {"success": success, "error": error}
624
+ response: dict[str, Any] = {"success": success, "error": error}
630
625
  return response
631
626
 
632
- async def get_status(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
627
+ async def get_status(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
633
628
  response = {"success": True, "genesis_initialized": True}
634
629
  return response
635
630
 
636
- async def get_version(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
631
+ async def get_version(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
637
632
  response = {"success": True, "version": __version__}
638
633
  return response
639
634
 
640
- async def get_plotters(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
641
- plotters: Dict[str, Any] = get_available_plotters(self.root_path)
642
- response: Dict[str, Any] = {"success": True, "plotters": plotters}
635
+ async def get_plotters(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
636
+ plotters: dict[str, Any] = get_available_plotters(self.root_path)
637
+ response: dict[str, Any] = {"success": True, "plotters": plotters}
643
638
  return response
644
639
 
645
- async def get_routes(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
640
+ async def get_routes(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
646
641
  routes = list(self.get_command_mapping().keys())
647
- response: Dict[str, Any] = {"success": True, "routes": routes}
642
+ response: dict[str, Any] = {"success": True, "routes": routes}
648
643
  return response
649
644
 
650
- async def get_wallet_addresses(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
645
+ async def get_wallet_addresses(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
651
646
  fingerprints = request.get("fingerprints", None)
652
647
  keys, missing_fingerprints = _get_keys_by_fingerprints(fingerprints)
653
648
  if len(missing_fingerprints) > 0:
@@ -684,16 +679,16 @@ class WebSocketServer:
684
679
 
685
680
  wallet_addresses_by_fingerprint[key.fingerprint] = address_entries
686
681
 
687
- response: Dict[str, Any] = {"success": True, "wallet_addresses": wallet_addresses_by_fingerprint}
682
+ response: dict[str, Any] = {"success": True, "wallet_addresses": wallet_addresses_by_fingerprint}
688
683
  return response
689
684
 
690
- async def get_keys_for_plotting(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
685
+ async def get_keys_for_plotting(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
691
686
  fingerprints = request.get("fingerprints", None)
692
687
  keys, missing_fingerprints = _get_keys_by_fingerprints(fingerprints)
693
688
  if len(missing_fingerprints) > 0:
694
689
  return {"success": False, "error": f"key(s) not found for fingerprint(s) {missing_fingerprints}"}
695
690
 
696
- keys_for_plot: Dict[uint32, Any] = {}
691
+ keys_for_plot: dict[uint32, Any] = {}
697
692
  for key in keys:
698
693
  if key.secrets is None:
699
694
  continue
@@ -704,13 +699,13 @@ class WebSocketServer:
704
699
  "farmer_public_key": bytes(farmer_public_key).hex(),
705
700
  "pool_public_key": bytes(pool_public_key).hex(),
706
701
  }
707
- response: Dict[str, Any] = {
702
+ response: dict[str, Any] = {
708
703
  "success": True,
709
704
  "keys": keys_for_plot,
710
705
  }
711
706
  return response
712
707
 
713
- def plot_queue_to_payload(self, plot_queue_item, send_full_log: bool) -> Dict[str, Any]:
708
+ def plot_queue_to_payload(self, plot_queue_item, send_full_log: bool) -> dict[str, Any]:
714
709
  error = plot_queue_item.get("error")
715
710
  has_error = error is not None
716
711
 
@@ -737,7 +732,7 @@ class WebSocketServer:
737
732
  }
738
733
  return message
739
734
 
740
- def extract_plot_queue(self, id=None) -> List[Dict]:
735
+ def extract_plot_queue(self, id=None) -> list[dict]:
741
736
  send_full_log = id is None
742
737
  data = []
743
738
  for item in self.plots_queue:
@@ -778,14 +773,14 @@ class WebSocketServer:
778
773
  websockets.remove(websocket)
779
774
  await websocket.close()
780
775
 
781
- def state_changed(self, service: str, message: Dict[str, Any]) -> None:
776
+ def state_changed(self, service: str, message: dict[str, Any]) -> None:
782
777
  self.state_changed_msg_queue.put_nowait(
783
778
  StatusMessage(
784
779
  service=service, command="state_changed", destination="wallet_ui", origin=service, data=message
785
780
  )
786
781
  )
787
782
 
788
- def keyring_status_changed(self, keyring_status: Dict[str, Any], destination: str) -> None:
783
+ def keyring_status_changed(self, keyring_status: dict[str, Any], destination: str) -> None:
789
784
  self.state_changed_msg_queue.put_nowait(
790
785
  StatusMessage(
791
786
  service="wallet_ui",
@@ -799,7 +794,7 @@ class WebSocketServer:
799
794
  async def _watch_file_changes(self, config, fp: TextIO, loop: asyncio.AbstractEventLoop):
800
795
  id: str = config["id"]
801
796
  plotter: str = config["plotter"]
802
- final_words: List[str] = []
797
+ final_words: list[str] = []
803
798
 
804
799
  if plotter == "chiapos":
805
800
  final_words = ["Renamed final file"]
@@ -824,7 +819,7 @@ class WebSocketServer:
824
819
  if config["state"] is not PlotState.RUNNING:
825
820
  return None
826
821
 
827
- if new_data not in (None, ""):
822
+ if new_data not in {None, ""}:
828
823
  config["log"] = new_data if config["log"] is None else config["log"] + new_data
829
824
  config["log_new"] = new_data
830
825
  self.state_changed(service_plotter, self.prepare_plot_state_message(PlotEvent.LOG_CHANGED, id))
@@ -834,14 +829,14 @@ class WebSocketServer:
834
829
  if word in new_data:
835
830
  return None
836
831
  else:
837
- time.sleep(0.5)
832
+ await asyncio.sleep(0.5)
838
833
 
839
834
  async def _track_plotting_progress(self, config, loop: asyncio.AbstractEventLoop):
840
835
  file_path = config["out_file"]
841
836
  with open(file_path) as fp:
842
837
  await self._watch_file_changes(config, fp, loop)
843
838
 
844
- def _common_plotting_command_args(self, request: Any, ignoreCount: bool) -> List[str]:
839
+ def _common_plotting_command_args(self, request: Any, ignoreCount: bool) -> list[str]:
845
840
  n = 1 if ignoreCount else request["n"] # Plot count
846
841
  d = request["d"] # Final directory
847
842
  r = request["r"] # Threads
@@ -849,7 +844,7 @@ class WebSocketServer:
849
844
  p = request.get("p") # Pool pubkey
850
845
  c = request.get("c") # Pool contract address
851
846
 
852
- command_args: List[str] = ["-n", str(n), "-d", d, "-r", str(r)]
847
+ command_args: list[str] = ["-n", str(n), "-d", d, "-r", str(r)]
853
848
 
854
849
  if f is not None:
855
850
  command_args.append("-f")
@@ -863,7 +858,7 @@ class WebSocketServer:
863
858
 
864
859
  return command_args
865
860
 
866
- def _chiapos_plotting_command_args(self, request: Any, ignoreCount: bool) -> List[str]:
861
+ def _chiapos_plotting_command_args(self, request: Any, ignoreCount: bool) -> list[str]:
867
862
  k = request["k"] # Plot size
868
863
  t = request["t"] # Temp directory
869
864
  t2 = request.get("t2") # Temp2 directory
@@ -874,7 +869,7 @@ class WebSocketServer:
874
869
  x = request["x"] # Exclude final directory
875
870
  override_k = request["overrideK"] # Force plot sizes < k32
876
871
 
877
- command_args: List[str] = ["-k", str(k), "-t", t, "-b", str(b), "-u", str(u)]
872
+ command_args: list[str] = ["-k", str(k), "-t", t, "-b", str(b), "-u", str(u)]
878
873
 
879
874
  if t2 is not None:
880
875
  command_args.append("-2")
@@ -891,12 +886,12 @@ class WebSocketServer:
891
886
 
892
887
  return command_args
893
888
 
894
- def _bladebit_plotting_command_args(self, request: Any, ignoreCount: bool) -> List[str]:
889
+ def _bladebit_plotting_command_args(self, request: Any, ignoreCount: bool) -> list[str]:
895
890
  plot_type = request["plot_type"]
896
- if plot_type not in ["ramplot", "diskplot", "cudaplot"]:
891
+ if plot_type not in {"ramplot", "diskplot", "cudaplot"}:
897
892
  raise ValueError(f"Unknown plot_type: {plot_type}")
898
893
 
899
- command_args: List[str] = []
894
+ command_args: list[str] = []
900
895
 
901
896
  # Common options among diskplot, ramplot, cudaplot
902
897
  w = request.get("w", False) # Warm start
@@ -991,7 +986,7 @@ class WebSocketServer:
991
986
 
992
987
  return command_args
993
988
 
994
- def _madmax_plotting_command_args(self, request: Any, ignoreCount: bool, index: int) -> List[str]:
989
+ def _madmax_plotting_command_args(self, request: Any, ignoreCount: bool, index: int) -> list[str]:
995
990
  k = request["k"] # Plot size
996
991
  t = request["t"] # Temp directory
997
992
  t2 = request["t2"] # Temp2 directory
@@ -1000,7 +995,7 @@ class WebSocketServer:
1000
995
  K = request.get("K", 1) # Thread multiplier for phase 2
1001
996
  G = request.get("G", False) # Alternate tmpdir/tmp2dir
1002
997
 
1003
- command_args: List[str] = []
998
+ command_args: list[str] = []
1004
999
  command_args.append(f"-k{k}")
1005
1000
  command_args.append(f"-u{u}")
1006
1001
  command_args.append(f"-v{v}")
@@ -1017,15 +1012,15 @@ class WebSocketServer:
1017
1012
 
1018
1013
  return command_args
1019
1014
 
1020
- def _build_plotting_command_args(self, request: Any, ignoreCount: bool, index: int) -> List[str]:
1015
+ def _build_plotting_command_args(self, request: Any, ignoreCount: bool, index: int) -> list[str]:
1021
1016
  plotter: str = request.get("plotter", "chiapos")
1022
- command_args: List[str] = ["chia", "plotters", plotter]
1017
+ command_args: list[str] = ["chia", "plotters", plotter]
1023
1018
 
1024
1019
  if plotter == "bladebit":
1025
1020
  # plotter command must be either
1026
1021
  # 'chia plotters bladebit ramplot' or 'chia plotters bladebit diskplot'
1027
1022
  plot_type = request["plot_type"]
1028
- assert plot_type == "diskplot" or plot_type == "ramplot" or plot_type == "cudaplot"
1023
+ assert plot_type in {"diskplot", "ramplot", "cudaplot"}
1029
1024
  command_args.append(plot_type)
1030
1025
 
1031
1026
  command_args.extend(self._common_plotting_command_args(request, ignoreCount))
@@ -1062,9 +1057,9 @@ class WebSocketServer:
1062
1057
  break
1063
1058
 
1064
1059
  if next_plot_id is not None:
1065
- loop.create_task(self._start_plotting(next_plot_id, loop, queue))
1060
+ create_referenced_task(self._start_plotting(next_plot_id, loop, queue))
1066
1061
 
1067
- def _post_process_plotting_job(self, job: Dict[str, Any]):
1062
+ def _post_process_plotting_job(self, job: dict[str, Any]):
1068
1063
  id: str = job["id"]
1069
1064
  final_dir: str = job["final_dir"]
1070
1065
  exclude_final_dir: bool = job["exclude_final_dir"]
@@ -1104,7 +1099,7 @@ class WebSocketServer:
1104
1099
 
1105
1100
  self.log.debug(f"command_args before launch_plotter are {command_args}")
1106
1101
  self.log.debug(f"self.root_path before launch_plotter is {self.root_path}")
1107
- process, pid_path = launch_plotter(self.root_path, service_name, command_args, id)
1102
+ process, _pid_path = launch_plotter(self.root_path, service_name, command_args, id)
1108
1103
 
1109
1104
  current_process = process
1110
1105
 
@@ -1137,11 +1132,14 @@ class WebSocketServer:
1137
1132
 
1138
1133
  finally:
1139
1134
  if current_process is not None:
1140
- self.services[service_name].remove(current_process)
1135
+ try:
1136
+ self.services[service_name].remove(current_process)
1137
+ except KeyError:
1138
+ pass
1141
1139
  current_process.wait() # prevent zombies
1142
1140
  self._run_next_serial_plotting(loop, queue)
1143
1141
 
1144
- async def start_plotting(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
1142
+ async def start_plotting(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
1145
1143
  service_name = request["service"]
1146
1144
 
1147
1145
  plotter = request.get("plotter", "chiapos")
@@ -1162,7 +1160,7 @@ class WebSocketServer:
1162
1160
  }
1163
1161
  return response
1164
1162
 
1165
- ids: List[str] = []
1163
+ ids: list[str] = []
1166
1164
  for k in range(count):
1167
1165
  id = str(uuid.uuid4())
1168
1166
  ids.append(id)
@@ -1197,7 +1195,8 @@ class WebSocketServer:
1197
1195
  log.info(f"Plotting will start in {config['delay']} seconds")
1198
1196
  # TODO: loop gets passed down a lot, review for potential removal
1199
1197
  loop = asyncio.get_running_loop()
1200
- loop.create_task(self._start_plotting(id, loop, queue))
1198
+ # TODO: stop dropping tasks on the floor
1199
+ create_referenced_task(self._start_plotting(id, loop, queue))
1201
1200
  else:
1202
1201
  log.info("Plotting will start automatically when previous plotting finish")
1203
1202
 
@@ -1209,7 +1208,7 @@ class WebSocketServer:
1209
1208
 
1210
1209
  return response
1211
1210
 
1212
- async def stop_plotting(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
1211
+ async def stop_plotting(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
1213
1212
  id = request["id"]
1214
1213
  config = self._get_plots_queue_item(id)
1215
1214
  if config is None:
@@ -1251,7 +1250,7 @@ class WebSocketServer:
1251
1250
  self.state_changed(service_plotter, self.prepare_plot_state_message(PlotEvent.STATE_CHANGED, id))
1252
1251
  return {"success": False}
1253
1252
 
1254
- async def start_service(self, websocket: WebSocketResponse, request: Dict[str, Any]):
1253
+ async def start_service(self, websocket: WebSocketResponse, request: dict[str, Any]):
1255
1254
  service_command = request["service"]
1256
1255
 
1257
1256
  error = None
@@ -1285,7 +1284,7 @@ class WebSocketServer:
1285
1284
  exe_command = service_command
1286
1285
  if testing is True:
1287
1286
  exe_command = f"{service_command} --testing=true"
1288
- process, pid_path = launch_service(self.root_path, exe_command)
1287
+ process, _pid_path = launch_service(self.root_path, exe_command)
1289
1288
  self.services[service_command] = [process]
1290
1289
  success = True
1291
1290
  except (subprocess.SubprocessError, OSError):
@@ -1295,14 +1294,14 @@ class WebSocketServer:
1295
1294
  response = {"success": success, "service": service_command, "error": error}
1296
1295
  return response
1297
1296
 
1298
- async def stop_service(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
1297
+ async def stop_service(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
1299
1298
  service_name = request["service"]
1300
1299
  result = await kill_service(self.root_path, self.services, service_name)
1301
1300
  response = {"success": result, "service_name": service_name}
1302
1301
  return response
1303
1302
 
1304
1303
  def is_service_running(self, service_name: str) -> bool:
1305
- processes: List[subprocess.Popen]
1304
+ processes: list[subprocess.Popen]
1306
1305
  if service_name == service_plotter:
1307
1306
  processes = self.services.get(service_name, [])
1308
1307
  is_running = len(processes) > 0
@@ -1317,19 +1316,19 @@ class WebSocketServer:
1317
1316
  is_running = len(service_connections) > 0
1318
1317
  return is_running
1319
1318
 
1320
- async def running_services_command(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
1319
+ async def running_services_command(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
1321
1320
  return await self.running_services()
1322
1321
 
1323
- async def running_services(self) -> Dict[str, Any]:
1322
+ async def running_services(self) -> dict[str, Any]:
1324
1323
  services = list({*self.services.keys(), *self.connections.keys()})
1325
1324
  running_services = [service_name for service_name in services if self.is_service_running(service_name)]
1326
1325
 
1327
1326
  return {"success": True, "running_services": running_services}
1328
1327
 
1329
- async def is_running_command(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
1328
+ async def is_running_command(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
1330
1329
  return await self.is_running(request=request)
1331
1330
 
1332
- async def is_running(self, request: Dict[str, Any]) -> Dict[str, Any]:
1331
+ async def is_running(self, request: dict[str, Any]) -> dict[str, Any]:
1333
1332
  service_name = request["service"]
1334
1333
  is_running = self.is_service_running(service_name)
1335
1334
  return {"success": True, "service_name": service_name, "is_running": is_running}
@@ -1340,7 +1339,7 @@ class WebSocketServer:
1340
1339
  await self.webserver.await_closed()
1341
1340
  log.info("chia daemon exiting")
1342
1341
 
1343
- async def register_service(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]:
1342
+ async def register_service(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
1344
1343
  self.log.info(f"Register service {request}")
1345
1344
  service = request.get("service")
1346
1345
  if service is None:
@@ -1350,7 +1349,7 @@ class WebSocketServer:
1350
1349
  self.connections[service] = set()
1351
1350
  self.connections[service].add(websocket)
1352
1351
 
1353
- response: Dict[str, Any] = {"success": True}
1352
+ response: dict[str, Any] = {"success": True}
1354
1353
  if service == service_plotter:
1355
1354
  response = {
1356
1355
  "success": True,
@@ -1359,7 +1358,7 @@ class WebSocketServer:
1359
1358
  }
1360
1359
  else:
1361
1360
  if self.ping_job is None:
1362
- self.ping_job = asyncio.create_task(self.ping_task())
1361
+ self.ping_job = create_referenced_task(self.ping_task())
1363
1362
  self.log.info(f"registered for service {service}")
1364
1363
  log.info(f"{response}")
1365
1364
  return response
@@ -1394,8 +1393,8 @@ def plotter_log_path(root_path: Path, id: str):
1394
1393
 
1395
1394
 
1396
1395
  def launch_plotter(
1397
- root_path: Path, service_name: str, service_array: List[str], id: str
1398
- ) -> Tuple[subprocess.Popen, Path]:
1396
+ root_path: Path, service_name: str, service_array: list[str], id: str
1397
+ ) -> tuple[subprocess.Popen, Path]:
1399
1398
  # we need to pass on the possibly altered CHIA_ROOT
1400
1399
  os.environ["CHIA_ROOT"] = str(root_path)
1401
1400
  service_executable = executable_for_service(service_array[0])
@@ -1438,7 +1437,7 @@ def launch_plotter(
1438
1437
  return process, pid_path
1439
1438
 
1440
1439
 
1441
- def launch_service(root_path: Path, service_command) -> Tuple[subprocess.Popen, Path]:
1440
+ def launch_service(root_path: Path, service_command) -> tuple[subprocess.Popen, Path]:
1442
1441
  """
1443
1442
  Launch a child process.
1444
1443
  """
@@ -1482,7 +1481,7 @@ def launch_service(root_path: Path, service_command) -> Tuple[subprocess.Popen,
1482
1481
 
1483
1482
 
1484
1483
  async def kill_processes(
1485
- processes: List[subprocess.Popen],
1484
+ processes: list[subprocess.Popen],
1486
1485
  root_path: Path,
1487
1486
  service_name: str,
1488
1487
  id: str,
@@ -1526,7 +1525,7 @@ async def kill_processes(
1526
1525
 
1527
1526
 
1528
1527
  async def kill_service(
1529
- root_path: Path, services: Dict[str, List[subprocess.Popen]], service_name: str, delay_before_kill: int = 15
1528
+ root_path: Path, services: dict[str, list[subprocess.Popen]], service_name: str, delay_before_kill: int = 15
1530
1529
  ) -> bool:
1531
1530
  processes = services.get(service_name)
1532
1531
  if processes is None:
@@ -1536,7 +1535,7 @@ async def kill_service(
1536
1535
  return result
1537
1536
 
1538
1537
 
1539
- def is_running(services: Dict[str, subprocess.Popen], service_name: str) -> bool:
1538
+ def is_running(services: dict[str, subprocess.Popen], service_name: str) -> bool:
1540
1539
  process = services.get(service_name)
1541
1540
  return process is not None and process.poll() is None
1542
1541
 
@@ -1547,23 +1546,12 @@ async def async_run_daemon(root_path: Path, wait_for_unlock: bool = False) -> in
1547
1546
  chia_init(root_path, should_check_keys=(not wait_for_unlock))
1548
1547
  config = load_config(root_path, "config.yaml")
1549
1548
  setproctitle("chia_daemon")
1550
- initialize_service_logging("daemon", config)
1549
+ initialize_service_logging("daemon", config, root_path=root_path)
1551
1550
  crt_path = root_path / config["daemon_ssl"]["private_crt"]
1552
1551
  key_path = root_path / config["daemon_ssl"]["private_key"]
1553
1552
  ca_crt_path = root_path / config["private_ssl_ca"]["crt"]
1554
1553
  ca_key_path = root_path / config["private_ssl_ca"]["key"]
1555
1554
  sys.stdout.flush()
1556
- json_msg = dict_to_json_str(
1557
- {
1558
- "message": "cert_path",
1559
- "success": True,
1560
- "cert": f"{crt_path}",
1561
- "key": f"{key_path}",
1562
- "ca_crt": f"{ca_crt_path}",
1563
- }
1564
- )
1565
- sys.stdout.write("\n" + json_msg + "\n")
1566
- sys.stdout.flush()
1567
1555
  try:
1568
1556
  with Lockfile.create(daemon_launch_lock_path(root_path), timeout=1):
1569
1557
  log.info(f"chia-blockchain version: {chia_short_version()}")
@@ -1605,11 +1593,13 @@ def run_daemon(root_path: Path, wait_for_unlock: bool = False) -> int:
1605
1593
 
1606
1594
 
1607
1595
  def main() -> int:
1608
- from chia.util.default_root import DEFAULT_ROOT_PATH
1596
+ from chia.util.default_root import resolve_root_path
1609
1597
  from chia.util.keychain import Keychain
1610
1598
 
1599
+ root_path = resolve_root_path(override=None)
1600
+
1611
1601
  wait_for_unlock = "--wait-for-unlock" in sys.argv[1:] and Keychain.is_keyring_locked()
1612
- return run_daemon(DEFAULT_ROOT_PATH, wait_for_unlock)
1602
+ return run_daemon(root_path, wait_for_unlock)
1613
1603
 
1614
1604
 
1615
1605
  if __name__ == "__main__":