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/cmd_classes.py CHANGED
@@ -2,20 +2,19 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import collections
5
+ import dataclasses
5
6
  import inspect
7
+ import pathlib
6
8
  import sys
7
- from contextlib import asynccontextmanager
8
9
  from dataclasses import MISSING, dataclass, field, fields
9
10
  from typing import (
10
11
  Any,
11
- AsyncIterator,
12
12
  Callable,
13
- Dict,
14
- List,
13
+ ClassVar,
15
14
  Optional,
16
15
  Protocol,
17
- Type,
18
16
  Union,
17
+ final,
19
18
  get_args,
20
19
  get_origin,
21
20
  get_type_hints,
@@ -24,10 +23,9 @@ from typing import (
24
23
  import click
25
24
  from typing_extensions import dataclass_transform
26
25
 
27
- from chia.cmds.cmds_util import get_wallet_client
28
- from chia.rpc.wallet_rpc_client import WalletRpcClient
29
26
  from chia.types.blockchain_format.sized_bytes import bytes32
30
27
  from chia.util.byte_types import hexstr_to_bytes
28
+ from chia.util.default_root import DEFAULT_ROOT_PATH
31
29
  from chia.util.streamable import is_type_SpecificOptional
32
30
 
33
31
  SyncCmd = Callable[..., None]
@@ -53,7 +51,7 @@ def option(*param_decls: str, **kwargs: Any) -> Any:
53
51
  else:
54
52
  default_default = MISSING
55
53
 
56
- return field( # pylint: disable=invalid-field-call
54
+ return field(
57
55
  metadata=dict(
58
56
  option_args=dict(
59
57
  param_decls=tuple(param_decls),
@@ -64,6 +62,29 @@ def option(*param_decls: str, **kwargs: Any) -> Any:
64
62
  )
65
63
 
66
64
 
65
+ @final
66
+ @dataclasses.dataclass
67
+ class ChiaCliContext:
68
+ context_dict_key: ClassVar[str] = "_chia_cli_context"
69
+
70
+ root_path: pathlib.Path = DEFAULT_ROOT_PATH
71
+ expected_prefix: Optional[str] = None
72
+ rpc_port: Optional[int] = None
73
+ keys_fingerprint: Optional[int] = None
74
+ keys_filename: Optional[str] = None
75
+ expected_address_prefix: Optional[str] = None
76
+
77
+ @classmethod
78
+ def set_default(cls, ctx: click.Context) -> ChiaCliContext:
79
+ ctx.ensure_object(dict)
80
+ self = ctx.obj.setdefault(cls.context_dict_key, cls())
81
+ assert isinstance(self, cls)
82
+ return self
83
+
84
+ def to_click(self) -> dict[str, object]:
85
+ return {self.context_dict_key: self}
86
+
87
+
67
88
  class HexString(click.ParamType):
68
89
  name = "hexstring"
69
90
 
@@ -96,10 +117,10 @@ _CLASS_TYPES_TO_CLICK_TYPES = {
96
117
 
97
118
  @dataclass
98
119
  class _CommandParsingStage:
99
- my_dataclass: Type[ChiaCommand]
100
- my_option_decorators: List[Callable[[SyncCmd], SyncCmd]]
101
- my_members: Dict[str, _CommandParsingStage]
102
- my_kwarg_names: List[str]
120
+ my_dataclass: type[ChiaCommand]
121
+ my_option_decorators: list[Callable[[SyncCmd], SyncCmd]]
122
+ my_members: dict[str, _CommandParsingStage]
123
+ my_kwarg_names: list[str]
103
124
  _needs_context: bool
104
125
 
105
126
  def needs_context(self) -> bool:
@@ -108,14 +129,14 @@ class _CommandParsingStage:
108
129
  else:
109
130
  return any(member.needs_context() for member in self.my_members.values())
110
131
 
111
- def get_all_option_decorators(self) -> List[Callable[[SyncCmd], SyncCmd]]:
112
- all_option_decorators: List[Callable[[SyncCmd], SyncCmd]] = self.my_option_decorators
132
+ def get_all_option_decorators(self) -> list[Callable[[SyncCmd], SyncCmd]]:
133
+ all_option_decorators: list[Callable[[SyncCmd], SyncCmd]] = self.my_option_decorators
113
134
  for member in self.my_members.values():
114
135
  all_option_decorators.extend(member.get_all_option_decorators())
115
136
  return all_option_decorators
116
137
 
117
138
  def initialize_instance(self, **kwargs: Any) -> ChiaCommand:
118
- kwargs_to_pass: Dict[str, Any] = {}
139
+ kwargs_to_pass: dict[str, Any] = {}
119
140
  for kwarg_name in self.my_kwarg_names:
120
141
  kwargs_to_pass[kwarg_name] = kwargs[kwarg_name]
121
142
 
@@ -130,7 +151,7 @@ class _CommandParsingStage:
130
151
 
131
152
  def strip_click_context(func: SyncCmd) -> SyncCmd:
132
153
  def _inner(ctx: click.Context, **kwargs: Any) -> None:
133
- context: Dict[str, Any] = ctx.obj if ctx.obj is not None else {}
154
+ context = ChiaCliContext.set_default(ctx)
134
155
  func(context=context, **kwargs)
135
156
 
136
157
  return _inner
@@ -152,10 +173,10 @@ class _CommandParsingStage:
152
173
  instance.run()
153
174
 
154
175
 
155
- def _generate_command_parser(cls: Type[ChiaCommand]) -> _CommandParsingStage:
156
- option_decorators: List[Callable[[SyncCmd], SyncCmd]] = []
157
- kwarg_names: List[str] = []
158
- members: Dict[str, _CommandParsingStage] = {}
176
+ def _generate_command_parser(cls: type[ChiaCommand]) -> _CommandParsingStage:
177
+ option_decorators: list[Callable[[SyncCmd], SyncCmd]] = []
178
+ kwarg_names: list[str] = []
179
+ members: dict[str, _CommandParsingStage] = {}
159
180
  needs_context: bool = False
160
181
 
161
182
  hints = get_type_hints(cls)
@@ -166,13 +187,13 @@ def _generate_command_parser(cls: Type[ChiaCommand]) -> _CommandParsingStage:
166
187
  if getattr(hints[field_name], COMMAND_HELPER_ATTRIBUTE_NAME, False):
167
188
  members[field_name] = _generate_command_parser(hints[field_name])
168
189
  elif field_name == "context":
169
- if hints[field_name] != Context:
190
+ if hints[field_name] != ChiaCliContext:
170
191
  raise ValueError("only Context can be the hint for variables named 'context'")
171
192
  else:
172
193
  needs_context = True
173
194
  kwarg_names.append(field_name)
174
195
  elif "option_args" in _field.metadata:
175
- option_args: Dict[str, Any] = {"multiple": False, "required": False}
196
+ option_args: dict[str, Any] = {"multiple": False, "required": False}
176
197
  option_args.update(_field.metadata["option_args"])
177
198
 
178
199
  if "type" not in option_args:
@@ -216,8 +237,9 @@ def _generate_command_parser(cls: Type[ChiaCommand]) -> _CommandParsingStage:
216
237
  option_decorators.append(
217
238
  click.option(
218
239
  *option_args["param_decls"],
240
+ field_name,
219
241
  type=type_arg,
220
- **{k: v for k, v in option_args.items() if k not in ("param_decls", "type")},
242
+ **{k: v for k, v in option_args.items() if k not in {"param_decls", "type"}},
221
243
  )
222
244
  )
223
245
 
@@ -230,86 +252,72 @@ def _generate_command_parser(cls: Type[ChiaCommand]) -> _CommandParsingStage:
230
252
  )
231
253
 
232
254
 
233
- def _convert_class_to_function(cls: Type[ChiaCommand]) -> SyncCmd:
255
+ def _convert_class_to_function(cls: type[ChiaCommand]) -> SyncCmd:
234
256
  command_parser = _generate_command_parser(cls)
235
257
 
236
258
  return command_parser.apply_decorators(command_parser)
237
259
 
238
260
 
239
- @dataclass_transform()
240
- def chia_command(cmd: click.Group, name: str, help: str) -> Callable[[Type[ChiaCommand]], Type[ChiaCommand]]:
241
- def _chia_command(cls: Type[ChiaCommand]) -> Type[ChiaCommand]:
261
+ @dataclass_transform(frozen_default=True)
262
+ def chia_command(
263
+ *,
264
+ group: Optional[click.Group] = None,
265
+ name: str,
266
+ short_help: str,
267
+ help: str,
268
+ ) -> Callable[[type[ChiaCommand]], type[ChiaCommand]]:
269
+ def _chia_command(cls: type[ChiaCommand]) -> type[ChiaCommand]:
242
270
  # The type ignores here are largely due to the fact that the class information is not preserved after being
243
271
  # passed through the dataclass wrapper. Not sure what to do about this right now.
244
272
  if sys.version_info < (3, 10): # pragma: no cover
245
273
  # stuff below 3.10 doesn't know about kw_only
246
- wrapped_cls: Type[ChiaCommand] = dataclass( # type: ignore[assignment]
274
+ wrapped_cls: type[ChiaCommand] = dataclass( # type: ignore[assignment]
247
275
  frozen=True,
248
276
  )(cls)
249
277
  else:
250
- wrapped_cls: Type[ChiaCommand] = dataclass( # type: ignore[assignment]
278
+ wrapped_cls: type[ChiaCommand] = dataclass( # type: ignore[assignment]
251
279
  frozen=True,
252
280
  kw_only=True,
253
281
  )(cls)
254
282
 
255
- cmd.command(name, short_help=help)(_convert_class_to_function(wrapped_cls))
283
+ metadata = Metadata(
284
+ command=click.command(
285
+ name=name,
286
+ short_help=short_help,
287
+ help=help,
288
+ )(_convert_class_to_function(wrapped_cls))
289
+ )
290
+
291
+ setattr(wrapped_cls, _chia_command_metadata_attribute, metadata)
292
+ if group is not None:
293
+ group.add_command(metadata.command)
294
+
256
295
  return wrapped_cls
257
296
 
258
297
  return _chia_command
259
298
 
260
299
 
261
- @dataclass_transform()
262
- def command_helper(cls: Type[Any]) -> Type[Any]:
300
+ _chia_command_metadata_attribute = f"_{__name__.replace('.', '_')}_{chia_command.__qualname__}_metadata"
301
+
302
+
303
+ @dataclass(frozen=True)
304
+ class Metadata:
305
+ command: click.Command
306
+
307
+
308
+ def get_chia_command_metadata(cls: type[ChiaCommand]) -> Metadata:
309
+ metadata: Optional[Metadata] = getattr(cls, _chia_command_metadata_attribute, None)
310
+ if metadata is None:
311
+ raise Exception(f"Class is not a chia command: {cls}")
312
+
313
+ return metadata
314
+
315
+
316
+ @dataclass_transform(frozen_default=True)
317
+ def command_helper(cls: type[Any]) -> type[Any]:
263
318
  if sys.version_info < (3, 10): # stuff below 3.10 doesn't support kw_only
264
319
  new_cls = dataclass(frozen=True)(cls) # pragma: no cover
265
320
  else:
266
321
  new_cls = dataclass(frozen=True, kw_only=True)(cls)
267
322
  setattr(new_cls, COMMAND_HELPER_ATTRIBUTE_NAME, True)
268
323
  return new_cls
269
-
270
-
271
- Context = Dict[str, Any]
272
-
273
-
274
- @dataclass(frozen=True)
275
- class WalletClientInfo:
276
- client: WalletRpcClient
277
- fingerprint: int
278
- config: Dict[str, Any]
279
-
280
-
281
- @command_helper
282
- class NeedsWalletRPC:
283
- context: Context = field(default_factory=dict) # pylint: disable=invalid-field-call
284
- client_info: Optional[WalletClientInfo] = None
285
- wallet_rpc_port: Optional[int] = option(
286
- "-wp",
287
- "--wallet-rpc_port",
288
- help=(
289
- "Set the port where the Wallet is hosting the RPC interface."
290
- "See the rpc_port under wallet in config.yaml."
291
- ),
292
- type=int,
293
- default=None,
294
- )
295
- fingerprint: Optional[int] = option(
296
- "-f",
297
- "--fingerprint",
298
- help="Fingerprint of the wallet to use",
299
- type=int,
300
- default=None,
301
- )
302
-
303
- @asynccontextmanager
304
- async def wallet_rpc(self, **kwargs: Any) -> AsyncIterator[WalletClientInfo]:
305
- if self.client_info is not None:
306
- yield self.client_info
307
- else:
308
- if "root_path" not in kwargs:
309
- kwargs["root_path"] = self.context["root_path"] # pylint: disable=unsubscriptable-object
310
- async with get_wallet_client(self.wallet_rpc_port, self.fingerprint, **kwargs) as (
311
- wallet_client,
312
- fp,
313
- config,
314
- ):
315
- yield WalletClientInfo(wallet_client, fp, config)
@@ -0,0 +1,242 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import AsyncIterator, Coroutine, Sequence
4
+ from contextlib import asynccontextmanager
5
+ from dataclasses import dataclass, field
6
+ from functools import cached_property
7
+ from pathlib import Path
8
+ from typing import Any, Callable, Optional, TypeVar
9
+
10
+ from chia.cmds.cmd_classes import ChiaCliContext, command_helper, option
11
+ from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, TransactionBundle, get_wallet_client
12
+ from chia.cmds.param_types import AmountParamType, Bytes32ParamType, CliAmount, TransactionFeeParamType, cli_amount_none
13
+ from chia.rpc.wallet_rpc_client import WalletRpcClient
14
+ from chia.types.blockchain_format.sized_bytes import bytes32
15
+ from chia.util.ints import uint64
16
+ from chia.wallet.conditions import ConditionValidTimes
17
+ from chia.wallet.transaction_record import TransactionRecord
18
+ from chia.wallet.util.tx_config import CoinSelectionConfig, TXConfig
19
+
20
+
21
+ @dataclass(frozen=True)
22
+ class WalletClientInfo:
23
+ client: WalletRpcClient
24
+ fingerprint: int
25
+ config: dict[str, Any]
26
+
27
+
28
+ @command_helper
29
+ class NeedsWalletRPC:
30
+ context: ChiaCliContext = field(default_factory=ChiaCliContext)
31
+ client_info: Optional[WalletClientInfo] = None
32
+ wallet_rpc_port: Optional[int] = option(
33
+ "-wp",
34
+ "--wallet-rpc_port",
35
+ help=(
36
+ "Set the port where the Wallet is hosting the RPC interface."
37
+ "See the rpc_port under wallet in config.yaml."
38
+ ),
39
+ type=int,
40
+ default=None,
41
+ )
42
+ fingerprint: Optional[int] = option(
43
+ "-f",
44
+ "--fingerprint",
45
+ help="Fingerprint of the wallet to use",
46
+ type=int,
47
+ default=None,
48
+ )
49
+
50
+ @asynccontextmanager
51
+ async def wallet_rpc(self, **kwargs: Any) -> AsyncIterator[WalletClientInfo]:
52
+ if self.client_info is not None:
53
+ yield self.client_info
54
+ else:
55
+ root_path = kwargs.get("root_path", self.context.root_path)
56
+ async with get_wallet_client(root_path, self.wallet_rpc_port, self.fingerprint, **kwargs) as (
57
+ wallet_client,
58
+ fp,
59
+ config,
60
+ ):
61
+ yield WalletClientInfo(wallet_client, fp, config)
62
+
63
+
64
+ @command_helper
65
+ class TransactionsIn:
66
+ transaction_file_in: str = option(
67
+ "--transaction-file-in",
68
+ type=str,
69
+ help="Transaction file to use as input",
70
+ required=True,
71
+ )
72
+
73
+ @cached_property
74
+ def transaction_bundle(self) -> TransactionBundle:
75
+ with open(Path(self.transaction_file_in), "rb") as file:
76
+ return TransactionBundle.from_bytes(file.read())
77
+
78
+
79
+ @command_helper
80
+ class TransactionsOut:
81
+ transaction_file_out: Optional[str] = option(
82
+ "--transaction-file-out",
83
+ type=str,
84
+ default=None,
85
+ help="A file to write relevant transactions to",
86
+ required=False,
87
+ )
88
+
89
+ def handle_transaction_output(self, output: list[TransactionRecord]) -> None:
90
+ if self.transaction_file_out is None:
91
+ return
92
+ else:
93
+ with open(Path(self.transaction_file_out), "wb") as file:
94
+ file.write(bytes(TransactionBundle(output)))
95
+
96
+
97
+ @command_helper
98
+ class NeedsCoinSelectionConfig:
99
+ min_coin_amount: CliAmount = option(
100
+ "-ma",
101
+ "--min-coin-amount",
102
+ "--min-amount",
103
+ help="Ignore coins worth less then this much XCH or CAT units",
104
+ type=AmountParamType(),
105
+ required=False,
106
+ default=cli_amount_none,
107
+ )
108
+ max_coin_amount: CliAmount = option(
109
+ "-l",
110
+ "--max-coin-amount",
111
+ "--max-amount",
112
+ help="Ignore coins worth more then this much XCH or CAT units",
113
+ type=AmountParamType(),
114
+ required=False,
115
+ default=cli_amount_none,
116
+ )
117
+ coins_to_exclude: Sequence[bytes32] = option(
118
+ "--exclude-coin",
119
+ multiple=True,
120
+ type=Bytes32ParamType(),
121
+ help="Exclude this coin from being spent.",
122
+ )
123
+ amounts_to_exclude: Sequence[CliAmount] = option(
124
+ "--exclude-amount",
125
+ multiple=True,
126
+ type=AmountParamType(),
127
+ help="Exclude any coins with this XCH or CAT amount from being included.",
128
+ )
129
+
130
+ def load_coin_selection_config(self, mojo_per_unit: int) -> CoinSelectionConfig:
131
+ return CMDCoinSelectionConfigLoader(
132
+ min_coin_amount=self.min_coin_amount,
133
+ max_coin_amount=self.max_coin_amount,
134
+ excluded_coin_amounts=list(_ for _ in self.amounts_to_exclude),
135
+ excluded_coin_ids=list(_ for _ in self.coins_to_exclude),
136
+ ).to_coin_selection_config(mojo_per_unit)
137
+
138
+
139
+ @command_helper
140
+ class NeedsTXConfig(NeedsCoinSelectionConfig):
141
+ reuse: Optional[bool] = option(
142
+ "--reuse/--new-address",
143
+ "--reuse-puzhash/--generate-new-puzhash",
144
+ help="Reuse existing address for the change.",
145
+ is_flag=True,
146
+ default=None,
147
+ )
148
+
149
+ def load_tx_config(self, mojo_per_unit: int, config: dict[str, Any], fingerprint: int) -> TXConfig:
150
+ return CMDTXConfigLoader(
151
+ min_coin_amount=self.min_coin_amount,
152
+ max_coin_amount=self.max_coin_amount,
153
+ excluded_coin_amounts=list(_ for _ in self.amounts_to_exclude),
154
+ excluded_coin_ids=list(_ for _ in self.coins_to_exclude),
155
+ reuse_puzhash=self.reuse,
156
+ ).to_tx_config(mojo_per_unit, config, fingerprint)
157
+
158
+
159
+ def transaction_endpoint_runner(
160
+ func: Callable[[_T_TransactionEndpoint], Coroutine[Any, Any, list[TransactionRecord]]],
161
+ ) -> Callable[[_T_TransactionEndpoint], Coroutine[Any, Any, None]]:
162
+ async def wrapped_func(self: _T_TransactionEndpoint) -> None:
163
+ txs = await func(self)
164
+ self.transaction_writer.handle_transaction_output(txs)
165
+
166
+ setattr(wrapped_func, _TRANSACTION_ENDPOINT_DECORATOR_APPLIED, True)
167
+ return wrapped_func
168
+
169
+
170
+ _TRANSACTION_ENDPOINT_DECORATOR_APPLIED = (
171
+ f"_{__name__.replace('.', '_')}_{transaction_endpoint_runner.__qualname__}_applied"
172
+ )
173
+
174
+
175
+ @dataclass(frozen=True)
176
+ class TransactionEndpoint:
177
+ rpc_info: NeedsWalletRPC
178
+ tx_config_loader: NeedsTXConfig
179
+ transaction_writer: TransactionsOut
180
+ fee: uint64 = option(
181
+ "-m",
182
+ "--fee",
183
+ help="Set the fees for the transaction, in XCH",
184
+ type=TransactionFeeParamType(),
185
+ default="0",
186
+ show_default=True,
187
+ required=True,
188
+ )
189
+ push: bool = option(
190
+ "--push/--no-push", help="Push the transaction to the network", type=bool, is_flag=True, default=True
191
+ )
192
+ valid_at: Optional[int] = option(
193
+ "--valid-at",
194
+ help="UNIX timestamp at which the associated transactions become valid",
195
+ type=int,
196
+ required=False,
197
+ default=None,
198
+ hidden=True,
199
+ )
200
+ expires_at: Optional[int] = option(
201
+ "--expires-at",
202
+ help="UNIX timestamp at which the associated transactions expire",
203
+ type=int,
204
+ required=False,
205
+ default=None,
206
+ hidden=True,
207
+ )
208
+
209
+ def __post_init__(self) -> None:
210
+ if not hasattr(self.run, _TRANSACTION_ENDPOINT_DECORATOR_APPLIED):
211
+ raise TypeError("TransactionEndpoints must utilize @transaction_endpoint_runner on their `run` method")
212
+
213
+ def load_condition_valid_times(self) -> ConditionValidTimes:
214
+ return ConditionValidTimes(
215
+ min_time=uint64.construct_optional(self.valid_at),
216
+ max_time=uint64.construct_optional(self.expires_at),
217
+ )
218
+
219
+ @transaction_endpoint_runner
220
+ async def run(self) -> list[TransactionRecord]:
221
+ raise NotImplementedError("Must implement `.run()` on a TransactionEndpoint subclass") # pragma: no cover
222
+
223
+
224
+ @dataclass(frozen=True)
225
+ class TransactionEndpointWithTimelocks(TransactionEndpoint):
226
+ valid_at: Optional[int] = option(
227
+ "--valid-at",
228
+ help="UNIX timestamp at which the associated transactions become valid",
229
+ type=int,
230
+ required=False,
231
+ default=None,
232
+ )
233
+ expires_at: Optional[int] = option(
234
+ "--expires-at",
235
+ help="UNIX timestamp at which the associated transactions expire",
236
+ type=int,
237
+ required=False,
238
+ default=None,
239
+ )
240
+
241
+
242
+ _T_TransactionEndpoint = TypeVar("_T_TransactionEndpoint", bound=TransactionEndpoint)