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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/timelord/timelord.py CHANGED
@@ -7,11 +7,13 @@ import io
7
7
  import logging
8
8
  import os
9
9
  import random
10
+ import tempfile
10
11
  import time
11
12
  import traceback
13
+ from collections.abc import AsyncIterator
12
14
  from concurrent.futures import ThreadPoolExecutor
13
15
  from pathlib import Path
14
- from typing import TYPE_CHECKING, Any, AsyncIterator, ClassVar, Dict, List, Optional, Set, Tuple, cast
16
+ from typing import IO, TYPE_CHECKING, Any, ClassVar, Optional, cast
15
17
 
16
18
  from chiavdf import create_discriminant, prove
17
19
 
@@ -40,6 +42,7 @@ from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
40
42
  from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
41
43
  from chia.util.ints import uint8, uint16, uint32, uint64, uint128
42
44
  from chia.util.streamable import Streamable, streamable
45
+ from chia.util.task_referencer import create_referenced_task
43
46
 
44
47
  log = logging.getLogger(__name__)
45
48
 
@@ -52,7 +55,7 @@ class BlueboxProcessData(Streamable):
52
55
  iters: uint64
53
56
 
54
57
 
55
- def prove_bluebox_slow(payload: bytes) -> bytes:
58
+ def prove_bluebox_slow(payload: bytes, executor_shutdown_tempfile_name: str) -> bytes:
56
59
  bluebox_process_data = BlueboxProcessData.from_bytes(payload)
57
60
  initial_el = b"\x08" + (b"\x00" * 99)
58
61
  return cast(
@@ -62,10 +65,15 @@ def prove_bluebox_slow(payload: bytes) -> bytes:
62
65
  initial_el,
63
66
  bluebox_process_data.size_bits,
64
67
  bluebox_process_data.iters,
68
+ executor_shutdown_tempfile_name,
65
69
  ),
66
70
  )
67
71
 
68
72
 
73
+ def _create_shutdown_file() -> IO[bytes]:
74
+ return tempfile.NamedTemporaryFile(prefix="chia_timelord_executor_shutdown_trigger")
75
+
76
+
69
77
  class Timelord:
70
78
  if TYPE_CHECKING:
71
79
  from chia.rpc.rpc_server import RpcServiceProtocol
@@ -81,50 +89,50 @@ class Timelord:
81
89
 
82
90
  return self._server
83
91
 
84
- def __init__(self, root_path: Path, config: Dict[str, Any], constants: ConsensusConstants) -> None:
92
+ def __init__(self, root_path: Path, config: dict[str, Any], constants: ConsensusConstants) -> None:
85
93
  self.config = config
86
94
  self.root_path = root_path
87
95
  self.constants = constants
88
96
  self._shut_down = False
89
- self.free_clients: List[Tuple[str, asyncio.StreamReader, asyncio.StreamWriter]] = []
97
+ self.free_clients: list[tuple[str, asyncio.StreamReader, asyncio.StreamWriter]] = []
90
98
  self.ip_whitelist = self.config["vdf_clients"]["ip"]
91
99
  self._server: Optional[ChiaServer] = None
92
- self.chain_type_to_stream: Dict[Chain, Tuple[str, asyncio.StreamReader, asyncio.StreamWriter]] = {}
93
- self.chain_start_time: Dict[Chain, float] = {}
100
+ self.chain_type_to_stream: dict[Chain, tuple[str, asyncio.StreamReader, asyncio.StreamWriter]] = {}
101
+ self.chain_start_time: dict[Chain, float] = {}
94
102
  # Chains that currently don't have a vdf_client.
95
- self.unspawned_chains: List[Chain] = [
103
+ self.unspawned_chains: list[Chain] = [
96
104
  Chain.CHALLENGE_CHAIN,
97
105
  Chain.REWARD_CHAIN,
98
106
  Chain.INFUSED_CHALLENGE_CHAIN,
99
107
  ]
100
108
  # Chains that currently accept iterations.
101
- self.allows_iters: List[Chain] = []
109
+ self.allows_iters: list[Chain] = []
102
110
  # Last peak received, None if it's already processed.
103
111
  self.new_peak: Optional[timelord_protocol.NewPeakTimelord] = None
104
112
  # Last state received. Can either be a new peak or a new EndOfSubslotBundle.
105
113
  # Unfinished block info, iters adjusted to the last peak.
106
- self.unfinished_blocks: List[timelord_protocol.NewUnfinishedBlockTimelord] = []
114
+ self.unfinished_blocks: list[timelord_protocol.NewUnfinishedBlockTimelord] = []
107
115
  # Signage points iters, adjusted to the last peak.
108
- self.signage_point_iters: List[Tuple[uint64, uint8]] = []
116
+ self.signage_point_iters: list[tuple[uint64, uint8]] = []
109
117
  # For each chain, send those info when the process spawns.
110
- self.iters_to_submit: Dict[Chain, List[uint64]] = {}
111
- self.iters_submitted: Dict[Chain, List[uint64]] = {}
112
- self.iters_finished: Set[uint64] = set()
118
+ self.iters_to_submit: dict[Chain, list[uint64]] = {}
119
+ self.iters_submitted: dict[Chain, list[uint64]] = {}
120
+ self.iters_finished: set[uint64] = set()
113
121
  # For each iteration submitted, know if it's a signage point, an infusion point or an end of slot.
114
- self.iteration_to_proof_type: Dict[uint64, IterationType] = {}
122
+ self.iteration_to_proof_type: dict[uint64, IterationType] = {}
115
123
  # List of proofs finished.
116
- self.proofs_finished: List[Tuple[Chain, VDFInfo, VDFProof, int]] = []
124
+ self.proofs_finished: list[tuple[Chain, VDFInfo, VDFProof, int]] = []
117
125
  # Data to send at vdf_client initialization.
118
- self.overflow_blocks: List[timelord_protocol.NewUnfinishedBlockTimelord] = []
126
+ self.overflow_blocks: list[timelord_protocol.NewUnfinishedBlockTimelord] = []
119
127
  # Incremented each time `reset_chains` has been called.
120
128
  # Used to label proofs in `finished_proofs` and to only filter proofs corresponding to the most recent state.
121
129
  self.num_resets: int = 0
122
130
 
123
- self.process_communication_tasks: List[asyncio.Task[None]] = []
131
+ self.process_communication_tasks: list[asyncio.Task[None]] = []
124
132
  self.main_loop: Optional[asyncio.Task[None]] = None
125
133
  self.vdf_server: Optional[asyncio.base_events.Server] = None
126
134
  self._shut_down = False
127
- self.vdf_failures: List[Tuple[Chain, Optional[int]]] = []
135
+ self.vdf_failures: list[tuple[Chain, Optional[int]]] = []
128
136
  self.vdf_failures_count: int = 0
129
137
  self.vdf_failure_time: float = 0
130
138
  self.total_unfinished: int = 0
@@ -134,9 +142,10 @@ class Timelord:
134
142
  # Support backwards compatibility for the old `config.yaml` that has field `sanitizer_mode`.
135
143
  if not self.bluebox_mode:
136
144
  self.bluebox_mode = self.config.get("sanitizer_mode", False)
137
- self.pending_bluebox_info: List[Tuple[float, timelord_protocol.RequestCompactProofOfTime]] = []
145
+ self.pending_bluebox_info: list[tuple[float, timelord_protocol.RequestCompactProofOfTime]] = []
138
146
  self.last_active_time = time.time()
139
147
  self.max_allowed_inactivity_time = 60
148
+ self._executor_shutdown_tempfile: Optional[IO[bytes]] = None
140
149
  self.bluebox_pool: Optional[ThreadPoolExecutor] = None
141
150
 
142
151
  @contextlib.asynccontextmanager
@@ -150,24 +159,27 @@ class Timelord:
150
159
  self.last_state: LastState = LastState(self.constants)
151
160
  slow_bluebox = self.config.get("slow_bluebox", False)
152
161
  if not self.bluebox_mode:
153
- self.main_loop = asyncio.create_task(self._manage_chains())
162
+ self.main_loop = create_referenced_task(self._manage_chains())
154
163
  else:
155
164
  if os.name == "nt" or slow_bluebox:
156
165
  # `vdf_client` doesn't build on windows, use `prove()` from chiavdf.
157
166
  workers = self.config.get("slow_bluebox_process_count", 1)
167
+ self._executor_shutdown_tempfile = _create_shutdown_file()
158
168
  self.bluebox_pool = ThreadPoolExecutor(
159
169
  max_workers=workers,
160
170
  )
161
- self.main_loop = asyncio.create_task(
171
+ self.main_loop = create_referenced_task(
162
172
  self._start_manage_discriminant_queue_sanitizer_slow(self.bluebox_pool, workers)
163
173
  )
164
174
  else:
165
- self.main_loop = asyncio.create_task(self._manage_discriminant_queue_sanitizer())
175
+ self.main_loop = create_referenced_task(self._manage_discriminant_queue_sanitizer())
166
176
  log.info(f"Started timelord, listening on port {self.get_vdf_server_port()}")
167
177
  try:
168
178
  yield
169
179
  finally:
170
180
  self._shut_down = True
181
+ if self._executor_shutdown_tempfile is not None:
182
+ self._executor_shutdown_tempfile.close()
171
183
  for task in self.process_communication_tasks:
172
184
  task.cancel()
173
185
  if self.main_loop is not None:
@@ -175,7 +187,7 @@ class Timelord:
175
187
  if self.bluebox_pool is not None:
176
188
  self.bluebox_pool.shutdown()
177
189
 
178
- def get_connections(self, request_node_type: Optional[NodeType]) -> List[Dict[str, Any]]:
190
+ def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
179
191
  return default_get_connections(server=self.server, request_node_type=request_node_type)
180
192
 
181
193
  async def on_connect(self, connection: WSChiaConnection) -> None:
@@ -189,7 +201,7 @@ class Timelord:
189
201
  def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
190
202
  self.state_changed_callback = callback
191
203
 
192
- def state_changed(self, change: str, change_data: Optional[Dict[str, Any]] = None) -> None:
204
+ def state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> None:
193
205
  if self.state_changed_callback is not None:
194
206
  self.state_changed_callback(change, change_data)
195
207
 
@@ -206,18 +218,17 @@ class Timelord:
206
218
 
207
219
  async def _stop_chain(self, chain: Chain) -> None:
208
220
  try:
209
- _, _, stop_writer = self.chain_type_to_stream[chain]
221
+ _, _, stop_writer = self.chain_type_to_stream.pop(chain)
222
+ if chain not in self.unspawned_chains:
223
+ self.unspawned_chains.append(chain)
210
224
  if chain in self.allows_iters:
225
+ self.allows_iters.remove(chain)
211
226
  stop_writer.write(b"010")
212
227
  await stop_writer.drain()
213
- self.allows_iters.remove(chain)
214
228
  else:
215
229
  log.error(f"Trying to stop {chain} before its initialization.")
216
230
  stop_writer.close()
217
231
  await stop_writer.wait_closed()
218
- if chain not in self.unspawned_chains:
219
- self.unspawned_chains.append(chain)
220
- del self.chain_type_to_stream[chain]
221
232
  except ConnectionResetError as e:
222
233
  log.error(f"{e}")
223
234
  except Exception as e:
@@ -326,6 +337,11 @@ class Timelord:
326
337
  self.iteration_to_proof_type[new_block_iters] = IterationType.INFUSION_POINT
327
338
  # Remove all unfinished blocks that have already passed.
328
339
  self.unfinished_blocks = new_unfinished_blocks
340
+
341
+ # remove overflow blocks that were moved to unfinished cache
342
+ for block in new_unfinished_blocks:
343
+ if block in self.overflow_blocks:
344
+ self.overflow_blocks.remove(block)
329
345
  # Signage points.
330
346
  if not only_eos and len(self.signage_point_iters) > 0:
331
347
  count_signage = 0
@@ -407,7 +423,7 @@ class Timelord:
407
423
  assert challenge is not None
408
424
  assert initial_form is not None
409
425
  self.process_communication_tasks.append(
410
- asyncio.create_task(
426
+ create_referenced_task(
411
427
  self._do_process_communication(
412
428
  picked_chain, challenge, initial_form, ip, reader, writer, proof_label=self.num_resets
413
429
  )
@@ -431,7 +447,7 @@ class Timelord:
431
447
  writer.write(iter_str.encode())
432
448
  await writer.drain()
433
449
 
434
- def _clear_proof_list(self, iters: uint64) -> List[Tuple[Chain, VDFInfo, VDFProof, int]]:
450
+ def _clear_proof_list(self, iters: uint64) -> list[tuple[Chain, VDFInfo, VDFProof, int]]:
435
451
  return [
436
452
  (chain, info, proof, label)
437
453
  for chain, info, proof, label in self.proofs_finished
@@ -1082,6 +1098,8 @@ class Timelord:
1082
1098
 
1083
1099
  except ConnectionResetError as e:
1084
1100
  log.debug(f"Connection reset with VDF client {e}")
1101
+ except Exception:
1102
+ log.exception("VDF client communication terminated abruptly")
1085
1103
 
1086
1104
  async def _manage_discriminant_queue_sanitizer(self) -> None:
1087
1105
  while not self._shut_down:
@@ -1101,7 +1119,7 @@ class Timelord:
1101
1119
  info = self.pending_bluebox_info[0]
1102
1120
  ip, reader, writer = self.free_clients[0]
1103
1121
  self.process_communication_tasks.append(
1104
- asyncio.create_task(
1122
+ create_referenced_task(
1105
1123
  self._do_process_communication(
1106
1124
  Chain.BLUEBOX,
1107
1125
  info[1].new_proof_of_time.challenge,
@@ -1125,7 +1143,7 @@ class Timelord:
1125
1143
  async def _start_manage_discriminant_queue_sanitizer_slow(self, pool: ThreadPoolExecutor, counter: int) -> None:
1126
1144
  tasks = []
1127
1145
  for _ in range(counter):
1128
- tasks.append(asyncio.create_task(self._manage_discriminant_queue_sanitizer_slow(pool)))
1146
+ tasks.append(create_referenced_task(self._manage_discriminant_queue_sanitizer_slow(pool)))
1129
1147
  for task in tasks:
1130
1148
  await task
1131
1149
 
@@ -1167,6 +1185,7 @@ class Timelord:
1167
1185
  pool,
1168
1186
  prove_bluebox_slow,
1169
1187
  bytes(bluebox_process_data),
1188
+ "" if self._executor_shutdown_tempfile is None else self._executor_shutdown_tempfile.name,
1170
1189
  )
1171
1190
  t2 = time.time()
1172
1191
  delta = t2 - t1
@@ -1174,6 +1193,11 @@ class Timelord:
1174
1193
  ips = picked_info.new_proof_of_time.number_of_iterations / delta
1175
1194
  else:
1176
1195
  ips = 0
1196
+
1197
+ if len(proof) == 0:
1198
+ log.info(f"Empty VDF proof returned: {picked_info.height}. Time: {delta}s. IPS: {ips}.")
1199
+ return
1200
+
1177
1201
  log.info(f"Finished compact proof: {picked_info.height}. Time: {delta}s. IPS: {ips}.")
1178
1202
  output = proof[:100]
1179
1203
  proof_part = proof[100:200]
@@ -2,23 +2,29 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import time
5
- from typing import Optional
5
+ from typing import TYPE_CHECKING, ClassVar, Optional, cast
6
6
 
7
7
  from chia.protocols import timelord_protocol
8
8
  from chia.protocols.timelord_protocol import NewPeakTimelord
9
9
  from chia.rpc.rpc_server import StateChangedProtocol
10
+ from chia.server.api_protocol import ApiMetadata
10
11
  from chia.timelord.iters_from_block import iters_from_block
11
12
  from chia.timelord.timelord import Timelord
12
13
  from chia.timelord.types import Chain, IterationType
13
- from chia.util.api_decorators import api_request
14
14
  from chia.util.ints import uint64
15
15
 
16
16
  log = logging.getLogger(__name__)
17
17
 
18
18
 
19
19
  class TimelordAPI:
20
+ if TYPE_CHECKING:
21
+ from chia.server.api_protocol import ApiProtocol
22
+
23
+ _protocol_check: ClassVar[ApiProtocol] = cast("TimelordAPI", None)
24
+
20
25
  log: logging.Logger
21
26
  timelord: Timelord
27
+ metadata: ClassVar[ApiMetadata] = ApiMetadata()
22
28
 
23
29
  def __init__(self, timelord) -> None:
24
30
  self.log = logging.getLogger(__name__)
@@ -30,7 +36,7 @@ class TimelordAPI:
30
36
  def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
31
37
  self.timelord.state_changed_callback = callback
32
38
 
33
- @api_request()
39
+ @metadata.request()
34
40
  async def new_peak_timelord(self, new_peak: timelord_protocol.NewPeakTimelord) -> None:
35
41
  if self.timelord.last_state is None:
36
42
  return None
@@ -52,7 +58,7 @@ class TimelordAPI:
52
58
  new_peak.reward_chain_block.height == self.timelord.last_state.last_height + 1
53
59
  and self.check_orphaned_unfinished_block(new_peak) is True
54
60
  ):
55
- log.info("there is an unfinished block that this peak would orphan - " "skip peak")
61
+ log.info("there is an unfinished block that this peak would orphan - skip peak")
56
62
  self.timelord.state_changed("skipping_peak", {"height": new_peak.reward_chain_block.height})
57
63
  return
58
64
 
@@ -87,7 +93,7 @@ class TimelordAPI:
87
93
  return True
88
94
  return False
89
95
 
90
- @api_request()
96
+ @metadata.request()
91
97
  async def new_unfinished_block_timelord(self, new_unfinished_block: timelord_protocol.NewUnfinishedBlockTimelord):
92
98
  if self.timelord.last_state is None:
93
99
  return None
@@ -120,7 +126,7 @@ class TimelordAPI:
120
126
  self.timelord.total_unfinished += 1
121
127
  log.debug(f"Non-overflow unfinished block, total {self.timelord.total_unfinished}")
122
128
 
123
- @api_request()
129
+ @metadata.request()
124
130
  async def request_compact_proof_of_time(self, vdf_info: timelord_protocol.RequestCompactProofOfTime):
125
131
  async with self.timelord.lock:
126
132
  if not self.timelord.bluebox_mode:
@@ -7,15 +7,16 @@ import pathlib
7
7
  import signal
8
8
  import sys
9
9
  import time
10
+ from collections.abc import AsyncIterator
10
11
  from contextlib import asynccontextmanager
11
12
  from dataclasses import dataclass, field
12
13
  from types import FrameType
13
- from typing import Any, AsyncIterator, Dict, List, Optional
14
+ from typing import Any, Optional
14
15
 
15
16
  from chia.server.signal_handlers import SignalHandlers
16
17
  from chia.util.chia_logging import initialize_logging
17
18
  from chia.util.config import load_config
18
- from chia.util.default_root import DEFAULT_ROOT_PATH
19
+ from chia.util.default_root import resolve_root_path
19
20
  from chia.util.network import resolve
20
21
  from chia.util.setproctitle import setproctitle
21
22
 
@@ -26,7 +27,7 @@ log = logging.getLogger(__name__)
26
27
  class VDFClientProcessMgr:
27
28
  lock: asyncio.Lock = field(default_factory=asyncio.Lock)
28
29
  stopped: bool = False
29
- active_processes: List[asyncio.subprocess.Process] = field(default_factory=list)
30
+ active_processes: list[asyncio.subprocess.Process] = field(default_factory=list)
30
31
 
31
32
  async def remove_process(self, proc: asyncio.subprocess.Process) -> None:
32
33
  async with self.lock:
@@ -131,7 +132,7 @@ async def spawn_process(
131
132
  await proc.communicate()
132
133
 
133
134
 
134
- async def spawn_all_processes(config: Dict, net_config: Dict, process_mgr: VDFClientProcessMgr):
135
+ async def spawn_all_processes(config: dict, net_config: dict, process_mgr: VDFClientProcessMgr):
135
136
  await asyncio.sleep(5)
136
137
  hostname = net_config["self_hostname"] if "host" not in config else config["host"]
137
138
  port = config["port"]
@@ -152,7 +153,7 @@ async def spawn_all_processes(config: Dict, net_config: Dict, process_mgr: VDFCl
152
153
  await asyncio.gather(*awaitables)
153
154
 
154
155
 
155
- async def async_main(config: Dict[str, Any], net_config: Dict[str, Any]) -> None:
156
+ async def async_main(config: dict[str, Any], net_config: dict[str, Any]) -> None:
156
157
  process_mgr = VDFClientProcessMgr()
157
158
 
158
159
  async def stop(
@@ -174,8 +175,9 @@ async def async_main(config: Dict[str, Any], net_config: Dict[str, Any]) -> None
174
175
  def main():
175
176
  if os.name == "nt":
176
177
  log.info("Timelord launcher not supported on Windows.")
177
- return
178
- root_path = DEFAULT_ROOT_PATH
178
+ return 1
179
+ root_path = resolve_root_path(override=None)
180
+
179
181
  setproctitle("chia_timelord_launcher")
180
182
  net_config = load_config(root_path, "config.yaml")
181
183
  config = net_config["timelord_launcher"]
@@ -185,4 +187,4 @@ def main():
185
187
 
186
188
 
187
189
  if __name__ == "__main__":
188
- main()
190
+ sys.exit(main())
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import List, Optional, Tuple, Union
4
+ from typing import Optional, Union
5
5
 
6
6
  from chia.consensus.constants import ConsensusConstants
7
7
  from chia.protocols import timelord_protocol
@@ -44,7 +44,7 @@ class LastState:
44
44
  self.last_peak_challenge: bytes32 = constants.GENESIS_CHALLENGE
45
45
  self.difficulty: uint64 = constants.DIFFICULTY_STARTING
46
46
  self.sub_slot_iters: uint64 = constants.SUB_SLOT_ITERS_STARTING
47
- self.reward_challenge_cache: List[Tuple[bytes32, uint128]] = [(constants.GENESIS_CHALLENGE, uint128(0))]
47
+ self.reward_challenge_cache: list[tuple[bytes32, uint128]] = [(constants.GENESIS_CHALLENGE, uint128(0))]
48
48
  self.new_epoch = False
49
49
  self.passed_ses_height_but_not_yet_included = False
50
50
  self.infused_ses = False
@@ -121,7 +121,7 @@ class LastState:
121
121
  if overflow and self.new_epoch:
122
122
  # No overflows in new epoch
123
123
  return False
124
- if self.state_type == StateType.FIRST_SUB_SLOT or self.state_type == StateType.END_OF_SUB_SLOT:
124
+ if self.state_type in {StateType.FIRST_SUB_SLOT, StateType.END_OF_SUB_SLOT}:
125
125
  return True
126
126
  ss_start_iters = self.get_total_iters() - self.get_last_ip()
127
127
  already_infused_count: int = 0
@@ -160,7 +160,7 @@ class LastState:
160
160
  return self.state_type == StateType.END_OF_SUB_SLOT and self.infused_ses
161
161
 
162
162
  def get_next_sub_epoch_summary(self) -> Optional[SubEpochSummary]:
163
- if self.state_type == StateType.FIRST_SUB_SLOT or self.state_type == StateType.END_OF_SUB_SLOT:
163
+ if self.state_type in {StateType.FIRST_SUB_SLOT, StateType.END_OF_SUB_SLOT}:
164
164
  # Can only infuse SES after a peak (in an end of sub slot)
165
165
  return None
166
166
  assert self.peak is not None
@@ -233,7 +233,7 @@ class LastState:
233
233
  else:
234
234
  return None
235
235
  elif self.state_type == StateType.END_OF_SUB_SLOT:
236
- if chain == Chain.CHALLENGE_CHAIN or chain == Chain.REWARD_CHAIN:
236
+ if chain in {Chain.CHALLENGE_CHAIN, Chain.REWARD_CHAIN}:
237
237
  return ClassgroupElement.get_default_element()
238
238
  if chain == Chain.INFUSED_CHALLENGE_CHAIN:
239
239
  assert self.subslot_end is not None
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import List, Optional
3
+ from typing import Optional
4
4
 
5
5
  from typing_extensions import Protocol
6
6
 
@@ -17,4 +17,4 @@ class BlockInfo(Protocol):
17
17
  def transactions_generator(self) -> Optional[SerializedProgram]: ...
18
18
 
19
19
  @property
20
- def transactions_generator_ref_list(self) -> List[uint32]: ...
20
+ def transactions_generator_ref_list(self) -> list[uint32]: ...
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import List, Union
3
+ from typing import Union
4
4
 
5
5
  from chia_rs import Coin
6
6
 
@@ -11,11 +11,11 @@ from chia.util.ints import uint64
11
11
  __all__ = ["Coin", "coin_as_list", "hash_coin_ids"]
12
12
 
13
13
 
14
- def coin_as_list(c: Coin) -> List[Union[bytes32, uint64]]:
14
+ def coin_as_list(c: Coin) -> list[Union[bytes32, uint64]]:
15
15
  return [c.parent_coin_info, c.puzzle_hash, uint64(c.amount)]
16
16
 
17
17
 
18
- def hash_coin_ids(coin_ids: List[bytes32]) -> bytes32:
18
+ def hash_coin_ids(coin_ids: list[bytes32]) -> bytes32:
19
19
  if len(coin_ids) == 1:
20
20
  return std_hash(coin_ids[0])
21
21
 
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import io
4
- from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Set, Tuple, Type, TypeVar
4
+ from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar
5
5
 
6
- from chia_rs import ALLOW_BACKREFS, MEMPOOL_MODE, run_chia_program, tree_hash
6
+ from chia_rs import MEMPOOL_MODE, run_chia_program, tree_hash
7
7
  from clvm.casts import int_from_bytes
8
8
  from clvm.CLVMObject import CLVMStorage
9
9
  from clvm.EvalError import EvalError
@@ -11,11 +11,10 @@ from clvm.serialize import sexp_from_stream, sexp_to_stream
11
11
  from clvm.SExp import SExp
12
12
 
13
13
  from chia.types.blockchain_format.sized_bytes import bytes32
14
+ from chia.types.blockchain_format.tree_hash import sha256_treehash
14
15
  from chia.util.byte_types import hexstr_to_bytes
15
16
  from chia.util.hash import std_hash
16
17
 
17
- from .tree_hash import sha256_treehash
18
-
19
18
  INFINITE_COST = 11000000000
20
19
 
21
20
  DEFAULT_FLAGS = MEMPOOL_MODE
@@ -30,32 +29,32 @@ class Program(SExp):
30
29
  """
31
30
 
32
31
  @classmethod
33
- def parse(cls: Type[T_Program], f) -> T_Program:
32
+ def parse(cls: type[T_Program], f) -> T_Program:
34
33
  return sexp_from_stream(f, cls.to)
35
34
 
36
35
  def stream(self, f):
37
36
  sexp_to_stream(self, f)
38
37
 
39
38
  @classmethod
40
- def from_bytes(cls: Type[T_Program], blob: bytes) -> T_Program:
39
+ def from_bytes(cls: type[T_Program], blob: bytes) -> T_Program:
41
40
  # this runs the program "1", which just returns the first argument.
42
41
  # the first argument is the buffer we want to parse. This effectively
43
42
  # leverages the rust parser and LazyNode, making it a lot faster to
44
43
  # parse serialized programs into a python compatible structure
45
- cost, ret = run_chia_program(
44
+ _cost, ret = run_chia_program(
46
45
  b"\x01",
47
46
  blob,
48
47
  50,
49
- ALLOW_BACKREFS,
48
+ 0,
50
49
  )
51
50
  return cls.to(ret)
52
51
 
53
52
  @classmethod
54
- def fromhex(cls: Type[T_Program], hexstr: str) -> T_Program:
53
+ def fromhex(cls: type[T_Program], hexstr: str) -> T_Program:
55
54
  return cls.from_bytes(hexstr_to_bytes(hexstr))
56
55
 
57
56
  @classmethod
58
- def from_json_dict(cls: Type[Program], json_dict: Any) -> Program:
57
+ def from_json_dict(cls: type[Program], json_dict: Any) -> Program:
59
58
  if isinstance(json_dict, cls):
60
59
  return json_dict
61
60
  item = hexstr_to_bytes(json_dict)
@@ -66,7 +65,7 @@ class Program(SExp):
66
65
 
67
66
  def __bytes__(self) -> bytes:
68
67
  f = io.BytesIO()
69
- self.stream(f) # noqa
68
+ self.stream(f)
70
69
  return f.getvalue()
71
70
 
72
71
  def __str__(self) -> str:
@@ -124,21 +123,21 @@ class Program(SExp):
124
123
  def get_tree_hash(self) -> bytes32:
125
124
  return bytes32(tree_hash(bytes(self)))
126
125
 
127
- def _run(self, max_cost: int, flags: int, args: Any) -> Tuple[int, Program]:
126
+ def _run(self, max_cost: int, flags: int, args: Any) -> tuple[int, Program]:
128
127
  prog_args = Program.to(args)
129
128
  cost, r = run_chia_program(self.as_bin(), prog_args.as_bin(), max_cost, flags)
130
129
  return cost, Program.to(r)
131
130
 
132
- def run_with_cost(self, max_cost: int, args: Any, flags=DEFAULT_FLAGS) -> Tuple[int, Program]:
131
+ def run_with_cost(self, max_cost: int, args: Any, flags=DEFAULT_FLAGS) -> tuple[int, Program]:
133
132
  # when running puzzles in the wallet, default to enabling all soft-forks
134
133
  # as well as enabling mempool-mode (i.e. strict mode)
135
134
  return self._run(max_cost, flags, args)
136
135
 
137
136
  def run(self, args: Any, max_cost=INFINITE_COST, flags=DEFAULT_FLAGS) -> Program:
138
- cost, r = self._run(max_cost, flags, args)
137
+ _cost, r = self._run(max_cost, flags, args)
139
138
  return r
140
139
 
141
- def run_with_flags(self, max_cost: int, flags: int, args: Any) -> Tuple[int, Program]:
140
+ def run_with_flags(self, max_cost: int, flags: int, args: Any) -> tuple[int, Program]:
142
141
  return self._run(max_cost, flags, args)
143
142
 
144
143
  # Replicates the curry function from clvm_tools, taking advantage of *args
@@ -163,7 +162,7 @@ class Program(SExp):
163
162
  fixed_args = [4, (1, arg), fixed_args]
164
163
  return Program.to([2, (1, self), fixed_args])
165
164
 
166
- def uncurry(self) -> Tuple[Program, Program]:
165
+ def uncurry(self) -> tuple[Program, Program]:
167
166
  def match(o: CLVMStorage, expected: bytes) -> None:
168
167
  if o.atom != expected:
169
168
  raise ValueError(f"expected: {expected.hex()}")
@@ -216,7 +215,7 @@ class Program(SExp):
216
215
  EvalError = EvalError
217
216
 
218
217
 
219
- def _tree_hash(node: SExp, precalculated: Set[bytes32]) -> bytes32:
218
+ def _tree_hash(node: SExp, precalculated: set[bytes32]) -> bytes32:
220
219
  """
221
220
  Hash values in `precalculated` are presumed to have been hashed already.
222
221
  """
@@ -252,7 +251,7 @@ def _sexp_replace(sexp: T_CLVMStorage, to_sexp: Callable[[Any], T_Program], **kw
252
251
  # Now split `kwargs` into two groups: those
253
252
  # that start with `f` and those that start with `r`
254
253
 
255
- args_by_prefix: Dict[str, Dict[str, Any]] = {}
254
+ args_by_prefix: dict[str, dict[str, Any]] = {}
256
255
  for k, v in kwargs.items():
257
256
  c = k[0]
258
257
  if c not in "fr":
@@ -8,7 +8,7 @@ have to worry about blowing out the python stack.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
- from typing import Callable, List, Optional, Set, Union
11
+ from typing import Callable, Optional, Union
12
12
 
13
13
  from clvm.CLVMObject import CLVMStorage
14
14
  from clvm.SExp import SExp
@@ -17,12 +17,12 @@ from chia.types.blockchain_format.sized_bytes import bytes32
17
17
  from chia.util.hash import std_hash
18
18
 
19
19
  ValueType = Union[bytes, CLVMStorage]
20
- ValueStackType = List[ValueType]
21
- Op = Callable[[ValueStackType, "OpStackType", Set[bytes32]], None]
22
- OpStackType = List[Op]
20
+ ValueStackType = list[ValueType]
21
+ Op = Callable[[ValueStackType, "OpStackType", set[bytes32]], None]
22
+ OpStackType = list[Op]
23
23
 
24
24
 
25
- def sha256_treehash(sexp: CLVMStorage, precalculated: Optional[Set[bytes32]] = None) -> bytes32:
25
+ def sha256_treehash(sexp: CLVMStorage, precalculated: Optional[set[bytes32]] = None) -> bytes32:
26
26
  """
27
27
  Hash values in `precalculated` are presumed to have been hashed already.
28
28
  """
@@ -30,7 +30,7 @@ def sha256_treehash(sexp: CLVMStorage, precalculated: Optional[Set[bytes32]] = N
30
30
  if precalculated is None:
31
31
  precalculated = set()
32
32
 
33
- def handle_sexp(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: Set[bytes32]) -> None:
33
+ def handle_sexp(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: set[bytes32]) -> None:
34
34
  # just trusting it is right, otherwise we get an attribute error
35
35
  sexp: SExp = sexp_stack.pop() # type: ignore[assignment]
36
36
  if sexp.pair:
@@ -50,20 +50,20 @@ def sha256_treehash(sexp: CLVMStorage, precalculated: Optional[Set[bytes32]] = N
50
50
  r = std_hash(b"\1" + atom)
51
51
  sexp_stack.append(r)
52
52
 
53
- def handle_pair(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: Set[bytes32]) -> None:
53
+ def handle_pair(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: set[bytes32]) -> None:
54
54
  # just trusting it is right, otherwise we get a type error
55
55
  p0: bytes = sexp_stack.pop() # type: ignore[assignment]
56
56
  p1: bytes = sexp_stack.pop() # type: ignore[assignment]
57
57
  sexp_stack.append(std_hash(b"\2" + p0 + p1))
58
58
 
59
- def roll(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: Set[bytes32]) -> None:
59
+ def roll(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: set[bytes32]) -> None:
60
60
  p0 = sexp_stack.pop()
61
61
  p1 = sexp_stack.pop()
62
62
  sexp_stack.append(p0)
63
63
  sexp_stack.append(p1)
64
64
 
65
65
  sexp_stack: ValueStackType = [sexp]
66
- op_stack: List[Op] = [handle_sexp]
66
+ op_stack: list[Op] = [handle_sexp]
67
67
  while len(op_stack) > 0:
68
68
  op = op_stack.pop()
69
69
  op(sexp_stack, op_stack, precalculated)