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
@@ -4,7 +4,7 @@ import asyncio
4
4
  import dataclasses
5
5
  import logging
6
6
  import time
7
- from typing import Dict, List, Optional, Set, Tuple
7
+ from typing import Optional
8
8
 
9
9
  from chia.consensus.block_record import BlockRecord
10
10
  from chia.consensus.blockchain_interface import BlockRecordsProtocol
@@ -33,8 +33,8 @@ log = logging.getLogger(__name__)
33
33
  @dataclasses.dataclass(frozen=True)
34
34
  class FullNodeStorePeakResult(Streamable):
35
35
  added_eos: Optional[EndOfSubSlotBundle]
36
- new_signage_points: List[Tuple[uint8, SignagePoint]]
37
- new_infusion_points: List[timelord_protocol.NewInfusionPointVDF]
36
+ new_signage_points: list[tuple[uint8, SignagePoint]]
37
+ new_infusion_points: list[timelord_protocol.NewInfusionPointVDF]
38
38
 
39
39
 
40
40
  @dataclasses.dataclass
@@ -49,8 +49,8 @@ class UnfinishedBlockEntry:
49
49
 
50
50
 
51
51
  def find_best_block(
52
- result: Dict[Optional[bytes32], UnfinishedBlockEntry]
53
- ) -> Tuple[Optional[bytes32], Optional[UnfinishedBlock]]:
52
+ result: dict[Optional[bytes32], UnfinishedBlockEntry],
53
+ ) -> tuple[Optional[bytes32], Optional[UnfinishedBlock]]:
54
54
  """
55
55
  Given a collection of UnfinishedBlocks (all with the same reward block
56
56
  hash), return the "best" one. i.e. the one with the smallest foliage hash.
@@ -67,7 +67,7 @@ def find_best_block(
67
67
  else:
68
68
  return foliage_hash, entry.unfinished_block
69
69
 
70
- def include_block(item: Tuple[Optional[bytes32], UnfinishedBlockEntry]) -> bool:
70
+ def include_block(item: tuple[Optional[bytes32], UnfinishedBlockEntry]) -> bool:
71
71
  foliage_hash, entry = item
72
72
  return foliage_hash is not None and entry.unfinished_block is not None
73
73
 
@@ -88,14 +88,14 @@ class FullNodeStore:
88
88
  constants: ConsensusConstants
89
89
 
90
90
  # Blocks which we have created, but don't have plot signatures yet, so not yet "unfinished blocks"
91
- candidate_blocks: Dict[bytes32, Tuple[uint32, UnfinishedBlock]]
92
- candidate_backup_blocks: Dict[bytes32, Tuple[uint32, UnfinishedBlock]]
91
+ candidate_blocks: dict[bytes32, tuple[uint32, UnfinishedBlock]]
92
+ candidate_backup_blocks: dict[bytes32, tuple[uint32, UnfinishedBlock]]
93
93
 
94
94
  # Block hashes of unfinished blocks that we have seen recently. This is
95
- # effectively a Set[bytes32] but in order to evict the oldest items first,
95
+ # effectively a set[bytes32] but in order to evict the oldest items first,
96
96
  # we use a Dict that preserves insertion order, and remove from the
97
97
  # beginning
98
- seen_unfinished_blocks: Dict[bytes32, None]
98
+ seen_unfinished_blocks: dict[bytes32, None]
99
99
 
100
100
  # Unfinished blocks, keyed from reward hash
101
101
  # There may be multiple different unfinished blocks with the same partial
@@ -107,36 +107,36 @@ class FullNodeStore:
107
107
  # The inner key (the foliage hash) is Optional, where None either means
108
108
  # it's not a transaction block, or it's a block we learned about via the old
109
109
  # protocol, where all we get is the reward block hash.
110
- _unfinished_blocks: Dict[bytes32, Dict[Optional[bytes32], UnfinishedBlockEntry]]
110
+ _unfinished_blocks: dict[bytes32, dict[Optional[bytes32], UnfinishedBlockEntry]]
111
111
 
112
112
  # Finished slots and sps from the peak's slot onwards
113
113
  # We store all 32 SPs for each slot, starting as 32 Nones and filling them as we go
114
114
  # Also stores the total iters at the end of slot
115
115
  # For the first sub-slot, EndOfSlotBundle is None
116
- finished_sub_slots: List[Tuple[Optional[EndOfSubSlotBundle], List[Optional[SignagePoint]], uint128]]
116
+ finished_sub_slots: list[tuple[Optional[EndOfSubSlotBundle], list[Optional[SignagePoint]], uint128]]
117
117
 
118
118
  # These caches maintain objects which depend on infused blocks in the reward chain, that we
119
119
  # might receive before the blocks themselves. The dict keys are the reward chain challenge hashes.
120
120
 
121
121
  # End of slots which depend on infusions that we don't have
122
- future_eos_cache: Dict[bytes32, List[EndOfSubSlotBundle]]
122
+ future_eos_cache: dict[bytes32, list[EndOfSubSlotBundle]]
123
123
 
124
124
  # Signage points which depend on infusions that we don't have
125
- future_sp_cache: Dict[bytes32, List[Tuple[uint8, SignagePoint]]]
125
+ future_sp_cache: dict[bytes32, list[tuple[uint8, SignagePoint]]]
126
126
 
127
127
  # Infusion point VDFs which depend on infusions that we don't have
128
- future_ip_cache: Dict[bytes32, List[timelord_protocol.NewInfusionPointVDF]]
128
+ future_ip_cache: dict[bytes32, list[timelord_protocol.NewInfusionPointVDF]]
129
129
 
130
130
  # This stores the time that each key was added to the future cache, so we can clear old keys
131
- future_cache_key_times: Dict[bytes32, int]
131
+ future_cache_key_times: dict[bytes32, int]
132
132
 
133
133
  # These recent caches are for pooling support
134
- recent_signage_points: LRUCache[bytes32, Tuple[SignagePoint, float]]
135
- recent_eos: LRUCache[bytes32, Tuple[EndOfSubSlotBundle, float]]
134
+ recent_signage_points: LRUCache[bytes32, tuple[SignagePoint, float]]
135
+ recent_eos: LRUCache[bytes32, tuple[EndOfSubSlotBundle, float]]
136
136
 
137
- pending_tx_request: Dict[bytes32, bytes32] # tx_id: peer_id
138
- peers_with_tx: Dict[bytes32, Set[bytes32]] # tx_id: Set[peer_ids}
139
- tx_fetch_tasks: Dict[bytes32, asyncio.Task[None]] # Task id: task
137
+ pending_tx_request: dict[bytes32, bytes32] # tx_id: peer_id
138
+ peers_with_tx: dict[bytes32, set[bytes32]] # tx_id: set[peer_ids}
139
+ tx_fetch_tasks: dict[bytes32, asyncio.Task[None]] # Task id: task
140
140
  serialized_wp_message: Optional[Message]
141
141
  serialized_wp_message_tip: Optional[bytes32]
142
142
 
@@ -166,7 +166,7 @@ class FullNodeStore:
166
166
 
167
167
  def is_requesting_unfinished_block(
168
168
  self, reward_block_hash: bytes32, foliage_hash: Optional[bytes32]
169
- ) -> Tuple[bool, int]:
169
+ ) -> tuple[bool, int]:
170
170
  """
171
171
  Asks if we are already requesting this specific unfinished block (given
172
172
  the reward block hash and foliage hash). The returned bool is true if we
@@ -212,7 +212,7 @@ class FullNodeStore:
212
212
 
213
213
  def get_candidate_block(
214
214
  self, quality_string: bytes32, backup: bool = False
215
- ) -> Optional[Tuple[uint32, UnfinishedBlock]]:
215
+ ) -> Optional[tuple[uint32, UnfinishedBlock]]:
216
216
  if backup:
217
217
  return self.candidate_backup_blocks.get(quality_string, None)
218
218
  else:
@@ -268,12 +268,12 @@ class FullNodeStore:
268
268
  # deterministic property.
269
269
  # this sorts the UnfinishedBlocks by the foliage hash, and picks the
270
270
  # smallest hash
271
- foliage_hash, block = find_best_block(result)
271
+ _foliage_hash, block = find_best_block(result)
272
272
  return block
273
273
 
274
274
  def get_unfinished_block2(
275
275
  self, unfinished_reward_hash: bytes32, unfinished_foliage_hash: Optional[bytes32]
276
- ) -> Tuple[Optional[UnfinishedBlock], int, bool]:
276
+ ) -> tuple[Optional[UnfinishedBlock], int, bool]:
277
277
  """
278
278
  Looks up an UnfinishedBlock by its reward block hash and foliage hash.
279
279
  If the foliage hash is None (e.g. it's not a transaction block), we fall
@@ -315,8 +315,8 @@ class FullNodeStore:
315
315
  return result.get(unfinished_foliage_hash)
316
316
 
317
317
  # returns all unfinished blocks for the specified height
318
- def get_unfinished_blocks(self, height: uint32) -> List[UnfinishedBlock]:
319
- ret: List[UnfinishedBlock] = []
318
+ def get_unfinished_blocks(self, height: uint32) -> list[UnfinishedBlock]:
319
+ ret: list[UnfinishedBlock] = []
320
320
  for entry in self._unfinished_blocks.values():
321
321
  for ube in entry.values():
322
322
  if ube.height == height and ube.unfinished_block is not None:
@@ -324,9 +324,9 @@ class FullNodeStore:
324
324
  return ret
325
325
 
326
326
  def clear_unfinished_blocks_below(self, height: uint32) -> None:
327
- del_partial: List[bytes32] = []
327
+ del_partial: list[bytes32] = []
328
328
  for partial_hash, entry in self._unfinished_blocks.items():
329
- del_foliage: List[Optional[bytes32]] = []
329
+ del_foliage: list[Optional[bytes32]] = []
330
330
  for foliage_hash, ube in entry.items():
331
331
  if ube.height < height:
332
332
  del_foliage.append(foliage_hash)
@@ -377,12 +377,12 @@ class FullNodeStore:
377
377
  self.future_sp_cache[signage_point.rc_vdf.challenge].append((index, signage_point))
378
378
  log.info(f"Don't have rc hash {signage_point.rc_vdf.challenge.hex()}. caching signage point {index}.")
379
379
 
380
- def get_future_ip(self, rc_challenge_hash: bytes32) -> List[timelord_protocol.NewInfusionPointVDF]:
380
+ def get_future_ip(self, rc_challenge_hash: bytes32) -> list[timelord_protocol.NewInfusionPointVDF]:
381
381
  return self.future_ip_cache.get(rc_challenge_hash, [])
382
382
 
383
383
  def clear_old_cache_entries(self) -> None:
384
384
  current_time: int = int(time.time())
385
- remove_keys: List[bytes32] = []
385
+ remove_keys: list[bytes32] = []
386
386
  for rc_hash, time_added in self.future_cache_key_times.items():
387
387
  if current_time - time_added > 3600:
388
388
  remove_keys.append(rc_hash)
@@ -395,7 +395,7 @@ class FullNodeStore:
395
395
  def clear_slots(self) -> None:
396
396
  self.finished_sub_slots.clear()
397
397
 
398
- def get_sub_slot(self, challenge_hash: bytes32) -> Optional[Tuple[EndOfSubSlotBundle, int, uint128]]:
398
+ def get_sub_slot(self, challenge_hash: bytes32) -> Optional[tuple[EndOfSubSlotBundle, int, uint128]]:
399
399
  assert len(self.finished_sub_slots) >= 1
400
400
  for index, (sub_slot, _, total_iters) in enumerate(self.finished_sub_slots):
401
401
  if sub_slot is not None and sub_slot.challenge_chain.get_hash() == challenge_hash:
@@ -414,7 +414,7 @@ class FullNodeStore:
414
414
  next_sub_slot_iters: uint64,
415
415
  next_difficulty: uint64,
416
416
  peak_full_block: Optional[FullBlock],
417
- ) -> Optional[List[timelord_protocol.NewInfusionPointVDF]]:
417
+ ) -> Optional[list[timelord_protocol.NewInfusionPointVDF]]:
418
418
  """
419
419
  Returns false if not added. Returns a list if added. The list contains all infusion points that depended
420
420
  on this sub slot
@@ -671,7 +671,7 @@ class FullNodeStore:
671
671
  new_cc_hash = eos.challenge_chain.get_hash()
672
672
  self.recent_eos.put(new_cc_hash, (eos, time.time()))
673
673
 
674
- new_ips: List[timelord_protocol.NewInfusionPointVDF] = []
674
+ new_ips: list[timelord_protocol.NewInfusionPointVDF] = []
675
675
  for ip in self.future_ip_cache.get(eos.reward_chain.get_hash(), []):
676
676
  new_ips.append(ip)
677
677
 
@@ -904,8 +904,8 @@ class FullNodeStore:
904
904
  self.initialize_genesis_sub_slot()
905
905
  else:
906
906
  # This is not the first sub-slot in the chain
907
- sp_sub_slot_sps: List[Optional[SignagePoint]] = [None] * self.constants.NUM_SPS_SUB_SLOT
908
- ip_sub_slot_sps: List[Optional[SignagePoint]] = [None] * self.constants.NUM_SPS_SUB_SLOT
907
+ sp_sub_slot_sps: list[Optional[SignagePoint]] = [None] * self.constants.NUM_SPS_SUB_SLOT
908
+ ip_sub_slot_sps: list[Optional[SignagePoint]] = [None] * self.constants.NUM_SPS_SUB_SLOT
909
909
 
910
910
  if fork_block is not None and fork_block.sub_slot_iters != peak.sub_slot_iters:
911
911
  # If there was a reorg and a difficulty adjustment, just clear all the slots
@@ -921,7 +921,7 @@ class FullNodeStore:
921
921
  if fork_block is None:
922
922
  # If this is not a reorg, we still want to remove signage points after the new peak
923
923
  fork_block = peak
924
- replaced_sps: List[Optional[SignagePoint]] = [] # index 0 is the end of sub slot
924
+ replaced_sps: list[Optional[SignagePoint]] = [] # index 0 is the end of sub slot
925
925
  for i, sp in enumerate(sps):
926
926
  if (total_iters + i * interval_iters) < fork_block.total_iters:
927
927
  # Sps before the fork point as still valid
@@ -951,10 +951,10 @@ class FullNodeStore:
951
951
  self.finished_sub_slots.append((ip_sub_slot, ip_sub_slot_sps, ip_sub_slot_total_iters))
952
952
 
953
953
  new_eos: Optional[EndOfSubSlotBundle] = None
954
- new_sps: List[Tuple[uint8, SignagePoint]] = []
955
- new_ips: List[timelord_protocol.NewInfusionPointVDF] = []
954
+ new_sps: list[tuple[uint8, SignagePoint]] = []
955
+ new_ips: list[timelord_protocol.NewInfusionPointVDF] = []
956
956
 
957
- future_eos: List[EndOfSubSlotBundle] = self.future_eos_cache.get(peak.reward_infusion_new_challenge, []).copy()
957
+ future_eos: list[EndOfSubSlotBundle] = self.future_eos_cache.get(peak.reward_infusion_new_challenge, []).copy()
958
958
  for eos in future_eos:
959
959
  if (
960
960
  self.new_finished_sub_slot(eos, blocks, peak, next_sub_slot_iters, next_difficulty, peak_full_block)
@@ -963,7 +963,7 @@ class FullNodeStore:
963
963
  new_eos = eos
964
964
  break
965
965
 
966
- future_sps: List[Tuple[uint8, SignagePoint]] = self.future_sp_cache.get(
966
+ future_sps: list[tuple[uint8, SignagePoint]] = self.future_sp_cache.get(
967
967
  peak.reward_infusion_new_challenge, []
968
968
  ).copy()
969
969
  for index, sp in future_sps:
@@ -990,7 +990,7 @@ class FullNodeStore:
990
990
  block_records: BlockRecordsProtocol,
991
991
  prev_b: Optional[BlockRecord],
992
992
  last_challenge_to_add: bytes32,
993
- ) -> Optional[List[EndOfSubSlotBundle]]:
993
+ ) -> Optional[list[EndOfSubSlotBundle]]:
994
994
  """
995
995
  Retrieves the EndOfSubSlotBundles that are in the store either:
996
996
  1. From the starting challenge if prev_b is None
@@ -1015,7 +1015,7 @@ class FullNodeStore:
1015
1015
  # No additional slots to add
1016
1016
  return []
1017
1017
 
1018
- collected_sub_slots: List[EndOfSubSlotBundle] = []
1018
+ collected_sub_slots: list[EndOfSubSlotBundle] = []
1019
1019
  found_last_challenge = False
1020
1020
  found_connecting_challenge = False
1021
1021
  for sub_slot, sps, total_iters in self.finished_sub_slots[1:]:
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Callable, List, Optional, Set, Tuple
3
+ from typing import Callable, Optional
4
4
 
5
5
  from chia.consensus.blockchain import StateChangeSummary
6
6
  from chia.types.blockchain_format.sized_bytes import bytes32
@@ -10,16 +10,16 @@ def get_hints_and_subscription_coin_ids(
10
10
  state_change_summary: StateChangeSummary,
11
11
  has_coin_subscription: Callable[[bytes32], bool],
12
12
  has_puzzle_subscription: Callable[[bytes32], bool],
13
- ) -> Tuple[List[Tuple[bytes32, bytes]], List[bytes32]]:
13
+ ) -> tuple[list[tuple[bytes32, bytes]], list[bytes32]]:
14
14
  # Precondition: all hints passed in are max 32 bytes long
15
15
  # Returns the hints that we need to add to the DB, and the coin ids that need to be looked up
16
16
 
17
17
  # Finds the coin IDs that we need to lookup in order to notify wallets of hinted transactions
18
18
  hint: Optional[bytes]
19
- hints_to_add: List[Tuple[bytes32, bytes]] = []
19
+ hints_to_add: list[tuple[bytes32, bytes]] = []
20
20
 
21
21
  # Goes through additions and removals for each block and flattens to a map and a set
22
- lookup_coin_ids: Set[bytes32] = set()
22
+ lookup_coin_ids: set[bytes32] = set()
23
23
 
24
24
  def add_if_coin_subscription(coin_id: bytes32) -> None:
25
25
  if has_coin_subscription(coin_id):
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  import logging
5
- from typing import List, Set, Tuple
6
5
 
7
6
  import typing_extensions
8
7
 
@@ -32,23 +31,23 @@ class HintStore:
32
31
  await conn.execute("CREATE INDEX IF NOT EXISTS hint_index on hints(hint)")
33
32
  return self
34
33
 
35
- async def get_coin_ids(self, hint: bytes, *, max_items: int = 50000) -> List[bytes32]:
34
+ async def get_coin_ids(self, hint: bytes, *, max_items: int = 50000) -> list[bytes32]:
36
35
  async with self.db_wrapper.reader_no_transaction() as conn:
37
36
  cursor = await conn.execute("SELECT coin_id from hints WHERE hint=? LIMIT ?", (hint, max_items))
38
37
  rows = await cursor.fetchall()
39
38
  await cursor.close()
40
39
  return [bytes32(row[0]) for row in rows]
41
40
 
42
- async def get_coin_ids_multi(self, hints: Set[bytes], *, max_items: int = 50000) -> List[bytes32]:
43
- coin_ids: List[bytes32] = []
41
+ async def get_coin_ids_multi(self, hints: set[bytes], *, max_items: int = 50000) -> list[bytes32]:
42
+ coin_ids: list[bytes32] = []
44
43
 
45
44
  async with self.db_wrapper.reader_no_transaction() as conn:
46
45
  for batch in to_batches(hints, SQLITE_MAX_VARIABLE_NUMBER):
47
- hints_db: Tuple[bytes, ...] = tuple(batch.entries)
46
+ hints_db: tuple[bytes, ...] = tuple(batch.entries)
48
47
  cursor = await conn.execute(
49
48
  f"SELECT coin_id from hints INDEXED BY hint_index "
50
49
  f'WHERE hint IN ({"?," * (len(batch.entries) - 1)}?) LIMIT ?',
51
- hints_db + (max_items,),
50
+ (*hints_db, max_items),
52
51
  )
53
52
  rows = await cursor.fetchall()
54
53
  coin_ids.extend([bytes32(row[0]) for row in rows])
@@ -56,12 +55,12 @@ class HintStore:
56
55
 
57
56
  return coin_ids
58
57
 
59
- async def get_hints(self, coin_ids: List[bytes32]) -> List[bytes32]:
60
- hints: List[bytes32] = []
58
+ async def get_hints(self, coin_ids: list[bytes32]) -> list[bytes32]:
59
+ hints: list[bytes32] = []
61
60
 
62
61
  async with self.db_wrapper.reader_no_transaction() as conn:
63
62
  for batch in to_batches(coin_ids, SQLITE_MAX_VARIABLE_NUMBER):
64
- coin_ids_db: Tuple[bytes32, ...] = tuple(batch.entries)
63
+ coin_ids_db: tuple[bytes32, ...] = tuple(batch.entries)
65
64
  cursor = await conn.execute(
66
65
  f'SELECT hint from hints WHERE coin_id IN ({"?," * (len(batch.entries) - 1)}?)',
67
66
  coin_ids_db,
@@ -72,7 +71,7 @@ class HintStore:
72
71
 
73
72
  return hints
74
73
 
75
- async def add_hints(self, coin_hint_list: List[Tuple[bytes32, bytes]]) -> None:
74
+ async def add_hints(self, coin_hint_list: list[tuple[bytes32, bytes]]) -> None:
76
75
  if len(coin_hint_list) == 0:
77
76
  return None
78
77
 
chia/full_node/mempool.py CHANGED
@@ -2,11 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import sqlite3
5
+ from collections.abc import Awaitable, Iterator
5
6
  from dataclasses import dataclass
6
7
  from datetime import datetime
7
8
  from enum import Enum
8
9
  from time import monotonic
9
- from typing import Awaitable, Callable, Dict, Iterator, List, Optional, Set, Tuple
10
+ from typing import Callable, Optional
10
11
 
11
12
  from chia_rs import AugSchemeMPL, Coin, G2Element
12
13
 
@@ -50,13 +51,13 @@ MEMPOOL_ITEM_FEE_LIMIT = 2**50
50
51
 
51
52
  @dataclass
52
53
  class MempoolRemoveInfo:
53
- items: List[InternalMempoolItem]
54
+ items: list[InternalMempoolItem]
54
55
  reason: MempoolRemoveReason
55
56
 
56
57
 
57
58
  @dataclass
58
59
  class MempoolAddInfo:
59
- removals: List[MempoolRemoveInfo]
60
+ removals: list[MempoolRemoveInfo]
60
61
  error: Optional[Err]
61
62
 
62
63
 
@@ -71,7 +72,7 @@ class Mempool:
71
72
  _db_conn: sqlite3.Connection
72
73
  # it's expensive to serialize and deserialize G2Element, so we keep those in
73
74
  # this separate dictionary
74
- _items: Dict[bytes32, InternalMempoolItem]
75
+ _items: dict[bytes32, InternalMempoolItem]
75
76
 
76
77
  # the most recent block height and timestamp that we know of
77
78
  _block_height: uint32
@@ -164,18 +165,18 @@ class Mempool:
164
165
  for row in cursor:
165
166
  yield self._row_to_item(row)
166
167
 
167
- def all_item_ids(self) -> List[bytes32]:
168
+ def all_item_ids(self) -> list[bytes32]:
168
169
  with self._db_conn:
169
170
  cursor = self._db_conn.execute("SELECT name FROM tx")
170
171
  return [bytes32(row[0]) for row in cursor]
171
172
 
172
- def items_with_coin_ids(self, coin_ids: Set[bytes32]) -> List[bytes32]:
173
+ def items_with_coin_ids(self, coin_ids: set[bytes32]) -> list[bytes32]:
173
174
  """
174
175
  Returns a list of transaction ids that spend or create any coins with the provided coin ids.
175
176
  This iterates over the internal items instead of using a query.
176
177
  """
177
178
 
178
- transaction_ids: List[bytes32] = []
179
+ transaction_ids: list[bytes32] = []
179
180
 
180
181
  for transaction_id, item in self._items.items():
181
182
  conds = item.conds
@@ -197,14 +198,14 @@ class Mempool:
197
198
 
198
199
  return transaction_ids
199
200
 
200
- def items_with_puzzle_hashes(self, puzzle_hashes: Set[bytes32], include_hints: bool) -> List[bytes32]:
201
+ def items_with_puzzle_hashes(self, puzzle_hashes: set[bytes32], include_hints: bool) -> list[bytes32]:
201
202
  """
202
203
  Returns a list of transaction ids that spend or create any coins
203
204
  with the provided puzzle hashes (or hints, if enabled).
204
205
  This iterates over the internal items instead of using a query.
205
206
  """
206
207
 
207
- transaction_ids: List[bytes32] = []
208
+ transaction_ids: list[bytes32] = []
208
209
 
209
210
  for transaction_id, item in self._items.items():
210
211
  conds = item.conds
@@ -261,8 +262,8 @@ class Mempool:
261
262
  for row in cursor:
262
263
  yield self._row_to_item(row)
263
264
 
264
- def get_items_by_coin_ids(self, spent_coin_ids: List[bytes32]) -> List[MempoolItem]:
265
- items: List[MempoolItem] = []
265
+ def get_items_by_coin_ids(self, spent_coin_ids: list[bytes32]) -> list[MempoolItem]:
266
+ items: list[MempoolItem] = []
266
267
  for batch in to_batches(spent_coin_ids, SQLITE_MAX_VARIABLE_NUMBER):
267
268
  args = ",".join(["?"] * len(batch.entries))
268
269
  cursor = self._db_conn.execute(
@@ -318,14 +319,14 @@ class Mempool:
318
319
 
319
320
  return self.remove_from_pool(to_remove, MempoolRemoveReason.EXPIRED)
320
321
 
321
- def remove_from_pool(self, items: List[bytes32], reason: MempoolRemoveReason) -> MempoolRemoveInfo:
322
+ def remove_from_pool(self, items: list[bytes32], reason: MempoolRemoveReason) -> MempoolRemoveInfo:
322
323
  """
323
324
  Removes an item from the mempool.
324
325
  """
325
326
  if items == []:
326
327
  return MempoolRemoveInfo([], reason)
327
328
 
328
- removed_items: List[MempoolItemInfo] = []
329
+ removed_items: list[MempoolItemInfo] = []
329
330
  if reason != MempoolRemoveReason.BLOCK_INCLUSION:
330
331
  for batch in to_batches(items, SQLITE_MAX_VARIABLE_NUMBER):
331
332
  args = ",".join(["?"] * len(batch.entries))
@@ -375,7 +376,7 @@ class Mempool:
375
376
  assert item.conds is not None
376
377
  assert item.cost <= self.mempool_info.max_block_clvm_cost
377
378
 
378
- removals: List[MempoolRemoveInfo] = []
379
+ removals: list[MempoolRemoveInfo] = []
379
380
 
380
381
  # we have certain limits on transactions that will expire soon
381
382
  # (in the next 15 minutes)
@@ -399,7 +400,7 @@ class Mempool:
399
400
  """,
400
401
  (time_cutoff, block_cutoff),
401
402
  )
402
- to_remove: List[bytes32] = []
403
+ to_remove: list[bytes32] = []
403
404
  for row in cursor:
404
405
  name, fee_per_cost, cumulative_cost = row
405
406
 
@@ -476,11 +477,11 @@ class Mempool:
476
477
  get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
477
478
  constants: ConsensusConstants,
478
479
  height: uint32,
479
- ) -> Optional[Tuple[SpendBundle, List[Coin]]]:
480
+ ) -> Optional[tuple[SpendBundle, list[Coin]]]:
480
481
  cost_sum = 0 # Checks that total cost does not exceed block maximum
481
482
  fee_sum = 0 # Checks that total fees don't exceed 64 bits
482
483
  processed_spend_bundles = 0
483
- additions: List[Coin] = []
484
+ additions: list[Coin] = []
484
485
  # This contains:
485
486
  # 1. A map of coin ID to a coin spend solution and its isolated cost
486
487
  # We reconstruct it for every bundle we create from mempool items because we
@@ -490,8 +491,8 @@ class Mempool:
490
491
  # recent unspent singleton data, to allow chaining fast forward
491
492
  # singleton spends
492
493
  eligible_coin_spends = EligibleCoinSpends()
493
- coin_spends: List[CoinSpend] = []
494
- sigs: List[G2Element] = []
494
+ coin_spends: list[CoinSpend] = []
495
+ sigs: list[G2Element] = []
495
496
  log.info(f"Starting to make block, max cost: {self.mempool_info.max_block_clvm_cost}")
496
497
  bundle_creation_start = monotonic()
497
498
  cursor = self._db_conn.execute("SELECT name, fee FROM tx ORDER BY fee_per_cost DESC, seq ASC")
@@ -500,6 +501,11 @@ class Mempool:
500
501
  name = bytes32(row[0])
501
502
  fee = int(row[1])
502
503
  item = self._items[name]
504
+
505
+ current_time = monotonic()
506
+ if current_time - bundle_creation_start > 1:
507
+ log.info(f"exiting early, already spent {current_time - bundle_creation_start:0.2f} s")
508
+ break
503
509
  if not item_inclusion_filter(name):
504
510
  continue
505
511
  try:
@@ -1,14 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Dict, List, Optional
4
+ from typing import Optional
5
5
 
6
- from chia_rs import DONT_VALIDATE_SIGNATURE, MEMPOOL_MODE, G2Element, get_flags_for_height_and_constants
6
+ from chia_rs import (
7
+ get_flags_for_height_and_constants,
8
+ run_chia_program,
9
+ )
7
10
  from chia_rs import get_puzzle_and_solution_for_coin2 as get_puzzle_and_solution_for_coin_rust
8
- from chia_rs import run_block_generator, run_block_generator2, run_chia_program
9
11
 
10
12
  from chia.consensus.constants import ConsensusConstants
11
- from chia.consensus.cost_calculator import NPCResult
12
13
  from chia.types.blockchain_format.coin import Coin
13
14
  from chia.types.blockchain_format.program import Program
14
15
  from chia.types.blockchain_format.sized_bytes import bytes32
@@ -18,7 +19,7 @@ from chia.types.generator_types import BlockGenerator
18
19
  from chia.types.spend_bundle_conditions import SpendBundleConditions
19
20
  from chia.util.condition_tools import conditions_for_solution
20
21
  from chia.util.errors import Err
21
- from chia.util.ints import uint16, uint32, uint64
22
+ from chia.util.ints import uint32, uint64
22
23
  from chia.wallet.puzzles.load_clvm import load_serialized_clvm_maybe_recompile
23
24
 
24
25
  DESERIALIZE_MOD = load_serialized_clvm_maybe_recompile(
@@ -28,38 +29,6 @@ DESERIALIZE_MOD = load_serialized_clvm_maybe_recompile(
28
29
  log = logging.getLogger(__name__)
29
30
 
30
31
 
31
- def get_name_puzzle_conditions(
32
- generator: BlockGenerator,
33
- max_cost: int,
34
- *,
35
- mempool_mode: bool,
36
- height: uint32,
37
- constants: ConsensusConstants,
38
- ) -> NPCResult:
39
- flags = get_flags_for_height_and_constants(height, constants) | DONT_VALIDATE_SIGNATURE
40
-
41
- if mempool_mode:
42
- flags = flags | MEMPOOL_MODE
43
-
44
- if height >= constants.HARD_FORK_HEIGHT:
45
- run_block = run_block_generator2
46
- else:
47
- run_block = run_block_generator
48
-
49
- try:
50
- block_args = generator.generator_refs
51
- err, result = run_block(bytes(generator.program), block_args, max_cost, flags, G2Element(), None, constants)
52
- assert (err is None) != (result is None)
53
- if err is not None:
54
- return NPCResult(uint16(err), None)
55
- else:
56
- assert result is not None
57
- return NPCResult(None, result)
58
- except BaseException:
59
- log.exception("get_name_puzzle_condition failed")
60
- return NPCResult(uint16(Err.GENERATOR_RUNTIME_ERROR.value), None)
61
-
62
-
63
32
  def get_puzzle_and_solution_for_coin(
64
33
  generator: BlockGenerator, coin: Coin, height: int, constants: ConsensusConstants
65
34
  ) -> SpendInfo:
@@ -76,7 +45,7 @@ def get_puzzle_and_solution_for_coin(
76
45
  raise ValueError(f"Failed to get puzzle and solution for coin {coin}, error: {e}") from e
77
46
 
78
47
 
79
- def get_spends_for_block(generator: BlockGenerator, height: int, constants: ConsensusConstants) -> List[CoinSpend]:
48
+ def get_spends_for_block(generator: BlockGenerator, height: int, constants: ConsensusConstants) -> list[CoinSpend]:
80
49
  args = bytearray(b"\xff")
81
50
  args += bytes(DESERIALIZE_MOD)
82
51
  args += b"\xff"
@@ -90,7 +59,7 @@ def get_spends_for_block(generator: BlockGenerator, height: int, constants: Cons
90
59
  get_flags_for_height_and_constants(height, constants),
91
60
  )
92
61
 
93
- spends: List[CoinSpend] = []
62
+ spends: list[CoinSpend] = []
94
63
 
95
64
  for spend in Program.to(ret).first().as_iter():
96
65
  parent, puzzle, amount, solution = spend.as_iter()
@@ -103,7 +72,7 @@ def get_spends_for_block(generator: BlockGenerator, height: int, constants: Cons
103
72
 
104
73
  def get_spends_for_block_with_conditions(
105
74
  generator: BlockGenerator, height: int, constants: ConsensusConstants
106
- ) -> List[CoinSpendWithConditions]:
75
+ ) -> list[CoinSpendWithConditions]:
107
76
  args = bytearray(b"\xff")
108
77
  args += bytes(DESERIALIZE_MOD)
109
78
  args += b"\xff"
@@ -119,7 +88,7 @@ def get_spends_for_block_with_conditions(
119
88
  flags,
120
89
  )
121
90
 
122
- spends: List[CoinSpendWithConditions] = []
91
+ spends: list[CoinSpendWithConditions] = []
123
92
 
124
93
  for spend in Program.to(ret).first().as_iter():
125
94
  parent, puzzle, amount, solution = spend.as_iter()
@@ -133,7 +102,7 @@ def get_spends_for_block_with_conditions(
133
102
 
134
103
 
135
104
  def mempool_check_time_locks(
136
- removal_coin_records: Dict[bytes32, CoinRecord],
105
+ removal_coin_records: dict[bytes32, CoinRecord],
137
106
  bundle_conds: SpendBundleConditions,
138
107
  prev_transaction_block_height: uint32,
139
108
  timestamp: uint64,