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,16 +4,18 @@ import asyncio
4
4
  import functools
5
5
  import json
6
6
  import time
7
+ from collections.abc import Awaitable
7
8
  from dataclasses import replace
9
+ from pathlib import Path
8
10
  from pprint import pprint
9
- from typing import Any, Awaitable, Callable, Dict, List, Optional
11
+ from typing import Any, Callable, Optional
10
12
 
11
13
  import aiohttp
12
14
 
15
+ from chia.cmds.cmd_helpers import WalletClientInfo
13
16
  from chia.cmds.cmds_util import (
14
17
  cli_confirm,
15
18
  get_any_service_client,
16
- get_wallet_client,
17
19
  transaction_status_msg,
18
20
  transaction_submitted_msg,
19
21
  )
@@ -28,8 +30,6 @@ from chia.server.server import ssl_context_for_root
28
30
  from chia.ssl.create_ssl import get_mozilla_ca_crt
29
31
  from chia.types.blockchain_format.sized_bytes import bytes32
30
32
  from chia.util.bech32m import encode_puzzle_hash
31
- from chia.util.byte_types import hexstr_to_bytes
32
- from chia.util.config import load_config
33
33
  from chia.util.default_root import DEFAULT_ROOT_PATH
34
34
  from chia.util.errors import CliRpcConnectionError
35
35
  from chia.util.ints import uint32, uint64
@@ -38,12 +38,12 @@ from chia.wallet.util.address_type import AddressType
38
38
  from chia.wallet.util.wallet_types import WalletType
39
39
 
40
40
 
41
- async def create_pool_args(pool_url: str) -> Dict[str, Any]:
41
+ async def create_pool_args(pool_url: str) -> dict[str, Any]:
42
42
  try:
43
43
  async with aiohttp.ClientSession() as session:
44
44
  async with session.get(f"{pool_url}/pool_info", ssl=ssl_context_for_root(get_mozilla_ca_crt())) as response:
45
45
  if response.ok:
46
- json_dict: Dict[str, Any] = json.loads(await response.text())
46
+ json_dict: dict[str, Any] = json.loads(await response.text())
47
47
  else:
48
48
  raise ValueError(f"Response from {pool_url} not OK: {response.status}")
49
49
  except Exception as e:
@@ -62,54 +62,57 @@ async def create_pool_args(pool_url: str) -> Dict[str, Any]:
62
62
 
63
63
 
64
64
  async def create(
65
- wallet_rpc_port: Optional[int], fingerprint: int, pool_url: Optional[str], state: str, fee: uint64, *, prompt: bool
65
+ wallet_info: WalletClientInfo,
66
+ pool_url: Optional[str],
67
+ state: str,
68
+ fee: uint64,
69
+ *,
70
+ prompt: bool,
66
71
  ) -> None:
67
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, _):
68
- target_puzzle_hash: Optional[bytes32]
69
- # Could use initial_pool_state_from_dict to simplify
70
- if state == "SELF_POOLING":
71
- pool_url = None
72
- relative_lock_height = uint32(0)
73
- target_puzzle_hash = None # wallet will fill this in
74
- elif state == "FARMING_TO_POOL":
75
- config = load_config(DEFAULT_ROOT_PATH, "config.yaml")
76
- enforce_https = config["full_node"]["selected_network"] == "mainnet"
77
- assert pool_url is not None
78
- if enforce_https and not pool_url.startswith("https://"):
79
- print(f"Pool URLs must be HTTPS on mainnet {pool_url}. Aborting.")
80
- return
81
- assert pool_url is not None
82
- json_dict = await create_pool_args(pool_url)
83
- relative_lock_height = json_dict["relative_lock_height"]
84
- target_puzzle_hash = bytes32.from_hexstr(json_dict["target_puzzle_hash"])
85
- else:
86
- raise ValueError("Plot NFT must be created in SELF_POOLING or FARMING_TO_POOL state.")
87
-
88
- pool_msg = f" and join pool: {pool_url}" if pool_url else ""
89
- print(f"Will create a plot NFT{pool_msg}.")
90
- if prompt:
91
- cli_confirm("Confirm (y/n): ", "Aborting.")
92
-
93
- try:
94
- tx_record: TransactionRecord = await wallet_client.create_new_pool_wallet(
95
- target_puzzle_hash,
96
- pool_url,
97
- relative_lock_height,
98
- "localhost:5000",
99
- "new",
100
- state,
101
- fee,
102
- )
103
- start = time.time()
104
- while time.time() - start < 10:
105
- await asyncio.sleep(0.1)
106
- tx = await wallet_client.get_transaction(tx_record.name)
107
- if len(tx.sent_to) > 0:
108
- print(transaction_submitted_msg(tx))
109
- print(transaction_status_msg(fingerprint, tx_record.name))
110
- return None
111
- except Exception as e:
112
- print(f"Error creating plot NFT: {e}\n Please start both farmer and wallet with: chia start -r farmer")
72
+ target_puzzle_hash: Optional[bytes32]
73
+ # Could use initial_pool_state_from_dict to simplify
74
+ if state == "SELF_POOLING":
75
+ pool_url = None
76
+ relative_lock_height = uint32(0)
77
+ target_puzzle_hash = None # wallet will fill this in
78
+ elif state == "FARMING_TO_POOL":
79
+ enforce_https = wallet_info.config["selected_network"] == "mainnet"
80
+ assert pool_url is not None
81
+ if enforce_https and not pool_url.startswith("https://"):
82
+ raise CliRpcConnectionError(f"Pool URLs must be HTTPS on mainnet {pool_url}.")
83
+ json_dict = await create_pool_args(pool_url)
84
+ relative_lock_height = json_dict["relative_lock_height"]
85
+ target_puzzle_hash = bytes32.from_hexstr(json_dict["target_puzzle_hash"])
86
+ else:
87
+ raise ValueError("Plot NFT must be created in SELF_POOLING or FARMING_TO_POOL state.")
88
+
89
+ pool_msg = f" and join pool: {pool_url}" if pool_url else ""
90
+ print(f"Will create a plot NFT{pool_msg}.")
91
+ if prompt:
92
+ cli_confirm("Confirm (y/n): ", "Aborting.")
93
+
94
+ try:
95
+ tx_record: TransactionRecord = await wallet_info.client.create_new_pool_wallet(
96
+ target_puzzle_hash,
97
+ pool_url,
98
+ relative_lock_height,
99
+ "localhost:5000",
100
+ "new",
101
+ state,
102
+ fee,
103
+ )
104
+ start = time.time()
105
+ while time.time() - start < 10:
106
+ await asyncio.sleep(0.1)
107
+ tx = await wallet_info.client.get_transaction(tx_record.name)
108
+ if len(tx.sent_to) > 0:
109
+ print(transaction_submitted_msg(tx))
110
+ print(transaction_status_msg(wallet_info.fingerprint, tx_record.name))
111
+ return None
112
+ except Exception as e:
113
+ raise CliRpcConnectionError(
114
+ f"Error creating plot NFT: {e}\n Please start both farmer and wallet with: chia start -r farmer"
115
+ )
113
116
 
114
117
 
115
118
  async def pprint_pool_wallet_state(
@@ -117,7 +120,7 @@ async def pprint_pool_wallet_state(
117
120
  wallet_id: int,
118
121
  pool_wallet_info: PoolWalletInfo,
119
122
  address_prefix: str,
120
- pool_state_dict: Optional[Dict[str, Any]],
123
+ pool_state_dict: Optional[dict[str, Any]],
121
124
  ) -> None:
122
125
  print(f"Wallet ID: {wallet_id}")
123
126
  if pool_wallet_info.current.state == PoolSingletonState.LEAVING_POOL.value and pool_wallet_info.target is None:
@@ -142,7 +145,7 @@ async def pprint_pool_wallet_state(
142
145
  print(f"Target state: {PoolSingletonState(pool_wallet_info.target.state).name}")
143
146
  print(f"Target pool URL: {pool_wallet_info.target.pool_url}")
144
147
  if pool_wallet_info.current.state == PoolSingletonState.SELF_POOLING.value:
145
- balances: Dict[str, Any] = await wallet_client.get_wallet_balance(wallet_id)
148
+ balances: dict[str, Any] = await wallet_client.get_wallet_balance(wallet_id)
146
149
  balance = balances["confirmed_wallet_balance"]
147
150
  typ = WalletType(int(WalletType.POOLING_WALLET))
148
151
  address_prefix, scale = wallet_coin_unit(typ, address_prefix)
@@ -177,12 +180,12 @@ async def pprint_pool_wallet_state(
177
180
 
178
181
  async def pprint_all_pool_wallet_state(
179
182
  wallet_client: WalletRpcClient,
180
- get_wallets_response: List[Dict[str, Any]],
183
+ get_wallets_response: list[dict[str, Any]],
181
184
  address_prefix: str,
182
- pool_state_dict: Dict[bytes32, Dict[str, Any]],
185
+ pool_state_dict: dict[bytes32, dict[str, Any]],
183
186
  ) -> None:
184
- print(f"Wallet height: {await wallet_client.get_height_info()}")
185
- print(f"Sync status: {'Synced' if (await wallet_client.get_synced()) else 'Not synced'}")
187
+ print(f"Wallet height: {(await wallet_client.get_height_info()).height}")
188
+ print(f"Sync status: {'Synced' if (await wallet_client.get_sync_status()).synced else 'Not synced'}")
186
189
  for wallet_info in get_wallets_response:
187
190
  pool_wallet_id = wallet_info["id"]
188
191
  typ = WalletType(int(wallet_info["type"]))
@@ -198,47 +201,49 @@ async def pprint_all_pool_wallet_state(
198
201
  print("")
199
202
 
200
203
 
201
- async def show(wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id_passed_in: Optional[int]) -> None:
202
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, _):
203
- try:
204
- async with get_any_service_client(FarmerRpcClient) as (farmer_client, config):
205
- address_prefix = config["network_overrides"]["config"][config["selected_network"]]["address_prefix"]
206
- summaries_response = await wallet_client.get_wallets()
207
- pool_state_list = (await farmer_client.get_pool_state())["pool_state"]
208
- pool_state_dict: Dict[bytes32, Dict[str, Any]] = {
209
- bytes32.from_hexstr(pool_state_item["pool_config"]["launcher_id"]): pool_state_item
210
- for pool_state_item in pool_state_list
211
- }
212
- if wallet_id_passed_in is not None:
213
- for summary in summaries_response:
214
- typ = WalletType(int(summary["type"]))
215
- if summary["id"] == wallet_id_passed_in and typ != WalletType.POOLING_WALLET:
216
- print(
217
- f"Wallet with id: {wallet_id_passed_in} is not a pooling wallet."
218
- " Please provide a different id."
219
- )
220
- return
221
- pool_wallet_info, _ = await wallet_client.pw_status(wallet_id_passed_in)
222
- await pprint_pool_wallet_state(
223
- wallet_client,
224
- wallet_id_passed_in,
225
- pool_wallet_info,
226
- address_prefix,
227
- pool_state_dict.get(pool_wallet_info.launcher_id),
228
- )
229
- else:
230
- await pprint_all_pool_wallet_state(
231
- wallet_client, summaries_response, address_prefix, pool_state_dict
232
- )
233
- except CliRpcConnectionError: # we want to output this if we can't connect to the farmer
234
- await pprint_all_pool_wallet_state(wallet_client, summaries_response, address_prefix, pool_state_dict)
204
+ async def show(
205
+ wallet_info: WalletClientInfo,
206
+ root_path: Path,
207
+ wallet_id_passed_in: Optional[int],
208
+ ) -> None:
209
+ summaries_response = await wallet_info.client.get_wallets()
210
+ config = wallet_info.config
211
+ address_prefix = config["network_overrides"]["config"][config["selected_network"]]["address_prefix"]
212
+ pool_state_dict: dict[bytes32, dict[str, Any]] = dict()
213
+ if wallet_id_passed_in is not None:
214
+ await wallet_id_lookup_and_check(wallet_info.client, wallet_id_passed_in)
215
+ try:
216
+ async with get_any_service_client(
217
+ client_type=FarmerRpcClient,
218
+ root_path=root_path,
219
+ ) as (farmer_client, _):
220
+ pool_state_list = (await farmer_client.get_pool_state())["pool_state"]
221
+ pool_state_dict = {
222
+ bytes32.from_hexstr(pool_state_item["pool_config"]["launcher_id"]): pool_state_item
223
+ for pool_state_item in pool_state_list
224
+ }
225
+ if wallet_id_passed_in is not None:
226
+ pool_wallet_info, _ = await wallet_info.client.pw_status(wallet_id_passed_in)
227
+ await pprint_pool_wallet_state(
228
+ wallet_info.client,
229
+ wallet_id_passed_in,
230
+ pool_wallet_info,
231
+ address_prefix,
232
+ pool_state_dict.get(pool_wallet_info.launcher_id),
233
+ )
234
+ else:
235
+ await pprint_all_pool_wallet_state(
236
+ wallet_info.client, summaries_response, address_prefix, pool_state_dict
237
+ )
238
+ except CliRpcConnectionError: # we want to output this if we can't connect to the farmer
239
+ await pprint_all_pool_wallet_state(wallet_info.client, summaries_response, address_prefix, pool_state_dict)
235
240
 
236
241
 
237
- async def get_login_link(launcher_id: bytes32) -> None:
238
- async with get_any_service_client(FarmerRpcClient) as (farmer_client, _):
242
+ async def get_login_link(launcher_id: bytes32, root_path: Path) -> None:
243
+ async with get_any_service_client(FarmerRpcClient, root_path=root_path) as (farmer_client, _):
239
244
  login_link: Optional[str] = await farmer_client.get_pool_login_link(launcher_id)
240
245
  if login_link is None:
241
- print("Was not able to get login link.")
246
+ raise CliRpcConnectionError("Was not able to get login link.")
242
247
  else:
243
248
  print(login_link)
244
249
 
@@ -246,7 +251,7 @@ async def get_login_link(launcher_id: bytes32) -> None:
246
251
  async def submit_tx_with_confirmation(
247
252
  message: str,
248
253
  prompt: bool,
249
- func: Callable[[], Awaitable[Dict[str, Any]]],
254
+ func: Callable[[], Awaitable[dict[str, Any]]],
250
255
  wallet_client: WalletRpcClient,
251
256
  fingerprint: int,
252
257
  wallet_id: int,
@@ -269,106 +274,132 @@ async def submit_tx_with_confirmation(
269
274
  print(f"Error performing operation on Plot NFT -f {fingerprint} wallet id: {wallet_id}: {e}")
270
275
 
271
276
 
277
+ async def wallet_id_lookup_and_check(wallet_client: WalletRpcClient, wallet_id: Optional[int]) -> int:
278
+ selected_wallet_id: int
279
+
280
+ # absent network errors, this should not fail with an error
281
+ pool_wallets = await wallet_client.get_wallets(wallet_type=WalletType.POOLING_WALLET)
282
+
283
+ if wallet_id is None:
284
+ if len(pool_wallets) == 0:
285
+ raise CliRpcConnectionError(
286
+ "No pool wallet found. Use 'chia plotnft create' to create a new pooling wallet."
287
+ )
288
+ if len(pool_wallets) > 1:
289
+ raise CliRpcConnectionError("More than one pool wallet found. Use -i to specify pool wallet id.")
290
+ selected_wallet_id = pool_wallets[0]["id"]
291
+ else:
292
+ selected_wallet_id = wallet_id
293
+
294
+ if not any(wallet["id"] == selected_wallet_id for wallet in pool_wallets):
295
+ raise CliRpcConnectionError(f"Wallet with id: {selected_wallet_id} is not a pool wallet.")
296
+
297
+ return selected_wallet_id
298
+
299
+
272
300
  async def join_pool(
273
301
  *,
274
- wallet_rpc_port: Optional[int],
275
- fingerprint: int,
302
+ wallet_info: WalletClientInfo,
276
303
  pool_url: str,
277
304
  fee: uint64,
278
- wallet_id: int,
305
+ wallet_id: Optional[int],
279
306
  prompt: bool,
280
307
  ) -> None:
281
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, config):
282
- enforce_https = config["full_node"]["selected_network"] == "mainnet"
308
+ selected_wallet_id = await wallet_id_lookup_and_check(wallet_info.client, wallet_id)
283
309
 
284
- if enforce_https and not pool_url.startswith("https://"):
285
- print(f"Pool URLs must be HTTPS on mainnet {pool_url}. Aborting.")
286
- return
287
- try:
288
- async with aiohttp.ClientSession() as session:
289
- async with session.get(
290
- f"{pool_url}/pool_info", ssl=ssl_context_for_root(get_mozilla_ca_crt())
291
- ) as response:
292
- if response.ok:
293
- json_dict = json.loads(await response.text())
294
- else:
295
- print(f"Response not OK: {response.status}")
296
- return
297
- except Exception as e:
298
- print(f"Error connecting to pool {pool_url}: {e}")
299
- return
300
-
301
- if json_dict["relative_lock_height"] > 1000:
302
- print("Relative lock height too high for this pool, cannot join")
303
- return
304
- if json_dict["protocol_version"] != POOL_PROTOCOL_VERSION:
305
- print(f"Incorrect version: {json_dict['protocol_version']}, should be {POOL_PROTOCOL_VERSION}")
306
- return
307
-
308
- pprint(json_dict)
309
- msg = f"\nWill join pool: {pool_url} with Plot NFT {fingerprint}."
310
- func = functools.partial(
311
- wallet_client.pw_join_pool,
312
- wallet_id,
313
- bytes32.from_hexstr(json_dict["target_puzzle_hash"]),
314
- pool_url,
315
- json_dict["relative_lock_height"],
316
- fee,
317
- )
310
+ enforce_https = wallet_info.config["selected_network"] == "mainnet"
318
311
 
319
- await submit_tx_with_confirmation(msg, prompt, func, wallet_client, fingerprint, wallet_id)
312
+ if enforce_https and not pool_url.startswith("https://"):
313
+ raise CliRpcConnectionError(f"Pool URLs must be HTTPS on mainnet {pool_url}.")
314
+ try:
315
+ async with aiohttp.ClientSession() as session:
316
+ async with session.get(f"{pool_url}/pool_info", ssl=ssl_context_for_root(get_mozilla_ca_crt())) as response:
317
+ if response.ok:
318
+ json_dict = json.loads(await response.text())
319
+ else:
320
+ raise CliRpcConnectionError(f"Response not OK: {response.status}")
321
+ except Exception as e:
322
+ raise CliRpcConnectionError(f"Error connecting to pool {pool_url}: {e}")
320
323
 
324
+ if json_dict["relative_lock_height"] > 1000:
325
+ raise CliRpcConnectionError("Relative lock height too high for this pool, cannot join")
321
326
 
322
- async def self_pool(
323
- *, wallet_rpc_port: Optional[int], fingerprint: int, fee: uint64, wallet_id: int, prompt: bool
324
- ) -> None:
325
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, _):
326
- msg = f"Will start self-farming with Plot NFT on wallet id {wallet_id} fingerprint {fingerprint}."
327
- func = functools.partial(wallet_client.pw_self_pool, wallet_id, fee)
328
- await submit_tx_with_confirmation(msg, prompt, func, wallet_client, fingerprint, wallet_id)
329
-
330
-
331
- async def inspect_cmd(wallet_rpc_port: Optional[int], fingerprint: int, wallet_id: int) -> None:
332
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, _):
333
- pool_wallet_info, unconfirmed_transactions = await wallet_client.pw_status(wallet_id)
334
- print(
335
- json.dumps(
336
- {
337
- "pool_wallet_info": pool_wallet_info.to_json_dict(),
338
- "unconfirmed_transactions": [
339
- {"sent_to": tx.sent_to, "transaction_id": tx.name.hex()} for tx in unconfirmed_transactions
340
- ],
341
- }
342
- )
327
+ if json_dict["protocol_version"] != POOL_PROTOCOL_VERSION:
328
+ raise CliRpcConnectionError(
329
+ f"Incorrect version: {json_dict['protocol_version']}, should be {POOL_PROTOCOL_VERSION}"
343
330
  )
344
331
 
332
+ pprint(json_dict)
333
+ msg = f"\nWill join pool: {pool_url} with Plot NFT {wallet_info.fingerprint}."
334
+ func = functools.partial(
335
+ wallet_info.client.pw_join_pool,
336
+ selected_wallet_id,
337
+ bytes32.from_hexstr(json_dict["target_puzzle_hash"]),
338
+ pool_url,
339
+ json_dict["relative_lock_height"],
340
+ fee,
341
+ )
345
342
 
346
- async def claim_cmd(*, wallet_rpc_port: Optional[int], fingerprint: int, fee: uint64, wallet_id: int) -> None:
347
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, _):
348
- msg = f"\nWill claim rewards for wallet ID: {wallet_id}."
349
- func = functools.partial(
350
- wallet_client.pw_absorb_rewards,
351
- wallet_id,
352
- fee,
343
+ await submit_tx_with_confirmation(
344
+ msg, prompt, func, wallet_info.client, wallet_info.fingerprint, selected_wallet_id
345
+ )
346
+
347
+
348
+ async def self_pool(*, wallet_info: WalletClientInfo, fee: uint64, wallet_id: Optional[int], prompt: bool) -> None:
349
+ selected_wallet_id = await wallet_id_lookup_and_check(wallet_info.client, wallet_id)
350
+ msg = (
351
+ "Will start self-farming with Plot NFT on wallet id "
352
+ f"{selected_wallet_id} fingerprint {wallet_info.fingerprint}."
353
+ )
354
+ func = functools.partial(wallet_info.client.pw_self_pool, selected_wallet_id, fee)
355
+ await submit_tx_with_confirmation(
356
+ msg, prompt, func, wallet_info.client, wallet_info.fingerprint, selected_wallet_id
357
+ )
358
+
359
+
360
+ async def inspect_cmd(wallet_info: WalletClientInfo, wallet_id: Optional[int]) -> None:
361
+ selected_wallet_id = await wallet_id_lookup_and_check(wallet_info.client, wallet_id)
362
+ pool_wallet_info, unconfirmed_transactions = await wallet_info.client.pw_status(selected_wallet_id)
363
+ print(
364
+ json.dumps(
365
+ {
366
+ "pool_wallet_info": pool_wallet_info.to_json_dict(),
367
+ "unconfirmed_transactions": [
368
+ {"sent_to": tx.sent_to, "transaction_id": tx.name.hex()} for tx in unconfirmed_transactions
369
+ ],
370
+ }
353
371
  )
354
- await submit_tx_with_confirmation(msg, False, func, wallet_client, fingerprint, wallet_id)
372
+ )
373
+
374
+
375
+ async def claim_cmd(*, wallet_info: WalletClientInfo, fee: uint64, wallet_id: Optional[int]) -> None:
376
+ selected_wallet_id = await wallet_id_lookup_and_check(wallet_info.client, wallet_id)
377
+ msg = f"\nWill claim rewards for wallet ID: {selected_wallet_id}."
378
+ func = functools.partial(
379
+ wallet_info.client.pw_absorb_rewards,
380
+ selected_wallet_id,
381
+ fee,
382
+ )
383
+ await submit_tx_with_confirmation(msg, False, func, wallet_info.client, wallet_info.fingerprint, selected_wallet_id)
355
384
 
356
385
 
357
- async def change_payout_instructions(launcher_id: str, address: CliAddress) -> None:
358
- new_pool_configs: List[PoolWalletConfig] = []
386
+ async def change_payout_instructions(launcher_id: bytes32, address: CliAddress, root_path: Optional[Path]) -> None:
387
+ new_pool_configs: list[PoolWalletConfig] = []
359
388
  id_found = False
360
389
  puzzle_hash = address.validate_address_type_get_ph(AddressType.XCH)
390
+ if root_path is None:
391
+ root_path = DEFAULT_ROOT_PATH
361
392
 
362
- old_configs: List[PoolWalletConfig] = load_pool_config(DEFAULT_ROOT_PATH)
393
+ old_configs: list[PoolWalletConfig] = load_pool_config(root_path)
363
394
  for pool_config in old_configs:
364
- if pool_config.launcher_id == hexstr_to_bytes(launcher_id):
395
+ if pool_config.launcher_id == launcher_id:
365
396
  id_found = True
366
397
  pool_config = replace(pool_config, payout_instructions=puzzle_hash.hex())
367
398
  new_pool_configs.append(pool_config)
368
399
  if id_found:
369
- print(f"Launcher Id: {launcher_id} Found, Updating Config.")
370
- await update_pool_config(DEFAULT_ROOT_PATH, new_pool_configs)
371
- print(f"Payout Instructions for launcher id: {launcher_id} successfully updated to: {address}.")
400
+ print(f"Launcher Id: {launcher_id.hex()} Found, Updating Config.")
401
+ await update_pool_config(root_path, new_pool_configs)
402
+ print(f"Payout Instructions for launcher id: {launcher_id.hex()} successfully updated to: {address}.")
372
403
  print(f"You will need to change the payout instructions on every device you use to: {address}.")
373
404
  else:
374
- print(f"Launcher Id: {launcher_id} Not found.")
405
+ print(f"Launcher Id: {launcher_id.hex()} Not found.")
chia/cmds/plots.py CHANGED
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
 
8
8
  import click
9
9
 
10
+ from chia.cmds.cmd_classes import ChiaCliContext
10
11
  from chia.plotting.util import add_plot_directory, validate_plot_size
11
12
 
12
13
  log = logging.getLogger(__name__)
@@ -33,7 +34,7 @@ def plots_cmd(ctx: click.Context) -> None:
33
34
  """Create, add, remove and check your plots"""
34
35
  from chia.util.chia_logging import initialize_logging
35
36
 
36
- root_path: Path = ctx.obj["root_path"]
37
+ root_path = ChiaCliContext.set_default(ctx).root_path
37
38
  if not root_path.is_dir():
38
39
  raise RuntimeError("Please initialize (or migrate) your config directory with 'chia init'")
39
40
  initialize_logging("", {"log_level": "INFO", "log_stdout": True}, root_path)
@@ -132,7 +133,7 @@ def create_cmd(
132
133
  nobitfield=nobitfield,
133
134
  )
134
135
 
135
- root_path: Path = ctx.obj["root_path"]
136
+ root_path = ChiaCliContext.set_default(ctx).root_path
136
137
  try:
137
138
  validate_plot_size(root_path, size, override_k)
138
139
  except ValueError as e:
@@ -177,7 +178,14 @@ def check_cmd(
177
178
  ) -> None:
178
179
  from chia.plotting.check_plots import check_plots
179
180
 
180
- check_plots(ctx.obj["root_path"], num, challenge_start, grep_string, list_duplicates, debug_show_memo)
181
+ check_plots(
182
+ ChiaCliContext.set_default(ctx).root_path,
183
+ num,
184
+ challenge_start,
185
+ grep_string,
186
+ list_duplicates,
187
+ debug_show_memo,
188
+ )
181
189
 
182
190
 
183
191
  @plots_cmd.command("add", help="Adds a directory of plots")
@@ -194,7 +202,7 @@ def add_cmd(ctx: click.Context, final_dir: str) -> None:
194
202
  from chia.plotting.util import add_plot_directory
195
203
 
196
204
  try:
197
- add_plot_directory(ctx.obj["root_path"], final_dir)
205
+ add_plot_directory(ChiaCliContext.set_default(ctx).root_path, final_dir)
198
206
  print(f"Successfully added: {final_dir}")
199
207
  except ValueError as e:
200
208
  print(e)
@@ -213,10 +221,10 @@ def add_cmd(ctx: click.Context, final_dir: str) -> None:
213
221
  def remove_cmd(ctx: click.Context, final_dir: str) -> None:
214
222
  from chia.plotting.util import remove_plot_directory
215
223
 
216
- remove_plot_directory(ctx.obj["root_path"], final_dir)
224
+ remove_plot_directory(ChiaCliContext.set_default(ctx).root_path, final_dir)
217
225
 
218
226
 
219
227
  @plots_cmd.command("show", help="Shows the directory of current plots")
220
228
  @click.pass_context
221
229
  def show_cmd(ctx: click.Context) -> None:
222
- show_plots(ctx.obj["root_path"])
230
+ show_plots(ChiaCliContext.set_default(ctx).root_path)
chia/cmds/plotters.py CHANGED
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import click
4
4
 
5
+ from chia.cmds.cmd_classes import ChiaCliContext
5
6
  from chia.plotters.plotters import call_plotters
6
7
 
7
8
 
@@ -14,4 +15,4 @@ from chia.plotters.plotters import call_plotters
14
15
  @click.pass_context
15
16
  @click.argument("args", nargs=-1)
16
17
  def plotters_cmd(ctx: click.Context, args: tuple[click.Argument]) -> None:
17
- call_plotters(ctx.obj["root_path"], args)
18
+ call_plotters(ChiaCliContext.set_default(ctx).root_path, args)