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
@@ -4,7 +4,7 @@ import asyncio
4
4
  import logging
5
5
  import time
6
6
  from pathlib import Path
7
- from typing import List, Optional, Tuple
7
+ from typing import TYPE_CHECKING, ClassVar, Optional, cast
8
8
 
9
9
  from chia_rs import AugSchemeMPL, G1Element, G2Element
10
10
 
@@ -15,6 +15,7 @@ from chia.protocols import harvester_protocol
15
15
  from chia.protocols.farmer_protocol import FarmingInfo
16
16
  from chia.protocols.harvester_protocol import Plot, PlotSyncResponse
17
17
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
18
+ from chia.server.api_protocol import ApiMetadata
18
19
  from chia.server.outbound_message import Message, make_msg
19
20
  from chia.server.ws_connection import WSChiaConnection
20
21
  from chia.types.blockchain_format.proof_of_space import (
@@ -24,14 +25,19 @@ from chia.types.blockchain_format.proof_of_space import (
24
25
  passes_plot_filter,
25
26
  )
26
27
  from chia.types.blockchain_format.sized_bytes import bytes32
27
- from chia.util.api_decorators import api_request
28
28
  from chia.util.ints import uint8, uint32, uint64
29
29
  from chia.wallet.derive_keys import master_sk_to_local_sk
30
30
 
31
31
 
32
32
  class HarvesterAPI:
33
+ if TYPE_CHECKING:
34
+ from chia.server.api_protocol import ApiProtocol
35
+
36
+ _protocol_check: ClassVar[ApiProtocol] = cast("HarvesterAPI", None)
37
+
33
38
  log: logging.Logger
34
39
  harvester: Harvester
40
+ metadata: ClassVar[ApiMetadata] = ApiMetadata()
35
41
 
36
42
  def __init__(self, harvester: Harvester):
37
43
  self.log = logging.getLogger(__name__)
@@ -40,7 +46,7 @@ class HarvesterAPI:
40
46
  def ready(self) -> bool:
41
47
  return True
42
48
 
43
- @api_request(peer_required=True)
49
+ @metadata.request(peer_required=True)
44
50
  async def harvester_handshake(
45
51
  self, harvester_handshake: harvester_protocol.HarvesterHandshake, peer: WSChiaConnection
46
52
  ) -> None:
@@ -56,7 +62,7 @@ class HarvesterAPI:
56
62
  await self.harvester.plot_sync_sender.start()
57
63
  self.harvester.plot_manager.start_refreshing()
58
64
 
59
- @api_request(peer_required=True)
65
+ @metadata.request(peer_required=True)
60
66
  async def new_signage_point_harvester(
61
67
  self, new_challenge: harvester_protocol.NewSignagePointHarvester, peer: WSChiaConnection
62
68
  ) -> None:
@@ -87,7 +93,7 @@ class HarvesterAPI:
87
93
 
88
94
  loop = asyncio.get_running_loop()
89
95
 
90
- def blocking_lookup(filename: Path, plot_info: PlotInfo) -> List[Tuple[bytes32, ProofOfSpace]]:
96
+ def blocking_lookup(filename: Path, plot_info: PlotInfo) -> list[tuple[bytes32, ProofOfSpace]]:
91
97
  # Uses the DiskProver object to lookup qualities. This is a blocking call,
92
98
  # so it should be run in a thread pool.
93
99
  try:
@@ -123,7 +129,7 @@ class HarvesterAPI:
123
129
  )
124
130
  return []
125
131
 
126
- responses: List[Tuple[bytes32, ProofOfSpace]] = []
132
+ responses: list[tuple[bytes32, ProofOfSpace]] = []
127
133
  if quality_strings is not None:
128
134
  difficulty = new_challenge.difficulty
129
135
  sub_slot_iters = new_challenge.sub_slot_iters
@@ -205,12 +211,12 @@ class HarvesterAPI:
205
211
 
206
212
  async def lookup_challenge(
207
213
  filename: Path, plot_info: PlotInfo
208
- ) -> Tuple[Path, List[harvester_protocol.NewProofOfSpace]]:
214
+ ) -> tuple[Path, list[harvester_protocol.NewProofOfSpace]]:
209
215
  # Executes a DiskProverLookup in a thread pool, and returns responses
210
- all_responses: List[harvester_protocol.NewProofOfSpace] = []
216
+ all_responses: list[harvester_protocol.NewProofOfSpace] = []
211
217
  if self.harvester._shut_down:
212
218
  return filename, []
213
- proofs_of_space_and_q: List[Tuple[bytes32, ProofOfSpace]] = await loop.run_in_executor(
219
+ proofs_of_space_and_q: list[tuple[bytes32, ProofOfSpace]] = await loop.run_in_executor(
214
220
  self.harvester.executor, blocking_lookup, filename, plot_info
215
221
  )
216
222
  for quality_str, proof_of_space in proofs_of_space_and_q:
@@ -296,7 +302,7 @@ class HarvesterAPI:
296
302
  },
297
303
  )
298
304
 
299
- @api_request(reply_types=[ProtocolMessageTypes.respond_signatures])
305
+ @metadata.request(reply_types=[ProtocolMessageTypes.respond_signatures])
300
306
  async def request_signatures(self, request: harvester_protocol.RequestSignatures) -> Optional[Message]:
301
307
  """
302
308
  The farmer requests a signature on the header hash, for one of the proofs that we found.
@@ -329,7 +335,7 @@ class HarvesterAPI:
329
335
 
330
336
  # This is only a partial signature. When combined with the farmer's half, it will
331
337
  # form a complete PrependSignature.
332
- message_signatures: List[Tuple[bytes32, G2Element]] = []
338
+ message_signatures: list[tuple[bytes32, G2Element]] = []
333
339
  for message in request.messages:
334
340
  signature: G2Element = AugSchemeMPL.sign(local_sk, message, agg_pk)
335
341
  message_signatures.append((message, signature))
@@ -347,7 +353,7 @@ class HarvesterAPI:
347
353
 
348
354
  return make_msg(ProtocolMessageTypes.respond_signatures, response)
349
355
 
350
- @api_request()
356
+ @metadata.request()
351
357
  async def request_plots(self, _: harvester_protocol.RequestPlots) -> Message:
352
358
  plots_response = []
353
359
  plots, failed_to_open_filenames, no_key_filenames = self.harvester.get_plots()
@@ -369,6 +375,6 @@ class HarvesterAPI:
369
375
  response = harvester_protocol.RespondPlots(plots_response, failed_to_open_filenames, no_key_filenames)
370
376
  return make_msg(ProtocolMessageTypes.respond_plots, response)
371
377
 
372
- @api_request()
378
+ @metadata.request()
373
379
  async def plot_sync_response(self, response: PlotSyncResponse) -> None:
374
380
  self.harvester.plot_sync_sender.set_response(response)
@@ -4,7 +4,8 @@ import asyncio
4
4
  import contextlib
5
5
  import logging
6
6
  import time
7
- from typing import TYPE_CHECKING, Any, AsyncIterator, ClassVar, Dict, List, Optional, cast
7
+ from collections.abc import AsyncIterator
8
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
8
9
 
9
10
  from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
10
11
  from chia.server.introducer_peers import VettedPeer
@@ -12,6 +13,7 @@ from chia.server.outbound_message import NodeType
12
13
  from chia.server.server import ChiaServer
13
14
  from chia.server.ws_connection import WSChiaConnection
14
15
  from chia.util.ints import uint64
16
+ from chia.util.task_referencer import create_referenced_task
15
17
 
16
18
 
17
19
  class Introducer:
@@ -38,7 +40,7 @@ class Introducer:
38
40
 
39
41
  @contextlib.asynccontextmanager
40
42
  async def manage(self) -> AsyncIterator[None]:
41
- self._vetting_task = asyncio.create_task(self._vetting_loop())
43
+ self._vetting_task = create_referenced_task(self._vetting_loop())
42
44
  try:
43
45
  yield
44
46
  finally:
@@ -53,7 +55,7 @@ class Introducer:
53
55
  # TODO: fill this out?
54
56
  pass
55
57
 
56
- def get_connections(self, request_node_type: Optional[NodeType]) -> List[Dict[str, Any]]:
58
+ def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
57
59
  return default_get_connections(server=self.server, request_node_type=request_node_type)
58
60
 
59
61
  def set_server(self, server: ChiaServer):
@@ -99,13 +101,13 @@ class Introducer:
99
101
  peer.last_attempt = uint64(time.time())
100
102
 
101
103
  self.log.info(f"Vetting peer {peer.host} {peer.port}")
102
- r, w = await asyncio.wait_for(
104
+ _r, w = await asyncio.wait_for(
103
105
  asyncio.open_connection(peer.host, int(peer.port)),
104
106
  timeout=3,
105
107
  )
106
108
  w.close()
107
109
  except Exception as e:
108
- self.log.warning(f"Could not vet {peer}, removing. {type(e)}{str(e)}")
110
+ self.log.warning(f"Could not vet {peer}, removing. {type(e)}{e!s}")
109
111
  peer.vetted = min(peer.vetted - 1, -1)
110
112
 
111
113
  # if we have failed 6 times in a row, remove the peer
@@ -1,22 +1,28 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Optional
4
+ from typing import TYPE_CHECKING, ClassVar, Optional, cast
5
5
 
6
6
  from chia.introducer.introducer import Introducer
7
7
  from chia.protocols.introducer_protocol import RequestPeersIntroducer, RespondPeersIntroducer
8
8
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
9
9
  from chia.rpc.rpc_server import StateChangedProtocol
10
+ from chia.server.api_protocol import ApiMetadata
10
11
  from chia.server.outbound_message import Message, make_msg
11
12
  from chia.server.ws_connection import WSChiaConnection
12
13
  from chia.types.peer_info import TimestampedPeerInfo
13
- from chia.util.api_decorators import api_request
14
14
  from chia.util.ints import uint64
15
15
 
16
16
 
17
17
  class IntroducerAPI:
18
+ if TYPE_CHECKING:
19
+ from chia.server.api_protocol import ApiProtocol
20
+
21
+ _protocol_check: ClassVar[ApiProtocol] = cast("IntroducerAPI", None)
22
+
18
23
  log: logging.Logger
19
24
  introducer: Introducer
25
+ metadata: ClassVar[ApiMetadata] = ApiMetadata()
20
26
 
21
27
  def __init__(self, introducer) -> None:
22
28
  self.log = logging.getLogger(__name__)
@@ -28,7 +34,7 @@ class IntroducerAPI:
28
34
  def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
29
35
  pass
30
36
 
31
- @api_request(peer_required=True)
37
+ @metadata.request(peer_required=True)
32
38
  async def request_peers_introducer(
33
39
  self,
34
40
  request: RequestPeersIntroducer,
chia/legacy/keyring.py CHANGED
@@ -6,7 +6,7 @@ helper it's required to install the `legacy_keyring` extra dependency which can
6
6
  from __future__ import annotations
7
7
 
8
8
  import sys
9
- from typing import Callable, List, Union, cast
9
+ from typing import Callable, Union, cast
10
10
 
11
11
  import click
12
12
  from chia_rs import G1Element
@@ -23,7 +23,6 @@ except ImportError:
23
23
  CryptFileKeyring = None
24
24
 
25
25
 
26
- from chia.cmds.cmds_util import prompt_yes_no
27
26
  from chia.util.errors import KeychainUserNotFound
28
27
  from chia.util.keychain import MAX_KEYS, KeyData, KeyDataSecrets, get_private_key_user
29
28
 
@@ -85,8 +84,8 @@ def get_key_data(keyring: LegacyKeyring, index: int) -> KeyData:
85
84
  )
86
85
 
87
86
 
88
- def get_keys(keyring: LegacyKeyring) -> List[KeyData]:
89
- keys: List[KeyData] = []
87
+ def get_keys(keyring: LegacyKeyring) -> list[KeyData]:
88
+ keys: list[KeyData] = []
90
89
  for index in range(MAX_KEYS):
91
90
  try:
92
91
  keys.append(get_key_data(keyring, index))
@@ -144,7 +143,9 @@ def clear() -> None:
144
143
 
145
144
  print_keys(keyring)
146
145
 
147
- if not prompt_yes_no("\nDo you really want to remove all the keys from the legacy keyring? This can't be undone."):
146
+ if not click.confirm(
147
+ "\nDo you really want to remove all the keys from the legacy keyring? This can't be undone.", default=None
148
+ ):
148
149
  raise click.ClickException("Aborted!")
149
150
 
150
151
  remove_keys(keyring)
chia/plot_sync/delta.py CHANGED
@@ -1,15 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import Dict, List, Union
4
+ from typing import Union
5
5
 
6
6
  from chia.protocols.harvester_protocol import Plot
7
7
 
8
8
 
9
9
  @dataclass
10
10
  class DeltaType:
11
- additions: Union[Dict[str, Plot], List[str]]
12
- removals: List[str]
11
+ additions: Union[dict[str, Plot], list[str]]
12
+ removals: list[str]
13
13
 
14
14
  def __str__(self) -> str:
15
15
  return f"+{len(self.additions)}/-{len(self.removals)}"
@@ -24,17 +24,17 @@ class DeltaType:
24
24
 
25
25
  @dataclass
26
26
  class PlotListDelta(DeltaType):
27
- additions: Dict[str, Plot] = field(default_factory=dict)
28
- removals: List[str] = field(default_factory=list)
27
+ additions: dict[str, Plot] = field(default_factory=dict)
28
+ removals: list[str] = field(default_factory=list)
29
29
 
30
30
 
31
31
  @dataclass
32
32
  class PathListDelta(DeltaType):
33
- additions: List[str] = field(default_factory=list)
34
- removals: List[str] = field(default_factory=list)
33
+ additions: list[str] = field(default_factory=list)
34
+ removals: list[str] = field(default_factory=list)
35
35
 
36
36
  @staticmethod
37
- def from_lists(old: List[str], new: List[str]) -> PathListDelta:
37
+ def from_lists(old: list[str], new: list[str]) -> PathListDelta:
38
38
  return PathListDelta([x for x in new if x not in old], [x for x in old if x not in new])
39
39
 
40
40
 
@@ -2,8 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import time
5
+ from collections.abc import Awaitable, Collection, Sequence
5
6
  from dataclasses import dataclass, field
6
- from typing import Any, Awaitable, Callable, Collection, Dict, List, Optional, Sequence, Union
7
+ from typing import Any, Callable, Optional, Union
7
8
 
8
9
  from typing_extensions import Protocol
9
10
 
@@ -82,10 +83,10 @@ class Receiver:
82
83
  _connection: WSChiaConnection
83
84
  _current_sync: Sync
84
85
  _last_sync: Sync
85
- _plots: Dict[str, Plot]
86
- _invalid: List[str]
87
- _keys_missing: List[str]
88
- _duplicates: List[str]
86
+ _plots: dict[str, Plot]
87
+ _invalid: list[str]
88
+ _keys_missing: list[str]
89
+ _duplicates: list[str]
89
90
  _total_plot_size: int
90
91
  _total_effective_plot_size: int
91
92
  _update_callback: ReceiverUpdateCallback
@@ -138,16 +139,16 @@ class Receiver:
138
139
  def initial_sync(self) -> bool:
139
140
  return self._last_sync.sync_id == 0
140
141
 
141
- def plots(self) -> Dict[str, Plot]:
142
+ def plots(self) -> dict[str, Plot]:
142
143
  return self._plots
143
144
 
144
- def invalid(self) -> List[str]:
145
+ def invalid(self) -> list[str]:
145
146
  return self._invalid
146
147
 
147
- def keys_missing(self) -> List[str]:
148
+ def keys_missing(self) -> list[str]:
148
149
  return self._keys_missing
149
150
 
150
- def duplicates(self) -> List[str]:
151
+ def duplicates(self) -> list[str]:
151
152
  return self._duplicates
152
153
 
153
154
  def total_plot_size(self) -> int:
@@ -245,7 +246,7 @@ class Receiver:
245
246
  state: State,
246
247
  next_state: State,
247
248
  target: Collection[str],
248
- delta: List[str],
249
+ delta: list[str],
249
250
  paths: PlotSyncPathList,
250
251
  is_removal: bool = False,
251
252
  ) -> None:
@@ -359,7 +360,7 @@ class Receiver:
359
360
  async def sync_done(self, data: PlotSyncDone) -> None:
360
361
  await self._process(self._sync_done, ProtocolMessageTypes.plot_sync_done, data)
361
362
 
362
- def to_dict(self, counts_only: bool = False) -> Dict[str, Any]:
363
+ def to_dict(self, counts_only: bool = False) -> dict[str, Any]:
363
364
  syncing = None
364
365
  if self._current_sync.in_progress():
365
366
  syncing = {
chia/plot_sync/sender.py CHANGED
@@ -4,9 +4,10 @@ import asyncio
4
4
  import logging
5
5
  import time
6
6
  import traceback
7
+ from collections.abc import Iterable
7
8
  from dataclasses import dataclass
8
9
  from pathlib import Path
9
- from typing import Any, Generic, Iterable, List, Optional, Tuple, Type, TypeVar
10
+ from typing import Any, Generic, Optional, TypeVar
10
11
 
11
12
  from typing_extensions import Protocol
12
13
 
@@ -28,12 +29,13 @@ from chia.server.outbound_message import NodeType, make_msg
28
29
  from chia.server.ws_connection import WSChiaConnection
29
30
  from chia.util.batches import to_batches
30
31
  from chia.util.ints import int16, uint32, uint64
32
+ from chia.util.task_referencer import create_referenced_task
31
33
 
32
34
  log = logging.getLogger(__name__)
33
35
 
34
36
 
35
- def _convert_plot_info_list(plot_infos: List[PlotInfo]) -> List[Plot]:
36
- converted: List[Plot] = []
37
+ def _convert_plot_info_list(plot_infos: list[PlotInfo]) -> list[Plot]:
38
+ converted: list[Plot] = []
37
39
  for plot_info in plot_infos:
38
40
  converted.append(
39
41
  Plot(
@@ -66,10 +68,10 @@ class MessageGenerator(Generic[T]):
66
68
  sync_id: uint64
67
69
  message_type: ProtocolMessageTypes
68
70
  message_id: uint64
69
- payload_type: Type[T]
71
+ payload_type: type[T]
70
72
  args: Iterable[object]
71
73
 
72
- def generate(self) -> Tuple[PlotSyncIdentifier, T]:
74
+ def generate(self) -> tuple[PlotSyncIdentifier, T]:
73
75
  identifier = PlotSyncIdentifier(uint64(int(time.time())), self.sync_id, self.message_id)
74
76
  payload = self.payload_type(identifier, *self.args)
75
77
  return identifier, payload
@@ -93,7 +95,7 @@ class Sender:
93
95
  _connection: Optional[WSChiaConnection]
94
96
  _sync_id: uint64
95
97
  _next_message_id: uint64
96
- _messages: List[MessageGenerator[PayloadType]]
98
+ _messages: list[MessageGenerator[PayloadType]]
97
99
  _last_sync_id: uint64
98
100
  _stop_requested = False
99
101
  _task: Optional[asyncio.Task[None]]
@@ -119,7 +121,7 @@ class Sender:
119
121
  if self._task is not None and self._stop_requested:
120
122
  await self.await_closed()
121
123
  if self._task is None:
122
- self._task = asyncio.create_task(self._run())
124
+ self._task = create_referenced_task(self._run())
123
125
  if not self._plot_manager.initial_refresh() or self._sync_id != 0:
124
126
  self._reset()
125
127
  else:
@@ -161,7 +163,8 @@ class Sender:
161
163
  async def _wait_for_response(self) -> bool:
162
164
  start = time.time()
163
165
  assert self._response is not None
164
- while time.time() - start < Constants.message_timeout and self._response.message is None:
166
+ # TODO: switch to event driven code
167
+ while time.time() - start < Constants.message_timeout and self._response.message is None: # noqa: ASYNC110
165
168
  await asyncio.sleep(0.1)
166
169
  return self._response.message is not None
167
170
 
@@ -249,7 +252,7 @@ class Sender:
249
252
 
250
253
  return True
251
254
 
252
- def _add_list_batched(self, message_type: ProtocolMessageTypes, payload_type: Any, data: List[Any]) -> None:
255
+ def _add_list_batched(self, message_type: ProtocolMessageTypes, payload_type: Any, data: list[Any]) -> None:
253
256
  if len(data) == 0:
254
257
  self._add_message(message_type, payload_type, [], True)
255
258
  return
@@ -266,7 +269,7 @@ class Sender:
266
269
  sync_id = int(time.time())
267
270
  # Make sure we have unique sync-id's even if we restart refreshing within a second (i.e. in tests)
268
271
  if sync_id == self._last_sync_id:
269
- sync_id = sync_id + 1
272
+ sync_id += 1
270
273
  log.debug(f"sync_start {sync_id}")
271
274
  self._sync_id = uint64(sync_id)
272
275
  self._add_message(
@@ -278,13 +281,13 @@ class Sender:
278
281
  self._harvesting_mode,
279
282
  )
280
283
 
281
- def process_batch(self, loaded: List[PlotInfo], remaining: int) -> None:
284
+ def process_batch(self, loaded: list[PlotInfo], remaining: int) -> None:
282
285
  log.debug(f"process_batch {self}: loaded {len(loaded)}, remaining {remaining}")
283
286
  if len(loaded) > 0 or remaining == 0:
284
287
  converted = _convert_plot_info_list(loaded)
285
288
  self._add_message(ProtocolMessageTypes.plot_sync_loaded, PlotSyncPlotList, converted, remaining == 0)
286
289
 
287
- def sync_done(self, removed: List[Path], duration: float) -> None:
290
+ def sync_done(self, removed: list[Path], duration: float) -> None:
288
291
  log.debug(f"sync_done {self}: removed {len(removed)}, duration {duration}")
289
292
  removed_list = [str(x) for x in removed]
290
293
  self._add_list_batched(
chia/plotters/bladebit.py CHANGED
@@ -7,7 +7,7 @@ import os
7
7
  import sys
8
8
  import traceback
9
9
  from pathlib import Path
10
- from typing import Any, Dict, List, Literal, Optional, Tuple, Union
10
+ from typing import Any, Literal, Optional, Union
11
11
 
12
12
  from chia.plotters.plotters_util import get_venv_bin, reset_loop_policy_for_windows, run_command, run_plotter
13
13
  from chia.plotting.create_plots import resolve_plot_keys
@@ -20,10 +20,10 @@ BLADEBIT_PLOTTER_DIR = "bladebit"
20
20
 
21
21
  def is_bladebit_supported() -> bool:
22
22
  # bladebit >= 2.0.0 now supports macOS
23
- return sys.platform.startswith("linux") or sys.platform in ["win32", "cygwin", "darwin"]
23
+ return sys.platform.startswith("linux") or sys.platform in {"win32", "cygwin", "darwin"}
24
24
 
25
25
 
26
- def meets_memory_requirement(plotters_root_path: Path) -> Tuple[bool, Optional[str]]:
26
+ def meets_memory_requirement(plotters_root_path: Path) -> tuple[bool, Optional[str]]:
27
27
  have_enough_memory: bool = False
28
28
  warning_string: Optional[str] = None
29
29
 
@@ -40,7 +40,7 @@ def meets_memory_requirement(plotters_root_path: Path) -> Tuple[bool, Optional[s
40
40
  if proc.returncode != 0:
41
41
  return have_enough_memory, proc.stderr.strip()
42
42
 
43
- memory_info: Dict[str, int] = json.loads(proc.stdout)
43
+ memory_info: dict[str, int] = json.loads(proc.stdout)
44
44
  total_bytes: int = memory_info.get("total", -1)
45
45
  required_bytes: int = memory_info.get("required", 0)
46
46
  have_enough_memory = total_bytes >= required_bytes
@@ -83,8 +83,8 @@ def get_bladebit_package_path() -> Path:
83
83
 
84
84
  def get_bladebit_exec_path(with_cuda: bool = False) -> str:
85
85
  if with_cuda:
86
- return "bladebit_cuda.exe" if sys.platform in ["win32", "cygwin"] else "bladebit_cuda"
87
- return "bladebit.exe" if sys.platform in ["win32", "cygwin"] else "bladebit"
86
+ return "bladebit_cuda.exe" if sys.platform in {"win32", "cygwin"} else "bladebit_cuda"
87
+ return "bladebit.exe" if sys.platform in {"win32", "cygwin"} else "bladebit"
88
88
 
89
89
 
90
90
  def get_bladebit_exec_venv_path(with_cuda: bool = False) -> Optional[Path]:
@@ -97,7 +97,7 @@ def get_bladebit_exec_venv_path(with_cuda: bool = False) -> Optional[Path]:
97
97
 
98
98
  def get_bladebit_exec_src_path(plotters_root_path: Path, with_cuda: bool = False) -> Path:
99
99
  bladebit_src_dir = get_bladebit_src_path(plotters_root_path)
100
- build_dir = "build/Release" if sys.platform in ["win32", "cygwin"] else "build"
100
+ build_dir = "build/Release" if sys.platform in {"win32", "cygwin"} else "build"
101
101
  bladebit_exec = get_bladebit_exec_path(with_cuda)
102
102
  return bladebit_src_dir / build_dir / bladebit_exec
103
103
 
@@ -131,7 +131,7 @@ def get_bladebit_executable_path(plotters_root_path: Path) -> Path:
131
131
 
132
132
  def get_bladebit_version(
133
133
  plotters_root_path: Path,
134
- ) -> Union[Tuple[Literal[False], str], Tuple[None, str], Tuple[Literal[True], List[str]]]:
134
+ ) -> Union[tuple[Literal[False], str], tuple[None, str], tuple[Literal[True], list[str]]]:
135
135
  bladebit_executable_path = get_bladebit_executable_path(plotters_root_path)
136
136
  if not bladebit_executable_path.exists():
137
137
  # (found=False, "")
@@ -157,8 +157,8 @@ def get_bladebit_version(
157
157
  return None, str(e)
158
158
 
159
159
 
160
- def get_bladebit_install_info(plotters_root_path: Path) -> Optional[Dict[str, Any]]:
161
- info: Dict[str, Any] = {"display_name": "BladeBit Plotter"}
160
+ def get_bladebit_install_info(plotters_root_path: Path) -> Optional[dict[str, Any]]:
161
+ info: dict[str, Any] = {"display_name": "BladeBit Plotter"}
162
162
  installed: bool = False
163
163
  supported: bool = is_bladebit_supported()
164
164
  cuda_available: bool = is_cudaplot_available(plotters_root_path)
@@ -272,7 +272,7 @@ def plot_bladebit(args, chia_root_path, root_path):
272
272
  print("Bladebit was not found.")
273
273
  return
274
274
 
275
- if sys.platform in ["win32", "cygwin"]:
275
+ if sys.platform in {"win32", "cygwin"}:
276
276
  reset_loop_policy_for_windows()
277
277
 
278
278
  plot_keys = asyncio.run(
@@ -286,7 +286,7 @@ def plot_bladebit(args, chia_root_path, root_path):
286
286
  args.connect_to_daemon,
287
287
  )
288
288
  )
289
- if args.plot_type == "ramplot" or args.plot_type == "diskplot" or args.plot_type == "cudaplot":
289
+ if args.plot_type in {"ramplot", "diskplot", "cudaplot"}:
290
290
  plot_type = args.plot_type
291
291
  else:
292
292
  plot_type = "diskplot"
chia/plotters/chiapos.py CHANGED
@@ -10,7 +10,7 @@ import importlib.metadata
10
10
  import logging
11
11
  from argparse import Namespace
12
12
  from pathlib import Path
13
- from typing import Any, Dict, Optional
13
+ from typing import Any, Optional
14
14
 
15
15
  from chia.plotting.create_plots import create_plots, resolve_plot_keys
16
16
  from chia.plotting.util import Params, add_plot_directory, validate_plot_size
@@ -18,7 +18,7 @@ from chia.plotting.util import Params, add_plot_directory, validate_plot_size
18
18
  log = logging.getLogger(__name__)
19
19
 
20
20
 
21
- def get_chiapos_install_info() -> Optional[Dict[str, Any]]:
21
+ def get_chiapos_install_info() -> Optional[dict[str, Any]]:
22
22
  chiapos_version = importlib.metadata.version("chiapos")
23
23
  return {"display_name": "Chia Proof of Space", "version": chiapos_version, "installed": True}
24
24
 
chia/plotters/madmax.py CHANGED
@@ -6,7 +6,7 @@ import os
6
6
  import sys
7
7
  import traceback
8
8
  from pathlib import Path
9
- from typing import Any, Dict, Optional
9
+ from typing import Any, Optional
10
10
 
11
11
  from chia.plotters.plotters_util import get_venv_bin, reset_loop_policy_for_windows, run_command, run_plotter
12
12
  from chia.plotting.create_plots import resolve_plot_keys
@@ -18,7 +18,7 @@ MADMAX_PLOTTER_DIR = "madmax-plotter"
18
18
 
19
19
 
20
20
  def is_madmax_supported() -> bool:
21
- return sys.platform.startswith("linux") or sys.platform in ["darwin", "win32", "cygwin"]
21
+ return sys.platform.startswith("linux") or sys.platform in {"darwin", "win32", "cygwin"}
22
22
 
23
23
 
24
24
  def get_madmax_src_path(plotters_root_path: Path) -> Path:
@@ -39,7 +39,7 @@ def get_madmax_exec_venv_path(ksize: int = 32) -> Optional[Path]:
39
39
  madmax_exec = "chia_plot"
40
40
  if ksize > 32:
41
41
  madmax_exec += "_k34" # Use the chia_plot_k34 executable for k-sizes > 32
42
- if sys.platform in ["win32", "cygwin"]:
42
+ if sys.platform in {"win32", "cygwin"}:
43
43
  madmax_exec += ".exe"
44
44
  return venv_bin_path / madmax_exec
45
45
 
@@ -49,7 +49,7 @@ def get_madmax_exec_src_path(plotters_root_path: Path, ksize: int = 32) -> Path:
49
49
  madmax_exec = "chia_plot"
50
50
  if ksize > 32:
51
51
  madmax_exec += "_k34" # Use the chia_plot_k34 executable for k-sizes > 32
52
- if sys.platform in ["win32", "cygwin"]:
52
+ if sys.platform in {"win32", "cygwin"}:
53
53
  madmax_exec += ".exe"
54
54
  return madmax_src_dir / madmax_exec
55
55
 
@@ -59,7 +59,7 @@ def get_madmax_exec_package_path(ksize: int = 32) -> Path:
59
59
  madmax_exec: str = "chia_plot"
60
60
  if ksize > 32:
61
61
  madmax_exec += "_k34" # Use the chia_plot_k34 executable for k-sizes > 32
62
- if sys.platform in ["win32", "cygwin"]:
62
+ if sys.platform in {"win32", "cygwin"}:
63
63
  madmax_exec += ".exe"
64
64
  return madmax_dir / madmax_exec
65
65
 
@@ -100,8 +100,8 @@ def get_madmax_version(plotters_root_path: Path):
100
100
  return None, f"Failed to determine madmax version: {e} {tb}"
101
101
 
102
102
 
103
- def get_madmax_install_info(plotters_root_path: Path) -> Optional[Dict[str, Any]]:
104
- info: Dict[str, Any] = {"display_name": "madMAx Plotter"}
103
+ def get_madmax_install_info(plotters_root_path: Path) -> Optional[dict[str, Any]]:
104
+ info: dict[str, Any] = {"display_name": "madMAx Plotter"}
105
105
  installed: bool = False
106
106
  supported: bool = is_madmax_supported()
107
107
 
@@ -160,7 +160,7 @@ def plot_madmax(args, chia_root_path: Path, plotters_root_path: Path):
160
160
 
161
161
  # madMAx has a ulimit -n requirement > 296:
162
162
  # "Cannot open at least 296 files, please raise maximum open file limit in OS."
163
- soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_NOFILE)
163
+ _soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_NOFILE)
164
164
  # Set soft limit to max (hard limit)
165
165
  resource.setrlimit(resource.RLIMIT_NOFILE, (hard_limit, hard_limit))
166
166
  else:
chia/plotters/plotters.py CHANGED
@@ -5,7 +5,7 @@ import binascii
5
5
  import os
6
6
  from enum import Enum
7
7
  from pathlib import Path
8
- from typing import Any, Dict, Optional
8
+ from typing import Any, Optional
9
9
 
10
10
  from chia.plotters.bladebit import get_bladebit_install_info, plot_bladebit
11
11
  from chia.plotters.chiapos import get_chiapos_install_info, plot_chia
@@ -547,12 +547,12 @@ def call_plotters(root_path: Path, args):
547
547
  show_plotters_version(chia_root_path)
548
548
 
549
549
 
550
- def get_available_plotters(root_path) -> Dict[str, Any]:
550
+ def get_available_plotters(root_path) -> dict[str, Any]:
551
551
  plotters_root_path: Path = get_plotters_root_path(root_path)
552
- plotters: Dict[str, Any] = {}
553
- chiapos: Optional[Dict[str, Any]] = get_chiapos_install_info()
554
- bladebit: Optional[Dict[str, Any]] = get_bladebit_install_info(plotters_root_path)
555
- madmax: Optional[Dict[str, Any]] = get_madmax_install_info(plotters_root_path)
552
+ plotters: dict[str, Any] = {}
553
+ chiapos: Optional[dict[str, Any]] = get_chiapos_install_info()
554
+ bladebit: Optional[dict[str, Any]] = get_bladebit_install_info(plotters_root_path)
555
+ madmax: Optional[dict[str, Any]] = get_madmax_install_info(plotters_root_path)
556
556
 
557
557
  if chiapos is not None:
558
558
  plotters["chiapos"] = chiapos