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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/cmds/gh.py ADDED
@@ -0,0 +1,275 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import shlex
6
+ import urllib
7
+ import uuid
8
+ import webbrowser
9
+ from collections.abc import Sequence
10
+ from pathlib import Path
11
+ from typing import Callable, ClassVar, Literal, Optional, Union, overload
12
+
13
+ import anyio
14
+ import click
15
+ import yaml
16
+
17
+ from chia.cmds.cmd_classes import chia_command, option
18
+
19
+
20
+ class UnexpectedFormError(Exception):
21
+ pass
22
+
23
+
24
+ Oses = Union[Literal["linux"], Literal["macos-arm"], Literal["macos-intel"], Literal["windows"]]
25
+ Method = Union[Literal["GET"], Literal["POST"]]
26
+ Per = Union[Literal["directory"], Literal["file"]]
27
+
28
+ all_oses: Sequence[Oses] = ("linux", "macos-arm", "macos-intel", "windows")
29
+
30
+
31
+ def report(*args: str) -> None:
32
+ print(" ====", *args)
33
+
34
+
35
+ async def get_gh_token() -> str:
36
+ command = ["gh", "auth", "token"]
37
+ report(f"running command: {shlex.join(command)}")
38
+ process = await anyio.run_process(command=command, check=False, stderr=None)
39
+
40
+ if process.returncode != 0:
41
+ raise click.ClickException("failed to get gh cli personal access token")
42
+
43
+ return process.stdout.decode("utf-8").strip()
44
+
45
+
46
+ @overload
47
+ async def run_gh_api(method: Method, args: list[str], error: str) -> None: ...
48
+ @overload
49
+ async def run_gh_api(method: Method, args: list[str], error: str, capture_stdout: Literal[False]) -> None: ...
50
+ @overload
51
+ async def run_gh_api(method: Method, args: list[str], error: str, capture_stdout: Literal[True]) -> str: ...
52
+
53
+
54
+ async def run_gh_api(method: Method, args: list[str], error: str, capture_stdout: bool = False) -> Optional[str]:
55
+ command = [
56
+ "gh",
57
+ "api",
58
+ f"--method={method}",
59
+ "-H=Accept: application/vnd.github+json",
60
+ "-H=X-GitHub-Api-Version: 2022-11-28",
61
+ *args,
62
+ ]
63
+ report(f"running command: {shlex.join(command)}")
64
+
65
+ if capture_stdout:
66
+ process = await anyio.run_process(command=command, check=False, stderr=None)
67
+ else:
68
+ process = await anyio.run_process(command=command, check=False, stderr=None, stdout=None)
69
+
70
+ if process.returncode != 0:
71
+ raise click.ClickException(error)
72
+
73
+ if capture_stdout:
74
+ return process.stdout.decode("utf-8")
75
+
76
+ return None
77
+
78
+
79
+ def input_arg(name: str, value: object, cond: bool = True) -> list[str]:
80
+ if not cond:
81
+ return []
82
+
83
+ assert value is not None
84
+
85
+ if isinstance(value, os.PathLike):
86
+ value = os.fspath(value)
87
+ dumped = yaml.safe_dump(value).partition("\n")[0]
88
+ return [f"-f=inputs[{name}]={dumped}"]
89
+
90
+
91
+ @click.group("gh", help="For working with GitHub")
92
+ def gh_group() -> None:
93
+ pass
94
+
95
+
96
+ @chia_command(
97
+ group=gh_group,
98
+ name="test",
99
+ short_help="launch a test run in CI from HEAD or existing remote ref",
100
+ help="""Allows easy triggering and viewing of test workflow runs in CI including
101
+ configuration of parameters. If a ref is specified then it must exist on the
102
+ remote and a run will be launched for it. If ref is not specified then the local
103
+ HEAD will be pushed to a temporary remote branch and a run will be launched for
104
+ that. There is no need to push the local commit first. The temporary remote
105
+ branch will automatically be deleted in most cases.
106
+
107
+ After launching the workflow run GitHub will be queried for the run and the URL
108
+ will be opened in the default browser.
109
+ """,
110
+ )
111
+ class TestCMD:
112
+ workflow_id: ClassVar[str] = "test.yml"
113
+ owner: str = option("-o", "--owner", help="Owner of the repo", type=str, default="Chia-Network")
114
+ repository: str = option("-r", "--repository", help="Repository name", type=str, default="chia-blockchain")
115
+ ref: Optional[str] = option(
116
+ "-f",
117
+ "--ref",
118
+ help="Branch or tag name (commit SHA not supported), if not specified will push HEAD to a temporary branch",
119
+ type=str,
120
+ default=None,
121
+ )
122
+ per: Per = option("-p", "--per", help="Per", type=click.Choice(["directory", "file"]), default="directory")
123
+ only: Optional[Path] = option(
124
+ "-o", "--only", help="Only run this item, a file or directory depending on --per", type=Path
125
+ )
126
+ duplicates: int = option("-d", "--duplicates", help="Number of duplicates", type=int, default=1)
127
+ oses: Sequence[Oses] = option(
128
+ "--os",
129
+ help="Operating systems to run on",
130
+ type=click.Choice(all_oses),
131
+ multiple=True,
132
+ default=all_oses,
133
+ )
134
+ full_python_matrix: bool = option(
135
+ "--full-python-matrix/--default-python-matrix", help="Run on all Python versions", default=False
136
+ )
137
+ remote: str = option("-r", "--remote", help="Name of git remote", type=str, default="origin")
138
+ open_browser: bool = option("--open-browser/--no-open-browser", help="Open browser", default=True)
139
+
140
+ async def run(self) -> None:
141
+ await self.check_only()
142
+
143
+ username = await self.get_username()
144
+
145
+ if self.ref is not None:
146
+ await self.trigger_workflow(self.ref)
147
+ query = "+".join(
148
+ [
149
+ "event=workflow_dispatch",
150
+ f"branch={self.ref}",
151
+ f"actor={username}",
152
+ ]
153
+ )
154
+ run_url = f"https://github.com/Chia-Network/chia-blockchain/actions/workflows/test.yml?query={urllib.parse.quote(query)}"
155
+ report(f"waiting a few seconds to load: {run_url}")
156
+ await anyio.sleep(10)
157
+ else:
158
+ process = await anyio.run_process(command=["git", "rev-parse", "HEAD"], check=True, stderr=None)
159
+ if process.returncode != 0:
160
+ raise click.ClickException("Failed to get current commit SHA")
161
+
162
+ commit_sha = process.stdout.decode("utf-8").strip()
163
+
164
+ temp_branch_name = f"tmp/{username}/{commit_sha}/{uuid.uuid4()}"
165
+
166
+ process = await anyio.run_process(
167
+ command=["git", "push", self.remote, f"HEAD:{temp_branch_name}"], check=False, stdout=None, stderr=None
168
+ )
169
+ if process.returncode != 0:
170
+ raise click.ClickException("Failed to push temporary branch")
171
+
172
+ try:
173
+ await self.trigger_workflow(temp_branch_name)
174
+ for _ in range(10):
175
+ await anyio.sleep(1)
176
+
177
+ try:
178
+ report("looking for run")
179
+ html_url, api_url = await self.find_run(temp_branch_name)
180
+ report(f"run found at: {html_url}")
181
+ report(f"run found at: {api_url}")
182
+ except UnexpectedFormError:
183
+ report("run not found")
184
+ continue
185
+
186
+ break
187
+ else:
188
+ raise click.ClickException("Failed to find run url")
189
+ finally:
190
+ report(f"deleting temporary branch: {temp_branch_name}")
191
+ process = await anyio.run_process(
192
+ command=["git", "push", self.remote, "-d", temp_branch_name], check=False, stdout=None, stderr=None
193
+ )
194
+ if process.returncode != 0:
195
+ raise click.ClickException("Failed to dispatch workflow")
196
+ report(f"temporary branch deleted: {temp_branch_name}")
197
+
198
+ report(f"run html url: {html_url}")
199
+ report(f"run api url: {api_url}")
200
+ if self.open_browser:
201
+ webbrowser.open(html_url)
202
+
203
+ async def check_only(self) -> None:
204
+ if self.only is not None:
205
+ import chia._tests
206
+
207
+ test_path = Path(chia._tests.__file__).parent
208
+ effective_path = test_path.joinpath(self.only)
209
+ checks: dict[Per, Callable[[], bool]] = {"directory": effective_path.is_dir, "file": effective_path.is_file}
210
+ check = checks[self.per]
211
+ if not check():
212
+ if effective_path.exists():
213
+ explanation = "wrong type"
214
+ else:
215
+ explanation = "does not exist"
216
+ message = f"expected requested --only to be a {self.per}, {explanation} at: {effective_path.as_posix()}"
217
+ raise click.ClickException(message)
218
+
219
+ async def trigger_workflow(self, ref: str) -> None:
220
+ # https://docs.github.com/en/rest/actions/workflows?apiVersion=2022-11-28#create-a-workflow-dispatch-event
221
+ await run_gh_api(
222
+ method="POST",
223
+ args=[
224
+ f"/repos/{self.owner}/{self.repository}/actions/workflows/{self.workflow_id}/dispatches",
225
+ f"-f=ref={ref}",
226
+ *input_arg("per", self.per),
227
+ *input_arg("only", self.only, self.only is not None),
228
+ *input_arg("duplicates", self.duplicates),
229
+ *(arg for os_name in all_oses for arg in input_arg(f"run-{os_name}", os_name in self.oses)),
230
+ *input_arg("full-python-matrix", self.full_python_matrix),
231
+ ],
232
+ error="Failed to dispatch workflow",
233
+ )
234
+ report(f"workflow triggered on branch: {ref}")
235
+
236
+ async def find_run(self, ref: str) -> tuple[str, str]:
237
+ # https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#list-workflow-runs-for-a-workflow
238
+ stdout = await run_gh_api(
239
+ method="GET",
240
+ args=[
241
+ f"-f=branch={ref}",
242
+ f"/repos/{self.owner}/{self.repository}/actions/workflows/{self.workflow_id}/runs",
243
+ ],
244
+ error="Failed to query workflow runs",
245
+ capture_stdout=True,
246
+ )
247
+
248
+ response = json.loads(stdout)
249
+ runs = response["workflow_runs"]
250
+ try:
251
+ [run] = runs
252
+ except ValueError:
253
+ raise UnexpectedFormError(f"expected 1 run, got: {len(runs)}")
254
+
255
+ html_url = run["html_url"]
256
+ assert isinstance(html_url, str), f"expected html url to be a string, got: {html_url!r}"
257
+
258
+ api_url = run["url"]
259
+ assert isinstance(api_url, str), f"expected url to be a string, got: {api_url!r}"
260
+
261
+ return html_url, api_url
262
+
263
+ async def get_username(self) -> str:
264
+ # https://docs.github.com/en/rest/users/users?apiVersion=2022-11-28#get-the-authenticated-user
265
+ stdout = await run_gh_api(
266
+ method="GET",
267
+ args=["/user"],
268
+ error="Failed to get username",
269
+ capture_stdout=True,
270
+ )
271
+
272
+ response = json.loads(stdout)
273
+ username = response["login"]
274
+ assert isinstance(username, str), f"expected username to be a string, got: {username!r}"
275
+ return username
chia/cmds/init.py CHANGED
@@ -2,6 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import click
4
4
 
5
+ from chia.cmds.cmd_classes import ChiaCliContext
6
+
5
7
 
6
8
  @click.command("init", help="Create or migrate the configuration")
7
9
  @click.option(
@@ -46,25 +48,16 @@ def init_cmd(
46
48
  """
47
49
  from pathlib import Path
48
50
 
51
+ from chia.cmds.init_funcs import init
49
52
  from chia.cmds.passphrase_funcs import initialize_passphrase
50
53
 
51
- from .init_funcs import init
52
-
53
54
  if set_passphrase:
54
55
  initialize_passphrase()
55
56
 
56
57
  init(
57
58
  Path(create_certs) if create_certs is not None else None,
58
- ctx.obj["root_path"],
59
+ ChiaCliContext.set_default(ctx).root_path,
59
60
  fix_ssl_permissions,
60
61
  testnet,
61
62
  v1_db,
62
63
  )
63
-
64
-
65
- if __name__ == "__main__":
66
- from chia.util.default_root import DEFAULT_ROOT_PATH
67
-
68
- from .init_funcs import chia_init
69
-
70
- chia_init(DEFAULT_ROOT_PATH)
chia/cmds/init_funcs.py CHANGED
@@ -4,7 +4,7 @@ import os
4
4
  import shutil
5
5
  import sqlite3
6
6
  from pathlib import Path
7
- from typing import Any, Dict, List, Optional
7
+ from typing import Any, Optional
8
8
 
9
9
  import yaml
10
10
 
@@ -40,9 +40,9 @@ from chia.wallet.derive_keys import (
40
40
  )
41
41
 
42
42
 
43
- def dict_add_new_default(updated: Dict[str, Any], default: Dict[str, Any], do_not_migrate_keys: Dict[str, Any]) -> None:
44
- for k in do_not_migrate_keys:
45
- if k in updated and do_not_migrate_keys[k] == "":
43
+ def dict_add_new_default(updated: dict[str, Any], default: dict[str, Any], do_not_migrate_keys: dict[str, Any]) -> None:
44
+ for k, v in do_not_migrate_keys.items():
45
+ if k in updated and v == "":
46
46
  updated.pop(k)
47
47
  for k, v in default.items():
48
48
  ignore = False
@@ -56,7 +56,7 @@ def dict_add_new_default(updated: Dict[str, Any], default: Dict[str, Any], do_no
56
56
  # If there is an intermediate key with empty string value, do not migrate all descendants
57
57
  if do_not_migrate_keys.get(k, None) == "":
58
58
  do_not_migrate_keys[k] = v
59
- dict_add_new_default(updated[k], default[k], do_not_migrate_keys.get(k, {}))
59
+ dict_add_new_default(updated[k], v, do_not_migrate_keys.get(k, {}))
60
60
  elif k not in updated or ignore is True:
61
61
  updated[k] = v
62
62
 
@@ -168,8 +168,8 @@ def copy_files_rec(old_path: Path, new_path: Path) -> None:
168
168
  def migrate_from(
169
169
  old_root: Path,
170
170
  new_root: Path,
171
- manifest: List[str],
172
- do_not_migrate_settings: List[str],
171
+ manifest: list[str],
172
+ do_not_migrate_settings: list[str],
173
173
  ) -> int:
174
174
  """
175
175
  Copy all the files in "manifest" to the new config directory.
@@ -192,7 +192,7 @@ def migrate_from(
192
192
 
193
193
  with lock_and_load_config(new_root, "config.yaml") as config:
194
194
  config_str: str = initial_config_file("config.yaml")
195
- default_config: Dict[str, Any] = yaml.safe_load(config_str)
195
+ default_config: dict[str, Any] = yaml.safe_load(config_str)
196
196
  flattened_keys = unflatten_properties({k: "" for k in do_not_migrate_settings})
197
197
  dict_add_new_default(config, default_config, flattened_keys)
198
198
 
@@ -331,7 +331,7 @@ def chia_init(
331
331
  if should_check_keys:
332
332
  check_keys(root_path)
333
333
 
334
- config: Dict[str, Any]
334
+ config: dict[str, Any]
335
335
 
336
336
  db_path_replaced: str
337
337
  if v1_db:
chia/cmds/installers.py CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import json
4
4
  import subprocess
5
5
  import tempfile
6
- from typing import Dict, List, Optional
6
+ from typing import Optional
7
7
 
8
8
  import click
9
9
  import packaging.version
@@ -12,7 +12,7 @@ from chia.daemon.server import executable_for_service
12
12
  from chia.util.timing import adjusted_timeout
13
13
 
14
14
 
15
- def check_plotter(plotter: List[str], expected_output: bytes, specify_tmp: bool = True) -> None:
15
+ def check_plotter(plotter: list[str], expected_output: bytes, specify_tmp: bool = True) -> None:
16
16
  with tempfile.TemporaryDirectory() as path:
17
17
  tmp_dir = []
18
18
  if specify_tmp:
@@ -61,6 +61,7 @@ def test_command(expected_chia_version_str: str, require_madmax: bool) -> None:
61
61
  capture_output=True,
62
62
  encoding="utf-8",
63
63
  timeout=adjusted_timeout(30),
64
+ check=False,
64
65
  )
65
66
  assert chia_version_process.returncode == 0
66
67
  assert chia_version_process.stderr == ""
@@ -76,6 +77,7 @@ def test_command(expected_chia_version_str: str, require_madmax: bool) -> None:
76
77
  capture_output=True,
77
78
  encoding="utf-8",
78
79
  timeout=adjusted_timeout(30),
80
+ check=False,
79
81
  )
80
82
 
81
83
  print()
@@ -88,7 +90,7 @@ def test_command(expected_chia_version_str: str, require_madmax: bool) -> None:
88
90
  assert plotter_version_process.stderr == ""
89
91
 
90
92
  found_start = False
91
- plotter_versions: Dict[str, packaging.version.Version] = {}
93
+ plotter_versions: dict[str, packaging.version.Version] = {}
92
94
  for line in plotter_version_process.stdout.splitlines():
93
95
  if line.startswith("chiapos:"):
94
96
  found_start = True
chia/cmds/keys.py CHANGED
@@ -1,20 +1,19 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional, Tuple
3
+ from typing import Optional
4
4
 
5
5
  import click
6
6
  from chia_rs import PrivateKey
7
7
 
8
8
  from chia.cmds import options
9
+ from chia.cmds.cmd_classes import ChiaCliContext
9
10
 
10
11
 
11
12
  @click.group("keys", help="Manage your keys")
12
13
  @click.pass_context
13
14
  def keys_cmd(ctx: click.Context) -> None:
14
15
  """Create, delete, view and use your key pairs"""
15
- from pathlib import Path
16
-
17
- root_path: Path = ctx.obj["root_path"]
16
+ root_path = ChiaCliContext.set_default(ctx).root_path
18
17
  if not root_path.is_dir():
19
18
  raise RuntimeError("Please initialize (or migrate) your config directory with chia init")
20
19
 
@@ -30,11 +29,11 @@ def keys_cmd(ctx: click.Context) -> None:
30
29
  )
31
30
  @click.pass_context
32
31
  def generate_cmd(ctx: click.Context, label: Optional[str]) -> None:
33
- from .init_funcs import check_keys
34
- from .keys_funcs import generate_and_add
32
+ from chia.cmds.init_funcs import check_keys
33
+ from chia.cmds.keys_funcs import generate_and_add
35
34
 
36
35
  generate_and_add(label)
37
- check_keys(ctx.obj["root_path"])
36
+ check_keys(ChiaCliContext.set_default(ctx).root_path)
38
37
 
39
38
 
40
39
  @keys_cmd.command("show", help="Displays all the keys in keychain or the key with the given fingerprint")
@@ -75,9 +74,16 @@ def show_cmd(
75
74
  fingerprint: Optional[int],
76
75
  bech32m_prefix: Optional[str],
77
76
  ) -> None:
78
- from .keys_funcs import show_keys
77
+ from chia.cmds.keys_funcs import show_keys
79
78
 
80
- show_keys(ctx.obj["root_path"], show_mnemonic_seed, non_observer_derivation, json, fingerprint, bech32m_prefix)
79
+ show_keys(
80
+ ChiaCliContext.set_default(ctx).root_path,
81
+ show_mnemonic_seed,
82
+ non_observer_derivation,
83
+ json,
84
+ fingerprint,
85
+ bech32m_prefix,
86
+ )
81
87
 
82
88
 
83
89
  @keys_cmd.command("add", help="Add a private key by mnemonic or public key as hex")
@@ -99,8 +105,8 @@ def show_cmd(
99
105
  )
100
106
  @click.pass_context
101
107
  def add_cmd(ctx: click.Context, filename: str, label: Optional[str]) -> None:
102
- from .init_funcs import check_keys
103
- from .keys_funcs import query_and_add_key_info
108
+ from chia.cmds.init_funcs import check_keys
109
+ from chia.cmds.keys_funcs import query_and_add_key_info
104
110
 
105
111
  mnemonic_or_pk = None
106
112
  if filename:
@@ -109,7 +115,7 @@ def add_cmd(ctx: click.Context, filename: str, label: Optional[str]) -> None:
109
115
  mnemonic_or_pk = Path(filename).read_text().rstrip()
110
116
 
111
117
  query_and_add_key_info(mnemonic_or_pk, label)
112
- check_keys(ctx.obj["root_path"])
118
+ check_keys(ChiaCliContext.set_default(ctx).root_path)
113
119
 
114
120
 
115
121
  @keys_cmd.group("label", help="Manage your key labels")
@@ -119,7 +125,7 @@ def label_cmd() -> None:
119
125
 
120
126
  @label_cmd.command("show", help="Show the labels of all available keys")
121
127
  def show_label_cmd() -> None:
122
- from .keys_funcs import show_all_key_labels
128
+ from chia.cmds.keys_funcs import show_all_key_labels
123
129
 
124
130
  show_all_key_labels()
125
131
 
@@ -134,7 +140,7 @@ def show_label_cmd() -> None:
134
140
  required=True,
135
141
  )
136
142
  def set_label_cmd(fingerprint: int, label: str) -> None:
137
- from .keys_funcs import set_key_label
143
+ from chia.cmds.keys_funcs import set_key_label
138
144
 
139
145
  set_key_label(fingerprint, label)
140
146
 
@@ -142,7 +148,7 @@ def set_label_cmd(fingerprint: int, label: str) -> None:
142
148
  @label_cmd.command("delete", help="Delete the label of a key")
143
149
  @options.create_fingerprint(required=True)
144
150
  def delete_label_cmd(fingerprint: int) -> None:
145
- from .keys_funcs import delete_key_label
151
+ from chia.cmds.keys_funcs import delete_key_label
146
152
 
147
153
  delete_key_label(fingerprint)
148
154
 
@@ -151,11 +157,11 @@ def delete_label_cmd(fingerprint: int) -> None:
151
157
  @options.create_fingerprint(required=True)
152
158
  @click.pass_context
153
159
  def delete_cmd(ctx: click.Context, fingerprint: int) -> None:
154
- from .init_funcs import check_keys
155
- from .keys_funcs import delete
160
+ from chia.cmds.init_funcs import check_keys
161
+ from chia.cmds.keys_funcs import delete
156
162
 
157
163
  delete(fingerprint)
158
- check_keys(ctx.obj["root_path"])
164
+ check_keys(ChiaCliContext.set_default(ctx).root_path)
159
165
 
160
166
 
161
167
  @keys_cmd.command("delete_all", help="Delete all private keys in keychain")
@@ -167,7 +173,7 @@ def delete_all_cmd() -> None:
167
173
 
168
174
  @keys_cmd.command("generate_and_print", help="Generates but does NOT add to keychain")
169
175
  def generate_and_print_cmd() -> None:
170
- from .keys_funcs import generate_and_print
176
+ from chia.cmds.keys_funcs import generate_and_print
171
177
 
172
178
  generate_and_print()
173
179
 
@@ -203,7 +209,7 @@ def generate_and_print_cmd() -> None:
203
209
  def sign_cmd(
204
210
  message: str, fingerprint: Optional[int], filename: Optional[str], hd_path: str, as_bytes: bool, json: bool
205
211
  ) -> None:
206
- from .keys_funcs import resolve_derivation_master_key, sign
212
+ from chia.cmds.keys_funcs import resolve_derivation_master_key, sign
207
213
 
208
214
  _, resolved_sk = resolve_derivation_master_key(filename if filename is not None else fingerprint)
209
215
 
@@ -214,7 +220,7 @@ def sign_cmd(
214
220
  sign(message, resolved_sk, hd_path, as_bytes, json)
215
221
 
216
222
 
217
- def parse_signature_json(json_str: str) -> Tuple[str, str, str, str]:
223
+ def parse_signature_json(json_str: str) -> tuple[str, str, str, str]:
218
224
  import json
219
225
 
220
226
  try:
@@ -253,7 +259,7 @@ def parse_signature_json(json_str: str) -> Tuple[str, str, str, str]:
253
259
  type=str,
254
260
  )
255
261
  def verify_cmd(message: str, public_key: str, signature: str, as_bytes: bool, json: str) -> None:
256
- from .keys_funcs import as_bytes_from_signing_mode, verify
262
+ from chia.cmds.keys_funcs import as_bytes_from_signing_mode, verify
257
263
 
258
264
  if json is not None:
259
265
  parsed_message, parsed_pubkey, parsed_sig, parsed_signing_mode_str = parse_signature_json(json)
@@ -275,8 +281,9 @@ def verify_cmd(message: str, public_key: str, signature: str, as_bytes: bool, js
275
281
  )
276
282
  @click.pass_context
277
283
  def derive_cmd(ctx: click.Context, fingerprint: Optional[int], filename: Optional[str]) -> None:
278
- ctx.obj["fingerprint"] = fingerprint
279
- ctx.obj["filename"] = filename
284
+ context = ChiaCliContext.set_default(ctx)
285
+ context.keys_fingerprint = fingerprint
286
+ context.keys_filename = filename
280
287
 
281
288
 
282
289
  @derive_cmd.command("search", help="Search the keyring for one or more matching derived keys or wallet addresses")
@@ -320,20 +327,21 @@ def derive_cmd(ctx: click.Context, fingerprint: Optional[int], filename: Optiona
320
327
  @click.pass_context
321
328
  def search_cmd(
322
329
  ctx: click.Context,
323
- search_terms: Tuple[str, ...],
330
+ search_terms: tuple[str, ...],
324
331
  limit: int,
325
332
  non_observer_derivation: bool,
326
333
  show_progress: bool,
327
- search_type: Tuple[str, ...],
334
+ search_type: tuple[str, ...],
328
335
  derive_from_hd_path: Optional[str],
329
336
  prefix: Optional[str],
330
337
  ) -> None:
331
338
  import sys
332
339
 
333
- from .keys_funcs import resolve_derivation_master_key, search_derive
340
+ from chia.cmds.keys_funcs import resolve_derivation_master_key, search_derive
334
341
 
335
- fingerprint: Optional[int] = ctx.obj.get("fingerprint", None)
336
- filename: Optional[str] = ctx.obj.get("filename", None)
342
+ context = ChiaCliContext.set_default(ctx)
343
+ fingerprint: Optional[int] = context.keys_fingerprint
344
+ filename: Optional[str] = context.keys_filename
337
345
 
338
346
  # Specifying the master key is optional for the search command. If not specified, we'll search all keys.
339
347
  resolved_sk = None
@@ -343,7 +351,7 @@ def search_cmd(
343
351
  print("Could not resolve private key from fingerprint/mnemonic file")
344
352
 
345
353
  found: bool = search_derive(
346
- ctx.obj["root_path"],
354
+ context.root_path,
347
355
  fingerprint,
348
356
  search_terms,
349
357
  limit,
@@ -364,8 +372,8 @@ class ResolutionError(Exception):
364
372
 
365
373
  def _resolve_fingerprint_and_sk(
366
374
  filename: Optional[str], fingerprint: Optional[int], non_observer_derivation: bool
367
- ) -> Tuple[Optional[int], Optional[PrivateKey]]:
368
- from .keys_funcs import resolve_derivation_master_key
375
+ ) -> tuple[Optional[int], Optional[PrivateKey]]:
376
+ from chia.cmds.keys_funcs import resolve_derivation_master_key
369
377
 
370
378
  reolved_fp, resolved_sk = resolve_derivation_master_key(filename if filename is not None else fingerprint)
371
379
 
@@ -408,10 +416,11 @@ def _resolve_fingerprint_and_sk(
408
416
  def wallet_address_cmd(
409
417
  ctx: click.Context, index: int, count: int, prefix: Optional[str], non_observer_derivation: bool, show_hd_path: bool
410
418
  ) -> None:
411
- from .keys_funcs import derive_wallet_address
419
+ from chia.cmds.keys_funcs import derive_wallet_address
412
420
 
413
- fingerprint: Optional[int] = ctx.obj.get("fingerprint", None)
414
- filename: Optional[str] = ctx.obj.get("filename", None)
421
+ context = ChiaCliContext.set_default(ctx)
422
+ fingerprint = context.keys_fingerprint
423
+ filename = context.keys_filename
415
424
 
416
425
  try:
417
426
  fingerprint, sk = _resolve_fingerprint_and_sk(filename, fingerprint, non_observer_derivation)
@@ -419,7 +428,14 @@ def wallet_address_cmd(
419
428
  return
420
429
 
421
430
  derive_wallet_address(
422
- ctx.obj["root_path"], fingerprint, index, count, prefix, non_observer_derivation, show_hd_path, sk
431
+ context.root_path,
432
+ fingerprint,
433
+ index,
434
+ count,
435
+ prefix,
436
+ non_observer_derivation,
437
+ show_hd_path,
438
+ sk,
423
439
  )
424
440
 
425
441
 
@@ -483,13 +499,14 @@ def child_key_cmd(
483
499
  show_hd_path: bool,
484
500
  bech32m_prefix: Optional[str],
485
501
  ) -> None:
486
- from .keys_funcs import derive_child_key
502
+ from chia.cmds.keys_funcs import derive_child_key
487
503
 
488
504
  if key_type is None and derive_from_hd_path is None:
489
505
  ctx.fail("--type or --derive-from-hd-path is required")
490
506
 
491
- fingerprint: Optional[int] = ctx.obj.get("fingerprint", None)
492
- filename: Optional[str] = ctx.obj.get("filename", None)
507
+ context = ChiaCliContext.set_default(ctx)
508
+ fingerprint = context.keys_fingerprint
509
+ filename = context.keys_filename
493
510
 
494
511
  try:
495
512
  fingerprint, sk = _resolve_fingerprint_and_sk(filename, fingerprint, non_observer_derivation)