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
@@ -1,28 +1,45 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import pathlib
3
4
  import textwrap
5
+ from collections.abc import Sequence
4
6
  from dataclasses import asdict
5
- from typing import Any, Dict, List, Optional, Sequence
7
+ from decimal import Decimal
8
+ from typing import Any, Optional
6
9
 
7
10
  import click
8
11
  import pytest
9
12
  from click.testing import CliRunner
10
13
 
11
- from chia._tests.conftest import ConsensusMode
12
- from chia._tests.environments.wallet import WalletTestFramework
14
+ from chia._tests.environments.wallet import STANDARD_TX_ENDPOINT_ARGS, WalletTestFramework
13
15
  from chia._tests.wallet.conftest import * # noqa
14
- from chia.cmds.cmd_classes import ChiaCommand, Context, NeedsWalletRPC, chia_command, option
16
+ from chia.cmds.cmd_classes import ChiaCliContext, ChiaCommand, chia_command, option
17
+ from chia.cmds.cmd_helpers import (
18
+ _TRANSACTION_ENDPOINT_DECORATOR_APPLIED,
19
+ NeedsCoinSelectionConfig,
20
+ NeedsTXConfig,
21
+ NeedsWalletRPC,
22
+ TransactionEndpoint,
23
+ TransactionEndpointWithTimelocks,
24
+ transaction_endpoint_runner,
25
+ )
26
+ from chia.cmds.cmds_util import coin_selection_args, tx_config_args, tx_out_cmd
27
+ from chia.cmds.param_types import CliAmount
15
28
  from chia.types.blockchain_format.sized_bytes import bytes32
29
+ from chia.util.ints import uint64
30
+ from chia.wallet.conditions import ConditionValidTimes
31
+ from chia.wallet.transaction_record import TransactionRecord
32
+ from chia.wallet.util.tx_config import CoinSelectionConfig, TXConfig
16
33
 
17
34
 
18
- def check_click_parsing(cmd: ChiaCommand, *args: str) -> None:
35
+ def check_click_parsing(cmd: ChiaCommand, *args: str, context: Optional[ChiaCliContext] = None) -> None:
19
36
  @click.group()
20
37
  def _cmd() -> None:
21
38
  pass
22
39
 
23
40
  mock_type = type(cmd.__class__.__name__, (cmd.__class__,), {})
24
41
 
25
- def dict_compare_with_ignore_context(one: Dict[str, Any], two: Dict[str, Any]) -> None:
42
+ def dict_compare_with_ignore_context(one: dict[str, Any], two: dict[str, Any]) -> None:
26
43
  for k, v in one.items():
27
44
  if k == "context":
28
45
  continue
@@ -35,11 +52,17 @@ def check_click_parsing(cmd: ChiaCommand, *args: str) -> None:
35
52
  # cmd is appropriately not recognized as a dataclass but I'm not sure how to hint that something is a dataclass
36
53
  dict_compare_with_ignore_context(asdict(cmd), asdict(self)) # type: ignore[call-overload]
37
54
 
55
+ # We hack this in because more robust solutions are harder and probably not worth it
56
+ setattr(new_run, _TRANSACTION_ENDPOINT_DECORATOR_APPLIED, True)
57
+
38
58
  setattr(mock_type, "run", new_run)
39
- chia_command(_cmd, "_", "")(mock_type)
59
+ chia_command(group=_cmd, name="_", short_help="", help="")(mock_type)
60
+
61
+ if context is None:
62
+ context = ChiaCliContext()
40
63
 
41
64
  runner = CliRunner()
42
- result = runner.invoke(_cmd, ["_", *args], catch_exceptions=False)
65
+ result = runner.invoke(_cmd, ["_", *args], catch_exceptions=False, obj=context.to_click())
43
66
  assert result.output == ""
44
67
 
45
68
 
@@ -48,12 +71,12 @@ def test_cmd_bases() -> None:
48
71
  def cmd() -> None:
49
72
  pass
50
73
 
51
- @chia_command(cmd, "temp_cmd", "blah")
74
+ @chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
52
75
  class TempCMD:
53
76
  def run(self) -> None:
54
77
  print("syncronous")
55
78
 
56
- @chia_command(cmd, "temp_cmd_async", "blah")
79
+ @chia_command(group=cmd, name="temp_cmd_async", short_help="blah", help="n/a")
57
80
  class TempCMDAsync:
58
81
  async def run(self) -> None:
59
82
  print("asyncronous")
@@ -95,14 +118,15 @@ def test_option_loading() -> None:
95
118
  def cmd() -> None:
96
119
  pass
97
120
 
98
- @chia_command(cmd, "temp_cmd", "blah")
121
+ @chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
99
122
  class TempCMD:
100
123
  some_option: int = option("-o", "--some-option", required=True, type=int)
124
+ choices: list[str] = option("--choice", multiple=True, type=str)
101
125
 
102
126
  def run(self) -> None:
103
127
  print(self.some_option)
104
128
 
105
- @chia_command(cmd, "temp_cmd_2", "blah")
129
+ @chia_command(group=cmd, name="temp_cmd_2", short_help="blah", help="n/a")
106
130
  class TempCMD2:
107
131
  some_option: int = option("-o", "--some-option", required=True, type=int, default=13)
108
132
 
@@ -142,14 +166,14 @@ def test_context_requirement() -> None:
142
166
  @click.group()
143
167
  @click.pass_context
144
168
  def cmd(ctx: click.Context) -> None:
145
- ctx.obj = {"foo": "bar"}
169
+ ctx.obj = ChiaCliContext(root_path=pathlib.Path("foo", "bar")).to_click()
146
170
 
147
- @chia_command(cmd, "temp_cmd", "blah")
171
+ @chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
148
172
  class TempCMD:
149
- context: Context
173
+ context: ChiaCliContext
150
174
 
151
175
  def run(self) -> None:
152
- assert self.context["foo"] == "bar"
176
+ assert self.context.root_path == pathlib.Path("foo", "bar")
153
177
 
154
178
  runner = CliRunner()
155
179
  result = runner.invoke(
@@ -162,7 +186,7 @@ def test_context_requirement() -> None:
162
186
  # Test that other variables named context are disallowed
163
187
  with pytest.raises(ValueError, match="context"):
164
188
 
165
- @chia_command(cmd, "shouldnt_work", "blah")
189
+ @chia_command(group=cmd, name="shouldnt_work", short_help="blah", help="n/a")
166
190
  class BadCMD:
167
191
  context: int
168
192
 
@@ -174,7 +198,7 @@ def test_typing() -> None:
174
198
  def cmd() -> None:
175
199
  pass
176
200
 
177
- @chia_command(cmd, "temp_cmd", "blah")
201
+ @chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
178
202
  class TempCMD:
179
203
  integer: int = option("--integer", default=1, required=False)
180
204
  text: str = option("--text", default="1", required=False)
@@ -206,7 +230,7 @@ def test_typing() -> None:
206
230
  )
207
231
 
208
232
  # Test optional
209
- @chia_command(cmd, "temp_cmd_optional", "blah")
233
+ @chia_command(group=cmd, name="temp_cmd_optional", short_help="blah", help="n/a")
210
234
  class TempCMDOptional:
211
235
  optional: Optional[int] = option("--optional", required=False)
212
236
 
@@ -218,7 +242,7 @@ def test_typing() -> None:
218
242
  # Test optional failure
219
243
  with pytest.raises(TypeError):
220
244
 
221
- @chia_command(cmd, "temp_cmd_optional_bad", "blah")
245
+ @chia_command(group=cmd, name="temp_cmd_optional_bad", short_help="blah", help="n/a")
222
246
  class TempCMDOptionalBad2:
223
247
  optional: Optional[int] = option("--optional", required=True)
224
248
 
@@ -226,20 +250,20 @@ def test_typing() -> None:
226
250
 
227
251
  with pytest.raises(TypeError):
228
252
 
229
- @chia_command(cmd, "temp_cmd_optional_bad", "blah")
253
+ @chia_command(group=cmd, name="temp_cmd_optional_bad", short_help="blah", help="n/a")
230
254
  class TempCMDOptionalBad3:
231
255
  optional: Optional[int] = option("--optional", default="string", required=False)
232
256
 
233
257
  def run(self) -> None: ...
234
258
 
235
- @chia_command(cmd, "temp_cmd_optional_fine", "blah")
259
+ @chia_command(group=cmd, name="temp_cmd_optional_fine", short_help="blah", help="n/a")
236
260
  class TempCMDOptionalBad4:
237
261
  optional: Optional[int] = option("--optional", default=None, required=False)
238
262
 
239
263
  def run(self) -> None: ...
240
264
 
241
265
  # Test multiple
242
- @chia_command(cmd, "temp_cmd_sequence", "blah")
266
+ @chia_command(group=cmd, name="temp_cmd_sequence", short_help="blah", help="n/a")
243
267
  class TempCMDSequence:
244
268
  sequence: Sequence[int] = option("--sequence", multiple=True)
245
269
 
@@ -251,7 +275,7 @@ def test_typing() -> None:
251
275
  # Test sequence failure
252
276
  with pytest.raises(TypeError):
253
277
 
254
- @chia_command(cmd, "temp_cmd_sequence_bad", "blah")
278
+ @chia_command(group=cmd, name="temp_cmd_sequence_bad", short_help="blah", help="n/a")
255
279
  class TempCMDSequenceBad:
256
280
  sequence: Sequence[int] = option("--sequence")
257
281
 
@@ -259,7 +283,7 @@ def test_typing() -> None:
259
283
 
260
284
  with pytest.raises(TypeError):
261
285
 
262
- @chia_command(cmd, "temp_cmd_sequence_bad", "blah")
286
+ @chia_command(group=cmd, name="temp_cmd_sequence_bad", short_help="blah", help="n/a")
263
287
  class TempCMDSequenceBad2:
264
288
  sequence: int = option("--sequence", multiple=True)
265
289
 
@@ -267,7 +291,7 @@ def test_typing() -> None:
267
291
 
268
292
  with pytest.raises(ValueError):
269
293
 
270
- @chia_command(cmd, "temp_cmd_sequence_bad", "blah")
294
+ @chia_command(group=cmd, name="temp_cmd_sequence_bad", short_help="blah", help="n/a")
271
295
  class TempCMDSequenceBad3:
272
296
  sequence: Sequence[int] = option("--sequence", default=[1, 2, 3], multiple=True)
273
297
 
@@ -275,7 +299,7 @@ def test_typing() -> None:
275
299
 
276
300
  with pytest.raises(TypeError):
277
301
 
278
- @chia_command(cmd, "temp_cmd_sequence_bad", "blah")
302
+ @chia_command(group=cmd, name="temp_cmd_sequence_bad", short_help="blah", help="n/a")
279
303
  class TempCMDSequenceBad4:
280
304
  sequence: Sequence[int] = option("--sequence", default=(1, 2, "3"), multiple=True)
281
305
 
@@ -284,29 +308,29 @@ def test_typing() -> None:
284
308
  # Test invalid type
285
309
  with pytest.raises(TypeError):
286
310
 
287
- @chia_command(cmd, "temp_cmd_bad_type", "blah")
311
+ @chia_command(group=cmd, name="temp_cmd_bad_type", short_help="blah", help="n/a")
288
312
  class TempCMDBadType:
289
- sequence: List[int] = option("--sequence")
313
+ sequence: list[int] = option("--sequence")
290
314
 
291
315
  def run(self) -> None: ...
292
316
 
293
317
  # Test invalid default
294
318
  with pytest.raises(TypeError):
295
319
 
296
- @chia_command(cmd, "temp_cmd_bad_default", "blah")
320
+ @chia_command(group=cmd, name="temp_cmd_bad_default", short_help="blah", help="n/a")
297
321
  class TempCMDBadDefault:
298
322
  integer: int = option("--int", default="string")
299
323
 
300
324
  def run(self) -> None: ...
301
325
 
302
326
  # Test bytes parsing
303
- @chia_command(cmd, "temp_cmd_bad_bytes", "blah")
327
+ @chia_command(group=cmd, name="temp_cmd_bad_bytes", short_help="blah", help="n/a")
304
328
  class TempCMDBadBytes:
305
329
  blob: bytes = option("--blob", required=True)
306
330
 
307
331
  def run(self) -> None: ...
308
332
 
309
- @chia_command(cmd, "temp_cmd_bad_bytes32", "blah")
333
+ @chia_command(group=cmd, name="temp_cmd_bad_bytes32", short_help="blah", help="n/a")
310
334
  class TempCMDBadBytes32:
311
335
  blob32: bytes32 = option("--blob32", required=True)
312
336
 
@@ -328,7 +352,7 @@ def test_typing() -> None:
328
352
  assert "not a valid 32-byte hex string" in result.output
329
353
 
330
354
 
331
- @pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.PLAIN], reason="doesn't matter")
355
+ @pytest.mark.limit_consensus_modes(reason="doesn't matter")
332
356
  @pytest.mark.parametrize(
333
357
  "wallet_environments",
334
358
  [
@@ -352,7 +376,7 @@ async def test_wallet_rpc_helper(wallet_environments: WalletTestFramework) -> No
352
376
  def cmd() -> None:
353
377
  pass
354
378
 
355
- @chia_command(cmd, "temp_cmd", "blah")
379
+ @chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
356
380
  class TempCMD:
357
381
  rpc_info: NeedsWalletRPC
358
382
 
@@ -384,7 +408,7 @@ async def test_wallet_rpc_helper(wallet_environments: WalletTestFramework) -> No
384
408
 
385
409
  expected_command = TempCMD(
386
410
  rpc_info=NeedsWalletRPC(
387
- context={"root_path": wallet_environments.environments[0].node.root_path},
411
+ context=ChiaCliContext(root_path=wallet_environments.environments[0].node.root_path),
388
412
  wallet_rpc_port=port,
389
413
  fingerprint=fingerprint,
390
414
  ),
@@ -398,3 +422,199 @@ async def test_wallet_rpc_helper(wallet_environments: WalletTestFramework) -> No
398
422
  test_present_client_info = TempCMD(rpc_info=NeedsWalletRPC(client_info="hello world")) # type: ignore[arg-type]
399
423
  async with test_present_client_info.rpc_info.wallet_rpc(consume_errors=False) as client_info:
400
424
  assert client_info == "hello world" # type: ignore[comparison-overlap]
425
+
426
+
427
+ def test_tx_config_helper() -> None:
428
+ @click.group()
429
+ def cmd() -> None:
430
+ pass # pragma: no cover
431
+
432
+ @chia_command(group=cmd, name="cs_cmd", short_help="blah", help="blah")
433
+ class CsCMD:
434
+ coin_selection_loader: NeedsCoinSelectionConfig
435
+
436
+ def run(self) -> None:
437
+ # ignoring the `None` return here for convenient testing sake
438
+ return self.coin_selection_loader.load_coin_selection_config(100) # type: ignore[return-value]
439
+
440
+ example_cs_cmd = CsCMD(
441
+ coin_selection_loader=NeedsCoinSelectionConfig(
442
+ min_coin_amount=CliAmount(amount=Decimal("0.01"), mojos=False),
443
+ max_coin_amount=CliAmount(amount=Decimal("0.01"), mojos=False),
444
+ amounts_to_exclude=(CliAmount(amount=Decimal("0.01"), mojos=False),),
445
+ coins_to_exclude=(bytes32([0] * 32),),
446
+ )
447
+ )
448
+
449
+ check_click_parsing(
450
+ example_cs_cmd,
451
+ "--min-coin-amount",
452
+ "0.01",
453
+ "--max-coin-amount",
454
+ "0.01",
455
+ "--exclude-amount",
456
+ "0.01",
457
+ "--exclude-coin",
458
+ bytes32([0] * 32).hex(),
459
+ )
460
+
461
+ # again, convenience for testing sake
462
+ assert example_cs_cmd.run() == CoinSelectionConfig( # type: ignore[func-returns-value]
463
+ min_coin_amount=uint64(1),
464
+ max_coin_amount=uint64(1),
465
+ excluded_coin_amounts=[uint64(1)],
466
+ excluded_coin_ids=[bytes32([0] * 32)],
467
+ )
468
+
469
+ @chia_command(group=cmd, name="tx_config_cmd", short_help="blah", help="blah")
470
+ class TXConfigCMD:
471
+ tx_config_loader: NeedsTXConfig
472
+
473
+ def run(self) -> None:
474
+ # ignoring the `None` return here for convenient testing sake
475
+ return self.tx_config_loader.load_tx_config(100, {}, 0) # type: ignore[return-value]
476
+
477
+ example_tx_config_cmd = TXConfigCMD(
478
+ tx_config_loader=NeedsTXConfig(
479
+ min_coin_amount=CliAmount(amount=Decimal("0.01"), mojos=False),
480
+ max_coin_amount=CliAmount(amount=Decimal("0.01"), mojos=False),
481
+ amounts_to_exclude=(CliAmount(amount=Decimal("0.01"), mojos=False),),
482
+ coins_to_exclude=(bytes32([0] * 32),),
483
+ reuse=False,
484
+ )
485
+ )
486
+
487
+ check_click_parsing(
488
+ example_tx_config_cmd,
489
+ "--min-coin-amount",
490
+ "0.01",
491
+ "--max-coin-amount",
492
+ "0.01",
493
+ "--exclude-amount",
494
+ "0.01",
495
+ "--exclude-coin",
496
+ bytes32([0] * 32).hex(),
497
+ "--new-address",
498
+ )
499
+
500
+ # again, convenience for testing sake
501
+ assert example_tx_config_cmd.run() == TXConfig( # type: ignore[func-returns-value]
502
+ min_coin_amount=uint64(1),
503
+ max_coin_amount=uint64(1),
504
+ excluded_coin_amounts=[uint64(1)],
505
+ excluded_coin_ids=[bytes32([0] * 32)],
506
+ reuse_puzhash=False,
507
+ )
508
+
509
+
510
+ @pytest.mark.anyio
511
+ async def test_transaction_endpoint_mixin() -> None:
512
+ @click.group()
513
+ def cmd() -> None:
514
+ pass # pragma: no cover
515
+
516
+ @chia_command(group=cmd, name="bad_cmd", short_help="blah", help="blah")
517
+ class BadCMD(TransactionEndpoint):
518
+ def run(self) -> None: # type: ignore[override]
519
+ pass # pragma: no cover
520
+
521
+ with pytest.raises(TypeError, match="transaction_endpoint_runner"):
522
+ BadCMD(**STANDARD_TX_ENDPOINT_ARGS)
523
+
524
+ @chia_command(group=cmd, name="cs_cmd", short_help="blah", help="blah")
525
+ class TxCMD(TransactionEndpoint):
526
+ @transaction_endpoint_runner
527
+ async def run(self) -> list[TransactionRecord]:
528
+ assert self.load_condition_valid_times() == ConditionValidTimes(
529
+ min_time=uint64(10),
530
+ max_time=uint64(20),
531
+ )
532
+ return []
533
+
534
+ # Check that our default object lines up with the default options
535
+ check_click_parsing(TxCMD(**STANDARD_TX_ENDPOINT_ARGS))
536
+
537
+ example_tx_cmd = TxCMD(
538
+ **{
539
+ **STANDARD_TX_ENDPOINT_ARGS,
540
+ **dict(
541
+ fee=uint64(1_000_000_000_000 / 100),
542
+ push=False,
543
+ valid_at=10,
544
+ expires_at=20,
545
+ ),
546
+ }
547
+ )
548
+ check_click_parsing(
549
+ example_tx_cmd,
550
+ "--fee",
551
+ "0.01",
552
+ "--no-push",
553
+ "--valid-at",
554
+ "10",
555
+ "--expires-at",
556
+ "20",
557
+ )
558
+
559
+ await example_tx_cmd.run() # trigger inner assert
560
+
561
+
562
+ # While we sit in between two paradigms, this test is in place to ensure they remain in sync.
563
+ # Delete this if the old decorators are deleted.
564
+ def test_old_decorator_support() -> None:
565
+ @click.group()
566
+ def cmd() -> None:
567
+ pass # pragma: no cover
568
+
569
+ @chia_command(group=cmd, name="cs_cmd", short_help="blah", help="blah")
570
+ class CsCMD:
571
+ coin_selection_loader: NeedsCoinSelectionConfig
572
+
573
+ def run(self) -> None:
574
+ pass # pragma: no cover
575
+
576
+ @chia_command(group=cmd, name="tx_config_cmd", short_help="blah", help="blah")
577
+ class TXConfigCMD:
578
+ tx_config_loader: NeedsTXConfig
579
+
580
+ def run(self) -> None:
581
+ pass # pragma: no cover
582
+
583
+ @chia_command(group=cmd, name="tx_cmd", short_help="blah", help="blah")
584
+ class TxCMD(TransactionEndpoint):
585
+ @transaction_endpoint_runner
586
+ async def run(self) -> list[TransactionRecord]:
587
+ return [] # pragma: no cover
588
+
589
+ @chia_command(group=cmd, name="tx_w_tl_cmd", short_help="blah", help="blah")
590
+ class TxWTlCMD(TransactionEndpointWithTimelocks):
591
+ @transaction_endpoint_runner
592
+ async def run(self) -> list[TransactionRecord]:
593
+ return [] # pragma: no cover
594
+
595
+ @cmd.command("cs_cmd_dec")
596
+ @coin_selection_args
597
+ def cs_cmd(**kwargs: Any) -> None:
598
+ pass # pragma: no cover
599
+
600
+ @cmd.command("tx_config_cmd_dec")
601
+ @tx_config_args
602
+ def tx_config_cmd(**kwargs: Any) -> None:
603
+ pass # pragma: no cover
604
+
605
+ @cmd.command("tx_cmd_dec") # type: ignore[arg-type]
606
+ @tx_out_cmd(enable_timelock_args=False)
607
+ def tx_cmd(**kwargs: Any) -> None:
608
+ pass # pragma: no cover
609
+
610
+ @cmd.command("tx_w_tl_cmd_dec") # type: ignore[arg-type]
611
+ @tx_out_cmd(enable_timelock_args=True)
612
+ def tx_w_tl_cmd(**kwargs: Any) -> None:
613
+ pass # pragma: no cover
614
+
615
+ for command_name, command in cmd.commands.items():
616
+ if "_dec" in command_name:
617
+ continue
618
+ params = [param.to_info_dict() for param in cmd.commands[command_name].params]
619
+ for param in cmd.commands[f"{command_name}_dec"].params:
620
+ assert param.to_info_dict() in params
@@ -44,7 +44,7 @@ async def test_failure_output_no_traceback(
44
44
  ) as (client, _):
45
45
  await client.fetch(path="/table", request_json={"response": expected_response})
46
46
 
47
- out, err = capsys.readouterr()
47
+ out, _err = capsys.readouterr()
48
48
 
49
49
  assert "ResponseFailureError" not in out
50
50
  assert "Traceback:" not in out
@@ -69,7 +69,7 @@ async def test_failure_output_with_traceback(
69
69
  ) as (client, _):
70
70
  await client.fetch(path="/table", request_json={"response": expected_response})
71
71
 
72
- out, err = capsys.readouterr()
72
+ out, _err = capsys.readouterr()
73
73
  assert sample_traceback_json not in out
74
74
  assert sample_traceback in out
75
75
 
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import sys
4
4
  from pathlib import Path
5
- from typing import Any, Dict, Optional
5
+ from typing import Any, Optional
6
6
 
7
7
  import pytest
8
8
  from _pytest.capture import CaptureFixture
@@ -28,7 +28,7 @@ async def test_daemon(
28
28
  async def unlock_keyring(_passphrase: str) -> bool:
29
29
  return True
30
30
 
31
- async def connect_to_daemon_and_validate(_root_path: Path, _config: Dict[str, Any]) -> DummyConnection:
31
+ async def connect_to_daemon_and_validate(_root_path: Path, _config: dict[str, Any]) -> DummyConnection:
32
32
  return DummyConnection()
33
33
 
34
34
  class DummyKeychain:
@@ -74,7 +74,7 @@ def test_start_daemon(tmp_path: Path, empty_keyring: Any, mocker: MockerFixture)
74
74
  return None
75
75
 
76
76
  async def create_start_daemon_connection_dummy(
77
- root_path: Path, config: Dict[str, Any], *, skip_keyring: bool
77
+ root_path: Path, config: dict[str, Any], *, skip_keyring: bool
78
78
  ) -> DummyDaemon:
79
79
  return DummyDaemon()
80
80
 
@@ -0,0 +1,131 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from dataclasses import dataclass
5
+ from pathlib import Path
6
+
7
+ import aiohttp
8
+ import anyio
9
+ import click
10
+ import pytest
11
+
12
+ # TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469
13
+ from _pytest.capture import CaptureFixture
14
+
15
+ import chia._tests
16
+ from chia._tests.util.misc import Marks, datacases
17
+ from chia.cmds.gh import Per, TestCMD, get_gh_token
18
+
19
+ test_root = Path(chia._tests.__file__).parent
20
+
21
+
22
+ @dataclass
23
+ class InvalidOnlyCase:
24
+ only: Path
25
+ per: Per
26
+ exists: bool
27
+ marks: Marks = ()
28
+
29
+ @property
30
+ def id(self) -> str:
31
+ return f"{self.per}: {self.only}"
32
+
33
+
34
+ @datacases(
35
+ InvalidOnlyCase(only=Path("does_not_exist.py"), per="directory", exists=False),
36
+ InvalidOnlyCase(only=Path("pools/test_pool_rpc.py"), per="directory", exists=True),
37
+ InvalidOnlyCase(only=Path("does_not_exist/"), per="file", exists=False),
38
+ InvalidOnlyCase(only=Path("pools/"), per="file", exists=True),
39
+ )
40
+ @pytest.mark.anyio
41
+ async def test_invalid_only(case: InvalidOnlyCase) -> None:
42
+ cmd = TestCMD(only=case.only, per=case.per)
43
+
44
+ if case.exists:
45
+ assert test_root.joinpath(case.only).exists()
46
+ explanation = "wrong type"
47
+ if case.per == "directory":
48
+ assert test_root.joinpath(case.only).is_file()
49
+ else:
50
+ assert test_root.joinpath(case.only).is_dir()
51
+ else:
52
+ assert not test_root.joinpath(case.only).exists()
53
+ explanation = "does not exist"
54
+
55
+ with pytest.raises(click.ClickException, match=rf"\bto be a {re.escape(case.per)}\b.*\b{re.escape(explanation)}\b"):
56
+ await cmd.run()
57
+
58
+
59
+ @pytest.mark.skip("considering inclusion, but not yet")
60
+ @pytest.mark.anyio
61
+ async def test_successfully_dispatches(
62
+ capsys: CaptureFixture[str],
63
+ ) -> None:
64
+ cmd = TestCMD(
65
+ # TODO: stop hardcoding here
66
+ owner="chia-network",
67
+ repository="chia-blockchain",
68
+ per="file",
69
+ only=Path("util/test_errors.py"),
70
+ duplicates=2,
71
+ oses=["linux", "macos-arm"],
72
+ full_python_matrix=True,
73
+ open_browser=False,
74
+ )
75
+
76
+ capsys.readouterr()
77
+ await cmd.run()
78
+ stdout, stderr = capsys.readouterr()
79
+
80
+ assert len(stderr.strip()) == 0
81
+ for line in stdout.splitlines():
82
+ match = re.search(r"(?<=\brun api url: )(?P<url>.*)", line)
83
+ if match is None:
84
+ continue
85
+ url = match.group("url")
86
+ break
87
+ else:
88
+ pytest.fail(f"Failed to find run url in: {stdout}")
89
+
90
+ token = await get_gh_token()
91
+ headers = {"Authorization": f"Bearer {token}"}
92
+
93
+ async with aiohttp.ClientSession(raise_for_status=True, headers=headers) as client:
94
+ while True:
95
+ async with client.get(url) as response:
96
+ d = await response.json()
97
+ jobs_url = d["jobs_url"]
98
+ conclusion = d["conclusion"]
99
+
100
+ print("conclusion:", conclusion)
101
+ if conclusion is None:
102
+ await anyio.sleep(5)
103
+ continue
104
+
105
+ break
106
+
107
+ async with client.get(jobs_url) as response:
108
+ d = await response.json()
109
+ jobs = d["jobs"]
110
+
111
+ by_name = {job["name"]: job for job in jobs}
112
+
113
+ assert by_name["Configure matrix"]["conclusion"] == "success"
114
+ assert by_name["macos-intel"]["conclusion"] == "skipped"
115
+ assert by_name["windows"]["conclusion"] == "skipped"
116
+
117
+ versions = ["3.9", "3.10", "3.11", "3.12"]
118
+ runs_by_name: dict[str, list[str]] = {name: [] for name in ["ubuntu", "macos-arm"]}
119
+ for name in by_name:
120
+ platform, _, rest = name.partition(" / ")
121
+
122
+ jobs = runs_by_name.get(platform)
123
+ if jobs is None:
124
+ continue
125
+
126
+ jobs.append(rest)
127
+
128
+ expected = len(versions) * cmd.duplicates
129
+ print("expected:", expected)
130
+ print("runs_by_name:", runs_by_name)
131
+ assert len({expected, *(len(runs) for runs in runs_by_name.values())}) == 1
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import re
4
- from typing import Tuple
5
4
 
6
5
  import pytest
7
6
  from _pytest.capture import CaptureFixture
@@ -18,7 +17,7 @@ from chia.types.aliases import FarmerService, HarvesterService, WalletService
18
17
  @pytest.mark.anyio
19
18
  async def test_farm_summary_command(
20
19
  capsys: CaptureFixture[str],
21
- farmer_one_harvester_simulator_wallet: Tuple[
20
+ farmer_one_harvester_simulator_wallet: tuple[
22
21
  HarvesterService,
23
22
  FarmerService,
24
23
  SimulatorFullNodeService,