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
@@ -11,10 +11,10 @@ import sys
11
11
  import tempfile
12
12
  from dataclasses import dataclass
13
13
  from pathlib import Path
14
- from typing import Any, Dict, List, Optional, Set, overload
14
+ from typing import Any, Optional, overload
15
15
  from urllib.parse import urlparse
16
16
 
17
- import boto3 as boto3
17
+ import boto3
18
18
  import yaml
19
19
  from aiohttp import web
20
20
  from botocore.exceptions import ClientError
@@ -31,17 +31,17 @@ plugin_version = "0.1.0"
31
31
  class StoreConfig:
32
32
  id: bytes32
33
33
  bucket: Optional[str]
34
- urls: Set[str]
34
+ urls: set[str]
35
35
 
36
36
  @classmethod
37
- def unmarshal(cls, d: Dict[str, Any]) -> StoreConfig:
37
+ def unmarshal(cls, d: dict[str, Any]) -> StoreConfig:
38
38
  upload_bucket = d.get("upload_bucket", None)
39
39
  if upload_bucket and len(upload_bucket) == 0:
40
40
  upload_bucket = None
41
41
 
42
42
  return StoreConfig(bytes32.from_hexstr(d["store_id"]), upload_bucket, d.get("download_urls", set()))
43
43
 
44
- def marshal(self) -> Dict[str, Any]:
44
+ def marshal(self) -> dict[str, Any]:
45
45
  return {"store_id": self.id.hex(), "upload_bucket": self.bucket, "download_urls": self.urls}
46
46
 
47
47
 
@@ -52,7 +52,7 @@ class S3Plugin:
52
52
  aws_access_key_id: str
53
53
  aws_secret_access_key: str
54
54
  server_files_path: Path
55
- stores: List[StoreConfig]
55
+ stores: list[StoreConfig]
56
56
  instance_name: str
57
57
 
58
58
  def __init__(
@@ -61,7 +61,7 @@ class S3Plugin:
61
61
  aws_access_key_id: str,
62
62
  aws_secret_access_key: str,
63
63
  server_files_path: Path,
64
- stores: List[StoreConfig],
64
+ stores: list[StoreConfig],
65
65
  instance_name: str,
66
66
  ):
67
67
  self.boto_resource = boto3.resource(
@@ -373,7 +373,7 @@ class S3Plugin:
373
373
  shutil.move(str(tmp_path), str(path))
374
374
 
375
375
 
376
- def read_store_ids_from_config(config: Dict[str, Any]) -> List[StoreConfig]:
376
+ def read_store_ids_from_config(config: dict[str, Any]) -> list[StoreConfig]:
377
377
  stores = []
378
378
  for store in config.get("stores", []):
379
379
  try:
@@ -389,7 +389,7 @@ def read_store_ids_from_config(config: Dict[str, Any]) -> List[StoreConfig]:
389
389
  return stores
390
390
 
391
391
 
392
- def make_app(config: Dict[str, Any], instance_name: str) -> web.Application:
392
+ def make_app(config: dict[str, Any], instance_name: str) -> web.Application:
393
393
  try:
394
394
  region = config["aws_credentials"]["region"]
395
395
  aws_access_key_id = config["aws_credentials"]["access_key_id"]
@@ -23,7 +23,6 @@ async def generate_datastore(num_nodes: int, slow_mode: bool) -> None:
23
23
  os.remove(db_path)
24
24
 
25
25
  async with DataStore.managed(database=db_path) as data_store:
26
-
27
26
  store_id = bytes32(b"0" * 32)
28
27
  await data_store.create_tree(store_id)
29
28
 
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  from pathlib import Path
5
- from typing import List
6
5
 
7
6
  import yaml
8
7
 
@@ -10,7 +9,7 @@ from chia.data_layer.data_layer_util import PluginRemote
10
9
  from chia.util.log_exceptions import log_exceptions
11
10
 
12
11
 
13
- async def load_plugin_configurations(root_path: Path, config_type: str, log: logging.Logger) -> List[PluginRemote]:
12
+ async def load_plugin_configurations(root_path: Path, config_type: str, log: logging.Logger) -> list[PluginRemote]:
14
13
  """
15
14
  Loads plugin configurations from the specified directory and validates that the contents
16
15
  are in the expected JSON format (an array of PluginRemote objects). It gracefully handles errors
@@ -21,7 +20,7 @@ async def load_plugin_configurations(root_path: Path, config_type: str, log: log
21
20
  config_type (str): The type of plugins to load ('downloaders' or 'uploaders').
22
21
 
23
22
  Returns:
24
- List[PluginRemote]: A list of valid PluginRemote instances for the specified plugin type.
23
+ list[PluginRemote]: A list of valid PluginRemote instances for the specified plugin type.
25
24
  """
26
25
  config_path = root_path / "plugins" / config_type
27
26
  config_path.mkdir(parents=True, exist_ok=True) # Ensure the config directory exists
chia/farmer/farmer.py CHANGED
@@ -7,10 +7,11 @@ import logging
7
7
  import sys
8
8
  import time
9
9
  import traceback
10
+ from collections.abc import AsyncIterator
10
11
  from dataclasses import dataclass
11
12
  from math import floor
12
13
  from pathlib import Path
13
- from typing import TYPE_CHECKING, Any, AsyncIterator, ClassVar, Dict, List, Optional, Set, Tuple, Union, cast
14
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast
14
15
 
15
16
  import aiohttp
16
17
  from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey
@@ -49,6 +50,7 @@ from chia.util.ints import uint8, uint16, uint32, uint64
49
50
  from chia.util.keychain import Keychain
50
51
  from chia.util.logging import TimedDuplicateFilter
51
52
  from chia.util.profiler import profile_task
53
+ from chia.util.task_referencer import create_referenced_task
52
54
  from chia.wallet.derive_keys import (
53
55
  find_authentication_sk,
54
56
  find_owner_sk,
@@ -69,11 +71,11 @@ UPDATE_POOL_FARMER_INFO_INTERVAL: int = 300
69
71
 
70
72
  @dataclass(frozen=True)
71
73
  class GetPoolInfoResult:
72
- pool_info: Dict[str, Any]
74
+ pool_info: dict[str, Any]
73
75
  new_pool_url: Optional[str]
74
76
 
75
77
 
76
- def strip_old_entries(pairs: List[Tuple[float, Any]], before: float) -> List[Tuple[float, Any]]:
78
+ def strip_old_entries(pairs: list[tuple[float, Any]], before: float) -> list[tuple[float, Any]]:
77
79
  for index, [timestamp, points] in enumerate(pairs):
78
80
  if timestamp >= before:
79
81
  if index == 0:
@@ -84,12 +86,12 @@ def strip_old_entries(pairs: List[Tuple[float, Any]], before: float) -> List[Tup
84
86
 
85
87
 
86
88
  def increment_pool_stats(
87
- pool_states: Dict[bytes32, Any],
89
+ pool_states: dict[bytes32, Any],
88
90
  p2_singleton_puzzlehash: bytes32,
89
91
  name: str,
90
92
  current_time: float,
91
93
  count: int = 1,
92
- value: Optional[Union[int, Dict[str, Any]]] = None,
94
+ value: Optional[Union[int, dict[str, Any]]] = None,
93
95
  ) -> None:
94
96
  if p2_singleton_puzzlehash not in pool_states:
95
97
  return
@@ -124,8 +126,8 @@ class Farmer:
124
126
  def __init__(
125
127
  self,
126
128
  root_path: Path,
127
- farmer_config: Dict[str, Any],
128
- pool_config: Dict[str, Any],
129
+ farmer_config: dict[str, Any],
130
+ pool_config: dict[str, Any],
129
131
  consensus_constants: ConsensusConstants,
130
132
  local_keychain: Optional[Keychain] = None,
131
133
  ):
@@ -135,22 +137,22 @@ class Farmer:
135
137
  self.config = farmer_config
136
138
  self.pool_config = pool_config
137
139
  # Keep track of all sps, keyed on challenge chain signage point hash
138
- self.sps: Dict[bytes32, List[farmer_protocol.NewSignagePoint]] = {}
140
+ self.sps: dict[bytes32, list[farmer_protocol.NewSignagePoint]] = {}
139
141
 
140
142
  # Keep track of harvester plot identifier (str), target sp index, and PoSpace for each challenge
141
- self.proofs_of_space: Dict[bytes32, List[Tuple[str, ProofOfSpace]]] = {}
143
+ self.proofs_of_space: dict[bytes32, list[tuple[str, ProofOfSpace]]] = {}
142
144
 
143
145
  # Quality string to plot identifier and challenge_hash, for use with harvester.RequestSignatures
144
- self.quality_str_to_identifiers: Dict[bytes32, Tuple[str, bytes32, bytes32, bytes32]] = {}
146
+ self.quality_str_to_identifiers: dict[bytes32, tuple[str, bytes32, bytes32, bytes32]] = {}
145
147
 
146
148
  # number of responses to each signage point
147
- self.number_of_responses: Dict[bytes32, int] = {}
149
+ self.number_of_responses: dict[bytes32, int] = {}
148
150
 
149
151
  # A dictionary of keys to time added. These keys refer to keys in the above 4 dictionaries. This is used
150
152
  # to periodically clear the memory
151
- self.cache_add_time: Dict[bytes32, uint64] = {}
153
+ self.cache_add_time: dict[bytes32, uint64] = {}
152
154
 
153
- self.plot_sync_receivers: Dict[bytes32, Receiver] = {}
155
+ self.plot_sync_receivers: dict[bytes32, Receiver] = {}
154
156
 
155
157
  self.cache_clear_task: Optional[asyncio.Task[None]] = None
156
158
  self.update_pool_state_task: Optional[asyncio.Task[None]] = None
@@ -166,18 +168,18 @@ class Farmer:
166
168
  self.harvester_handshake_task: Optional[asyncio.Task[None]] = None
167
169
 
168
170
  # From p2_singleton_puzzle_hash to pool state dict
169
- self.pool_state: Dict[bytes32, Dict[str, Any]] = {}
171
+ self.pool_state: dict[bytes32, dict[str, Any]] = {}
170
172
 
171
173
  # From p2_singleton to auth PrivateKey
172
- self.authentication_keys: Dict[bytes32, PrivateKey] = {}
174
+ self.authentication_keys: dict[bytes32, PrivateKey] = {}
173
175
 
174
176
  # Last time we updated pool_state based on the config file
175
177
  self.last_config_access_time: float = 0
176
178
 
177
- self.all_root_sks: List[PrivateKey] = []
179
+ self.all_root_sks: list[PrivateKey] = []
178
180
 
179
181
  # Use to find missing signage points. (new_signage_point, time)
180
- self.prev_signage_point: Optional[Tuple[uint64, farmer_protocol.NewSignagePoint]] = None
182
+ self.prev_signage_point: Optional[tuple[uint64, farmer_protocol.NewSignagePoint]] = None
181
183
 
182
184
  @contextlib.asynccontextmanager
183
185
  async def manage(self) -> AsyncIterator[None]:
@@ -186,8 +188,8 @@ class Farmer:
186
188
  # succeeds or until we need to shut down.
187
189
  while not self._shut_down:
188
190
  if await self.setup_keys():
189
- self.update_pool_state_task = asyncio.create_task(self._periodically_update_pool_state_task())
190
- self.cache_clear_task = asyncio.create_task(self._periodically_clear_cache_and_refresh_task())
191
+ self.update_pool_state_task = create_referenced_task(self._periodically_update_pool_state_task())
192
+ self.cache_clear_task = create_referenced_task(self._periodically_clear_cache_and_refresh_task())
191
193
  log.debug("start_task: initialized")
192
194
  self.started = True
193
195
  return
@@ -197,9 +199,9 @@ class Farmer:
197
199
  if sys.getprofile() is not None:
198
200
  self.log.warning("not enabling profiler, getprofile() is already set")
199
201
  else:
200
- asyncio.create_task(profile_task(self._root_path, "farmer", self.log))
202
+ create_referenced_task(profile_task(self._root_path, "farmer", self.log), known_unreferenced=True)
201
203
 
202
- asyncio.create_task(start_task())
204
+ create_referenced_task(start_task(), known_unreferenced=True)
203
205
  try:
204
206
  yield
205
207
  finally:
@@ -216,7 +218,7 @@ class Farmer:
216
218
  await asyncio.sleep(0.5) # https://docs.aiohttp.org/en/stable/client_advanced.html#graceful-shutdown
217
219
  self.started = False
218
220
 
219
- def get_connections(self, request_node_type: Optional[NodeType]) -> List[Dict[str, Any]]:
221
+ def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
220
222
  return default_get_connections(server=self.server, request_node_type=request_node_type)
221
223
 
222
224
  async def ensure_keychain_proxy(self) -> KeychainProxy:
@@ -229,7 +231,7 @@ class Farmer:
229
231
  raise KeychainProxyConnectionFailure()
230
232
  return self.keychain_proxy
231
233
 
232
- async def get_all_private_keys(self) -> List[Tuple[PrivateKey, bytes]]:
234
+ async def get_all_private_keys(self) -> list[tuple[PrivateKey, bytes]]:
233
235
  keychain_proxy = await self.ensure_keychain_proxy()
234
236
  return await keychain_proxy.get_all_private_keys()
235
237
 
@@ -285,7 +287,8 @@ class Farmer:
285
287
  async def handshake_task() -> None:
286
288
  # Wait until the task in `Farmer._start` is done so that we have keys available for the handshake. Bail out
287
289
  # early if we need to shut down or if the harvester is not longer connected.
288
- while not self.started and not self._shut_down and peer in self.server.get_connections():
290
+ # TODO: switch to event driven code
291
+ while not self.started and not self._shut_down and peer in self.server.get_connections(): # noqa: ASYNC110
289
292
  await asyncio.sleep(1)
290
293
 
291
294
  if self._shut_down:
@@ -309,12 +312,12 @@ class Farmer:
309
312
 
310
313
  if peer.connection_type is NodeType.HARVESTER:
311
314
  self.plot_sync_receivers[peer.peer_node_id] = Receiver(peer, self.plot_sync_callback)
312
- self.harvester_handshake_task = asyncio.create_task(handshake_task())
315
+ self.harvester_handshake_task = create_referenced_task(handshake_task())
313
316
 
314
317
  def set_server(self, server: ChiaServer) -> None:
315
318
  self.server = server
316
319
 
317
- def state_changed(self, change: str, data: Dict[str, Any]) -> None:
320
+ def state_changed(self, change: str, data: dict[str, Any]) -> None:
318
321
  if self.state_changed_callback is not None:
319
322
  self.state_changed_callback(change, data)
320
323
 
@@ -348,7 +351,7 @@ class Farmer:
348
351
  url = f"{pool_config.pool_url}/pool_info"
349
352
  async with session.get(url, ssl=ssl_context_for_root(get_mozilla_ca_crt(), log=self.log)) as resp:
350
353
  if resp.ok:
351
- response: Dict[str, Any] = json.loads(await resp.text())
354
+ response: dict[str, Any] = json.loads(await resp.text())
352
355
  self.log.info(f"GET /pool_info response: {response}")
353
356
  new_pool_url: Optional[str] = None
354
357
  response_url_str = f"{resp.url}"
@@ -375,7 +378,7 @@ class Farmer:
375
378
 
376
379
  async def _pool_get_farmer(
377
380
  self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, authentication_sk: PrivateKey
378
- ) -> Optional[Dict[str, Any]]:
381
+ ) -> Optional[dict[str, Any]]:
379
382
  authentication_token = get_current_authentication_token(authentication_token_timeout)
380
383
  message: bytes32 = std_hash(
381
384
  AuthenticationPayload(
@@ -396,7 +399,7 @@ class Farmer:
396
399
  ssl=ssl_context_for_root(get_mozilla_ca_crt(), log=self.log),
397
400
  ) as resp:
398
401
  if resp.ok:
399
- response: Dict[str, Any] = json.loads(await resp.text())
402
+ response: dict[str, Any] = json.loads(await resp.text())
400
403
  log_level = logging.INFO
401
404
  if "error_code" in response:
402
405
  log_level = logging.WARNING
@@ -422,7 +425,7 @@ class Farmer:
422
425
 
423
426
  async def _pool_post_farmer(
424
427
  self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, owner_sk: PrivateKey
425
- ) -> Optional[Dict[str, Any]]:
428
+ ) -> Optional[dict[str, Any]]:
426
429
  auth_sk: Optional[PrivateKey] = self.get_authentication_sk(pool_config)
427
430
  assert auth_sk is not None
428
431
  post_farmer_payload: PostFarmerPayload = PostFarmerPayload(
@@ -444,7 +447,7 @@ class Farmer:
444
447
  ssl=ssl_context_for_root(get_mozilla_ca_crt(), log=self.log),
445
448
  ) as resp:
446
449
  if resp.ok:
447
- response: Dict[str, Any] = json.loads(await resp.text())
450
+ response: dict[str, Any] = json.loads(await resp.text())
448
451
  log_level = logging.INFO
449
452
  if "error_code" in response:
450
453
  log_level = logging.WARNING
@@ -492,7 +495,7 @@ class Farmer:
492
495
  ssl=ssl_context_for_root(get_mozilla_ca_crt(), log=self.log),
493
496
  ) as resp:
494
497
  if resp.ok:
495
- response: Dict[str, Any] = json.loads(await resp.text())
498
+ response: dict[str, Any] = json.loads(await resp.text())
496
499
  log_level = logging.INFO
497
500
  if "error_code" in response:
498
501
  log_level = logging.WARNING
@@ -525,7 +528,7 @@ class Farmer:
525
528
  async def update_pool_state(self) -> None:
526
529
  config = load_config(self._root_path, "config.yaml")
527
530
 
528
- pool_config_list: List[PoolWalletConfig] = load_pool_config(self._root_path)
531
+ pool_config_list: list[PoolWalletConfig] = load_pool_config(self._root_path)
529
532
  for pool_config in pool_config_list:
530
533
  p2_singleton_puzzle_hash = pool_config.p2_singleton_puzzle_hash
531
534
 
@@ -598,7 +601,7 @@ class Farmer:
598
601
  pool_state["next_farmer_update"] = time.time() + UPDATE_POOL_FARMER_INFO_INTERVAL
599
602
  authentication_token_timeout = pool_state["authentication_token_timeout"]
600
603
 
601
- async def update_pool_farmer_info() -> Tuple[Optional[GetFarmerResponse], Optional[PoolErrorCode]]:
604
+ async def update_pool_farmer_info() -> tuple[Optional[GetFarmerResponse], Optional[PoolErrorCode]]:
602
605
  # Run a GET /farmer to see if the farmer is already known by the pool
603
606
  response = await self._pool_get_farmer(
604
607
  pool_config, authentication_token_timeout, authentication_sk
@@ -662,19 +665,19 @@ class Farmer:
662
665
  tb = traceback.format_exc()
663
666
  self.log.error(f"Exception in update_pool_state for {pool_config.pool_url}, {e} {tb}")
664
667
 
665
- def get_public_keys(self) -> List[G1Element]:
668
+ def get_public_keys(self) -> list[G1Element]:
666
669
  return [child_sk.get_g1() for child_sk in self._private_keys]
667
670
 
668
- def get_private_keys(self) -> List[PrivateKey]:
671
+ def get_private_keys(self) -> list[PrivateKey]:
669
672
  return self._private_keys
670
673
 
671
- async def get_reward_targets(self, search_for_private_key: bool, max_ph_to_search: int = 500) -> Dict[str, Any]:
674
+ async def get_reward_targets(self, search_for_private_key: bool, max_ph_to_search: int = 500) -> dict[str, Any]:
672
675
  if search_for_private_key:
673
676
  all_sks = await self.get_all_private_keys()
674
677
  have_farmer_sk, have_pool_sk = False, False
675
- search_addresses: List[bytes32] = [self.farmer_target, self.pool_target]
678
+ search_addresses: list[bytes32] = [self.farmer_target, self.pool_target]
676
679
  for sk, _ in all_sks:
677
- found_addresses: Set[bytes32] = match_address_to_sk(sk, search_addresses, max_ph_to_search)
680
+ found_addresses: set[bytes32] = match_address_to_sk(sk, search_addresses, max_ph_to_search)
678
681
 
679
682
  if not have_farmer_sk and self.farmer_target in found_addresses:
680
683
  search_addresses.remove(self.farmer_target)
@@ -763,8 +766,8 @@ class Farmer:
763
766
 
764
767
  return None
765
768
 
766
- async def get_harvesters(self, counts_only: bool = False) -> Dict[str, Any]:
767
- harvesters: List[Dict[str, Any]] = []
769
+ async def get_harvesters(self, counts_only: bool = False) -> dict[str, Any]:
770
+ harvesters: list[dict[str, Any]] = []
768
771
  for connection in self.server.get_connections(NodeType.HARVESTER):
769
772
  self.log.debug(f"get_harvesters host: {connection.peer_info.host}, node_id: {connection.peer_node_id}")
770
773
  receiver = self.plot_sync_receivers.get(connection.peer_node_id)
@@ -785,7 +788,7 @@ class Farmer:
785
788
 
786
789
  def check_missing_signage_points(
787
790
  self, timestamp: uint64, new_signage_point: farmer_protocol.NewSignagePoint
788
- ) -> Optional[Tuple[uint64, uint32]]:
791
+ ) -> Optional[tuple[uint64, uint32]]:
789
792
  if self.prev_signage_point is None:
790
793
  self.prev_signage_point = (timestamp, new_signage_point)
791
794
  return None
@@ -836,7 +839,7 @@ class Farmer:
836
839
  try:
837
840
  if time_slept > self.constants.SUB_SLOT_TIME_TARGET:
838
841
  now = time.time()
839
- removed_keys: List[bytes32] = []
842
+ removed_keys: list[bytes32] = []
840
843
  for key, add_time in self.cache_add_time.items():
841
844
  if now - float(add_time) > self.constants.SUB_SLOT_TIME_TARGET * 3:
842
845
  self.sps.pop(key, None)
chia/farmer/farmer_api.py CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import json
4
4
  import logging
5
5
  import time
6
- from typing import Any, Dict, List, Optional, Union
6
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast
7
7
 
8
8
  import aiohttp
9
9
  from chia_rs import AugSchemeMPL, G2Element, PrivateKey
@@ -30,6 +30,7 @@ from chia.protocols.pool_protocol import (
30
30
  get_current_authentication_token,
31
31
  )
32
32
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
33
+ from chia.server.api_protocol import ApiMetadata
33
34
  from chia.server.outbound_message import Message, NodeType, make_msg
34
35
  from chia.server.server import ssl_context_for_root
35
36
  from chia.server.ws_connection import WSChiaConnection
@@ -43,13 +44,18 @@ from chia.types.blockchain_format.proof_of_space import (
43
44
  verify_and_get_quality_string,
44
45
  )
45
46
  from chia.types.blockchain_format.sized_bytes import bytes32
46
- from chia.util.api_decorators import api_request
47
47
  from chia.util.ints import uint8, uint16, uint32, uint64
48
48
 
49
49
 
50
50
  class FarmerAPI:
51
+ if TYPE_CHECKING:
52
+ from chia.server.api_protocol import ApiProtocol
53
+
54
+ _protocol_check: ClassVar[ApiProtocol] = cast("FarmerAPI", None)
55
+
51
56
  log: logging.Logger
52
57
  farmer: Farmer
58
+ metadata: ClassVar[ApiMetadata] = ApiMetadata()
53
59
 
54
60
  def __init__(self, farmer: Farmer) -> None:
55
61
  self.log = logging.getLogger(__name__)
@@ -58,7 +64,7 @@ class FarmerAPI:
58
64
  def ready(self) -> bool:
59
65
  return self.farmer.started
60
66
 
61
- @api_request(peer_required=True)
67
+ @metadata.request(peer_required=True)
62
68
  async def new_proof_of_space(
63
69
  self, new_proof_of_space: harvester_protocol.NewProofOfSpace, peer: WSChiaConnection
64
70
  ) -> None:
@@ -117,7 +123,7 @@ class FarmerAPI:
117
123
  if new_proof_of_space.farmer_reward_address_override is not None:
118
124
  self.farmer.notify_farmer_reward_taken_by_harvester_as_fee(sp, new_proof_of_space)
119
125
 
120
- sp_src_data: Optional[List[Optional[SignatureRequestSourceData]]] = None
126
+ sp_src_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
121
127
  if (
122
128
  new_proof_of_space.include_source_signature_data
123
129
  or new_proof_of_space.farmer_reward_address_override is not None
@@ -182,7 +188,7 @@ class FarmerAPI:
182
188
  if p2_singleton_puzzle_hash not in self.farmer.pool_state:
183
189
  self.farmer.log.info(f"Did not find pool info for {p2_singleton_puzzle_hash}")
184
190
  return
185
- pool_state_dict: Dict[str, Any] = self.farmer.pool_state[p2_singleton_puzzle_hash]
191
+ pool_state_dict: dict[str, Any] = self.farmer.pool_state[p2_singleton_puzzle_hash]
186
192
  pool_url = pool_state_dict["pool_config"].pool_url
187
193
  if pool_url == "":
188
194
  # `pool_url == ""` means solo plotNFT farming
@@ -268,7 +274,7 @@ class FarmerAPI:
268
274
 
269
275
  # The plot key is 2/2 so we need the harvester's half of the signature
270
276
  m_to_sign = payload.get_hash()
271
- m_src_data: Optional[List[Optional[SignatureRequestSourceData]]] = None
277
+ m_src_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
272
278
 
273
279
  if ( # pragma: no cover
274
280
  new_proof_of_space.include_source_signature_data
@@ -374,7 +380,7 @@ class FarmerAPI:
374
380
  )
375
381
  return
376
382
 
377
- pool_response: Dict[str, Any] = json.loads(await resp.text())
383
+ pool_response: dict[str, Any] = json.loads(await resp.text())
378
384
  self.farmer.log.info(f"Pool response: {pool_response}")
379
385
  if "error_code" in pool_response:
380
386
  self.farmer.log.error(
@@ -471,7 +477,7 @@ class FarmerAPI:
471
477
 
472
478
  return
473
479
 
474
- @api_request()
480
+ @metadata.request()
475
481
  async def respond_signatures(self, response: harvester_protocol.RespondSignatures) -> None:
476
482
  request = self._process_respond_signatures(response)
477
483
  if request is None:
@@ -489,7 +495,7 @@ class FarmerAPI:
489
495
  FARMER PROTOCOL (FARMER <-> FULL NODE)
490
496
  """
491
497
 
492
- @api_request()
498
+ @metadata.request()
493
499
  async def new_signage_point(self, new_signage_point: farmer_protocol.NewSignagePoint) -> None:
494
500
  if new_signage_point.challenge_chain_sp not in self.farmer.sps:
495
501
  self.farmer.sps[new_signage_point.challenge_chain_sp] = []
@@ -501,7 +507,7 @@ class FarmerAPI:
501
507
  self.farmer.sps[new_signage_point.challenge_chain_sp].append(new_signage_point)
502
508
 
503
509
  try:
504
- pool_difficulties: List[PoolDifficulty] = []
510
+ pool_difficulties: list[PoolDifficulty] = []
505
511
  for p2_singleton_puzzle_hash, pool_dict in self.farmer.pool_state.items():
506
512
  if pool_dict["pool_config"].pool_url == "":
507
513
  # Self pooling
@@ -558,7 +564,7 @@ class FarmerAPI:
558
564
  {"sp_hash": new_signage_point.challenge_chain_sp, "missing_signage_points": missing_signage_points},
559
565
  )
560
566
 
561
- @api_request()
567
+ @metadata.request()
562
568
  async def request_signed_values(self, full_node_request: farmer_protocol.RequestSignedValues) -> Optional[Message]:
563
569
  if full_node_request.quality_string not in self.farmer.quality_str_to_identifiers:
564
570
  self.farmer.log.error(f"Do not have quality string {full_node_request.quality_string}")
@@ -568,7 +574,7 @@ class FarmerAPI:
568
574
  full_node_request.quality_string
569
575
  ]
570
576
 
571
- message_data: Optional[List[Optional[SignatureRequestSourceData]]] = None
577
+ message_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
572
578
 
573
579
  if full_node_request.foliage_block_data is not None:
574
580
  message_data = [
@@ -607,7 +613,7 @@ class FarmerAPI:
607
613
 
608
614
  return make_msg(ProtocolMessageTypes.signed_values, signed_values)
609
615
 
610
- @api_request(peer_required=True)
616
+ @metadata.request(peer_required=True)
611
617
  async def farming_info(self, request: farmer_protocol.FarmingInfo, peer: WSChiaConnection) -> None:
612
618
  self.farmer.state_changed(
613
619
  "new_farming_info",
@@ -625,35 +631,35 @@ class FarmerAPI:
625
631
  },
626
632
  )
627
633
 
628
- @api_request(peer_required=True)
634
+ @metadata.request(peer_required=True)
629
635
  async def respond_plots(self, _: harvester_protocol.RespondPlots, peer: WSChiaConnection) -> None:
630
636
  self.farmer.log.warning(f"Respond plots came too late from: {peer.get_peer_logging()}")
631
637
 
632
- @api_request(peer_required=True)
638
+ @metadata.request(peer_required=True)
633
639
  async def plot_sync_start(self, message: PlotSyncStart, peer: WSChiaConnection) -> None:
634
640
  await self.farmer.plot_sync_receivers[peer.peer_node_id].sync_started(message)
635
641
 
636
- @api_request(peer_required=True)
642
+ @metadata.request(peer_required=True)
637
643
  async def plot_sync_loaded(self, message: PlotSyncPlotList, peer: WSChiaConnection) -> None:
638
644
  await self.farmer.plot_sync_receivers[peer.peer_node_id].process_loaded(message)
639
645
 
640
- @api_request(peer_required=True)
646
+ @metadata.request(peer_required=True)
641
647
  async def plot_sync_removed(self, message: PlotSyncPathList, peer: WSChiaConnection) -> None:
642
648
  await self.farmer.plot_sync_receivers[peer.peer_node_id].process_removed(message)
643
649
 
644
- @api_request(peer_required=True)
650
+ @metadata.request(peer_required=True)
645
651
  async def plot_sync_invalid(self, message: PlotSyncPathList, peer: WSChiaConnection) -> None:
646
652
  await self.farmer.plot_sync_receivers[peer.peer_node_id].process_invalid(message)
647
653
 
648
- @api_request(peer_required=True)
654
+ @metadata.request(peer_required=True)
649
655
  async def plot_sync_keys_missing(self, message: PlotSyncPathList, peer: WSChiaConnection) -> None:
650
656
  await self.farmer.plot_sync_receivers[peer.peer_node_id].process_keys_missing(message)
651
657
 
652
- @api_request(peer_required=True)
658
+ @metadata.request(peer_required=True)
653
659
  async def plot_sync_duplicates(self, message: PlotSyncPathList, peer: WSChiaConnection) -> None:
654
660
  await self.farmer.plot_sync_receivers[peer.peer_node_id].process_duplicates(message)
655
661
 
656
- @api_request(peer_required=True)
662
+ @metadata.request(peer_required=True)
657
663
  async def plot_sync_done(self, message: PlotSyncDone, peer: WSChiaConnection) -> None:
658
664
  await self.farmer.plot_sync_receivers[peer.peer_node_id].sync_done(message)
659
665
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import logging
4
4
  from dataclasses import dataclass
5
5
  from pathlib import Path
6
- from typing import Dict, List, Optional, Tuple
6
+ from typing import Optional
7
7
 
8
8
  import aiofiles
9
9
 
@@ -20,7 +20,7 @@ log = logging.getLogger(__name__)
20
20
  @streamable
21
21
  @dataclass(frozen=True)
22
22
  class SesCache(Streamable):
23
- content: List[Tuple[uint32, bytes]]
23
+ content: list[tuple[uint32, bytes]]
24
24
 
25
25
 
26
26
  class BlockHeightMap:
@@ -38,7 +38,7 @@ class BlockHeightMap:
38
38
  # All sub-epoch summaries that have been included in the blockchain from the beginning until and including the peak
39
39
  # (height_included, SubEpochSummary). Note: ONLY for the blocks in the path to the peak
40
40
  # The value is a serialized SubEpochSummary object
41
- __sub_epoch_summaries: Dict[uint32, bytes]
41
+ __sub_epoch_summaries: dict[uint32, bytes]
42
42
 
43
43
  # count how many blocks have been added since the cache was last written to
44
44
  # disk
@@ -124,7 +124,7 @@ class BlockHeightMap:
124
124
 
125
125
  log.info(
126
126
  f"Loaded sub-epoch-summaries: {len(self.__sub_epoch_summaries)} "
127
- f"height-to-hash: {len(self.__height_to_hash)//32}"
127
+ f"height-to-hash: {len(self.__height_to_hash) // 32}"
128
128
  )
129
129
 
130
130
  # prepopulate the height -> hash mapping
@@ -194,7 +194,7 @@ class BlockHeightMap:
194
194
  async with self.db.reader_no_transaction() as conn:
195
195
  async with conn.execute(query, (window_end, height)) as cursor:
196
196
  # maps block-hash -> (height, prev-hash, sub-epoch-summary)
197
- ordered: Dict[bytes32, Tuple[uint32, bytes32, Optional[bytes]]] = {}
197
+ ordered: dict[bytes32, tuple[uint32, bytes32, Optional[bytes]]] = {}
198
198
 
199
199
  for r in await cursor.fetchall():
200
200
  ordered[r[0]] = (r[2], r[1], r[3])
@@ -267,5 +267,5 @@ class BlockHeightMap:
267
267
  def get_ses(self, height: uint32) -> SubEpochSummary:
268
268
  return SubEpochSummary.from_bytes(self.__sub_epoch_summaries[height])
269
269
 
270
- def get_ses_heights(self) -> List[uint32]:
270
+ def get_ses_heights(self) -> list[uint32]:
271
271
  return sorted(self.__sub_epoch_summaries.keys())