chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/_tests/util/rpc.py CHANGED
@@ -18,6 +18,9 @@ async def validate_get_routes(client: RpcClient, api: RpcApiProtocol) -> None:
18
18
  "/get_routes",
19
19
  "/get_version",
20
20
  "/healthz",
21
+ "/get_log_level",
22
+ "/set_log_level",
23
+ "/reset_log_level",
21
24
  ]
22
25
  assert len(routes_api) > 0
23
26
  assert sorted(routes_client) == sorted(routes_api + routes_server)
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import json
4
4
  from dataclasses import dataclass
5
5
  from pathlib import Path
6
- from typing import Any, Dict, List, Tuple
6
+ from typing import Any
7
7
 
8
8
  from chia_rs import Coin
9
9
 
@@ -27,7 +27,7 @@ DESERIALIZE_MOD = load_serialized_clvm_maybe_recompile(
27
27
  class NPC:
28
28
  coin_name: bytes32
29
29
  puzzle_hash: bytes32
30
- conditions: List[Tuple[ConditionOpcode, List[ConditionWithArgs]]]
30
+ conditions: list[tuple[ConditionOpcode, list[ConditionWithArgs]]]
31
31
 
32
32
 
33
33
  @dataclass
@@ -36,23 +36,23 @@ class CAT:
36
36
  memo: str
37
37
  npc: NPC
38
38
 
39
- def cat_to_dict(self) -> Dict[str, Any]:
39
+ def cat_to_dict(self) -> dict[str, Any]:
40
40
  return {"asset_id": self.asset_id, "memo": self.memo, "npc": npc_to_dict(self.npc)}
41
41
 
42
42
 
43
- def condition_with_args_to_dict(condition_with_args: ConditionWithArgs) -> Dict[str, Any]:
43
+ def condition_with_args_to_dict(condition_with_args: ConditionWithArgs) -> dict[str, Any]:
44
44
  return {
45
45
  "condition_opcode": condition_with_args.opcode.name,
46
46
  "arguments": [arg.hex() for arg in condition_with_args.vars],
47
47
  }
48
48
 
49
49
 
50
- def condition_list_to_dict(condition_list: Tuple[ConditionOpcode, List[ConditionWithArgs]]) -> List[Dict[str, Any]]:
50
+ def condition_list_to_dict(condition_list: tuple[ConditionOpcode, list[ConditionWithArgs]]) -> list[dict[str, Any]]:
51
51
  assert all([condition_list[0] == cwa.opcode for cwa in condition_list[1]])
52
52
  return [condition_with_args_to_dict(cwa) for cwa in condition_list[1]]
53
53
 
54
54
 
55
- def npc_to_dict(npc: NPC) -> Dict[str, Any]:
55
+ def npc_to_dict(npc: NPC) -> dict[str, Any]:
56
56
  return {
57
57
  "coin_name": npc.coin_name.hex(),
58
58
  "conditions": [{"condition_type": c[0].name, "conditions": condition_list_to_dict(c)} for c in npc.conditions],
@@ -60,13 +60,13 @@ def npc_to_dict(npc: NPC) -> Dict[str, Any]:
60
60
  }
61
61
 
62
62
 
63
- def run_generator(block_generator: BlockGenerator, constants: ConsensusConstants, max_cost: int) -> List[CAT]:
63
+ def run_generator(block_generator: BlockGenerator, constants: ConsensusConstants, max_cost: int) -> list[CAT]:
64
64
  block_args = block_generator.generator_refs
65
- cost, block_result = block_generator.program.run_with_cost(max_cost, [DESERIALIZE_MOD, block_args])
65
+ _cost, block_result = block_generator.program.run_with_cost(max_cost, [DESERIALIZE_MOD, block_args])
66
66
 
67
67
  coin_spends = block_result.first()
68
68
 
69
- cat_list: List[CAT] = []
69
+ cat_list: list[CAT] = []
70
70
  for spend in coin_spends.as_iter():
71
71
  parent, puzzle, amount, solution = spend.as_iter()
72
72
  args = match_cat_puzzle(uncurry_puzzle(puzzle))
@@ -79,7 +79,7 @@ def run_generator(block_generator: BlockGenerator, constants: ConsensusConstants
79
79
 
80
80
  puzzle_result = puzzle.run(solution)
81
81
 
82
- conds: Dict[ConditionOpcode, List[ConditionWithArgs]] = {}
82
+ conds: dict[ConditionOpcode, list[ConditionWithArgs]] = {}
83
83
 
84
84
  for condition in puzzle_result.as_python():
85
85
  op = ConditionOpcode(condition[0])
@@ -126,7 +126,7 @@ def run_generator(block_generator: BlockGenerator, constants: ConsensusConstants
126
126
  return cat_list
127
127
 
128
128
 
129
- def ref_list_to_args(ref_list: List[uint32], root_path: Path) -> List[bytes]:
129
+ def ref_list_to_args(ref_list: list[uint32], root_path: Path) -> list[bytes]:
130
130
  args = []
131
131
  for height in ref_list:
132
132
  with open(root_path / f"{height}.json", "rb") as f:
@@ -139,10 +139,10 @@ def ref_list_to_args(ref_list: List[uint32], root_path: Path) -> List[bytes]:
139
139
 
140
140
  def run_generator_with_args(
141
141
  generator_program_hex: str,
142
- generator_args: List[bytes],
142
+ generator_args: list[bytes],
143
143
  constants: ConsensusConstants,
144
144
  cost: uint64,
145
- ) -> List[CAT]:
145
+ ) -> list[CAT]:
146
146
  if not generator_program_hex:
147
147
  return []
148
148
  generator_program = SerializedProgram.fromhex(generator_program_hex)
@@ -150,11 +150,11 @@ def run_generator_with_args(
150
150
  return run_generator(block_generator, constants, min(constants.MAX_BLOCK_COST_CLVM, cost))
151
151
 
152
152
 
153
- def run_json_block(full_block: Dict[str, Any], parent: Path, constants: ConsensusConstants) -> List[CAT]:
153
+ def run_json_block(full_block: dict[str, Any], parent: Path, constants: ConsensusConstants) -> list[CAT]:
154
154
  ref_list = full_block["block"]["transactions_generator_ref_list"]
155
- tx_info: Dict[str, Any] = full_block["block"]["transactions_info"]
155
+ tx_info: dict[str, Any] = full_block["block"]["transactions_info"]
156
156
  generator_program_hex: str = full_block["block"]["transactions_generator"]
157
- cat_list: List[CAT] = []
157
+ cat_list: list[CAT] = []
158
158
  if tx_info and generator_program_hex:
159
159
  cost = tx_info["cost"]
160
160
  args = ref_list_to_args(ref_list, parent)
@@ -3,10 +3,11 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  import contextlib
5
5
  import logging
6
+ from collections.abc import AsyncIterator
6
7
  from contextlib import AsyncExitStack, ExitStack, asynccontextmanager
7
8
  from dataclasses import dataclass
8
9
  from pathlib import Path
9
- from typing import AsyncIterator, Dict, List, Optional, Tuple, Union
10
+ from typing import Optional, Union
10
11
 
11
12
  import anyio
12
13
 
@@ -46,8 +47,8 @@ from chia.util.keychain import Keychain
46
47
  from chia.util.timing import adjusted_timeout, backoff_times
47
48
  from chia.wallet.wallet_node import WalletNode
48
49
 
49
- OldSimulatorsAndWallets = Tuple[List[FullNodeSimulator], List[Tuple[WalletNode, ChiaServer]], BlockTools]
50
- SimulatorsAndWalletsServices = Tuple[List[SimulatorFullNodeService], List[WalletService], BlockTools]
50
+ OldSimulatorsAndWallets = tuple[list[FullNodeSimulator], list[tuple[WalletNode, ChiaServer]], BlockTools]
51
+ SimulatorsAndWalletsServices = tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools]
51
52
 
52
53
 
53
54
  @dataclass(frozen=True)
@@ -64,8 +65,8 @@ class FullSystem:
64
65
 
65
66
  @dataclass
66
67
  class SimulatorsAndWallets:
67
- simulators: List[FullNodeEnvironment]
68
- wallets: List[WalletEnvironment]
68
+ simulators: list[FullNodeEnvironment]
69
+ wallets: list[WalletEnvironment]
69
70
  bt: BlockTools
70
71
 
71
72
 
@@ -79,12 +80,12 @@ log = logging.getLogger(__name__)
79
80
  @asynccontextmanager
80
81
  async def setup_two_nodes(
81
82
  consensus_constants: ConsensusConstants, db_version: int, self_hostname: str
82
- ) -> AsyncIterator[Tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]]:
83
+ ) -> AsyncIterator[tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]]:
83
84
  """
84
85
  Setup and teardown of two full nodes, with blockchains and separate DBs.
85
86
  """
86
87
 
87
- config_overrides = {"full_node.max_sync_wait": 0}
88
+ config_overrides = {"full_node.max_sync_wait": 0, "full_node.log_coins": True}
88
89
  with TempKeyring(populate=True) as keychain1, TempKeyring(populate=True) as keychain2:
89
90
  bt1 = await create_block_tools_async(
90
91
  constants=consensus_constants, keychain=keychain1, config_overrides=config_overrides
@@ -116,11 +117,11 @@ async def setup_two_nodes(
116
117
  @asynccontextmanager
117
118
  async def setup_n_nodes(
118
119
  consensus_constants: ConsensusConstants, n: int, db_version: int, self_hostname: str
119
- ) -> AsyncIterator[List[FullNodeAPI]]:
120
+ ) -> AsyncIterator[list[FullNodeAPI]]:
120
121
  """
121
122
  Setup and teardown of n full nodes, with blockchains and separate DBs.
122
123
  """
123
- config_overrides = {"full_node.max_sync_wait": 0}
124
+ config_overrides = {"full_node.max_sync_wait": 0, "full_node.log_coins": True}
124
125
  with ExitStack() as stack:
125
126
  keychains = [stack.enter_context(TempKeyring(populate=True)) for _ in range(n)]
126
127
  async with AsyncExitStack() as async_exit_stack:
@@ -154,8 +155,8 @@ async def setup_simulators_and_wallets(
154
155
  key_seed: Optional[bytes32] = None,
155
156
  initial_num_public_keys: int = 5,
156
157
  db_version: int = 2,
157
- config_overrides: Optional[Dict[str, int]] = None,
158
- disable_capabilities: Optional[List[Capability]] = None,
158
+ config_overrides: Optional[dict[str, int]] = None,
159
+ disable_capabilities: Optional[list[Capability]] = None,
159
160
  ) -> AsyncIterator[SimulatorsAndWallets]:
160
161
  with TempKeyring(populate=True) as keychain1, TempKeyring(populate=True) as keychain2:
161
162
  if config_overrides is None:
@@ -175,7 +176,7 @@ async def setup_simulators_and_wallets(
175
176
  disable_capabilities,
176
177
  ) as (bt_tools, simulators, wallets_services):
177
178
  async with contextlib.AsyncExitStack() as exit_stack:
178
- wallets: List[WalletEnvironment] = []
179
+ wallets: list[WalletEnvironment] = []
179
180
  for service in wallets_services:
180
181
  assert service.rpc_server is not None
181
182
 
@@ -207,9 +208,9 @@ async def setup_simulators_and_wallets_service(
207
208
  key_seed: Optional[bytes32] = None,
208
209
  initial_num_public_keys: int = 5,
209
210
  db_version: int = 2,
210
- config_overrides: Optional[Dict[str, int]] = None,
211
- disable_capabilities: Optional[List[Capability]] = None,
212
- ) -> AsyncIterator[Tuple[List[SimulatorFullNodeService], List[WalletService], BlockTools]]:
211
+ config_overrides: Optional[dict[str, int]] = None,
212
+ disable_capabilities: Optional[list[Capability]] = None,
213
+ ) -> AsyncIterator[tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools]]:
213
214
  with TempKeyring(populate=True) as keychain1, TempKeyring(populate=True) as keychain2:
214
215
  async with setup_simulators_and_wallets_inner(
215
216
  db_version,
@@ -240,13 +241,14 @@ async def setup_simulators_and_wallets_inner(
240
241
  spam_filter_after_n_txs: int,
241
242
  wallet_count: int,
242
243
  xch_spam_amount: int,
243
- config_overrides: Optional[Dict[str, int]],
244
- disable_capabilities: Optional[List[Capability]],
245
- ) -> AsyncIterator[Tuple[List[BlockTools], List[SimulatorFullNodeService], List[WalletService]]]:
244
+ config_overrides: Optional[dict[str, int]],
245
+ disable_capabilities: Optional[list[Capability]],
246
+ ) -> AsyncIterator[tuple[list[BlockTools], list[SimulatorFullNodeService], list[WalletService]]]:
246
247
  if config_overrides is not None and "full_node.max_sync_wait" not in config_overrides:
247
248
  config_overrides["full_node.max_sync_wait"] = 0
249
+ config_overrides["full_node.log_coins"] = True
248
250
  async with AsyncExitStack() as async_exit_stack:
249
- bt_tools: List[BlockTools] = [
251
+ bt_tools: list[BlockTools] = [
250
252
  await create_block_tools_async(consensus_constants, keychain=keychain1, config_overrides=config_overrides)
251
253
  for _ in range(0, simulator_count)
252
254
  ]
@@ -258,7 +260,7 @@ async def setup_simulators_and_wallets_inner(
258
260
  )
259
261
  )
260
262
 
261
- simulators: List[SimulatorFullNodeService] = [
263
+ simulators: list[SimulatorFullNodeService] = [
262
264
  await async_exit_stack.enter_async_context(
263
265
  # Passing simulator=True gets us this type guaranteed
264
266
  setup_full_node( # type: ignore[arg-type]
@@ -274,7 +276,7 @@ async def setup_simulators_and_wallets_inner(
274
276
  for index in range(0, simulator_count)
275
277
  ]
276
278
 
277
- wallets: List[WalletService] = [
279
+ wallets: list[WalletService] = [
278
280
  await async_exit_stack.enter_async_context(
279
281
  setup_wallet_node(
280
282
  bt_tools[index].config["self_hostname"],
@@ -301,7 +303,7 @@ async def setup_farmer_multi_harvester(
301
303
  consensus_constants: ConsensusConstants,
302
304
  *,
303
305
  start_services: bool,
304
- ) -> AsyncIterator[Tuple[List[HarvesterService], FarmerService, BlockTools]]:
306
+ ) -> AsyncIterator[tuple[list[HarvesterService], FarmerService, BlockTools]]:
305
307
  async with AsyncExitStack() as async_exit_stack:
306
308
  farmer_service = await async_exit_stack.enter_async_context(
307
309
  setup_farmer(
@@ -359,7 +361,7 @@ async def setup_full_system_inner(
359
361
  keychain2: Keychain,
360
362
  shared_b_tools: BlockTools,
361
363
  ) -> AsyncIterator[FullSystem]:
362
- config_overrides = {"full_node.max_sync_wait": 0}
364
+ config_overrides = {"full_node.max_sync_wait": 0, "full_node.log_coins": True}
363
365
  if b_tools is None:
364
366
  b_tools = await create_block_tools_async(
365
367
  constants=consensus_constants, keychain=keychain1, config_overrides=config_overrides
@@ -3,23 +3,24 @@ from __future__ import annotations
3
3
  import contextlib
4
4
  import json
5
5
  import random
6
+ from collections.abc import AsyncIterator
6
7
  from contextlib import asynccontextmanager
7
8
  from dataclasses import dataclass
8
9
  from pathlib import Path
9
- from typing import Any, AsyncIterator, Callable, Dict, List, Optional, Tuple, Type, TypeVar
10
+ from typing import Any, Callable, Optional, TypeVar
10
11
 
11
12
  import anyio
13
+ from chia_rs import DONT_VALIDATE_SIGNATURE, G2Element, get_flags_for_height_and_constants, run_block_generator2
12
14
 
13
15
  from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
14
16
  from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
15
17
  from chia.consensus.constants import ConsensusConstants
16
- from chia.consensus.cost_calculator import NPCResult
17
18
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
18
19
  from chia.full_node.bundle_tools import simple_solution_generator
19
20
  from chia.full_node.coin_store import CoinStore
20
21
  from chia.full_node.hint_store import HintStore
21
22
  from chia.full_node.mempool import Mempool
22
- from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions, get_puzzle_and_solution_for_coin
23
+ from chia.full_node.mempool_check_conditions import get_puzzle_and_solution_for_coin
23
24
  from chia.full_node.mempool_manager import MempoolManager
24
25
  from chia.types.blockchain_format.coin import Coin
25
26
  from chia.types.blockchain_format.program import INFINITE_COST
@@ -51,7 +52,7 @@ and is designed so that you could test with it and then swap in a real rpc clien
51
52
  @asynccontextmanager
52
53
  async def sim_and_client(
53
54
  db_path: Optional[Path] = None, defaults: ConsensusConstants = DEFAULT_CONSTANTS, pass_prefarm: bool = True
54
- ) -> AsyncIterator[Tuple[SpendSim, SimClient]]:
55
+ ) -> AsyncIterator[tuple[SpendSim, SimClient]]:
55
56
  async with SpendSim.managed(db_path, defaults) as sim:
56
57
  client: SimClient = SimClient(sim)
57
58
  if pass_prefarm:
@@ -61,19 +62,22 @@ async def sim_and_client(
61
62
 
62
63
  class CostLogger:
63
64
  def __init__(self) -> None:
64
- self.cost_dict: Dict[str, int] = {}
65
- self.cost_dict_no_puzs: Dict[str, int] = {}
65
+ self.cost_dict: dict[str, int] = {}
66
+ self.cost_dict_no_puzs: dict[str, int] = {}
66
67
 
67
68
  def add_cost(self, descriptor: str, spend_bundle: T_SpendBundle) -> T_SpendBundle:
68
69
  program: BlockGenerator = simple_solution_generator(spend_bundle)
69
- npc_result: NPCResult = get_name_puzzle_conditions(
70
- program,
70
+ flags = get_flags_for_height_and_constants(DEFAULT_CONSTANTS.HARD_FORK_HEIGHT, DEFAULT_CONSTANTS)
71
+ _err, conds = run_block_generator2(
72
+ bytes(program.program),
73
+ [],
71
74
  INFINITE_COST,
72
- mempool_mode=True,
73
- height=DEFAULT_CONSTANTS.HARD_FORK_HEIGHT,
74
- constants=DEFAULT_CONSTANTS,
75
+ flags | DONT_VALIDATE_SIGNATURE,
76
+ G2Element(),
77
+ None,
78
+ DEFAULT_CONSTANTS,
75
79
  )
76
- cost = uint64(0 if npc_result.conds is None else npc_result.conds.cost)
80
+ cost = uint64(0 if conds is None else conds.cost)
77
81
  self.cost_dict[descriptor] = cost
78
82
  cost_to_subtract: int = 0
79
83
  for cs in spend_bundle.coin_spends:
@@ -102,7 +106,7 @@ _T_SimBlockRecord = TypeVar("_T_SimBlockRecord", bound="SimBlockRecord")
102
106
  @streamable
103
107
  @dataclass(frozen=True)
104
108
  class SimBlockRecord(Streamable):
105
- reward_claims_incorporated: List[Coin]
109
+ reward_claims_incorporated: list[Coin]
106
110
  height: uint32
107
111
  prev_transaction_block_height: uint32
108
112
  timestamp: uint64
@@ -111,7 +115,7 @@ class SimBlockRecord(Streamable):
111
115
  prev_transaction_block_hash: bytes32
112
116
 
113
117
  @classmethod
114
- def create(cls: Type[_T_SimBlockRecord], rci: List[Coin], height: uint32, timestamp: uint64) -> _T_SimBlockRecord:
118
+ def create(cls: type[_T_SimBlockRecord], rci: list[Coin], height: uint32, timestamp: uint64) -> _T_SimBlockRecord:
115
119
  prev_transaction_block_height = uint32(height - 1 if height > 0 else 0)
116
120
  return cls(
117
121
  rci,
@@ -129,8 +133,8 @@ class SimBlockRecord(Streamable):
129
133
  class SimStore(Streamable):
130
134
  timestamp: uint64
131
135
  block_height: uint32
132
- block_records: List[SimBlockRecord]
133
- blocks: List[SimFullBlock]
136
+ block_records: list[SimBlockRecord]
137
+ blocks: list[SimFullBlock]
134
138
 
135
139
 
136
140
  _T_SpendSim = TypeVar("_T_SpendSim", bound="SpendSim")
@@ -140,8 +144,8 @@ class SpendSim:
140
144
  db_wrapper: DBWrapper2
141
145
  coin_store: CoinStore
142
146
  mempool_manager: MempoolManager
143
- block_records: List[SimBlockRecord]
144
- blocks: List[SimFullBlock]
147
+ block_records: list[SimBlockRecord]
148
+ blocks: list[SimFullBlock]
145
149
  timestamp: uint64
146
150
  block_height: uint32
147
151
  defaults: ConsensusConstants
@@ -150,7 +154,7 @@ class SpendSim:
150
154
  @classmethod
151
155
  @contextlib.asynccontextmanager
152
156
  async def managed(
153
- cls: Type[_T_SpendSim], db_path: Optional[Path] = None, defaults: ConsensusConstants = DEFAULT_CONSTANTS
157
+ cls: type[_T_SpendSim], db_path: Optional[Path] = None, defaults: ConsensusConstants = DEFAULT_CONSTANTS
154
158
  ) -> AsyncIterator[_T_SpendSim]:
155
159
  self = cls()
156
160
  if db_path is None:
@@ -196,7 +200,7 @@ class SpendSim:
196
200
  )
197
201
  await c.close()
198
202
 
199
- async def new_peak(self, spent_coins_ids: Optional[List[bytes32]]) -> None:
203
+ async def new_peak(self, spent_coins_ids: Optional[list[bytes32]]) -> None:
200
204
  await self.mempool_manager.new_peak(self.block_records[-1], spent_coins_ids)
201
205
 
202
206
  def new_coin_record(self, coin: Coin, coinbase: bool = False) -> CoinRecord:
@@ -208,7 +212,7 @@ class SpendSim:
208
212
  self.timestamp,
209
213
  )
210
214
 
211
- async def all_non_reward_coins(self) -> List[Coin]:
215
+ async def all_non_reward_coins(self) -> list[Coin]:
212
216
  coins = set()
213
217
  async with self.db_wrapper.reader_no_transaction() as conn:
214
218
  cursor = await conn.execute(
@@ -231,7 +235,7 @@ class SpendSim:
231
235
  self,
232
236
  puzzle_hash: bytes32 = bytes32(b"0" * 32),
233
237
  item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
234
- ) -> Tuple[List[Coin], List[Coin]]:
238
+ ) -> tuple[list[Coin], list[Coin]]:
235
239
  # Fees get calculated
236
240
  fees = uint64(0)
237
241
  for item in self.mempool_manager.mempool.all_items():
@@ -257,8 +261,8 @@ class SpendSim:
257
261
 
258
262
  # Coin store gets updated
259
263
  generator_bundle: Optional[SpendBundle] = None
260
- return_additions: List[Coin] = []
261
- return_removals: List[Coin] = []
264
+ return_additions: list[Coin] = []
265
+ return_removals: list[Coin] = []
262
266
  spent_coins_ids = None
263
267
  if (len(self.block_records) > 0) and (self.mempool_manager.mempool.size() > 0):
264
268
  peak = self.mempool_manager.peak
@@ -274,7 +278,7 @@ class SpendSim:
274
278
  generator_bundle = bundle
275
279
  for spend in generator_bundle.coin_spends:
276
280
  hint_dict, _ = compute_spend_hints_and_additions(spend)
277
- hints: List[Tuple[bytes32, bytes]] = []
281
+ hints: list[tuple[bytes32, bytes]] = []
278
282
  hint_obj: HintedCoin
279
283
  for coin_name, hint_obj in hint_dict.items():
280
284
  if hint_obj.hint is not None:
@@ -334,7 +338,7 @@ class SimClient:
334
338
  def __init__(self, service: SpendSim) -> None:
335
339
  self.service = service
336
340
 
337
- async def push_tx(self, spend_bundle: SpendBundle) -> Tuple[MempoolInclusionStatus, Optional[Err]]:
341
+ async def push_tx(self, spend_bundle: SpendBundle) -> tuple[MempoolInclusionStatus, Optional[Err]]:
338
342
  try:
339
343
  spend_bundle_id = spend_bundle.name()
340
344
  sbc = await self.service.mempool_manager.pre_validate_spendbundle(spend_bundle, spend_bundle_id)
@@ -351,12 +355,12 @@ class SimClient:
351
355
 
352
356
  async def get_coin_records_by_names(
353
357
  self,
354
- names: List[bytes32],
358
+ names: list[bytes32],
355
359
  start_height: Optional[int] = None,
356
360
  end_height: Optional[int] = None,
357
361
  include_spent_coins: bool = False,
358
- ) -> List[CoinRecord]:
359
- kwargs: Dict[str, Any] = {"include_spent_coins": include_spent_coins, "names": names}
362
+ ) -> list[CoinRecord]:
363
+ kwargs: dict[str, Any] = {"include_spent_coins": include_spent_coins, "names": names}
360
364
  if start_height is not None:
361
365
  kwargs["start_height"] = start_height
362
366
  if end_height is not None:
@@ -365,12 +369,12 @@ class SimClient:
365
369
 
366
370
  async def get_coin_records_by_parent_ids(
367
371
  self,
368
- parent_ids: List[bytes32],
372
+ parent_ids: list[bytes32],
369
373
  start_height: Optional[int] = None,
370
374
  end_height: Optional[int] = None,
371
375
  include_spent_coins: bool = False,
372
- ) -> List[CoinRecord]:
373
- kwargs: Dict[str, Any] = {"include_spent_coins": include_spent_coins, "parent_ids": parent_ids}
376
+ ) -> list[CoinRecord]:
377
+ kwargs: dict[str, Any] = {"include_spent_coins": include_spent_coins, "parent_ids": parent_ids}
374
378
  if start_height is not None:
375
379
  kwargs["start_height"] = start_height
376
380
  if end_height is not None:
@@ -383,8 +387,8 @@ class SimClient:
383
387
  include_spent_coins: bool = True,
384
388
  start_height: Optional[int] = None,
385
389
  end_height: Optional[int] = None,
386
- ) -> List[CoinRecord]:
387
- kwargs: Dict[str, Any] = {"include_spent_coins": include_spent_coins, "puzzle_hash": puzzle_hash}
390
+ ) -> list[CoinRecord]:
391
+ kwargs: dict[str, Any] = {"include_spent_coins": include_spent_coins, "puzzle_hash": puzzle_hash}
388
392
  if start_height is not None:
389
393
  kwargs["start_height"] = start_height
390
394
  if end_height is not None:
@@ -393,12 +397,12 @@ class SimClient:
393
397
 
394
398
  async def get_coin_records_by_puzzle_hashes(
395
399
  self,
396
- puzzle_hashes: List[bytes32],
400
+ puzzle_hashes: list[bytes32],
397
401
  include_spent_coins: bool = True,
398
402
  start_height: Optional[int] = None,
399
403
  end_height: Optional[int] = None,
400
- ) -> List[CoinRecord]:
401
- kwargs: Dict[str, Any] = {"include_spent_coins": include_spent_coins, "puzzle_hashes": puzzle_hashes}
404
+ ) -> list[CoinRecord]:
405
+ kwargs: dict[str, Any] = {"include_spent_coins": include_spent_coins, "puzzle_hashes": puzzle_hashes}
402
406
  if start_height is not None:
403
407
  kwargs["start_height"] = start_height
404
408
  if end_height is not None:
@@ -406,32 +410,32 @@ class SimClient:
406
410
  return await self.service.coin_store.get_coin_records_by_puzzle_hashes(**kwargs)
407
411
 
408
412
  async def get_block_record_by_height(self, height: uint32) -> SimBlockRecord:
409
- return list(filter(lambda block: block.height == height, self.service.block_records))[0]
413
+ return next(filter(lambda block: block.height == height, self.service.block_records))
410
414
 
411
415
  async def get_block_record(self, header_hash: bytes32) -> SimBlockRecord:
412
- return list(filter(lambda block: block.header_hash == header_hash, self.service.block_records))[0]
416
+ return next(filter(lambda block: block.header_hash == header_hash, self.service.block_records))
413
417
 
414
- async def get_block_records(self, start: uint32, end: uint32) -> List[SimBlockRecord]:
418
+ async def get_block_records(self, start: uint32, end: uint32) -> list[SimBlockRecord]:
415
419
  return list(filter(lambda block: (block.height >= start) and (block.height < end), self.service.block_records))
416
420
 
417
421
  async def get_block(self, header_hash: bytes32) -> SimFullBlock:
418
- selected_block: SimBlockRecord = list(
422
+ selected_block: SimBlockRecord = next(
419
423
  filter(lambda br: br.header_hash == header_hash, self.service.block_records)
420
- )[0]
424
+ )
421
425
  block_height: uint32 = selected_block.height
422
- block: SimFullBlock = list(filter(lambda block: block.height == block_height, self.service.blocks))[0]
426
+ block: SimFullBlock = next(filter(lambda block: block.height == block_height, self.service.blocks))
423
427
  return block
424
428
 
425
- async def get_all_block(self, start: uint32, end: uint32) -> List[SimFullBlock]:
429
+ async def get_all_block(self, start: uint32, end: uint32) -> list[SimFullBlock]:
426
430
  return list(filter(lambda block: (block.height >= start) and (block.height < end), self.service.blocks))
427
431
 
428
- async def get_additions_and_removals(self, header_hash: bytes32) -> Tuple[List[CoinRecord], List[CoinRecord]]:
429
- selected_block: SimBlockRecord = list(
432
+ async def get_additions_and_removals(self, header_hash: bytes32) -> tuple[list[CoinRecord], list[CoinRecord]]:
433
+ selected_block: SimBlockRecord = next(
430
434
  filter(lambda br: br.header_hash == header_hash, self.service.block_records)
431
- )[0]
435
+ )
432
436
  block_height: uint32 = selected_block.height
433
- additions: List[CoinRecord] = await self.service.coin_store.get_coins_added_at_height(block_height)
434
- removals: List[CoinRecord] = await self.service.coin_store.get_coins_removed_at_height(block_height)
437
+ additions: list[CoinRecord] = await self.service.coin_store.get_coins_added_at_height(block_height)
438
+ removals: list[CoinRecord] = await self.service.coin_store.get_coins_removed_at_height(block_height)
435
439
  return additions, removals
436
440
 
437
441
  async def get_puzzle_and_solution(self, coin_id: bytes32, height: uint32) -> CoinSpend:
@@ -443,16 +447,16 @@ class SimClient:
443
447
  spend_info = get_puzzle_and_solution_for_coin(generator, coin_record.coin, height, self.service.defaults)
444
448
  return CoinSpend(coin_record.coin, spend_info.puzzle, spend_info.solution)
445
449
 
446
- async def get_all_mempool_tx_ids(self) -> List[bytes32]:
450
+ async def get_all_mempool_tx_ids(self) -> list[bytes32]:
447
451
  return self.service.mempool_manager.mempool.all_item_ids()
448
452
 
449
- async def get_all_mempool_items(self) -> Dict[bytes32, MempoolItem]:
453
+ async def get_all_mempool_items(self) -> dict[bytes32, MempoolItem]:
450
454
  spends = {}
451
455
  for item in self.service.mempool_manager.mempool.all_items():
452
456
  spends[item.name] = item
453
457
  return spends
454
458
 
455
- async def get_mempool_item_by_tx_id(self, tx_id: bytes32) -> Optional[Dict[str, Any]]:
459
+ async def get_mempool_item_by_tx_id(self, tx_id: bytes32) -> Optional[dict[str, Any]]:
456
460
  item = self.service.mempool_manager.get_mempool_item(tx_id)
457
461
  if item is None:
458
462
  return None
@@ -465,13 +469,13 @@ class SimClient:
465
469
  include_spent_coins: bool = True,
466
470
  start_height: Optional[int] = None,
467
471
  end_height: Optional[int] = None,
468
- ) -> List[CoinRecord]:
472
+ ) -> list[CoinRecord]:
469
473
  """
470
474
  Retrieves coins by hint, by default returns unspent coins.
471
475
  """
472
- names: List[bytes32] = await self.service.hint_store.get_coin_ids(hint)
476
+ names: list[bytes32] = await self.service.hint_store.get_coin_ids(hint)
473
477
 
474
- kwargs: Dict[str, Any] = {
478
+ kwargs: dict[str, Any] = {
475
479
  "include_spent_coins": False,
476
480
  "names": names,
477
481
  }
@@ -1,8 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import contextlib
4
+ from collections.abc import AsyncIterator, Iterator
4
5
  from dataclasses import dataclass
5
- from typing import AsyncContextManager, AsyncIterator, ContextManager, Generic, Iterator, List, TypeVar
6
+ from typing import Generic, TypeVar
6
7
 
7
8
  T = TypeVar("T")
8
9
 
@@ -10,13 +11,13 @@ T = TypeVar("T")
10
11
  @dataclass
11
12
  class SplitManager(Generic[T]):
12
13
  # NOTE: only for transitional testing use, please avoid usage
13
- manager: ContextManager[object]
14
+ manager: contextlib.AbstractContextManager[object]
14
15
  object: T
15
16
  _entered: bool = False
16
17
  _exited: bool = False
17
18
 
18
19
  def enter(self) -> None:
19
- messages: List[str] = []
20
+ messages: list[str] = []
20
21
  if self._entered:
21
22
  messages.append("already entered")
22
23
  if self._exited:
@@ -31,7 +32,7 @@ class SplitManager(Generic[T]):
31
32
  if if_needed and (not self._entered or self._exited):
32
33
  return
33
34
 
34
- messages: List[str] = []
35
+ messages: list[str] = []
35
36
  if not self._entered:
36
37
  messages.append("not yet entered")
37
38
  if self._exited:
@@ -46,13 +47,13 @@ class SplitManager(Generic[T]):
46
47
  @dataclass
47
48
  class SplitAsyncManager(Generic[T]):
48
49
  # NOTE: only for transitional testing use, please avoid usage
49
- manager: AsyncContextManager[object]
50
+ manager: contextlib.AbstractAsyncContextManager[object]
50
51
  object: T
51
52
  _entered: bool = False
52
53
  _exited: bool = False
53
54
 
54
55
  async def enter(self) -> None:
55
- messages: List[str] = []
56
+ messages: list[str] = []
56
57
  if self._entered:
57
58
  messages.append("already entered")
58
59
  if self._exited:
@@ -67,7 +68,7 @@ class SplitAsyncManager(Generic[T]):
67
68
  if if_needed and (not self._entered or self._exited):
68
69
  return
69
70
 
70
- messages: List[str] = []
71
+ messages: list[str] = []
71
72
  if not self._entered:
72
73
  messages.append("not yet entered")
73
74
  if self._exited:
@@ -80,7 +81,7 @@ class SplitAsyncManager(Generic[T]):
80
81
 
81
82
 
82
83
  @contextlib.contextmanager
83
- def split_manager(manager: ContextManager[object], object: T) -> Iterator[SplitManager[T]]:
84
+ def split_manager(manager: contextlib.AbstractContextManager[object], object: T) -> Iterator[SplitManager[T]]:
84
85
  # NOTE: only for transitional testing use, please avoid usage
85
86
  split = SplitManager(manager=manager, object=object)
86
87
  try:
@@ -90,7 +91,9 @@ def split_manager(manager: ContextManager[object], object: T) -> Iterator[SplitM
90
91
 
91
92
 
92
93
  @contextlib.asynccontextmanager
93
- async def split_async_manager(manager: AsyncContextManager[object], object: T) -> AsyncIterator[SplitAsyncManager[T]]:
94
+ async def split_async_manager(
95
+ manager: contextlib.AbstractAsyncContextManager[object], object: T
96
+ ) -> AsyncIterator[SplitAsyncManager[T]]:
94
97
  # NOTE: only for transitional testing use, please avoid usage
95
98
  split = SplitAsyncManager(manager=manager, object=object)
96
99
  try:
@@ -2,8 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import contextlib
4
4
  import tempfile
5
+ from collections.abc import Iterator
5
6
  from pathlib import Path
6
- from typing import Iterator
7
7
 
8
8
 
9
9
  @contextlib.contextmanager