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/util/keychain.py CHANGED
@@ -1,18 +1,22 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import sys
4
6
  import unicodedata
7
+ from collections.abc import Iterator
5
8
  from dataclasses import dataclass
6
9
  from hashlib import pbkdf2_hmac
7
10
  from pathlib import Path
8
- from typing import Any, Dict, Iterator, List, Literal, Optional, Tuple, Union, overload
11
+ from typing import Any, Literal, Optional, Union, overload
9
12
 
10
13
  import importlib_resources
11
14
  from bitstring import BitArray # pyright: reportMissingImports=false
12
15
  from chia_rs import AugSchemeMPL, G1Element, PrivateKey # pyright: reportMissingImports=false
16
+ from chia_rs.sized_bytes import bytes32
17
+ from chia_rs.sized_ints import uint32
13
18
  from typing_extensions import final
14
19
 
15
- from chia.types.blockchain_format.sized_bytes import bytes32
16
20
  from chia.util.bech32m import bech32_decode, convertbits
17
21
  from chia.util.byte_types import hexstr_to_bytes
18
22
  from chia.util.errors import (
@@ -26,7 +30,6 @@ from chia.util.errors import (
26
30
  )
27
31
  from chia.util.file_keyring import Key
28
32
  from chia.util.hash import std_hash
29
- from chia.util.ints import uint32
30
33
  from chia.util.keyring_wrapper import KeyringWrapper
31
34
  from chia.util.streamable import Streamable, streamable
32
35
 
@@ -38,10 +41,10 @@ MIN_PASSPHRASE_LEN = 8
38
41
 
39
42
 
40
43
  def supports_os_passphrase_storage() -> bool:
41
- return sys.platform in ["darwin", "win32", "cygwin"]
44
+ return sys.platform in {"darwin", "win32", "cygwin"}
42
45
 
43
46
 
44
- def passphrase_requirements() -> Dict[str, Any]:
47
+ def passphrase_requirements() -> dict[str, Any]:
45
48
  """
46
49
  Returns a dictionary specifying current passphrase requirements
47
50
  """
@@ -68,7 +71,7 @@ def generate_mnemonic() -> str:
68
71
 
69
72
 
70
73
  def bytes_to_mnemonic(mnemonic_bytes: bytes) -> str:
71
- if len(mnemonic_bytes) not in [16, 20, 24, 28, 32]:
74
+ if len(mnemonic_bytes) not in {16, 20, 24, 28, 32}:
72
75
  raise ValueError(
73
76
  f"Data length should be one of the following: [16, 20, 24, 28, 32], but it is {len(mnemonic_bytes)}."
74
77
  )
@@ -93,8 +96,8 @@ def bytes_to_mnemonic(mnemonic_bytes: bytes) -> str:
93
96
 
94
97
 
95
98
  def check_mnemonic_validity(mnemonic_str: str) -> bool:
96
- mnemonic: List[str] = mnemonic_str.split(" ")
97
- return len(mnemonic) in [12, 15, 18, 21, 24]
99
+ mnemonic: list[str] = mnemonic_str.split(" ")
100
+ return len(mnemonic) in {12, 15, 18, 21, 24}
98
101
 
99
102
 
100
103
  def mnemonic_from_short_words(mnemonic_str: str) -> str:
@@ -103,12 +106,12 @@ def mnemonic_from_short_words(mnemonic_str: str) -> str:
103
106
  practice to only store the first 4 letters of each word in many offline storage solutions, also support looking
104
107
  up words by the first 4 characters
105
108
  """
106
- mnemonic: List[str] = mnemonic_str.split(" ")
107
- if len(mnemonic) not in [12, 15, 18, 21, 24]:
109
+ mnemonic: list[str] = mnemonic_str.split(" ")
110
+ if len(mnemonic) not in {12, 15, 18, 21, 24}:
108
111
  raise ValueError("Invalid mnemonic length")
109
112
 
110
113
  four_char_dict = {word[:4]: word for word in bip39_word_list().splitlines()}
111
- full_words: List[str] = []
114
+ full_words: list[str] = []
112
115
  for word in mnemonic:
113
116
  full_word = four_char_dict.get(word[:4])
114
117
  if full_word is None:
@@ -120,7 +123,7 @@ def mnemonic_from_short_words(mnemonic_str: str) -> str:
120
123
 
121
124
  def bytes_from_mnemonic(mnemonic_str: str) -> bytes:
122
125
  full_mnemonic_str = mnemonic_from_short_words(mnemonic_str)
123
- mnemonic: List[str] = full_mnemonic_str.split(" ")
126
+ mnemonic: list[str] = full_mnemonic_str.split(" ")
124
127
 
125
128
  word_list = {word: i for i, word in enumerate(bip39_word_list().splitlines())}
126
129
  bit_array = BitArray()
@@ -185,7 +188,7 @@ def get_private_key_user(user: str, index: int) -> str:
185
188
  @streamable
186
189
  @dataclass(frozen=True)
187
190
  class KeyDataSecrets(Streamable):
188
- mnemonic: List[str]
191
+ mnemonic: list[str]
189
192
  entropy: bytes
190
193
  private_key: PrivateKey
191
194
 
@@ -259,7 +262,7 @@ class KeyData(Streamable):
259
262
  return cls.from_mnemonic(generate_mnemonic(), label)
260
263
 
261
264
  @property
262
- def mnemonic(self) -> List[str]:
265
+ def mnemonic(self) -> list[str]:
263
266
  if self.secrets is None:
264
267
  raise KeychainSecretsMissing()
265
268
  return self.secrets.mnemonic
@@ -434,7 +437,7 @@ class Keychain:
434
437
  pass
435
438
  return None
436
439
 
437
- def get_first_private_key(self) -> Optional[Tuple[PrivateKey, bytes]]:
440
+ def get_first_private_key(self) -> Optional[tuple[PrivateKey, bytes]]:
438
441
  """
439
442
  Returns the first key in the keychain that has one of the passed in passphrases.
440
443
  """
@@ -442,7 +445,7 @@ class Keychain:
442
445
  return key_data.private_key, key_data.entropy
443
446
  return None
444
447
 
445
- def get_private_key_by_fingerprint(self, fingerprint: int) -> Optional[Tuple[PrivateKey, bytes]]:
448
+ def get_private_key_by_fingerprint(self, fingerprint: int) -> Optional[tuple[PrivateKey, bytes]]:
446
449
  """
447
450
  Return first private key which have the given public key fingerprint.
448
451
  """
@@ -451,12 +454,12 @@ class Keychain:
451
454
  return key_data.private_key, key_data.entropy
452
455
  return None
453
456
 
454
- def get_all_private_keys(self) -> List[Tuple[PrivateKey, bytes]]:
457
+ def get_all_private_keys(self) -> list[tuple[PrivateKey, bytes]]:
455
458
  """
456
459
  Returns all private keys which can be retrieved, with the given passphrases.
457
460
  A tuple of key, and entropy bytes (i.e. mnemonic) is returned for each key.
458
461
  """
459
- all_keys: List[Tuple[PrivateKey, bytes]] = []
462
+ all_keys: list[tuple[PrivateKey, bytes]] = []
460
463
  for key_data in self._iterate_through_key_datas(skip_public_only=True):
461
464
  all_keys.append((key_data.private_key, key_data.entropy))
462
465
  return all_keys
@@ -470,21 +473,21 @@ class Keychain:
470
473
  return key_data
471
474
  raise KeychainFingerprintNotFound(fingerprint)
472
475
 
473
- def get_keys(self, include_secrets: bool = False) -> List[KeyData]:
476
+ def get_keys(self, include_secrets: bool = False) -> list[KeyData]:
474
477
  """
475
478
  Returns the KeyData of all keys which can be retrieved.
476
479
  """
477
- all_keys: List[KeyData] = []
480
+ all_keys: list[KeyData] = []
478
481
  for key_data in self._iterate_through_key_datas(include_secrets=include_secrets, skip_public_only=False):
479
482
  all_keys.append(key_data)
480
483
 
481
484
  return all_keys
482
485
 
483
- def get_all_public_keys(self) -> List[G1Element]:
486
+ def get_all_public_keys(self) -> list[G1Element]:
484
487
  """
485
488
  Returns all public keys.
486
489
  """
487
- all_keys: List[G1Element] = []
490
+ all_keys: list[G1Element] = []
488
491
  for key_data in self._iterate_through_key_datas(skip_public_only=False):
489
492
  all_keys.append(key_data.public_key)
490
493
 
@@ -521,13 +524,13 @@ class Keychain:
521
524
  pass
522
525
  return removed
523
526
 
524
- def delete_keys(self, keys_to_delete: List[Tuple[PrivateKey, bytes]]) -> None:
527
+ def delete_keys(self, keys_to_delete: list[tuple[PrivateKey, bytes]]) -> None:
525
528
  """
526
529
  Deletes all keys in the list.
527
530
  """
528
531
  remaining_fingerprints = {x[0].get_g1().get_fingerprint() for x in keys_to_delete}
529
532
  remaining_removals = len(remaining_fingerprints)
530
- while len(remaining_fingerprints):
533
+ while len(remaining_fingerprints) > 0:
531
534
  key_to_delete = remaining_fingerprints.pop()
532
535
  if self.delete_key_by_fingerprint(key_to_delete) > 0:
533
536
  remaining_removals -= 1
@@ -1,15 +1,22 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
5
+ import sys
6
+ import time
7
+ from getpass import getpass
3
8
  from pathlib import Path
4
9
  from sys import platform
5
- from typing import ClassVar, Optional, Tuple, Union, overload
10
+ from typing import ClassVar, Optional, Union, overload
6
11
 
12
+ import colorama
7
13
  from keyring.backends.macOS import Keyring as MacKeyring
8
14
  from keyring.backends.Windows import WinVaultKeyring as WinKeyring
9
15
  from keyring.errors import KeyringError, PasswordDeleteError
10
16
  from typing_extensions import Literal
11
17
 
12
18
  from chia.util.default_root import DEFAULT_KEYS_ROOT_PATH
19
+ from chia.util.errors import KeychainMaxUnlockAttempts
13
20
  from chia.util.file_keyring import FileKeyring
14
21
 
15
22
  # We want to protect the keyring, even if a user-specified master passphrase isn't provided
@@ -52,6 +59,62 @@ def warn_if_macos_errSecInteractionNotAllowed(error: KeyringError) -> bool:
52
59
  return False
53
60
 
54
61
 
62
+ DEFAULT_PASSPHRASE_PROMPT = (
63
+ colorama.Fore.YELLOW + colorama.Style.BRIGHT + "(Unlock Keyring)" + colorama.Style.RESET_ALL + " Passphrase: "
64
+ )
65
+ FAILED_ATTEMPT_DELAY = 0.5
66
+ MAX_RETRIES = 3
67
+
68
+
69
+ def prompt_for_passphrase(prompt: str) -> str:
70
+ if sys.platform == "win32" or sys.platform == "cygwin":
71
+ print(prompt, end="", flush=True)
72
+ prompt = ""
73
+ return getpass(prompt)
74
+
75
+
76
+ def obtain_current_passphrase(prompt: str = DEFAULT_PASSPHRASE_PROMPT, use_passphrase_cache: bool = False) -> str:
77
+ from chia.util.keyring_wrapper import KeyringWrapper
78
+
79
+ """
80
+ Obtains the master passphrase for the keyring, optionally using the cached
81
+ value (if previously set). If the passphrase isn't already cached, the user is
82
+ prompted interactively to enter their passphrase a max of MAX_RETRIES times
83
+ before failing.
84
+ """
85
+
86
+ if use_passphrase_cache:
87
+ passphrase, validated = KeyringWrapper.get_shared_instance().get_cached_master_passphrase()
88
+ if passphrase:
89
+ # If the cached passphrase was previously validated, we assume it's... valid
90
+ if validated:
91
+ return passphrase
92
+
93
+ # Cached passphrase needs to be validated
94
+ if KeyringWrapper.get_shared_instance().master_passphrase_is_valid(passphrase):
95
+ KeyringWrapper.get_shared_instance().set_cached_master_passphrase(passphrase, validated=True)
96
+ return passphrase
97
+ else:
98
+ # Cached passphrase is bad, clear the cache
99
+ KeyringWrapper.get_shared_instance().set_cached_master_passphrase(None)
100
+
101
+ # Prompt interactively with up to MAX_RETRIES attempts
102
+ for i in range(MAX_RETRIES):
103
+ colorama.init()
104
+
105
+ passphrase = prompt_for_passphrase(prompt)
106
+
107
+ if KeyringWrapper.get_shared_instance().master_passphrase_is_valid(passphrase):
108
+ # If using the passphrase cache, and the user inputted a passphrase, update the cache
109
+ if use_passphrase_cache:
110
+ KeyringWrapper.get_shared_instance().set_cached_master_passphrase(passphrase, validated=True)
111
+ return passphrase
112
+
113
+ time.sleep(FAILED_ATTEMPT_DELAY)
114
+ print("Incorrect passphrase\n")
115
+ raise KeychainMaxUnlockAttempts()
116
+
117
+
55
118
  class KeyringWrapper:
56
119
  """
57
120
  KeyringWrapper provides an abstraction that the Keychain class can use
@@ -141,7 +204,7 @@ class KeyringWrapper:
141
204
 
142
205
  # Master passphrase support
143
206
 
144
- def get_cached_master_passphrase(self) -> Tuple[Optional[str], bool]:
207
+ def get_cached_master_passphrase(self) -> tuple[Optional[str], bool]:
145
208
  """
146
209
  Returns a tuple including the currently cached passphrase and a bool
147
210
  indicating whether the passphrase has been previously validated.
@@ -228,7 +291,6 @@ class KeyringWrapper:
228
291
  except KeyringError as e:
229
292
  if not warn_if_macos_errSecInteractionNotAllowed(e):
230
293
  raise
231
- return None
232
294
 
233
295
  def remove_master_passphrase_from_credential_store(self) -> None:
234
296
  passphrase_store: Optional[OSPassphraseStore] = get_os_passphrase_store()
@@ -247,7 +309,6 @@ class KeyringWrapper:
247
309
  except KeyringError as e:
248
310
  if not warn_if_macos_errSecInteractionNotAllowed(e):
249
311
  raise
250
- return None
251
312
 
252
313
  def get_master_passphrase_from_credential_store(self) -> Optional[str]:
253
314
  passphrase_store: Optional[OSPassphraseStore] = get_os_passphrase_store()
@@ -1,9 +1,11 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import asyncio
4
6
  import contextlib
7
+ from collections.abc import AsyncIterator
5
8
  from dataclasses import dataclass
6
- from typing import AsyncIterator
7
9
 
8
10
  from typing_extensions import final
9
11
 
chia/util/lock.py CHANGED
@@ -1,9 +1,11 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  from dataclasses import dataclass
4
6
  from pathlib import Path
5
7
  from types import TracebackType
6
- from typing import Optional, Type
8
+ from typing import Optional
7
9
 
8
10
  from filelock import BaseFileLock, FileLock, Timeout
9
11
  from typing_extensions import final
@@ -31,7 +33,7 @@ class Lockfile:
31
33
 
32
34
  def __exit__(
33
35
  self,
34
- exc_type: Optional[Type[BaseException]],
36
+ exc_type: Optional[type[BaseException]],
35
37
  exc: Optional[BaseException],
36
38
  traceback: Optional[TracebackType],
37
39
  ) -> None:
@@ -1,9 +1,12 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import logging
4
6
  import traceback
7
+ from collections.abc import Iterator
5
8
  from contextlib import contextmanager
6
- from typing import Iterator, Tuple, Type, Union
9
+ from typing import Union
7
10
 
8
11
 
9
12
  @contextmanager
@@ -14,7 +17,7 @@ def log_exceptions(
14
17
  message: str = "Caught exception",
15
18
  level: int = logging.ERROR,
16
19
  show_traceback: bool = True,
17
- exceptions_to_process: Union[Type[BaseException], Tuple[Type[BaseException], ...]] = Exception,
20
+ exceptions_to_process: Union[type[BaseException], tuple[type[BaseException], ...]] = Exception,
18
21
  ) -> Iterator[None]:
19
22
  try:
20
23
  yield
chia/util/logging.py CHANGED
@@ -1,9 +1,11 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import logging
4
6
  import re
5
7
  import time
6
- from typing import Pattern
8
+ from re import Pattern
7
9
 
8
10
 
9
11
  class TimedDuplicateFilter(logging.Filter):
chia/util/lru_cache.py CHANGED
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  from collections import OrderedDict
chia/util/math.py CHANGED
@@ -1,14 +1,14 @@
1
- from __future__ import annotations
1
+ # Package: utils
2
2
 
3
- from typing import List
3
+ from __future__ import annotations
4
4
 
5
5
 
6
6
  def clamp(n: int, smallest: int, largest: int) -> int:
7
7
  return max(smallest, min(n, largest))
8
8
 
9
9
 
10
- def make_monotonically_decreasing(seq: List[float]) -> List[float]:
11
- out: List[float] = []
10
+ def make_monotonically_decreasing(seq: list[float]) -> list[float]:
11
+ out: list[float] = []
12
12
  if len(seq) > 0:
13
13
  min = seq[0]
14
14
  for n in seq:
chia/util/network.py CHANGED
@@ -5,51 +5,19 @@ import ipaddress
5
5
  import logging
6
6
  import socket
7
7
  import ssl
8
+ from collections.abc import Iterable
8
9
  from dataclasses import dataclass
9
- from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network, ip_address
10
- from typing import Any, Dict, Iterable, List, Literal, Optional, Tuple, Union
10
+ from ipaddress import IPv4Network, IPv6Network, ip_address
11
+ from typing import Any, Literal, Optional, Union
11
12
 
12
13
  from aiohttp import web
13
14
  from aiohttp.log import web_logger
14
15
  from typing_extensions import final
15
16
 
16
- from chia.server.outbound_message import NodeType
17
17
  from chia.types.blockchain_format.sized_bytes import bytes32
18
18
  from chia.util.ints import uint16
19
-
20
-
21
- @dataclass(frozen=True)
22
- class IPAddress:
23
- _inner: Union[IPv4Address, IPv6Address]
24
-
25
- @classmethod
26
- def create(cls, ip: str) -> IPAddress:
27
- return cls(ip_address(ip))
28
-
29
- def __int__(self) -> int:
30
- return int(self._inner)
31
-
32
- def __str__(self) -> str:
33
- return str(self._inner)
34
-
35
- def __repr__(self) -> str:
36
- return repr(self._inner)
37
-
38
- @property
39
- def packed(self) -> bytes:
40
- return self._inner.packed
41
-
42
- @property
43
- def is_private(self) -> bool:
44
- return self._inner.is_private
45
-
46
- @property
47
- def is_v4(self) -> bool:
48
- return self._inner.version == 4
49
-
50
- @property
51
- def is_v6(self) -> bool:
52
- return self._inner.version == 6
19
+ from chia.util.ip_address import IPAddress
20
+ from chia.util.task_referencer import create_referenced_task
53
21
 
54
22
 
55
23
  @final
@@ -130,7 +98,7 @@ class WebServer:
130
98
  await self.runner.cleanup()
131
99
 
132
100
  def close(self) -> None:
133
- self._close_task = asyncio.create_task(self._close())
101
+ self._close_task = create_referenced_task(self._close())
134
102
 
135
103
  async def await_closed(self) -> None:
136
104
  if self._close_task is None:
@@ -146,7 +114,7 @@ def is_in_network(peer_host: str, networks: Iterable[Union[IPv4Network, IPv6Netw
146
114
  return False
147
115
 
148
116
 
149
- def is_trusted_cidr(peer_host: str, trusted_cidrs: List[str]) -> bool:
117
+ def is_trusted_cidr(peer_host: str, trusted_cidrs: list[str]) -> bool:
150
118
  try:
151
119
  ip_obj = ipaddress.ip_address(peer_host)
152
120
  except ValueError:
@@ -161,41 +129,15 @@ def is_trusted_cidr(peer_host: str, trusted_cidrs: List[str]) -> bool:
161
129
 
162
130
 
163
131
  def is_localhost(peer_host: str) -> bool:
164
- return peer_host in ["127.0.0.1", "localhost", "::1", "0:0:0:0:0:0:0:1"]
132
+ return peer_host in {"127.0.0.1", "localhost", "::1", "0:0:0:0:0:0:0:1"}
165
133
 
166
134
 
167
135
  def is_trusted_peer(
168
- host: str, node_id: bytes32, trusted_peers: Dict[str, Any], trusted_cidrs: List[str], testing: bool = False
136
+ host: str, node_id: bytes32, trusted_peers: dict[str, Any], trusted_cidrs: list[str], testing: bool = False
169
137
  ) -> bool:
170
- return not testing and is_localhost(host) or node_id.hex() in trusted_peers or is_trusted_cidr(host, trusted_cidrs)
171
-
172
-
173
- def class_for_type(type: NodeType) -> Any:
174
- if type is NodeType.FULL_NODE:
175
- from chia.full_node.full_node_api import FullNodeAPI
176
-
177
- return FullNodeAPI
178
- elif type is NodeType.WALLET:
179
- from chia.wallet.wallet_node_api import WalletNodeAPI
180
-
181
- return WalletNodeAPI
182
- elif type is NodeType.INTRODUCER:
183
- from chia.introducer.introducer_api import IntroducerAPI
184
-
185
- return IntroducerAPI
186
- elif type is NodeType.TIMELORD:
187
- from chia.timelord.timelord_api import TimelordAPI
188
-
189
- return TimelordAPI
190
- elif type is NodeType.FARMER:
191
- from chia.farmer.farmer_api import FarmerAPI
192
-
193
- return FarmerAPI
194
- elif type is NodeType.HARVESTER:
195
- from chia.harvester.harvester_api import HarvesterAPI
196
-
197
- return HarvesterAPI
198
- raise ValueError("No class for type")
138
+ return (
139
+ (not testing and is_localhost(host)) or node_id.hex() in trusted_peers or is_trusted_cidr(host, trusted_cidrs)
140
+ )
199
141
 
200
142
 
201
143
  async def resolve(host: str, *, prefer_ipv6: bool = False) -> IPAddress:
@@ -203,8 +145,8 @@ async def resolve(host: str, *, prefer_ipv6: bool = False) -> IPAddress:
203
145
  return IPAddress.create(host)
204
146
  except ValueError:
205
147
  pass
206
- addrset: List[
207
- Tuple[socket.AddressFamily, socket.SocketKind, int, str, Union[Tuple[str, int], Tuple[str, int, int, int]]]
148
+ addrset: list[
149
+ tuple[socket.AddressFamily, socket.SocketKind, int, str, Union[tuple[str, int], tuple[str, int, int, int]]]
208
150
  ] = await asyncio.get_event_loop().getaddrinfo(host, None)
209
151
  # The list returned by getaddrinfo is never empty, an exception is thrown or data is returned.
210
152
  ips_v4 = []
@@ -224,7 +166,7 @@ async def resolve(host: str, *, prefer_ipv6: bool = False) -> IPAddress:
224
166
  raise ValueError(f"failed to resolve {host} into an IP address")
225
167
 
226
168
 
227
- def select_port(prefer_ipv6: bool, addresses: List[Any]) -> uint16:
169
+ def select_port(prefer_ipv6: bool, addresses: list[Any]) -> uint16:
228
170
  selected_port: uint16
229
171
  for address_string, port, *_ in addresses:
230
172
  address = ip_address(address_string)
chia/util/paginator.py CHANGED
@@ -1,8 +1,10 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import dataclasses
6
+ from collections.abc import Sequence
4
7
  from math import ceil
5
- from typing import Sequence
6
8
 
7
9
 
8
10
  class InvalidPageSizeLimit(Exception):
chia/util/path.py CHANGED
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import os
chia/util/permissions.py CHANGED
@@ -1,11 +1,12 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import os
4
6
  from pathlib import Path
5
- from typing import Tuple
6
7
 
7
8
 
8
- def verify_file_permissions(path: Path, mask: int) -> Tuple[bool, int]:
9
+ def verify_file_permissions(path: Path, mask: int) -> tuple[bool, int]:
9
10
  """
10
11
  Check that the file's permissions are properly restricted, as compared to the
11
12
  permission mask
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Tuple
4
-
5
3
  from chia.consensus.block_record import BlockRecord
6
4
  from chia.consensus.blockchain_interface import BlockRecordsProtocol
7
5
  from chia.util.ints import uint128
@@ -11,7 +9,7 @@ def get_prev_transaction_block(
11
9
  curr: BlockRecord,
12
10
  blocks: BlockRecordsProtocol,
13
11
  total_iters_sp: uint128,
14
- ) -> Tuple[bool, BlockRecord]:
12
+ ) -> tuple[bool, BlockRecord]:
15
13
  prev_transaction_block = curr
16
14
  while not curr.is_transaction_block:
17
15
  curr = blocks.block_record(curr.prev_hash)
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import asyncio
@@ -5,8 +7,9 @@ import collections
5
7
  import contextlib
6
8
  import dataclasses
7
9
  import logging
10
+ from collections.abc import AsyncIterator
8
11
  from enum import IntEnum
9
- from typing import AsyncIterator, Dict, Generic, Optional, Type, TypeVar
12
+ from typing import Generic, Optional, TypeVar
10
13
 
11
14
  from typing_extensions import final
12
15
 
@@ -45,11 +48,11 @@ class PriorityMutex(Generic[_T_Priority]):
45
48
  ```
46
49
  """
47
50
 
48
- _deques: Dict[_T_Priority, collections.deque[_Element]]
51
+ _deques: dict[_T_Priority, collections.deque[_Element]]
49
52
  _active: Optional[_Element] = None
50
53
 
51
54
  @classmethod
52
- def create(cls, priority_type: Type[_T_Priority]) -> PriorityMutex[_T_Priority]:
55
+ def create(cls, priority_type: type[_T_Priority]) -> PriorityMutex[_T_Priority]:
53
56
  return cls(
54
57
  _deques={priority: collections.deque() for priority in sorted(priority_type)},
55
58
  )
chia/util/profiler.py CHANGED
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import asyncio
@@ -5,9 +7,10 @@ import cProfile
5
7
  import logging
6
8
  import pathlib
7
9
  import tracemalloc
10
+ from collections.abc import AsyncIterator
8
11
  from contextlib import asynccontextmanager
9
12
  from datetime import datetime
10
- from typing import AsyncIterator, Optional
13
+ from typing import Optional
11
14
 
12
15
  from chia.util.path import path_from_root
13
16
 
@@ -132,7 +135,7 @@ if __name__ == "__main__":
132
135
  output_file += f"-{last}"
133
136
 
134
137
  print(f"generating call tree for slot(s) [{first}, {last}]")
135
- check_call(["gprof2dot", "-f", "pstats", "-o", output_file + ".dot"] + files)
138
+ check_call(["gprof2dot", "-f", "pstats", "-o", output_file + ".dot", *files])
136
139
  with open(output_file + ".png", "w+") as f:
137
140
  check_call(["dot", "-T", "png", output_file + ".dot"], stdout=f)
138
141
  print(f"output written to: {output_file}.png")
@@ -140,7 +143,7 @@ if __name__ == "__main__":
140
143
  if len(sys.argv) == 2:
141
144
  # this analyzes the CPU usage at all slots saved to the profiler directory
142
145
  analyze_cpu_usage(profile_dir)
143
- elif len(sys.argv) in [3, 4]:
146
+ elif len(sys.argv) in {3, 4}:
144
147
  # the additional arguments are interpreted as either one slot, or a
145
148
  # slot range (first and last) to analyze
146
149
  first = int(sys.argv[2])
@@ -174,7 +177,7 @@ async def mem_profile_task(root_path: pathlib.Path, service: str, log: logging.L
174
177
  await asyncio.sleep(60)
175
178
  snapshot = tracemalloc.take_snapshot()
176
179
  snapshot.dump(str(profile_dir / f"heap-{counter:05d}.profile"))
177
- log.info(f"Heap usage: {tracemalloc.get_traced_memory()[0]/1000000:0.3f} MB profile {counter:05d}")
180
+ log.info(f"Heap usage: {tracemalloc.get_traced_memory()[0] / 1000000:0.3f} MB profile {counter:05d}")
178
181
  counter += 1
179
182
  finally:
180
183
  tracemalloc.stop()
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  from dataclasses import replace
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import asyncio