chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/cmds/cmds_util.py CHANGED
@@ -1,11 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import contextlib
3
4
  import dataclasses
4
5
  import logging
5
6
  import traceback
7
+ from collections.abc import AsyncIterator
6
8
  from contextlib import asynccontextmanager
7
9
  from pathlib import Path
8
- from typing import Any, AsyncIterator, Callable, Dict, List, Optional, Tuple, Type, TypeVar
10
+ from typing import Any, Callable, Optional, TypeVar
9
11
 
10
12
  import click
11
13
  from aiohttp import ClientConnectorCertificateError, ClientConnectorError
@@ -24,7 +26,6 @@ from chia.simulator.simulator_full_node_rpc_client import SimulatorFullNodeRpcCl
24
26
  from chia.types.blockchain_format.sized_bytes import bytes32
25
27
  from chia.types.mempool_submission_status import MempoolSubmissionStatus
26
28
  from chia.util.config import load_config
27
- from chia.util.default_root import DEFAULT_ROOT_PATH
28
29
  from chia.util.errors import CliRpcConnectionError, InvalidPathError
29
30
  from chia.util.ints import uint16, uint32, uint64
30
31
  from chia.util.keychain import KeyData
@@ -33,7 +34,7 @@ from chia.wallet.conditions import ConditionValidTimes
33
34
  from chia.wallet.transaction_record import TransactionRecord
34
35
  from chia.wallet.util.tx_config import CoinSelectionConfig, CoinSelectionConfigLoader, TXConfig, TXConfigLoader
35
36
 
36
- NODE_TYPES: Dict[str, Type[RpcClient]] = {
37
+ NODE_TYPES: dict[str, type[RpcClient]] = {
37
38
  "base": RpcClient,
38
39
  "farmer": FarmerRpcClient,
39
40
  "wallet": WalletRpcClient,
@@ -43,7 +44,7 @@ NODE_TYPES: Dict[str, Type[RpcClient]] = {
43
44
  "simulator": SimulatorFullNodeRpcClient,
44
45
  }
45
46
 
46
- node_config_section_names: Dict[Type[RpcClient], str] = {
47
+ node_config_section_names: dict[type[RpcClient], str] = {
47
48
  RpcClient: "base",
48
49
  FarmerRpcClient: "farmer",
49
50
  WalletRpcClient: "wallet",
@@ -92,21 +93,18 @@ async def validate_client_connection(
92
93
 
93
94
  @asynccontextmanager
94
95
  async def get_any_service_client(
95
- client_type: Type[_T_RpcClient],
96
+ client_type: type[_T_RpcClient],
97
+ root_path: Path,
96
98
  rpc_port: Optional[int] = None,
97
- root_path: Optional[Path] = None,
98
99
  consume_errors: bool = True,
99
100
  use_ssl: bool = True,
100
- ) -> AsyncIterator[Tuple[_T_RpcClient, Dict[str, Any]]]:
101
+ ) -> AsyncIterator[tuple[_T_RpcClient, dict[str, Any]]]:
101
102
  """
102
103
  Yields a tuple with a RpcClient for the applicable node type a dictionary of the node's configuration,
103
104
  and a fingerprint if applicable. However, if connecting to the node fails then we will return None for
104
105
  the RpcClient.
105
106
  """
106
107
 
107
- if root_path is None:
108
- root_path = DEFAULT_ROOT_PATH
109
-
110
108
  node_type = node_config_section_names.get(client_type)
111
109
  if node_type is None:
112
110
  # Click already checks this, so this should never happen
@@ -116,42 +114,44 @@ async def get_any_service_client(
116
114
  self_hostname = config["self_hostname"]
117
115
  if rpc_port is None:
118
116
  rpc_port = config[node_type]["rpc_port"]
119
- # select node client type based on string
120
- if use_ssl:
121
- node_client = await client_type.create(self_hostname, uint16(rpc_port), root_path=root_path, net_config=config)
122
- else:
123
- node_client = await client_type.create(self_hostname, uint16(rpc_port), root_path=None, net_config=None)
124
117
 
125
- try:
126
- # check if we can connect to node
127
- await validate_client_connection(node_client, node_type, rpc_port, consume_errors)
128
- yield node_client, config
129
- except ResponseFailureError as e:
130
- if not consume_errors:
131
- raise
118
+ async with contextlib.AsyncExitStack() as exit_stack:
119
+ # select node client type based on string
120
+ if use_ssl:
121
+ node_client = await exit_stack.enter_async_context(
122
+ client_type.create_as_context(self_hostname, uint16(rpc_port), root_path=root_path, net_config=config)
123
+ )
124
+ else:
125
+ node_client = await exit_stack.enter_async_context(
126
+ client_type.create_as_context(self_hostname, uint16(rpc_port), root_path=None, net_config=None)
127
+ )
132
128
 
133
- response = dict(e.response)
134
- tb = response.pop("traceback", None)
129
+ try:
130
+ # check if we can connect to node
131
+ await validate_client_connection(node_client, node_type, rpc_port, consume_errors)
132
+ yield node_client, config
133
+ except ResponseFailureError as e:
134
+ if not consume_errors:
135
+ raise
135
136
 
136
- print(f"{ResponseFailureError(response=response)}")
137
+ response = dict(e.response)
138
+ tb = response.pop("traceback", None)
137
139
 
138
- if tb is not None:
139
- print(f"Traceback:\n{tb}")
140
- except Exception as e: # this is only here to make the errors more user-friendly.
141
- if not consume_errors or isinstance(e, (CliRpcConnectionError, click.Abort)):
142
- # CliRpcConnectionError will be handled by click.
143
- raise
144
- print(f"Exception from '{node_type}' {e}:\n{traceback.format_exc()}")
140
+ print(f"{ResponseFailureError(response=response)}")
145
141
 
146
- finally:
147
- node_client.close() # this can run even if already closed, will just do nothing.
148
- await node_client.await_closed()
142
+ if tb is not None:
143
+ print(f"Traceback:\n{tb}")
144
+ except Exception as e: # this is only here to make the errors more user-friendly.
145
+ if not consume_errors or isinstance(e, (CliRpcConnectionError, click.Abort)):
146
+ # CliRpcConnectionError will be handled by click.
147
+ raise
148
+ print(f"Exception from '{node_type}' {e}:\n{traceback.format_exc()}")
149
149
 
150
150
 
151
151
  async def get_wallet(root_path: Path, wallet_client: WalletRpcClient, fingerprint: Optional[int]) -> int:
152
152
  selected_fingerprint: int
153
153
  keychain_proxy: Optional[KeychainProxy] = None
154
- all_keys: List[KeyData] = []
154
+ all_keys: list[KeyData] = []
155
155
 
156
156
  try:
157
157
  if fingerprint is not None:
@@ -177,9 +177,10 @@ async def get_wallet(root_path: Path, wallet_client: WalletRpcClient, fingerprin
177
177
  current_sync_status: str = ""
178
178
  indent = " "
179
179
  if logged_in_key is not None:
180
- if await wallet_client.get_synced():
180
+ sync_response = await wallet_client.get_sync_status()
181
+ if sync_response.synced:
181
182
  current_sync_status = "Synced"
182
- elif await wallet_client.get_sync_status():
183
+ elif sync_response.syncing:
183
184
  current_sync_status = "Syncing"
184
185
  else:
185
186
  current_sync_status = "Not Synced"
@@ -243,12 +244,12 @@ async def get_wallet(root_path: Path, wallet_client: WalletRpcClient, fingerprin
243
244
 
244
245
  @asynccontextmanager
245
246
  async def get_wallet_client(
247
+ root_path: Path,
246
248
  wallet_rpc_port: Optional[int] = None,
247
249
  fingerprint: Optional[int] = None,
248
- root_path: Path = DEFAULT_ROOT_PATH,
249
250
  consume_errors: bool = True,
250
- ) -> AsyncIterator[Tuple[WalletRpcClient, int, Dict[str, Any]]]:
251
- async with get_any_service_client(WalletRpcClient, wallet_rpc_port, root_path, consume_errors) as (
251
+ ) -> AsyncIterator[tuple[WalletRpcClient, int, dict[str, Any]]]:
252
+ async with get_any_service_client(WalletRpcClient, root_path, wallet_rpc_port, consume_errors) as (
252
253
  wallet_client,
253
254
  config,
254
255
  ):
@@ -261,7 +262,7 @@ def cli_confirm(input_message: str, abort_message: str = "Did not confirm. Abort
261
262
  Raise a click.Abort if the user does not respond with 'y' or 'yes'
262
263
  """
263
264
  response = input(input_message).lower()
264
- if response not in ["y", "yes"]:
265
+ if response not in {"y", "yes"}:
265
266
  print(abort_message)
266
267
  raise click.Abort()
267
268
 
@@ -323,7 +324,7 @@ def timelock_args(enable: Optional[bool] = None) -> Callable[[Callable[..., None
323
324
  min_time=uint64.construct_optional(kwargs["valid_at"]),
324
325
  max_time=uint64.construct_optional(kwargs["expires_at"]),
325
326
  ),
326
- **{k: v for k, v in kwargs.items() if k not in ("valid_at", "expires_at")},
327
+ **{k: v for k, v in kwargs.items() if k not in {"valid_at", "expires_at"}},
327
328
  )
328
329
 
329
330
  return click.option(
@@ -350,27 +351,26 @@ def timelock_args(enable: Optional[bool] = None) -> Callable[[Callable[..., None
350
351
  @streamable
351
352
  @dataclasses.dataclass(frozen=True)
352
353
  class TransactionBundle(Streamable):
353
- txs: List[TransactionRecord]
354
+ txs: list[TransactionRecord]
354
355
 
355
356
 
356
357
  def tx_out_cmd(
357
358
  enable_timelock_args: Optional[bool] = None,
358
- ) -> Callable[[Callable[..., List[TransactionRecord]]], Callable[..., None]]:
359
-
360
- def _tx_out_cmd(func: Callable[..., List[TransactionRecord]]) -> Callable[..., None]:
359
+ ) -> Callable[[Callable[..., list[TransactionRecord]]], Callable[..., None]]:
360
+ def _tx_out_cmd(func: Callable[..., list[TransactionRecord]]) -> Callable[..., None]:
361
361
  @timelock_args(enable=enable_timelock_args)
362
- def original_cmd(transaction_file: Optional[str] = None, **kwargs: Any) -> None:
363
- txs: List[TransactionRecord] = func(**kwargs)
364
- if transaction_file is not None:
365
- print(f"Writing transactions to file {transaction_file}:")
366
- with open(Path(transaction_file), "wb") as file:
362
+ def original_cmd(transaction_file_out: Optional[str] = None, **kwargs: Any) -> None:
363
+ txs: list[TransactionRecord] = func(**kwargs)
364
+ if transaction_file_out is not None:
365
+ print(f"Writing transactions to file {transaction_file_out}:")
366
+ with open(Path(transaction_file_out), "wb") as file:
367
367
  file.write(bytes(TransactionBundle(txs)))
368
368
 
369
369
  return click.option(
370
370
  "--push/--no-push", help="Push the transaction to the network", type=bool, is_flag=True, default=True
371
371
  )(
372
372
  click.option(
373
- "--transaction-file",
373
+ "--transaction-file-out",
374
374
  help="A file to write relevant transactions to",
375
375
  type=str,
376
376
  required=False,
@@ -385,8 +385,8 @@ def tx_out_cmd(
385
385
  class CMDCoinSelectionConfigLoader:
386
386
  min_coin_amount: CliAmount = cli_amount_none
387
387
  max_coin_amount: CliAmount = cli_amount_none
388
- excluded_coin_amounts: Optional[List[CliAmount]] = None
389
- excluded_coin_ids: Optional[List[bytes32]] = None
388
+ excluded_coin_amounts: Optional[list[CliAmount]] = None
389
+ excluded_coin_ids: Optional[list[bytes32]] = None
390
390
 
391
391
  def to_coin_selection_config(self, mojo_per_unit: int) -> CoinSelectionConfig:
392
392
  return CoinSelectionConfigLoader(
@@ -405,7 +405,7 @@ class CMDCoinSelectionConfigLoader:
405
405
  class CMDTXConfigLoader(CMDCoinSelectionConfigLoader):
406
406
  reuse_puzhash: Optional[bool] = None
407
407
 
408
- def to_tx_config(self, mojo_per_unit: int, config: Dict[str, Any], fingerprint: int) -> TXConfig:
408
+ def to_tx_config(self, mojo_per_unit: int, config: dict[str, Any], fingerprint: int) -> TXConfig:
409
409
  cs_config = self.to_coin_selection_config(mojo_per_unit)
410
410
  return TXConfigLoader(
411
411
  cs_config.min_coin_amount,
@@ -476,16 +476,6 @@ def format_minutes(minutes: int) -> str:
476
476
  return "Unknown"
477
477
 
478
478
 
479
- def prompt_yes_no(prompt: str) -> bool:
480
- while True:
481
- response = str(input(prompt + " (y/n): ")).lower().strip()
482
- ch = response[:1]
483
- if ch == "y":
484
- return True
485
- elif ch == "n":
486
- return False
487
-
488
-
489
479
  def validate_directory_writable(path: Path) -> None:
490
480
  write_test_path = path / ".write_test"
491
481
  try:
chia/cmds/coin_funcs.py CHANGED
@@ -2,9 +2,11 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  import sys
5
- from typing import List, Optional, Sequence, Tuple
5
+ from collections.abc import Sequence
6
+ from typing import Optional
6
7
 
7
- from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, cli_confirm, get_wallet_client
8
+ from chia.cmds.cmd_helpers import WalletClientInfo
9
+ from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, cli_confirm
8
10
  from chia.cmds.param_types import CliAmount
9
11
  from chia.cmds.wallet_funcs import get_mojo_per_unit, get_wallet_type, print_balance
10
12
  from chia.rpc.wallet_request_types import CombineCoins, SplitCoins
@@ -20,8 +22,7 @@ from chia.wallet.util.wallet_types import WalletType
20
22
 
21
23
  async def async_list(
22
24
  *,
23
- wallet_rpc_port: Optional[int],
24
- fingerprint: Optional[int],
25
+ client_info: WalletClientInfo,
25
26
  wallet_id: int,
26
27
  max_coin_amount: CliAmount,
27
28
  min_coin_amount: CliAmount,
@@ -30,61 +31,60 @@ async def async_list(
30
31
  show_unconfirmed: bool,
31
32
  paginate: Optional[bool],
32
33
  ) -> None:
33
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, _, config):
34
- addr_prefix = selected_network_address_prefix(config)
35
- if paginate is None:
36
- paginate = sys.stdout.isatty()
37
- try:
38
- wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=wallet_client)
39
- mojo_per_unit = get_mojo_per_unit(wallet_type)
40
- except LookupError:
41
- print(f"Wallet id: {wallet_id} not found.")
42
- return
43
- if not await wallet_client.get_synced():
44
- print("Wallet not synced. Please wait.")
45
- return
46
- conf_coins, unconfirmed_removals, unconfirmed_additions = await wallet_client.get_spendable_coins(
47
- wallet_id=wallet_id,
48
- coin_selection_config=CMDCoinSelectionConfigLoader(
49
- max_coin_amount=max_coin_amount,
50
- min_coin_amount=min_coin_amount,
51
- excluded_coin_amounts=list(excluded_amounts),
52
- excluded_coin_ids=list(excluded_coin_ids),
53
- ).to_coin_selection_config(mojo_per_unit),
34
+ addr_prefix = selected_network_address_prefix(client_info.config)
35
+ if paginate is None:
36
+ paginate = sys.stdout.isatty()
37
+ try:
38
+ wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=client_info.client)
39
+ mojo_per_unit = get_mojo_per_unit(wallet_type)
40
+ except LookupError:
41
+ print(f"Wallet id: {wallet_id} not found.")
42
+ return
43
+ if not (await client_info.client.get_sync_status()).synced:
44
+ print("Wallet not synced. Please wait.")
45
+ return
46
+ conf_coins, unconfirmed_removals, unconfirmed_additions = await client_info.client.get_spendable_coins(
47
+ wallet_id=wallet_id,
48
+ coin_selection_config=CMDCoinSelectionConfigLoader(
49
+ max_coin_amount=max_coin_amount,
50
+ min_coin_amount=min_coin_amount,
51
+ excluded_coin_amounts=list(excluded_amounts),
52
+ excluded_coin_ids=list(excluded_coin_ids),
53
+ ).to_coin_selection_config(mojo_per_unit),
54
+ )
55
+ print(f"There are a total of {len(conf_coins) + len(unconfirmed_additions)} coins in wallet {wallet_id}.")
56
+ print(f"{len(conf_coins)} confirmed coins.")
57
+ print(f"{len(unconfirmed_additions)} unconfirmed additions.")
58
+ print(f"{len(unconfirmed_removals)} unconfirmed removals.")
59
+ print("Confirmed coins:")
60
+ print_coins(
61
+ "\tAddress: {} Amount: {}, Confirmed in block: {}\n",
62
+ [(cr.coin, str(cr.confirmed_block_index)) for cr in conf_coins],
63
+ mojo_per_unit,
64
+ addr_prefix,
65
+ paginate,
66
+ )
67
+ if show_unconfirmed:
68
+ print("\nUnconfirmed Removals:")
69
+ print_coins(
70
+ "\tPrevious Address: {} Amount: {}, Confirmed in block: {}\n",
71
+ [(cr.coin, str(cr.confirmed_block_index)) for cr in unconfirmed_removals],
72
+ mojo_per_unit,
73
+ addr_prefix,
74
+ paginate,
54
75
  )
55
- print(f"There are a total of {len(conf_coins) + len(unconfirmed_additions)} coins in wallet {wallet_id}.")
56
- print(f"{len(conf_coins)} confirmed coins.")
57
- print(f"{len(unconfirmed_additions)} unconfirmed additions.")
58
- print(f"{len(unconfirmed_removals)} unconfirmed removals.")
59
- print("Confirmed coins:")
76
+ print("\nUnconfirmed Additions:")
60
77
  print_coins(
61
- "\tAddress: {} Amount: {}, Confirmed in block: {}\n",
62
- [(cr.coin, str(cr.confirmed_block_index)) for cr in conf_coins],
78
+ "\tNew Address: {} Amount: {}, Not yet confirmed in a block.{}\n",
79
+ [(coin, "") for coin in unconfirmed_additions],
63
80
  mojo_per_unit,
64
81
  addr_prefix,
65
82
  paginate,
66
83
  )
67
- if show_unconfirmed:
68
- print("\nUnconfirmed Removals:")
69
- print_coins(
70
- "\tPrevious Address: {} Amount: {}, Confirmed in block: {}\n",
71
- [(cr.coin, str(cr.confirmed_block_index)) for cr in unconfirmed_removals],
72
- mojo_per_unit,
73
- addr_prefix,
74
- paginate,
75
- )
76
- print("\nUnconfirmed Additions:")
77
- print_coins(
78
- "\tNew Address: {} Amount: {}, Not yet confirmed in a block.{}\n",
79
- [(coin, "") for coin in unconfirmed_additions],
80
- mojo_per_unit,
81
- addr_prefix,
82
- paginate,
83
- )
84
84
 
85
85
 
86
86
  def print_coins(
87
- target_string: str, coins: List[Tuple[Coin, str]], mojo_per_unit: int, addr_prefix: str, paginate: bool
87
+ target_string: str, coins: list[tuple[Coin, str]], mojo_per_unit: int, addr_prefix: str, paginate: bool
88
88
  ) -> None:
89
89
  if len(coins) == 0:
90
90
  print("\tNo Coins.")
@@ -113,15 +113,14 @@ def print_coins(
113
113
 
114
114
  async def async_combine(
115
115
  *,
116
- wallet_rpc_port: Optional[int],
117
- fingerprint: Optional[int],
116
+ client_info: WalletClientInfo,
118
117
  wallet_id: int,
119
118
  fee: uint64,
120
119
  max_coin_amount: CliAmount,
121
120
  min_coin_amount: CliAmount,
122
121
  excluded_amounts: Sequence[CliAmount],
123
122
  coins_to_exclude: Sequence[bytes32],
124
- reuse_puzhash: bool,
123
+ reuse_puzhash: Optional[bool],
125
124
  number_of_coins: int,
126
125
  target_coin_amount: Optional[CliAmount],
127
126
  target_coin_ids: Sequence[bytes32],
@@ -129,132 +128,148 @@ async def async_combine(
129
128
  push: bool,
130
129
  condition_valid_times: ConditionValidTimes,
131
130
  override: bool,
132
- ) -> List[TransactionRecord]:
133
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, config):
134
- try:
135
- wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=wallet_client)
136
- mojo_per_unit = get_mojo_per_unit(wallet_type)
137
- except LookupError:
138
- print(f"Wallet id: {wallet_id} not found.")
139
- return []
140
- if not await wallet_client.get_synced():
141
- print("Wallet not synced. Please wait.")
142
- return []
131
+ ) -> list[TransactionRecord]:
132
+ try:
133
+ wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=client_info.client)
134
+ mojo_per_unit = get_mojo_per_unit(wallet_type)
135
+ except LookupError:
136
+ print(f"Wallet id: {wallet_id} not found.")
137
+ return []
138
+ if not (await client_info.client.get_sync_status()).synced:
139
+ print("Wallet not synced. Please wait.")
140
+ return []
143
141
 
144
- tx_config = CMDTXConfigLoader(
145
- max_coin_amount=max_coin_amount,
146
- min_coin_amount=min_coin_amount,
147
- excluded_coin_amounts=list(excluded_amounts),
148
- excluded_coin_ids=list(coins_to_exclude),
149
- reuse_puzhash=reuse_puzhash,
150
- ).to_tx_config(mojo_per_unit, config, fingerprint)
142
+ tx_config = CMDTXConfigLoader(
143
+ max_coin_amount=max_coin_amount,
144
+ min_coin_amount=min_coin_amount,
145
+ excluded_coin_amounts=list(excluded_amounts),
146
+ excluded_coin_ids=list(coins_to_exclude),
147
+ reuse_puzhash=reuse_puzhash,
148
+ ).to_tx_config(mojo_per_unit, client_info.config, client_info.fingerprint)
151
149
 
152
- final_target_coin_amount = (
153
- None if target_coin_amount is None else target_coin_amount.convert_amount(mojo_per_unit)
154
- )
150
+ final_target_coin_amount = None if target_coin_amount is None else target_coin_amount.convert_amount(mojo_per_unit)
155
151
 
156
- combine_request = CombineCoins(
157
- wallet_id=uint32(wallet_id),
158
- target_coin_amount=final_target_coin_amount,
159
- number_of_coins=uint16(number_of_coins),
160
- target_coin_ids=list(target_coin_ids),
161
- largest_first=largest_first,
162
- fee=fee,
163
- push=False,
164
- )
165
- resp = await wallet_client.combine_coins(
166
- combine_request,
152
+ combine_request = CombineCoins(
153
+ wallet_id=uint32(wallet_id),
154
+ target_coin_amount=final_target_coin_amount,
155
+ number_of_coins=uint16(number_of_coins),
156
+ target_coin_ids=list(target_coin_ids),
157
+ largest_first=largest_first,
158
+ fee=fee,
159
+ push=False,
160
+ )
161
+ resp = await client_info.client.combine_coins(
162
+ combine_request,
163
+ tx_config,
164
+ timelock_info=condition_valid_times,
165
+ )
166
+
167
+ if not override and wallet_id == 1 and fee >= sum(coin.amount for tx in resp.transactions for coin in tx.removals):
168
+ print("Fee is >= the amount of coins selected. To continue, please use --override flag.")
169
+ return []
170
+
171
+ print(f"Transactions would combine up to {number_of_coins} coins.")
172
+ if push:
173
+ cli_confirm("Would you like to Continue? (y/n): ")
174
+ resp = await client_info.client.combine_coins(
175
+ dataclasses.replace(combine_request, push=True),
167
176
  tx_config,
168
177
  timelock_info=condition_valid_times,
169
178
  )
170
-
171
- if (
172
- not override
173
- and wallet_id == 1
174
- and fee >= sum(coin.amount for tx in resp.transactions for coin in tx.removals)
175
- ):
176
- print("Fee is >= the amount of coins selected. To continue, please use --override flag.")
177
- return []
178
-
179
- print(f"Transactions would combine up to {number_of_coins} coins.")
180
- if push:
181
- cli_confirm("Would you like to Continue? (y/n): ")
182
- resp = await wallet_client.combine_coins(
183
- dataclasses.replace(combine_request, push=True),
184
- tx_config,
185
- timelock_info=condition_valid_times,
179
+ for tx in resp.transactions:
180
+ print(f"Transaction sent: {tx.name}")
181
+ print(
182
+ f"To get status, use command: chia wallet get_transaction -f {client_info.fingerprint} -tx 0x{tx.name}"
186
183
  )
187
- for tx in resp.transactions:
188
- print(f"Transaction sent: {tx.name}")
189
- print(f"To get status, use command: chia wallet get_transaction -f {fingerprint} -tx 0x{tx.name}")
190
184
 
191
- return resp.transactions
185
+ return resp.transactions
192
186
 
193
187
 
194
188
  async def async_split(
195
189
  *,
196
- wallet_rpc_port: Optional[int],
197
- fingerprint: Optional[int],
190
+ client_info: WalletClientInfo,
198
191
  wallet_id: int,
199
192
  fee: uint64,
200
- number_of_coins: int,
201
- amount_per_coin: CliAmount,
193
+ number_of_coins: Optional[int],
194
+ amount_per_coin: Optional[CliAmount],
202
195
  target_coin_id: bytes32,
203
196
  max_coin_amount: CliAmount,
204
197
  min_coin_amount: CliAmount,
205
198
  excluded_amounts: Sequence[CliAmount],
206
199
  coins_to_exclude: Sequence[bytes32],
207
- reuse_puzhash: bool,
200
+ reuse_puzhash: Optional[bool],
208
201
  push: bool,
209
202
  condition_valid_times: ConditionValidTimes,
210
- ) -> List[TransactionRecord]:
211
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, config):
212
- try:
213
- wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=wallet_client)
214
- mojo_per_unit = get_mojo_per_unit(wallet_type)
215
- except LookupError:
216
- print(f"Wallet id: {wallet_id} not found.")
203
+ ) -> list[TransactionRecord]:
204
+ try:
205
+ wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=client_info.client)
206
+ mojo_per_unit = get_mojo_per_unit(wallet_type)
207
+ except LookupError:
208
+ print(f"Wallet id: {wallet_id} not found.")
209
+ return []
210
+ if not (await client_info.client.get_sync_status()).synced:
211
+ print("Wallet not synced. Please wait.")
212
+ return []
213
+
214
+ if number_of_coins is None and amount_per_coin is None:
215
+ print("Must use either -a or -n. For more information run --help.")
216
+ return []
217
+
218
+ if number_of_coins is None:
219
+ coins = await client_info.client.get_coin_records_by_names([target_coin_id])
220
+ if len(coins) == 0:
221
+ print("Could not find target coin.")
217
222
  return []
218
- if not await wallet_client.get_synced():
219
- print("Wallet not synced. Please wait.")
223
+ assert amount_per_coin is not None
224
+ number_of_coins = int(coins[0].coin.amount // amount_per_coin.convert_amount(mojo_per_unit))
225
+ elif amount_per_coin is None:
226
+ coins = await client_info.client.get_coin_records_by_names([target_coin_id])
227
+ if len(coins) == 0:
228
+ print("Could not find target coin.")
220
229
  return []
230
+ assert number_of_coins is not None
231
+ amount_per_coin = CliAmount(True, uint64(coins[0].coin.amount // number_of_coins))
221
232
 
222
- final_amount_per_coin = amount_per_coin.convert_amount(mojo_per_unit)
233
+ final_amount_per_coin = amount_per_coin.convert_amount(mojo_per_unit)
223
234
 
224
- tx_config = CMDTXConfigLoader(
225
- max_coin_amount=max_coin_amount,
226
- min_coin_amount=min_coin_amount,
227
- excluded_coin_amounts=list(excluded_amounts),
228
- excluded_coin_ids=list(coins_to_exclude),
229
- reuse_puzhash=reuse_puzhash,
230
- ).to_tx_config(mojo_per_unit, config, fingerprint)
235
+ tx_config = CMDTXConfigLoader(
236
+ max_coin_amount=max_coin_amount,
237
+ min_coin_amount=min_coin_amount,
238
+ excluded_coin_amounts=list(excluded_amounts),
239
+ excluded_coin_ids=list(coins_to_exclude),
240
+ reuse_puzhash=reuse_puzhash,
241
+ ).to_tx_config(mojo_per_unit, client_info.config, client_info.fingerprint)
231
242
 
232
- transactions: List[TransactionRecord] = (
233
- await wallet_client.split_coins(
234
- SplitCoins(
235
- wallet_id=uint32(wallet_id),
236
- number_of_coins=uint16(number_of_coins),
237
- amount_per_coin=uint64(final_amount_per_coin),
238
- target_coin_id=target_coin_id,
239
- fee=fee,
240
- push=push,
241
- ),
242
- tx_config=tx_config,
243
- timelock_info=condition_valid_times,
244
- )
245
- ).transactions
243
+ transactions: list[TransactionRecord] = (
244
+ await client_info.client.split_coins(
245
+ SplitCoins(
246
+ wallet_id=uint32(wallet_id),
247
+ number_of_coins=uint16(number_of_coins),
248
+ amount_per_coin=uint64(final_amount_per_coin),
249
+ target_coin_id=target_coin_id,
250
+ fee=fee,
251
+ push=push,
252
+ ),
253
+ tx_config=tx_config,
254
+ timelock_info=condition_valid_times,
255
+ )
256
+ ).transactions
246
257
 
247
- if push:
248
- for tx in transactions:
249
- print(f"Transaction sent: {tx.name}")
250
- print(f"To get status, use command: chia wallet get_transaction -f {fingerprint} -tx 0x{tx.name}")
251
- dust_threshold = config.get("xch_spam_amount", 1000000) # min amount per coin in mojo
252
- spam_filter_after_n_txs = config.get("spam_filter_after_n_txs", 200) # how many txs to wait before filtering
253
- if final_amount_per_coin < dust_threshold and wallet_type == WalletType.STANDARD_WALLET:
258
+ if push:
259
+ for tx in transactions:
260
+ print(f"Transaction sent: {tx.name}")
254
261
  print(
255
- f"WARNING: The amount per coin: {amount_per_coin.amount} is less than the dust threshold: "
256
- f"{dust_threshold / (1 if amount_per_coin.mojos else mojo_per_unit)}. Some or all of the Coins "
257
- f"{'will' if number_of_coins > spam_filter_after_n_txs else 'may'} not show up in your wallet unless "
258
- f"you decrease the dust limit to below {final_amount_per_coin} mojos or disable it by setting it to 0."
262
+ f"To get status, use command: chia wallet get_transaction -f {client_info.fingerprint} -tx 0x{tx.name}"
259
263
  )
260
- return transactions
264
+ dust_threshold = client_info.config.get("xch_spam_amount", 1000000) # min amount per coin in mojo
265
+ spam_filter_after_n_txs = client_info.config.get(
266
+ "spam_filter_after_n_txs", 200
267
+ ) # how many txs to wait before filtering
268
+ if final_amount_per_coin < dust_threshold and wallet_type == WalletType.STANDARD_WALLET:
269
+ print(
270
+ f"WARNING: The amount per coin: {amount_per_coin.amount} is less than the dust threshold: "
271
+ f"{dust_threshold / (1 if amount_per_coin.mojos else mojo_per_unit)}. Some or all of the Coins "
272
+ f"{'will' if number_of_coins > spam_filter_after_n_txs else 'may'} not show up in your wallet unless "
273
+ f"you decrease the dust limit to below {final_amount_per_coin} mojos or disable it by setting it to 0."
274
+ )
275
+ return transactions