chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict, List, Optional
3
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
4
4
 
5
5
  from chia.harvester.harvester import Harvester
6
6
  from chia.rpc.rpc_server import Endpoint, EndpointResult
@@ -9,11 +9,16 @@ from chia.util.ws_message import WsRpcMessage, create_payload_dict
9
9
 
10
10
 
11
11
  class HarvesterRpcApi:
12
+ if TYPE_CHECKING:
13
+ from chia.rpc.rpc_server import RpcApiProtocol
14
+
15
+ _protocol_check: ClassVar[RpcApiProtocol] = cast("HarvesterRpcApi", None)
16
+
12
17
  def __init__(self, harvester: Harvester):
13
18
  self.service = harvester
14
19
  self.service_name = "chia_harvester"
15
20
 
16
- def get_routes(self) -> Dict[str, Endpoint]:
21
+ def get_routes(self) -> dict[str, Endpoint]:
17
22
  return {
18
23
  "/get_plots": self.get_plots,
19
24
  "/refresh_plots": self.refresh_plots,
@@ -25,7 +30,7 @@ class HarvesterRpcApi:
25
30
  "/update_harvester_config": self.update_harvester_config,
26
31
  }
27
32
 
28
- async def _state_changed(self, change: str, change_data: Optional[Dict[str, Any]] = None) -> List[WsRpcMessage]:
33
+ async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> list[WsRpcMessage]:
29
34
  if change_data is None:
30
35
  change_data = {}
31
36
 
@@ -48,7 +53,7 @@ class HarvesterRpcApi:
48
53
 
49
54
  return payloads
50
55
 
51
- async def get_plots(self, _: Dict[str, Any]) -> EndpointResult:
56
+ async def get_plots(self, _: dict[str, Any]) -> EndpointResult:
52
57
  plots, failed_to_open, not_found = self.service.get_plots()
53
58
  return {
54
59
  "plots": plots,
@@ -56,33 +61,33 @@ class HarvesterRpcApi:
56
61
  "not_found_filenames": not_found,
57
62
  }
58
63
 
59
- async def refresh_plots(self, _: Dict[str, Any]) -> EndpointResult:
64
+ async def refresh_plots(self, _: dict[str, Any]) -> EndpointResult:
60
65
  self.service.plot_manager.trigger_refresh()
61
66
  return {}
62
67
 
63
- async def delete_plot(self, request: Dict[str, Any]) -> EndpointResult:
68
+ async def delete_plot(self, request: dict[str, Any]) -> EndpointResult:
64
69
  filename = request["filename"]
65
70
  if self.service.delete_plot(filename):
66
71
  return {}
67
72
  raise ValueError(f"Not able to delete file {filename}")
68
73
 
69
- async def add_plot_directory(self, request: Dict[str, Any]) -> EndpointResult:
74
+ async def add_plot_directory(self, request: dict[str, Any]) -> EndpointResult:
70
75
  directory_name = request["dirname"]
71
76
  if await self.service.add_plot_directory(directory_name):
72
77
  return {}
73
78
  raise ValueError(f"Did not add plot directory {directory_name}")
74
79
 
75
- async def get_plot_directories(self, _: Dict[str, Any]) -> EndpointResult:
80
+ async def get_plot_directories(self, _: dict[str, Any]) -> EndpointResult:
76
81
  plot_dirs = await self.service.get_plot_directories()
77
82
  return {"directories": plot_dirs}
78
83
 
79
- async def remove_plot_directory(self, request: Dict[str, Any]) -> EndpointResult:
84
+ async def remove_plot_directory(self, request: dict[str, Any]) -> EndpointResult:
80
85
  directory_name = request["dirname"]
81
86
  if await self.service.remove_plot_directory(directory_name):
82
87
  return {}
83
88
  raise ValueError(f"Did not remove plot directory {directory_name}")
84
89
 
85
- async def get_harvester_config(self, _: Dict[str, Any]) -> EndpointResult:
90
+ async def get_harvester_config(self, _: dict[str, Any]) -> EndpointResult:
86
91
  harvester_config = await self.service.get_harvester_config()
87
92
  return {
88
93
  "use_gpu_harvesting": harvester_config["use_gpu_harvesting"],
@@ -95,7 +100,7 @@ class HarvesterRpcApi:
95
100
  "refresh_parameter_interval_seconds": harvester_config["plots_refresh_parameter"].get("interval_seconds"),
96
101
  }
97
102
 
98
- async def update_harvester_config(self, request: Dict[str, Any]) -> EndpointResult:
103
+ async def update_harvester_config(self, request: dict[str, Any]) -> EndpointResult:
99
104
  use_gpu_harvesting: Optional[bool] = None
100
105
  gpu_index: Optional[int] = None
101
106
  enforce_gpu_index: Optional[bool] = None
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict, List, cast
3
+ from typing import Any, cast
4
4
 
5
5
  from chia.rpc.rpc_client import RpcClient
6
6
 
@@ -14,7 +14,7 @@ class HarvesterRpcClient(RpcClient):
14
14
  to the full node.
15
15
  """
16
16
 
17
- async def get_plots(self) -> Dict[str, Any]:
17
+ async def get_plots(self) -> dict[str, Any]:
18
18
  return await self.fetch("get_plots", {})
19
19
 
20
20
  async def refresh_plots(self) -> None:
@@ -32,10 +32,10 @@ class HarvesterRpcClient(RpcClient):
32
32
  result = cast(bool, response["success"])
33
33
  return result
34
34
 
35
- async def get_plot_directories(self) -> List[str]:
35
+ async def get_plot_directories(self) -> list[str]:
36
36
  response = await self.fetch("get_plot_directories", {})
37
37
  # TODO: casting due to lack of type checked deserialization
38
- result = cast(List[str], response["directories"])
38
+ result = cast(list[str], response["directories"])
39
39
  return result
40
40
 
41
41
  async def remove_plot_directory(self, dirname: str) -> bool:
@@ -44,10 +44,10 @@ class HarvesterRpcClient(RpcClient):
44
44
  result = cast(bool, response["success"])
45
45
  return result
46
46
 
47
- async def get_harvester_config(self) -> Dict[str, Any]:
47
+ async def get_harvester_config(self) -> dict[str, Any]:
48
48
  return await self.fetch("get_harvester_config", {})
49
49
 
50
- async def update_harvester_config(self, config: Dict[str, Any]) -> bool:
50
+ async def update_harvester_config(self, config: dict[str, Any]) -> bool:
51
51
  response = await self.fetch("update_harvester_config", config)
52
52
  # TODO: casting due to lack of type checked deserialization
53
53
  result = cast(bool, response["success"])
chia/rpc/rpc_client.py CHANGED
@@ -2,11 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import json
5
+ from collections.abc import AsyncIterator
5
6
  from contextlib import asynccontextmanager
6
7
  from dataclasses import dataclass
7
8
  from pathlib import Path
8
9
  from ssl import SSLContext
9
- from typing import Any, AsyncIterator, Dict, List, Optional, Type, TypeVar
10
+ from typing import Any, Optional, TypeVar
10
11
 
11
12
  import aiohttp
12
13
 
@@ -16,6 +17,7 @@ from chia.server.ssl_context import private_ssl_ca_paths
16
17
  from chia.types.blockchain_format.sized_bytes import bytes32
17
18
  from chia.util.byte_types import hexstr_to_bytes
18
19
  from chia.util.ints import uint16
20
+ from chia.util.task_referencer import create_referenced_task
19
21
 
20
22
  _T_RpcClient = TypeVar("_T_RpcClient", bound="RpcClient")
21
23
 
@@ -24,7 +26,7 @@ _T_RpcClient = TypeVar("_T_RpcClient", bound="RpcClient")
24
26
  # the possibility to identify these errors in new code from having to review and
25
27
  # clean up existing code.
26
28
  class ResponseFailureError(ValueError):
27
- def __init__(self, response: Dict[str, Any]):
29
+ def __init__(self, response: dict[str, Any]):
28
30
  self.response = response
29
31
  super().__init__(f"RPC response failure: {json.dumps(response)}")
30
32
 
@@ -48,11 +50,11 @@ class RpcClient:
48
50
 
49
51
  @classmethod
50
52
  async def create(
51
- cls: Type[_T_RpcClient],
53
+ cls: type[_T_RpcClient],
52
54
  self_hostname: str,
53
55
  port: uint16,
54
56
  root_path: Optional[Path],
55
- net_config: Optional[Dict[str, Any]],
57
+ net_config: Optional[dict[str, Any]],
56
58
  ) -> _T_RpcClient:
57
59
  if (root_path is not None) != (net_config is not None):
58
60
  raise ValueError("Either both or neither of root_path and net_config must be provided")
@@ -77,7 +79,7 @@ class RpcClient:
77
79
  self = cls(
78
80
  hostname=self_hostname,
79
81
  port=port,
80
- url=f"{scheme}://{self_hostname}:{str(port)}/",
82
+ url=f"{scheme}://{self_hostname}:{port!s}/",
81
83
  session=aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=timeout)),
82
84
  ssl_context=ssl_context,
83
85
  )
@@ -87,11 +89,11 @@ class RpcClient:
87
89
  @classmethod
88
90
  @asynccontextmanager
89
91
  async def create_as_context(
90
- cls: Type[_T_RpcClient],
92
+ cls: type[_T_RpcClient],
91
93
  self_hostname: str,
92
94
  port: uint16,
93
95
  root_path: Optional[Path] = None,
94
- net_config: Optional[Dict[str, Any]] = None,
96
+ net_config: Optional[dict[str, Any]] = None,
95
97
  ) -> AsyncIterator[_T_RpcClient]:
96
98
  self = await cls.create(
97
99
  self_hostname=self_hostname,
@@ -105,7 +107,7 @@ class RpcClient:
105
107
  self.close()
106
108
  await self.await_closed()
107
109
 
108
- async def fetch(self, path, request_json) -> Dict[str, Any]:
110
+ async def fetch(self, path, request_json) -> dict[str, Any]:
109
111
  async with self.session.post(
110
112
  self.url + path, json=request_json, ssl=self.ssl_context if self.ssl_context is not None else True
111
113
  ) as response:
@@ -115,7 +117,7 @@ class RpcClient:
115
117
  raise ResponseFailureError(res_json)
116
118
  return res_json
117
119
 
118
- async def get_connections(self, node_type: Optional[NodeType] = None) -> List[Dict]:
120
+ async def get_connections(self, node_type: Optional[NodeType] = None) -> list[dict]:
119
121
  request = {}
120
122
  if node_type is not None:
121
123
  request["node_type"] = node_type.value
@@ -124,20 +126,38 @@ class RpcClient:
124
126
  connection["node_id"] = hexstr_to_bytes(connection["node_id"])
125
127
  return response["connections"]
126
128
 
127
- async def open_connection(self, host: str, port: int) -> Dict:
129
+ async def open_connection(self, host: str, port: int) -> dict:
128
130
  return await self.fetch("open_connection", {"host": host, "port": int(port)})
129
131
 
130
- async def close_connection(self, node_id: bytes32) -> Dict:
132
+ async def close_connection(self, node_id: bytes32) -> dict:
131
133
  return await self.fetch("close_connection", {"node_id": node_id.hex()})
132
134
 
133
- async def stop_node(self) -> Dict:
135
+ async def stop_node(self) -> dict:
134
136
  return await self.fetch("stop_node", {})
135
137
 
136
- async def healthz(self) -> Dict:
138
+ async def healthz(self) -> dict:
137
139
  return await self.fetch("healthz", {})
138
140
 
141
+ async def get_network_info(self) -> dict:
142
+ return await self.fetch("get_network_info", {})
143
+
144
+ async def get_routes(self) -> dict:
145
+ return await self.fetch("get_routes", {})
146
+
147
+ async def get_version(self) -> dict:
148
+ return await self.fetch("get_version", {})
149
+
150
+ async def get_log_level(self) -> dict:
151
+ return await self.fetch("get_log_level", {})
152
+
153
+ async def set_log_level(self, level: str) -> dict:
154
+ return await self.fetch("set_log_level", {"level": level})
155
+
156
+ async def reset_log_level(self) -> dict:
157
+ return await self.fetch("reset_log_level", {})
158
+
139
159
  def close(self) -> None:
140
- self.closing_task = asyncio.create_task(self.session.close())
160
+ self.closing_task = create_referenced_task(self.session.close())
141
161
 
142
162
  async def await_closed(self) -> None:
143
163
  if self.closing_task is not None:
chia/rpc/rpc_server.py CHANGED
@@ -4,39 +4,60 @@ import asyncio
4
4
  import contextlib
5
5
  import json
6
6
  import logging
7
+ import sys
7
8
  import traceback
9
+ from collections.abc import AsyncIterator, Awaitable
8
10
  from dataclasses import dataclass
9
11
  from pathlib import Path
10
12
  from ssl import SSLContext
11
- from typing import Any, AsyncIterator, Awaitable, Callable, Dict, Generic, List, Optional, TypeVar
12
-
13
- from aiohttp import ClientConnectorError, ClientSession, ClientWebSocketResponse, WSMsgType, web
13
+ from types import MethodType
14
+ from typing import Any, Callable, ClassVar, Generic, Optional, TypeVar
15
+
16
+ from aiohttp import (
17
+ ClientConnectorError,
18
+ ClientSession,
19
+ ClientWebSocketResponse,
20
+ WSMsgType,
21
+ web,
22
+ )
14
23
  from typing_extensions import Protocol, final
15
24
 
16
25
  from chia import __version__
17
26
  from chia.rpc.util import wrap_http_handler
18
27
  from chia.server.outbound_message import NodeType
19
- from chia.server.server import ChiaServer, ssl_context_for_client, ssl_context_for_server
28
+ from chia.server.server import (
29
+ ChiaServer,
30
+ ssl_context_for_client,
31
+ ssl_context_for_server,
32
+ )
20
33
  from chia.server.ws_connection import WSChiaConnection
21
34
  from chia.types.peer_info import PeerInfo
22
35
  from chia.util.byte_types import hexstr_to_bytes
36
+ from chia.util.chia_logging import default_log_level, set_log_level
23
37
  from chia.util.config import str2bool
24
38
  from chia.util.ints import uint16
25
39
  from chia.util.json_util import dict_to_json_str
26
40
  from chia.util.network import WebServer, resolve
27
- from chia.util.ws_message import WsRpcMessage, create_payload, create_payload_dict, format_response, pong
41
+ from chia.util.task_referencer import create_referenced_task
42
+ from chia.util.ws_message import (
43
+ WsRpcMessage,
44
+ create_payload,
45
+ create_payload_dict,
46
+ format_response,
47
+ pong,
48
+ )
28
49
 
29
50
  log = logging.getLogger(__name__)
30
51
  max_message_size = 50 * 1024 * 1024 # 50MB
31
52
 
32
53
 
33
- EndpointResult = Dict[str, Any]
34
- Endpoint = Callable[[Dict[str, object]], Awaitable[EndpointResult]]
54
+ EndpointResult = dict[str, Any]
55
+ Endpoint = Callable[[dict[str, object]], Awaitable[EndpointResult]]
35
56
  _T_RpcApiProtocol = TypeVar("_T_RpcApiProtocol", bound="RpcApiProtocol")
36
57
 
37
58
 
38
59
  class StateChangedProtocol(Protocol):
39
- def __call__(self, change: str, change_data: Optional[Dict[str, Any]]) -> None: ...
60
+ def __call__(self, change: str, change_data: Optional[dict[str, Any]]) -> None: ...
40
61
 
41
62
 
42
63
  class RpcServiceProtocol(Protocol):
@@ -54,7 +75,7 @@ class RpcServiceProtocol(Protocol):
54
75
  # Optional[ChiaServer]
55
76
  ...
56
77
 
57
- def get_connections(self, request_node_type: Optional[NodeType]) -> List[Dict[str, Any]]:
78
+ def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
58
79
  """Report the active connections for the service.
59
80
 
60
81
  A default implementation is available and can be called as
@@ -90,16 +111,16 @@ class RpcApiProtocol(Protocol):
90
111
  # using a read-only property per https://github.com/python/mypy/issues/12990
91
112
  ...
92
113
 
93
- def get_routes(self) -> Dict[str, Endpoint]:
114
+ def get_routes(self) -> dict[str, Endpoint]:
94
115
  """Return the mapping of endpoints to handler callables."""
95
116
  ...
96
117
 
97
- async def _state_changed(self, change: str, change_data: Optional[Dict[str, Any]]) -> List[WsRpcMessage]:
118
+ async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]]) -> list[WsRpcMessage]:
98
119
  """Notify the state change system of a changed state."""
99
120
  ...
100
121
 
101
122
 
102
- def default_get_connections(server: ChiaServer, request_node_type: Optional[NodeType]) -> List[Dict[str, Any]]:
123
+ def default_get_connections(server: ChiaServer, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
103
124
  connections = server.get_connections(request_node_type)
104
125
  con_info = [
105
126
  {
@@ -131,7 +152,8 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
131
152
  service_name: str
132
153
  ssl_context: SSLContext
133
154
  ssl_client_context: SSLContext
134
- net_config: Dict[str, Any]
155
+ net_config: dict[str, Any]
156
+ service_config: dict[str, Any]
135
157
  webserver: Optional[WebServer] = None
136
158
  daemon_heartbeat: int = 300
137
159
  daemon_connection_task: Optional[asyncio.Task[None]] = None
@@ -147,7 +169,8 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
147
169
  service_name: str,
148
170
  stop_cb: Callable[[], None],
149
171
  root_path: Path,
150
- net_config: Dict[str, Any],
172
+ net_config: dict[str, Any],
173
+ service_config: dict[str, Any],
151
174
  prefer_ipv6: bool,
152
175
  ) -> RpcServer[_T_RpcApiProtocol]:
153
176
  crt_path = root_path / net_config["daemon_ssl"]["private_crt"]
@@ -164,6 +187,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
164
187
  ssl_context,
165
188
  ssl_client_context,
166
189
  net_config,
190
+ service_config=service_config,
167
191
  daemon_heartbeat=daemon_heartbeat,
168
192
  prefer_ipv6=prefer_ipv6,
169
193
  )
@@ -196,12 +220,12 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
196
220
  await self.daemon_connection_task
197
221
  self.daemon_connection_task = None
198
222
 
199
- async def _state_changed(self, change: str, change_data: Optional[Dict[str, Any]]) -> None:
223
+ async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]]) -> None:
200
224
  if self.websocket is None or self.websocket.closed:
201
225
  return None
202
- payloads: List[WsRpcMessage] = await self.rpc_api._state_changed(change, change_data)
226
+ payloads: list[WsRpcMessage] = await self.rpc_api._state_changed(change, change_data)
203
227
 
204
- if change == "add_connection" or change == "close_connection" or change == "peer_changed_peak":
228
+ if change in {"add_connection", "close_connection", "peer_changed_peak"}:
205
229
  data = await self.get_connections({})
206
230
  if data is not None:
207
231
  payload = create_payload_dict(
@@ -222,10 +246,10 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
222
246
  tb = traceback.format_exc()
223
247
  log.warning(f"Sending data failed. Exception {tb}.")
224
248
 
225
- def state_changed(self, change: str, change_data: Optional[Dict[str, Any]] = None) -> None:
249
+ def state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> None:
226
250
  if self.websocket is None or self.websocket.closed:
227
251
  return None
228
- asyncio.create_task(self._state_changed(change, change_data))
252
+ create_referenced_task(self._state_changed(change, change_data), known_unreferenced=True)
229
253
 
230
254
  @property
231
255
  def listen_port(self) -> uint16:
@@ -233,42 +257,39 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
233
257
  raise RuntimeError("RpcServer is not started")
234
258
  return self.webserver.listen_port
235
259
 
236
- def _get_routes(self) -> Dict[str, Endpoint]:
260
+ def _get_routes(self) -> dict[str, Endpoint]:
237
261
  return {
238
262
  **self.rpc_api.get_routes(),
239
- "/get_network_info": self.get_network_info,
240
- "/get_connections": self.get_connections,
241
- "/open_connection": self.open_connection,
242
- "/close_connection": self.close_connection,
243
- "/stop_node": self.stop_node,
244
- "/get_routes": self.get_routes,
245
- "/get_version": self.get_version,
246
- "/healthz": self.healthz,
263
+ **{path: MethodType(handler, self) for path, handler in self._routes.items()},
247
264
  }
248
265
 
249
- async def get_routes(self, request: Dict[str, Any]) -> EndpointResult:
266
+ async def get_routes(self, request: dict[str, Any]) -> EndpointResult:
250
267
  return {
251
268
  "success": True,
252
269
  "routes": list(self._get_routes().keys()),
253
270
  }
254
271
 
255
- async def get_network_info(self, _: Dict[str, Any]) -> EndpointResult:
272
+ async def get_network_info(self, _: dict[str, Any]) -> EndpointResult:
256
273
  network_name = self.net_config["selected_network"]
257
274
  address_prefix = self.net_config["network_overrides"]["config"][network_name]["address_prefix"]
258
275
  genesis_challenge = self.net_config["network_overrides"]["constants"][network_name]["GENESIS_CHALLENGE"]
259
- return {"network_name": network_name, "network_prefix": address_prefix, "genesis_challenge": genesis_challenge}
276
+ return {
277
+ "network_name": network_name,
278
+ "network_prefix": address_prefix,
279
+ "genesis_challenge": genesis_challenge,
280
+ }
260
281
 
261
- async def get_connections(self, request: Dict[str, Any]) -> EndpointResult:
282
+ async def get_connections(self, request: dict[str, Any]) -> EndpointResult:
262
283
  request_node_type: Optional[NodeType] = None
263
284
  if "node_type" in request:
264
285
  request_node_type = NodeType(request["node_type"])
265
286
  if self.rpc_api.service.server is None:
266
287
  raise ValueError("Global connections is not set")
267
- con_info: List[Dict[str, Any]]
288
+ con_info: list[dict[str, Any]]
268
289
  con_info = self.rpc_api.service.get_connections(request_node_type=request_node_type)
269
290
  return {"connections": con_info}
270
291
 
271
- async def open_connection(self, request: Dict[str, Any]) -> EndpointResult:
292
+ async def open_connection(self, request: dict[str, Any]) -> EndpointResult:
272
293
  host = request["host"]
273
294
  port = request["port"]
274
295
  target_node: PeerInfo = PeerInfo(await resolve(host, prefer_ipv6=self.prefer_ipv6), uint16(int(port)))
@@ -279,7 +300,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
279
300
  return {"success": False, "error": f"could not connect to {target_node}"}
280
301
  return {"success": True}
281
302
 
282
- async def close_connection(self, request: Dict[str, Any]) -> EndpointResult:
303
+ async def close_connection(self, request: dict[str, Any]) -> EndpointResult:
283
304
  node_id = hexstr_to_bytes(request["node_id"])
284
305
  if self.rpc_api.service.server is None:
285
306
  raise web.HTTPInternalServerError()
@@ -290,7 +311,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
290
311
  await connection.close()
291
312
  return {}
292
313
 
293
- async def stop_node(self, request: Dict[str, Any]) -> EndpointResult:
314
+ async def stop_node(self, request: dict[str, Any]) -> EndpointResult:
294
315
  """
295
316
  Shuts down the node.
296
317
  """
@@ -298,17 +319,49 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
298
319
  self.stop_cb()
299
320
  return {}
300
321
 
301
- async def healthz(self, request: Dict[str, Any]) -> EndpointResult:
322
+ async def healthz(self, request: dict[str, Any]) -> EndpointResult:
302
323
  return {
303
324
  "success": True,
304
325
  }
305
326
 
306
- async def get_version(self, request: Dict[str, Any]) -> EndpointResult:
327
+ async def get_version(self, request: dict[str, Any]) -> EndpointResult:
307
328
  return {
308
329
  "version": __version__,
309
330
  }
310
331
 
311
- async def ws_api(self, message: WsRpcMessage) -> Optional[Dict[str, object]]:
332
+ async def get_log_level(self, request: dict[str, Any]) -> EndpointResult:
333
+ logger = logging.getLogger()
334
+ level_number = logger.level
335
+ level_name = logging.getLevelName(level_number)
336
+
337
+ if sys.version_info >= (3, 11):
338
+ map = logging.getLevelNamesMapping()
339
+ else:
340
+ map = logging._nameToLevel
341
+
342
+ return {
343
+ "success": True,
344
+ "level": level_name,
345
+ "available_levels": list(map),
346
+ }
347
+
348
+ async def reset_log_level(self, request: dict[str, Any]) -> EndpointResult:
349
+ level_name = self.service_config.get("log_level", default_log_level)
350
+
351
+ return await self.set_log_level(request={"level": level_name})
352
+
353
+ async def set_log_level(self, request: dict[str, Any]) -> EndpointResult:
354
+ error_strings = set_log_level(log_level=request["level"], service_name=self.service_name)
355
+ status = await self.get_log_level(request={})
356
+
357
+ status["success"] &= len(error_strings) == 0
358
+
359
+ return {
360
+ **status,
361
+ "errors": error_strings,
362
+ }
363
+
364
+ async def ws_api(self, message: WsRpcMessage) -> Optional[dict[str, object]]:
312
365
  """
313
366
  This function gets called when new message is received via websocket.
314
367
  """
@@ -317,7 +370,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
317
370
  if message["ack"]:
318
371
  return None
319
372
 
320
- data: Dict[str, object] = {}
373
+ data: dict[str, object] = {}
321
374
  if "data" in message:
322
375
  data = message["data"]
323
376
  if command == "ping":
@@ -407,7 +460,21 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
407
460
  self.client_session = None
408
461
  await asyncio.sleep(2)
409
462
 
410
- self.daemon_connection_task = asyncio.create_task(inner())
463
+ self.daemon_connection_task = create_referenced_task(inner())
464
+
465
+ _routes: ClassVar[dict[str, Callable[..., Awaitable[object]]]] = {
466
+ "/get_network_info": get_network_info,
467
+ "/get_connections": get_connections,
468
+ "/open_connection": open_connection,
469
+ "/close_connection": close_connection,
470
+ "/stop_node": stop_node,
471
+ "/get_routes": get_routes,
472
+ "/get_version": get_version,
473
+ "/healthz": healthz,
474
+ "/get_log_level": get_log_level,
475
+ "/set_log_level": set_log_level,
476
+ "/reset_log_level": reset_log_level,
477
+ }
411
478
 
412
479
 
413
480
  async def start_rpc_server(
@@ -417,7 +484,8 @@ async def start_rpc_server(
417
484
  rpc_port: uint16,
418
485
  stop_cb: Callable[[], None],
419
486
  root_path: Path,
420
- net_config: Dict[str, object],
487
+ net_config: dict[str, object],
488
+ service_config: dict[str, object],
421
489
  connect_to_daemon: bool = True,
422
490
  max_request_body_size: Optional[int] = None,
423
491
  ) -> RpcServer[_T_RpcApiProtocol]:
@@ -432,7 +500,13 @@ async def start_rpc_server(
432
500
  prefer_ipv6 = str2bool(str(net_config.get("prefer_ipv6", False)))
433
501
 
434
502
  rpc_server = RpcServer.create(
435
- rpc_api, rpc_api.service_name, stop_cb, root_path, net_config, prefer_ipv6=prefer_ipv6
503
+ rpc_api,
504
+ rpc_api.service_name,
505
+ stop_cb,
506
+ root_path,
507
+ net_config,
508
+ service_config=service_config,
509
+ prefer_ipv6=prefer_ipv6,
436
510
  )
437
511
  rpc_server.rpc_api.service._set_state_changed_callback(rpc_server.state_changed)
438
512
  await rpc_server.start(self_hostname, rpc_port, max_request_body_size)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict, List, Optional
3
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
4
4
 
5
5
  from chia.rpc.rpc_server import Endpoint
6
6
  from chia.timelord.timelord import Timelord
@@ -8,20 +8,25 @@ from chia.util.ws_message import WsRpcMessage, create_payload_dict
8
8
 
9
9
 
10
10
  class TimelordRpcApi:
11
+ if TYPE_CHECKING:
12
+ from chia.rpc.rpc_server import RpcApiProtocol
13
+
14
+ _protocol_check: ClassVar[RpcApiProtocol] = cast("TimelordRpcApi", None)
15
+
11
16
  def __init__(self, timelord: Timelord):
12
17
  self.service = timelord
13
18
  self.service_name = "chia_timelord"
14
19
 
15
- def get_routes(self) -> Dict[str, Endpoint]:
20
+ def get_routes(self) -> dict[str, Endpoint]:
16
21
  return {}
17
22
 
18
- async def _state_changed(self, change: str, change_data: Optional[Dict[str, Any]] = None) -> List[WsRpcMessage]:
23
+ async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> list[WsRpcMessage]:
19
24
  payloads = []
20
25
 
21
26
  if change_data is None:
22
27
  change_data = {}
23
28
 
24
- if change in ("finished_pot", "new_compact_proof", "skipping_peak", "new_peak"):
29
+ if change in {"finished_pot", "new_compact_proof", "skipping_peak", "new_peak"}:
25
30
  payloads.append(create_payload_dict(change, change_data, self.service_name, "metrics"))
26
31
 
27
32
  return payloads