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
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Dict, Generator, Iterable, KeysView
3
+ from collections.abc import Generator, Iterable, KeysView
4
4
 
5
- SERVICES_FOR_GROUP: Dict[str, list[str]] = {
5
+ SERVICES_FOR_GROUP: dict[str, list[str]] = {
6
6
  "all": [
7
7
  "chia_harvester",
8
8
  "chia_timelord_launcher",
chia/util/setproctitle.py CHANGED
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  try:
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
 
chia/util/ssl_check.py CHANGED
@@ -5,7 +5,7 @@ import stat
5
5
  import sys
6
6
  from logging import Logger
7
7
  from pathlib import Path
8
- from typing import List, Optional, Set, Tuple
8
+ from typing import Optional
9
9
 
10
10
  from chia.util.config import load_config, traverse_dict
11
11
  from chia.util.permissions import octal_mode_string, verify_file_permissions
@@ -60,15 +60,15 @@ KEY_CONFIG_KEY_PATHS = [
60
60
 
61
61
 
62
62
  # Set to keep track of which files we've already warned about
63
- warned_ssl_files: Set[Path] = set()
63
+ warned_ssl_files: set[Path] = set()
64
64
 
65
65
 
66
- def get_all_ssl_file_paths(root_path: Path) -> Tuple[List[Path], List[Path]]:
66
+ def get_all_ssl_file_paths(root_path: Path) -> tuple[list[Path], list[Path]]:
67
67
  """Lookup config values and append to a list of files whose permissions we need to check"""
68
68
  from chia.ssl.create_ssl import get_mozilla_ca_crt
69
69
 
70
- all_certs: List[Path] = []
71
- all_keys: List[Path] = []
70
+ all_certs: list[Path] = []
71
+ all_keys: list[Path] = []
72
72
 
73
73
  try:
74
74
  config = load_config(root_path, "config.yaml", exit_on_error=False, fill_missing_services=True)
@@ -99,16 +99,16 @@ def get_ssl_perm_warning(path: Path, actual_mode: int, expected_mode: int) -> st
99
99
 
100
100
 
101
101
  def verify_ssl_certs_and_keys(
102
- cert_paths: List[Path], key_paths: List[Path], log: Optional[Logger] = None
103
- ) -> List[Tuple[Path, int, int]]:
102
+ cert_paths: list[Path], key_paths: list[Path], log: Optional[Logger] = None
103
+ ) -> list[tuple[Path, int, int]]:
104
104
  """Check that file permissions are properly set for the provided SSL cert and key files"""
105
105
  if sys.platform == "win32" or sys.platform == "cygwin":
106
106
  # TODO: ACLs for SSL certs/keys on Windows
107
107
  return []
108
108
 
109
- invalid_files_and_modes: List[Tuple[Path, int, int]] = []
109
+ invalid_files_and_modes: list[tuple[Path, int, int]] = []
110
110
 
111
- def verify_paths(paths: List[Path], restrict_mask: int, expected_permissions: int) -> None:
111
+ def verify_paths(paths: list[Path], restrict_mask: int, expected_permissions: int) -> None:
112
112
  nonlocal invalid_files_and_modes
113
113
  for path in paths:
114
114
  try:
@@ -157,7 +157,7 @@ def check_ssl(root_path: Path) -> None:
157
157
  print("\n".join(lines), file=sys.stderr)
158
158
 
159
159
 
160
- def check_and_fix_permissions_for_ssl_file(file: Path, mask: int, updated_mode: int) -> Tuple[bool, bool]:
160
+ def check_and_fix_permissions_for_ssl_file(file: Path, mask: int, updated_mode: int) -> tuple[bool, bool]:
161
161
  """Check file permissions and attempt to fix them if found to be too open"""
162
162
  if sys.platform == "win32" or sys.platform == "cygwin":
163
163
  # TODO: ACLs for SSL certs/keys on Windows
@@ -168,7 +168,7 @@ def check_and_fix_permissions_for_ssl_file(file: Path, mask: int, updated_mode:
168
168
 
169
169
  # Check that the file permissions are not too permissive
170
170
  try:
171
- (good_perms, mode) = verify_file_permissions(file, mask)
171
+ (good_perms, _mode) = verify_file_permissions(file, mask)
172
172
  if not good_perms:
173
173
  valid = False
174
174
  print(
chia/util/streamable.py CHANGED
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import dataclasses
@@ -5,30 +7,16 @@ import io
5
7
  import os
6
8
  import pprint
7
9
  import traceback
10
+ from collections.abc import Collection
8
11
  from enum import Enum
9
- from typing import (
10
- TYPE_CHECKING,
11
- Any,
12
- BinaryIO,
13
- Callable,
14
- ClassVar,
15
- Collection,
16
- Dict,
17
- List,
18
- Optional,
19
- Tuple,
20
- Type,
21
- TypeVar,
22
- Union,
23
- get_type_hints,
24
- )
12
+ from typing import TYPE_CHECKING, Any, BinaryIO, Callable, ClassVar, Optional, TypeVar, Union, get_type_hints
25
13
 
14
+ from chia_rs.sized_bytes import bytes32
15
+ from chia_rs.sized_ints import uint16, uint32, uint64
26
16
  from typing_extensions import Literal, get_args, get_origin
27
17
 
28
- from chia.types.blockchain_format.sized_bytes import bytes32
29
18
  from chia.util.byte_types import hexstr_to_bytes
30
19
  from chia.util.hash import std_hash
31
- from chia.util.ints import uint16, uint32, uint64
32
20
 
33
21
  if TYPE_CHECKING:
34
22
  from _typeshed import DataclassInstance
@@ -45,7 +33,7 @@ class UnsupportedType(StreamableError):
45
33
 
46
34
 
47
35
  class DefinitionError(StreamableError):
48
- def __init__(self, message: str, cls: Type[object]):
36
+ def __init__(self, message: str, cls: type[object]):
49
37
  super().__init__(
50
38
  f"{message} Correct usage is:\n\n"
51
39
  f"@streamable\n@dataclass(frozen=True)\nclass {cls.__name__}(Streamable):\n ..."
@@ -53,7 +41,7 @@ class DefinitionError(StreamableError):
53
41
 
54
42
 
55
43
  class ParameterMissingError(StreamableError):
56
- def __init__(self, cls: type, missing: List[str]):
44
+ def __init__(self, cls: type, missing: list[str]):
57
45
  super().__init__(
58
46
  f"{len(missing)} field{'s' if len(missing) != 1 else ''} missing for {cls.__name__}: {', '.join(missing)}"
59
47
  )
@@ -91,7 +79,7 @@ ConvertFunctionType = Callable[[object], object]
91
79
  @dataclasses.dataclass(frozen=True)
92
80
  class Field:
93
81
  name: str
94
- type: Type[object]
82
+ type: type[object]
95
83
  has_default: bool
96
84
  stream_function: StreamFunctionType
97
85
  parse_function: ParseFunctionType
@@ -99,10 +87,10 @@ class Field:
99
87
  post_init_function: ConvertFunctionType
100
88
 
101
89
 
102
- StreamableFields = Tuple[Field, ...]
90
+ StreamableFields = tuple[Field, ...]
103
91
 
104
92
 
105
- def create_fields(cls: Type[DataclassInstance]) -> StreamableFields:
93
+ def create_fields(cls: type[DataclassInstance]) -> StreamableFields:
106
94
  hints = get_type_hints(cls)
107
95
  fields = []
108
96
  for field in dataclasses.fields(cls):
@@ -124,7 +112,7 @@ def create_fields(cls: Type[DataclassInstance]) -> StreamableFields:
124
112
 
125
113
 
126
114
  def is_type_List(f_type: object) -> bool:
127
- return get_origin(f_type) == list or f_type == list
115
+ return get_origin(f_type) is list or f_type is list
128
116
 
129
117
 
130
118
  def is_type_SpecificOptional(f_type: object) -> bool:
@@ -135,7 +123,7 @@ def is_type_SpecificOptional(f_type: object) -> bool:
135
123
 
136
124
 
137
125
  def is_type_Tuple(f_type: object) -> bool:
138
- return get_origin(f_type) == tuple or f_type == tuple
126
+ return get_origin(f_type) is tuple or f_type is tuple
139
127
 
140
128
 
141
129
  def convert_optional(convert_func: ConvertFunctionType, item: Any) -> Any:
@@ -144,7 +132,7 @@ def convert_optional(convert_func: ConvertFunctionType, item: Any) -> Any:
144
132
  return convert_func(item)
145
133
 
146
134
 
147
- def convert_tuple(convert_funcs: List[ConvertFunctionType], items: Collection[Any]) -> Tuple[Any, ...]:
135
+ def convert_tuple(convert_funcs: list[ConvertFunctionType], items: Collection[Any]) -> tuple[Any, ...]:
148
136
  if not isinstance(items, (list, tuple)):
149
137
  raise InvalidTypeError(tuple, type(items))
150
138
  if len(items) != len(convert_funcs):
@@ -152,7 +140,7 @@ def convert_tuple(convert_funcs: List[ConvertFunctionType], items: Collection[An
152
140
  return tuple(convert_func(item) for convert_func, item in zip(convert_funcs, items))
153
141
 
154
142
 
155
- def convert_list(convert_func: ConvertFunctionType, items: List[Any]) -> List[Any]:
143
+ def convert_list(convert_func: ConvertFunctionType, items: list[Any]) -> list[Any]:
156
144
  if not isinstance(items, list):
157
145
  raise InvalidTypeError(list, type(items))
158
146
  return [convert_func(item) for item in items]
@@ -167,7 +155,7 @@ def convert_hex_string(item: str) -> bytes:
167
155
  raise ConversionError(item, bytes, e) from e
168
156
 
169
157
 
170
- def convert_byte_type(f_type: Type[Any], item: Any) -> Any:
158
+ def convert_byte_type(f_type: type[Any], item: Any) -> Any:
171
159
  if isinstance(item, f_type):
172
160
  return item
173
161
  if not isinstance(item, bytes):
@@ -178,7 +166,7 @@ def convert_byte_type(f_type: Type[Any], item: Any) -> Any:
178
166
  raise ConversionError(item, f_type, e) from e
179
167
 
180
168
 
181
- def convert_primitive(f_type: Type[Any], item: Any) -> Any:
169
+ def convert_primitive(f_type: type[Any], item: Any) -> Any:
182
170
  if isinstance(item, f_type):
183
171
  return item
184
172
  try:
@@ -187,7 +175,7 @@ def convert_primitive(f_type: Type[Any], item: Any) -> Any:
187
175
  raise ConversionError(item, f_type, e) from e
188
176
 
189
177
 
190
- def streamable_from_dict(klass: Type[_T_Streamable], item: Any) -> _T_Streamable:
178
+ def streamable_from_dict(klass: type[_T_Streamable], item: Any) -> _T_Streamable:
191
179
  """
192
180
  Converts a dictionary based on a dataclass, into an instance of that dataclass.
193
181
  Recursively goes through lists, optionals, and dictionaries.
@@ -208,7 +196,7 @@ def streamable_from_dict(klass: Type[_T_Streamable], item: Any) -> _T_Streamable
208
196
 
209
197
 
210
198
  def function_to_convert_one_item(
211
- f_type: Type[Any], json_parser: Optional[Callable[[object], Streamable]] = None
199
+ f_type: type[Any], json_parser: Optional[Callable[[object], Streamable]] = None
212
200
  ) -> ConvertFunctionType:
213
201
  if is_type_SpecificOptional(f_type):
214
202
  convert_inner_func = function_to_convert_one_item(get_args(f_type)[0], json_parser)
@@ -228,7 +216,7 @@ def function_to_convert_one_item(
228
216
  elif hasattr(f_type, "from_json_dict"):
229
217
  if json_parser is None:
230
218
  json_parser = f_type.from_json_dict
231
- return lambda item: json_parser(item)
219
+ return json_parser
232
220
  elif issubclass(f_type, bytes):
233
221
  # Type is bytes, data is a hex string or bytes
234
222
  return lambda item: convert_byte_type(f_type, item)
@@ -237,7 +225,7 @@ def function_to_convert_one_item(
237
225
  return lambda item: convert_primitive(f_type, item)
238
226
 
239
227
 
240
- def post_init_process_item(f_type: Type[Any], item: Any) -> object:
228
+ def post_init_process_item(f_type: type[Any], item: Any) -> object:
241
229
  if not isinstance(item, f_type):
242
230
  try:
243
231
  item = f_type(item)
@@ -255,7 +243,7 @@ def post_init_process_item(f_type: Type[Any], item: Any) -> object:
255
243
  return item
256
244
 
257
245
 
258
- def function_to_post_init_process_one_item(f_type: Type[object]) -> ConvertFunctionType:
246
+ def function_to_post_init_process_one_item(f_type: type[object]) -> ConvertFunctionType:
259
247
  if is_type_SpecificOptional(f_type):
260
248
  process_inner_func = function_to_post_init_process_one_item(get_args(f_type)[0])
261
249
  return lambda item: convert_optional(process_inner_func, item)
@@ -309,7 +297,7 @@ def recurse_jsonify(
309
297
  elif d is None or type(d) is str:
310
298
  return d
311
299
  elif hasattr(d, "to_json_dict"):
312
- ret: Union[List[Any], Dict[str, Any], str, None, int] = d.to_json_dict()
300
+ ret: Union[list[Any], dict[str, Any], str, int, None] = d.to_json_dict()
313
301
  return ret
314
302
  raise UnsupportedType(f"failed to jsonify {d} (type: {type(d)})")
315
303
 
@@ -346,7 +334,7 @@ def parse_optional(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> Option
346
334
  raise ValueError("Optional must be 0 or 1")
347
335
 
348
336
 
349
- def parse_rust(f: BinaryIO, f_type: Type[Any]) -> Any:
337
+ def parse_rust(f: BinaryIO, f_type: type[Any]) -> Any:
350
338
  assert isinstance(f, io.BytesIO)
351
339
  buf = f.getbuffer()
352
340
  ret, advance = f_type.parse_rust(buf[f.tell() :])
@@ -361,8 +349,8 @@ def parse_bytes(f: BinaryIO) -> bytes:
361
349
  return bytes_read
362
350
 
363
351
 
364
- def parse_list(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> List[object]:
365
- full_list: List[object] = []
352
+ def parse_list(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> list[object]:
353
+ full_list: list[object] = []
366
354
  # wjb assert inner_type != get_args(List)[0]
367
355
  list_size = parse_uint32(f)
368
356
  for list_index in range(list_size):
@@ -370,8 +358,8 @@ def parse_list(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> List[objec
370
358
  return full_list
371
359
 
372
360
 
373
- def parse_tuple(f: BinaryIO, list_parse_inner_type_f: List[ParseFunctionType]) -> Tuple[object, ...]:
374
- full_list: List[object] = []
361
+ def parse_tuple(f: BinaryIO, list_parse_inner_type_f: list[ParseFunctionType]) -> tuple[object, ...]:
362
+ full_list: list[object] = []
375
363
  for parse_f in list_parse_inner_type_f:
376
364
  full_list.append(parse_f(f))
377
365
  return tuple(full_list)
@@ -384,12 +372,12 @@ def parse_str(f: BinaryIO) -> str:
384
372
  return bytes.decode(str_read_bytes, "utf-8")
385
373
 
386
374
 
387
- def function_to_parse_one_item(f_type: Type[Any]) -> ParseFunctionType:
375
+ def function_to_parse_one_item(f_type: type[Any]) -> ParseFunctionType:
388
376
  """
389
377
  This function returns a function taking one argument `f: BinaryIO` that parses
390
378
  and returns a value of the given type.
391
379
  """
392
- inner_type: Type[Any]
380
+ inner_type: type[Any]
393
381
  if f_type is bool:
394
382
  return parse_bool
395
383
  if is_type_SpecificOptional(f_type):
@@ -401,7 +389,7 @@ def function_to_parse_one_item(f_type: Type[Any]) -> ParseFunctionType:
401
389
  if hasattr(f_type, "parse"):
402
390
  # Ignoring for now as the proper solution isn't obvious
403
391
  return f_type.parse # type: ignore[no-any-return]
404
- if f_type == bytes:
392
+ if f_type is bytes:
405
393
  return parse_bytes
406
394
  if is_type_List(f_type):
407
395
  inner_type = get_args(f_type)[0]
@@ -435,7 +423,7 @@ def stream_list(stream_inner_type_func: StreamFunctionType, item: Any, f: Binary
435
423
  stream_inner_type_func(element, f)
436
424
 
437
425
 
438
- def stream_tuple(stream_inner_type_funcs: List[StreamFunctionType], item: Any, f: BinaryIO) -> None:
426
+ def stream_tuple(stream_inner_type_funcs: list[StreamFunctionType], item: Any, f: BinaryIO) -> None:
439
427
  assert len(stream_inner_type_funcs) == len(item)
440
428
  for i in range(len(item)):
441
429
  stream_inner_type_funcs[i](item[i], f)
@@ -459,13 +447,13 @@ def stream_byte_convertible(item: object, f: BinaryIO) -> None:
459
447
  f.write(getattr(item, "__bytes__")())
460
448
 
461
449
 
462
- def function_to_stream_one_item(f_type: Type[Any]) -> StreamFunctionType:
463
- inner_type: Type[Any]
450
+ def function_to_stream_one_item(f_type: type[Any]) -> StreamFunctionType:
451
+ inner_type: type[Any]
464
452
  if is_type_SpecificOptional(f_type):
465
453
  inner_type = get_args(f_type)[0]
466
454
  stream_inner_type_func = function_to_stream_one_item(inner_type)
467
455
  return lambda item, f: stream_optional(stream_inner_type_func, item, f)
468
- elif f_type == bytes:
456
+ elif f_type is bytes:
469
457
  return stream_bytes
470
458
  elif hasattr(f_type, "stream"):
471
459
  return stream_streamable
@@ -489,7 +477,7 @@ def function_to_stream_one_item(f_type: Type[Any]) -> StreamFunctionType:
489
477
  raise UnsupportedType(f"can't stream {f_type}")
490
478
 
491
479
 
492
- def streamable(cls: Type[_T_Streamable]) -> Type[_T_Streamable]:
480
+ def streamable(cls: type[_T_Streamable]) -> type[_T_Streamable]:
493
481
  """
494
482
  This decorator forces correct streamable protocol syntax/usage and populates the caches for types hints and
495
483
  (de)serialization methods for all members of the class. The correct usage is:
@@ -528,7 +516,7 @@ def streamable(cls: Type[_T_Streamable]) -> Type[_T_Streamable]:
528
516
  class Streamable:
529
517
  """
530
518
  This class defines a simple serialization format, and adds methods to parse from/to bytes and json. It also
531
- validates and parses all fields at construction in ´__post_init__` to make sure all fields have the correct type
519
+ validates and parses all fields at construction in `__post_init__` to make sure all fields have the correct type
532
520
  and can be streamed/parsed properly.
533
521
 
534
522
  The available primitives are:
@@ -542,8 +530,8 @@ class Streamable:
542
530
 
543
531
  An item is one of:
544
532
  * primitive
545
- * Tuple[item1, .. itemx]
546
- * List[item1, .. itemx]
533
+ * tuple[item1, .. itemx]
534
+ * list[item1, .. itemx]
547
535
  * Optional[item]
548
536
  * Custom item
549
537
 
@@ -587,7 +575,7 @@ class Streamable:
587
575
  raise
588
576
 
589
577
  @classmethod
590
- def parse(cls: Type[_T_Streamable], f: BinaryIO) -> _T_Streamable:
578
+ def parse(cls: type[_T_Streamable], f: BinaryIO) -> _T_Streamable:
591
579
  # Create the object without calling __init__() to avoid unnecessary post-init checks in strictdataclass
592
580
  obj: _T_Streamable = object.__new__(cls)
593
581
  for field in cls._streamable_fields:
@@ -602,7 +590,7 @@ class Streamable:
602
590
  return std_hash(bytes(self), skip_bytes_conversion=True)
603
591
 
604
592
  @classmethod
605
- def from_bytes(cls: Type[_T_Streamable], blob: bytes) -> _T_Streamable:
593
+ def from_bytes(cls: type[_T_Streamable], blob: bytes) -> _T_Streamable:
606
594
  f = io.BytesIO(blob)
607
595
  parsed = cls.parse(f)
608
596
  assert f.read() == b""
@@ -624,12 +612,12 @@ class Streamable:
624
612
  def __repr__(self: Any) -> str:
625
613
  return pp.pformat(recurse_jsonify(self))
626
614
 
627
- def to_json_dict(self) -> Dict[str, Any]:
628
- ret: Dict[str, Any] = recurse_jsonify(self)
615
+ def to_json_dict(self) -> dict[str, Any]:
616
+ ret: dict[str, Any] = recurse_jsonify(self)
629
617
  return ret
630
618
 
631
619
  @classmethod
632
- def from_json_dict(cls: Type[_T_Streamable], json_dict: Dict[str, Any]) -> _T_Streamable:
620
+ def from_json_dict(cls: type[_T_Streamable], json_dict: dict[str, Any]) -> _T_Streamable:
633
621
  return streamable_from_dict(cls, json_dict)
634
622
 
635
623
 
@@ -0,0 +1,59 @@
1
+ # TODO: this should not exist, it is a bad task group that doesn't require
2
+ # any responsibility of the requestor.
3
+
4
+ from __future__ import annotations
5
+
6
+ import asyncio
7
+ import dataclasses
8
+ import logging
9
+ import typing
10
+
11
+ T = typing.TypeVar("T")
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ @dataclasses.dataclass(frozen=True)
17
+ class _TaskInfo:
18
+ task: asyncio.Task[object]
19
+ # retained for potential debugging use
20
+ known_unreferenced: bool
21
+
22
+ def __str__(self) -> str:
23
+ return self.task.get_name()
24
+
25
+
26
+ @dataclasses.dataclass
27
+ class _TaskReferencer:
28
+ """Holds strong references to tasks until they are done. This compensates for
29
+ asyncio holding only weak references. This should be replaced by patterns using
30
+ task groups such as from anyio.
31
+ """
32
+
33
+ tasks: dict[asyncio.Task[object], _TaskInfo] = dataclasses.field(default_factory=dict)
34
+
35
+ def create_task(
36
+ self,
37
+ coroutine: typing.Coroutine[object, object, T],
38
+ *,
39
+ name: typing.Optional[str] = None,
40
+ known_unreferenced: bool = False,
41
+ ) -> asyncio.Task[T]:
42
+ task = asyncio.create_task(coro=coroutine, name=name) # noqa: TID251
43
+ task.add_done_callback(self._task_done)
44
+
45
+ self.tasks[task] = _TaskInfo(task=task, known_unreferenced=known_unreferenced)
46
+
47
+ return task
48
+
49
+ def _task_done(self, task: asyncio.Task[object]) -> None:
50
+ # TODO: consider collecting results and logging errors
51
+ try:
52
+ del self.tasks[task]
53
+ except KeyError:
54
+ logger.warning("Task not found in task referencer: %s", task)
55
+
56
+
57
+ _global_task_referencer = _TaskReferencer()
58
+
59
+ create_referenced_task = _global_task_referencer.create_task
chia/util/task_timing.py CHANGED
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import asyncio
@@ -6,8 +8,9 @@ import inspect
6
8
  import os
7
9
  import sys
8
10
  import time
11
+ from collections.abc import Iterator
9
12
  from types import FrameType
10
- from typing import Any, Dict, Iterator, List
13
+ from typing import Any
11
14
 
12
15
  # This is a development utility that instruments tasks (coroutines) and records
13
16
  # wall-clock time they spend in various functions. Since it relies on
@@ -15,7 +18,12 @@ from typing import Any, Dict, Iterator, List
15
18
 
16
19
  # to enable this instrumentation, set one of the environment variables:
17
20
 
18
- # CHIA_INSTRUMENT_NODE=1
21
+ # CHIA_INSTRUMENT_DATA_LAYER=1
22
+ # CHIA_INSTRUMENT_FARMER=1
23
+ # CHIA_INSTRUMENT_FULL_NODE=1
24
+ # CHIA_INSTRUMENT_HARVESTER=1
25
+ # CHIA_INSTRUMENT_INTRODUCER=1
26
+ # CHIA_INSTRUMENT_TIMELORD=1
19
27
  # CHIA_INSTRUMENT_WALLET=1
20
28
 
21
29
  # Before starting the daemon.
@@ -49,7 +57,7 @@ class CallInfo:
49
57
 
50
58
 
51
59
  class TaskInfo:
52
- stack: Dict[FrameType, FrameInfo]
60
+ stack: dict[FrameType, FrameInfo]
53
61
  stack_pos: int
54
62
 
55
63
  def __init__(self) -> None:
@@ -65,7 +73,7 @@ class FunctionInfo:
65
73
  file: str
66
74
  num_calls: int
67
75
  duration: float
68
- callers: Dict[str, CallInfo]
76
+ callers: dict[str, CallInfo]
69
77
  fun_id: int
70
78
 
71
79
  def __init__(self, name: str, file: str) -> None:
@@ -81,9 +89,9 @@ class FunctionInfo:
81
89
 
82
90
 
83
91
  # maps tasks to call-treea
84
- g_function_infos: Dict[str, Dict[str, FunctionInfo]] = {}
92
+ g_function_infos: dict[str, dict[str, FunctionInfo]] = {}
85
93
 
86
- g_tasks: Dict[asyncio.Task[Any], TaskInfo] = {}
94
+ g_tasks: dict[asyncio.Task[Any], TaskInfo] = {}
87
95
 
88
96
  g_cwd = os.getcwd() + "/"
89
97
 
@@ -125,7 +133,7 @@ g_cwd = os.getcwd() + "/"
125
133
  def get_stack(frame: FrameType) -> str:
126
134
  ret = ""
127
135
  code = frame.f_code
128
- while code.co_flags & inspect.CO_COROUTINE: # pylint: disable=no-member
136
+ while code.co_flags & inspect.CO_COROUTINE:
129
137
  ret = f"/{code.co_name}{ret}"
130
138
  if frame.f_back is None:
131
139
  break
@@ -155,11 +163,11 @@ def get_file(frame: FrameType) -> str:
155
163
 
156
164
 
157
165
  def trace_fun(frame: FrameType, event: str, arg: Any) -> None:
158
- if event in ["c_call", "c_return", "c_exception"]:
166
+ if event in {"c_call", "c_return", "c_exception"}:
159
167
  return
160
168
 
161
169
  # we only care about instrumenting co-routines
162
- if (frame.f_code.co_flags & inspect.CO_COROUTINE) == 0: # pylint: disable=no-member
170
+ if (frame.f_code.co_flags & inspect.CO_COROUTINE) == 0:
163
171
  # with open("instrumentation.log", "a") as f:
164
172
  # f.write(f"[1] {event} {get_fun(frame)}\n")
165
173
  return
@@ -168,9 +176,6 @@ def trace_fun(frame: FrameType, event: str, arg: Any) -> None:
168
176
  if task is None:
169
177
  return
170
178
 
171
- global g_tasks
172
- global g_function_infos
173
-
174
179
  ti = g_tasks.get(task)
175
180
  if ti is None:
176
181
  ti = TaskInfo()
@@ -245,7 +250,7 @@ def start_task_instrumentation() -> None:
245
250
 
246
251
  def color(pct: float) -> str:
247
252
  assert pct >= 0 and pct <= 100
248
- return f"{int((100.-pct)//10)+1}"
253
+ return f"{int((100. - pct) // 10) + 1}"
249
254
 
250
255
 
251
256
  def fontcolor(pct: float) -> str:
@@ -257,7 +262,6 @@ def fontcolor(pct: float) -> str:
257
262
 
258
263
  def stop_task_instrumentation(target_dir: str = f"task-profile-{os.getpid()}") -> None:
259
264
  sys.setprofile(None)
260
- global g_function_infos
261
265
 
262
266
  try:
263
267
  os.mkdir(target_dir)
@@ -297,7 +301,7 @@ def stop_task_instrumentation(target_dir: str = f"task-profile-{os.getpid()}") -
297
301
  f'frame_{fun_info.fun_id} [shape=box, label="{fun_info.name}()\\l'
298
302
  f"{fun_info.file}\\l"
299
303
  f"{percent:0.2f}%\\n"
300
- f"{fun_info.duration*1000:0.2f}ms\\n"
304
+ f"{fun_info.duration * 1000:0.2f}ms\\n"
301
305
  f'{fun_info.num_calls}x\\n",'
302
306
  f"fillcolor={color(percent)}, "
303
307
  f"color={color(percent)}, "
@@ -324,7 +328,7 @@ def stop_task_instrumentation(target_dir: str = f"task-profile-{os.getpid()}") -
324
328
  f.write(
325
329
  f"frame_{caller_info.fun_id} -> frame_{fun_info.fun_id} "
326
330
  f'[label="{percent:0.2f}%\\n{ci.calls}x",'
327
- f"penwidth={0.3+(ci.duration*6/total_duration):0.2f},"
331
+ f"penwidth={0.3 + (ci.duration * 6 / total_duration):0.2f},"
328
332
  f"color={color(percent)}]\n"
329
333
  )
330
334
  f.write("}\n")
@@ -348,13 +352,13 @@ def maybe_manage_task_instrumentation(enable: bool) -> Iterator[None]:
348
352
  yield
349
353
 
350
354
 
351
- def main(args: List[str]) -> int:
355
+ def main(args: list[str]) -> int:
352
356
  import glob
353
357
  import pathlib
354
358
  import subprocess
355
359
 
356
360
  profile_dir = pathlib.Path(args[0])
357
- queue: List[subprocess.Popen[bytes]] = []
361
+ queue: list[subprocess.Popen[bytes]] = []
358
362
  for file in glob.glob(str(profile_dir / "*.dot")):
359
363
  print(file)
360
364
  if os.path.exists(file + ".png"):
chia/util/timing.py CHANGED
@@ -1,9 +1,12 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
3
5
  import os
4
6
  import sys
5
7
  import time
6
- from typing import Callable, Iterator, Optional, overload
8
+ from collections.abc import Iterator
9
+ from typing import Callable, Optional, overload
7
10
 
8
11
  system_delays = {
9
12
  # based on data from https://github.com/Chia-Network/chia-blockchain/pull/13724
chia/util/vdf_prover.py CHANGED
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Tuple
4
-
5
3
  from chiavdf import prove
6
4
 
7
5
  from chia.consensus.constants import ConsensusConstants
@@ -17,13 +15,14 @@ def get_vdf_info_and_proof(
17
15
  challenge_hash: bytes32,
18
16
  number_iters: uint64,
19
17
  normalized_to_identity: bool = False,
20
- ) -> Tuple[VDFInfo, VDFProof]:
18
+ ) -> tuple[VDFInfo, VDFProof]:
21
19
  form_size = ClassgroupElement.get_size()
22
20
  result: bytes = prove(
23
21
  bytes(challenge_hash),
24
22
  vdf_input.data,
25
23
  constants.DISCRIMINANT_SIZE_BITS,
26
24
  number_iters,
25
+ "",
27
26
  )
28
27
 
29
28
  output = ClassgroupElement.create(result[:form_size])