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
@@ -7,12 +7,14 @@ import os
7
7
  import signal
8
8
  import subprocess
9
9
  import sys
10
+ from collections.abc import Iterator
10
11
  from datetime import datetime
11
12
  from pathlib import Path
12
- from typing import Iterator, Optional, TextIO
13
+ from typing import Optional, TextIO
13
14
 
14
15
  from chia.util.chia_version import chia_short_version
15
16
  from chia.util.config import lock_and_load_config
17
+ from chia.util.task_referencer import create_referenced_task
16
18
 
17
19
 
18
20
  @contextlib.contextmanager
@@ -59,7 +61,7 @@ async def run_plotter(root_path, plotter, args, progress_dict):
59
61
  process.terminate()
60
62
 
61
63
  # For Windows, we'll install a SIGINT handler to catch Ctrl-C (KeyboardInterrupt isn't raised)
62
- if sys.platform in ["win32", "cygwin"]:
64
+ if sys.platform in {"win32", "cygwin"}:
63
65
  signal.signal(signal.SIGINT, sigint_handler)
64
66
  installed_sigint_handler = True
65
67
 
@@ -82,13 +84,13 @@ async def run_plotter(root_path, plotter, args, progress_dict):
82
84
  try:
83
85
  await asyncio.wait(
84
86
  [
85
- asyncio.create_task(
87
+ create_referenced_task(
86
88
  _read_stream(
87
89
  process.stdout,
88
90
  process_stdout_line,
89
91
  )
90
92
  ),
91
- asyncio.create_task(
93
+ create_referenced_task(
92
94
  _read_stream(
93
95
  process.stderr,
94
96
  process_stderr_line,
chia/plotting/cache.py CHANGED
@@ -3,10 +3,11 @@ from __future__ import annotations
3
3
  import logging
4
4
  import time
5
5
  import traceback
6
+ from collections.abc import ItemsView, KeysView, ValuesView
6
7
  from dataclasses import dataclass, field
7
8
  from math import ceil
8
9
  from pathlib import Path
9
- from typing import Dict, ItemsView, KeysView, List, Optional, Tuple, ValuesView
10
+ from typing import Optional
10
11
 
11
12
  from chia_rs import G1Element
12
13
  from chiapos import DiskProver
@@ -37,7 +38,7 @@ class DiskCacheEntry(Streamable):
37
38
  @streamable
38
39
  @dataclass(frozen=True)
39
40
  class CacheDataV1(Streamable):
40
- entries: List[Tuple[str, DiskCacheEntry]]
41
+ entries: list[tuple[str, DiskCacheEntry]]
41
42
 
42
43
 
43
44
  @dataclass
@@ -84,7 +85,7 @@ class CacheEntry:
84
85
  class Cache:
85
86
  _path: Path
86
87
  _changed: bool = False
87
- _data: Dict[Path, CacheEntry] = field(default_factory=dict)
88
+ _data: dict[Path, CacheEntry] = field(default_factory=dict)
88
89
  expiry_seconds: int = 7 * 24 * 60 * 60 # Keep the cache entries alive for 7 days after its last access
89
90
 
90
91
  def __post_init__(self) -> None:
@@ -97,7 +98,7 @@ class Cache:
97
98
  self._data[path] = entry
98
99
  self._changed = True
99
100
 
100
- def remove(self, cache_keys: List[Path]) -> None:
101
+ def remove(self, cache_keys: list[Path]) -> None:
101
102
  for key in cache_keys:
102
103
  if key in self._data:
103
104
  del self._data[key]
@@ -105,7 +106,7 @@ class Cache:
105
106
 
106
107
  def save(self) -> None:
107
108
  try:
108
- disk_cache_entries: Dict[str, DiskCacheEntry] = {
109
+ disk_cache_entries: dict[str, DiskCacheEntry] = {
109
110
  str(path): DiskCacheEntry(
110
111
  bytes(cache_entry.prover),
111
112
  cache_entry.farmer_public_key,
@@ -136,8 +137,8 @@ class Cache:
136
137
  start = time.time()
137
138
  cache_data: CacheDataV1 = CacheDataV1.from_bytes(stored_cache.blob)
138
139
  self._data = {}
139
- estimated_c2_sizes: Dict[int, int] = {}
140
- measured_sizes: Dict[int, int] = {
140
+ estimated_c2_sizes: dict[int, int] = {}
141
+ measured_sizes: dict[int, int] = {
141
142
  32: 738,
142
143
  33: 1083,
143
144
  34: 1771,
@@ -6,7 +6,7 @@ from collections import Counter
6
6
  from pathlib import Path
7
7
  from threading import Lock
8
8
  from time import sleep, time
9
- from typing import List, Optional
9
+ from typing import Optional
10
10
 
11
11
  from chia_rs import G1Element
12
12
  from chiapos import Verifier
@@ -103,7 +103,7 @@ def check_plots(
103
103
  log.info("Plot filenames expected to end with -[64 char plot ID].plot")
104
104
 
105
105
  if list_duplicates:
106
- all_filenames: List[Path] = []
106
+ all_filenames: list[Path] = []
107
107
  for paths in get_plot_filenames(root_path).values():
108
108
  all_filenames += paths
109
109
  find_duplicate_plot_IDs(all_filenames)
@@ -135,7 +135,7 @@ def check_plots(
135
135
  log.info(f"Starting to test each plot with {num} challenges each\n")
136
136
  total_good_plots: Counter[str] = Counter()
137
137
  total_size = 0
138
- bad_plots_list: List[Path] = []
138
+ bad_plots_list: list[Path] = []
139
139
 
140
140
  with plot_manager:
141
141
 
@@ -148,7 +148,7 @@ def check_plots(
148
148
 
149
149
  # Look up local_sk from plot to save locked memory
150
150
  (
151
- pool_public_key_or_puzzle_hash,
151
+ _pool_public_key_or_puzzle_hash,
152
152
  farmer_public_key,
153
153
  local_master_sk,
154
154
  ) = parse_plot_info(pr.get_memo())
@@ -161,8 +161,8 @@ def check_plots(
161
161
  if plot_info.pool_contract_puzzle_hash is not None:
162
162
  pca: str = encode_puzzle_hash(plot_info.pool_contract_puzzle_hash, address_prefix)
163
163
  log.info(f"\t{'Pool contract address:':<23} {pca}")
164
- log.info(f"\t{'Farmer public key:' :<23} {farmer_public_key}")
165
- log.info(f"\t{'Local sk:' :<23} {local_sk}")
164
+ log.info(f"\t{'Farmer public key:':<23} {farmer_public_key}")
165
+ log.info(f"\t{'Local sk:':<23} {local_sk}")
166
166
 
167
167
  total_proofs = 0
168
168
  caught_exception: bool = False
@@ -229,14 +229,14 @@ def check_plots(
229
229
 
230
230
  if total_proofs > 0 and caught_exception is False:
231
231
  log.info(
232
- f"\tProofs {total_proofs} / {challenges}, {round(total_proofs/float(challenges), 4)}. "
232
+ f"\tProofs {total_proofs} / {challenges}, {round(total_proofs / float(challenges), 4)}. "
233
233
  f"Filepath: {plot_path}"
234
234
  )
235
235
  total_good_plots[pr.get_size()] += 1
236
236
  total_size += plot_path.stat().st_size
237
237
  else:
238
238
  log.error(
239
- f"\tProofs {total_proofs} / {challenges}, {round(total_proofs/float(challenges), 4)} "
239
+ f"\tProofs {total_proofs} / {challenges}, {round(total_proofs / float(challenges), 4)} "
240
240
  f"Filepath: {plot_path}"
241
241
  )
242
242
  bad_plots_list.append(plot_path)
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import logging
4
4
  from datetime import datetime
5
5
  from pathlib import Path
6
- from typing import Dict, List, Optional, Tuple
6
+ from typing import Optional
7
7
 
8
8
  from chia_rs import AugSchemeMPL, G1Element, PrivateKey
9
9
  from chiapos import DiskPlotter
@@ -105,7 +105,7 @@ class PlotKeysResolver:
105
105
  except Exception as e:
106
106
  log.error(f"Keychain proxy failed with error: {e}")
107
107
  else:
108
- sk_ent: Optional[Tuple[PrivateKey, bytes]] = None
108
+ sk_ent: Optional[tuple[PrivateKey, bytes]] = None
109
109
  keychain: Keychain = Keychain()
110
110
  if self.alt_fingerprint is not None:
111
111
  sk_ent = keychain.get_private_key_by_fingerprint(self.alt_fingerprint)
@@ -151,8 +151,8 @@ async def create_plots(
151
151
  args: Params,
152
152
  keys: PlotKeys,
153
153
  use_datetime: bool = True,
154
- test_private_keys: Optional[List[PrivateKey]] = None,
155
- ) -> Tuple[Dict[bytes32, Path], Dict[bytes32, Path]]:
154
+ test_private_keys: Optional[list[PrivateKey]] = None,
155
+ ) -> tuple[dict[bytes32, Path], dict[bytes32, Path]]:
156
156
  if args.tmp2_dir is None:
157
157
  args.tmp2_dir = args.tmp_dir
158
158
  assert (keys.pool_public_key is None) != (keys.pool_contract_puzzle_hash is None)
@@ -182,8 +182,8 @@ async def create_plots(
182
182
 
183
183
  args.final_dir.mkdir(parents=True, exist_ok=True)
184
184
 
185
- created_plots: Dict[bytes32, Path] = {}
186
- existing_plots: Dict[bytes32, Path] = {}
185
+ created_plots: dict[bytes32, Path] = {}
186
+ existing_plots: dict[bytes32, Path] = {}
187
187
  for i in range(num):
188
188
  # Generate a random master secret key
189
189
  if test_private_keys is not None:
chia/plotting/manager.py CHANGED
@@ -6,7 +6,7 @@ import time
6
6
  import traceback
7
7
  from concurrent.futures.thread import ThreadPoolExecutor
8
8
  from pathlib import Path
9
- from typing import Any, Callable, Dict, List, Optional, Set, Tuple
9
+ from typing import Any, Callable, Optional
10
10
 
11
11
  from chia_rs import G1Element
12
12
  from chiapos import DiskProver, decompressor_context_queue
@@ -27,13 +27,13 @@ log = logging.getLogger(__name__)
27
27
 
28
28
 
29
29
  class PlotManager:
30
- plots: Dict[Path, PlotInfo]
31
- plot_filename_paths: Dict[str, Tuple[str, Set[str]]]
30
+ plots: dict[Path, PlotInfo]
31
+ plot_filename_paths: dict[str, tuple[str, set[str]]]
32
32
  plot_filename_paths_lock: threading.Lock
33
- failed_to_open_filenames: Dict[Path, int]
34
- no_key_filenames: Set[Path]
35
- farmer_public_keys: List[G1Element]
36
- pool_public_keys: List[G1Element]
33
+ failed_to_open_filenames: dict[Path, int]
34
+ no_key_filenames: set[Path]
35
+ farmer_public_keys: list[G1Element]
36
+ pool_public_keys: list[G1Element]
37
37
  cache: Cache
38
38
  match_str: Optional[str]
39
39
  open_no_key_filenames: bool
@@ -137,7 +137,7 @@ class PlotManager:
137
137
  def set_refresh_callback(self, callback: Callable):
138
138
  self._refresh_callback = callback
139
139
 
140
- def set_public_keys(self, farmer_public_keys: List[G1Element], pool_public_keys: List[G1Element]):
140
+ def set_public_keys(self, farmer_public_keys: list[G1Element], pool_public_keys: list[G1Element]):
141
141
  self.farmer_public_keys = farmer_public_keys
142
142
  self.pool_public_keys = pool_public_keys
143
143
 
@@ -151,7 +151,7 @@ class PlotManager:
151
151
  with self:
152
152
  return len(self.plots)
153
153
 
154
- def get_duplicates(self) -> List[Path]:
154
+ def get_duplicates(self) -> list[Path]:
155
155
  result = []
156
156
  for plot_filename, paths_entry in self.plot_filename_paths.items():
157
157
  _, duplicated_paths = paths_entry
@@ -188,9 +188,9 @@ class PlotManager:
188
188
  if not self._refreshing_enabled:
189
189
  return
190
190
 
191
- plot_filenames: Dict[Path, List[Path]] = get_plot_filenames(self.root_path)
192
- plot_directories: Set[Path] = set(plot_filenames.keys())
193
- plot_paths: Set[Path] = set()
191
+ plot_filenames: dict[Path, list[Path]] = get_plot_filenames(self.root_path)
192
+ plot_directories: set[Path] = set(plot_filenames.keys())
193
+ plot_paths: set[Path] = set()
194
194
  for paths in plot_filenames.values():
195
195
  plot_paths.update(paths)
196
196
 
@@ -208,7 +208,7 @@ class PlotManager:
208
208
  if path not in plot_paths:
209
209
  self.no_key_filenames.remove(path)
210
210
 
211
- filenames_to_remove: List[str] = []
211
+ filenames_to_remove: list[str] = []
212
212
  for plot_filename, paths_entry in self.plot_filename_paths.items():
213
213
  loaded_path, duplicated_paths = paths_entry
214
214
  loaded_plot = Path(loaded_path) / Path(plot_filename)
@@ -221,7 +221,7 @@ class PlotManager:
221
221
  # No need to check the duplicates here since we drop the whole entry
222
222
  continue
223
223
 
224
- paths_to_remove: List[str] = []
224
+ paths_to_remove: list[str] = []
225
225
  for path_str in duplicated_paths:
226
226
  loaded_plot = Path(path_str) / Path(plot_filename)
227
227
  if loaded_plot not in plot_paths:
@@ -258,7 +258,7 @@ class PlotManager:
258
258
 
259
259
  # Cleanup unused cache
260
260
  self.log.debug(f"_refresh_task: cached entries before cleanup: {len(self.cache)}")
261
- remove_paths: List[Path] = []
261
+ remove_paths: list[Path] = []
262
262
  for path, cache_entry in self.cache.items():
263
263
  if cache_entry.expired(Cache.expiry_seconds) and path not in self.plots:
264
264
  remove_paths.append(path)
@@ -281,7 +281,7 @@ class PlotManager:
281
281
  log.error(f"_refresh_callback raised: {e} with the traceback: {traceback.format_exc()}")
282
282
  self.reset()
283
283
 
284
- def refresh_batch(self, plot_paths: List[Path], plot_directories: Set[Path]) -> PlotRefreshResult:
284
+ def refresh_batch(self, plot_paths: list[Path], plot_directories: set[Path]) -> PlotRefreshResult:
285
285
  start_time: float = time.time()
286
286
  result: PlotRefreshResult = PlotRefreshResult(processed=len(plot_paths))
287
287
  counter_lock = threading.Lock()
@@ -308,11 +308,11 @@ class PlotManager:
308
308
  if file_path in self.plots:
309
309
  return self.plots[file_path]
310
310
 
311
- entry: Optional[Tuple[str, Set[str]]] = self.plot_filename_paths.get(file_path.name)
311
+ entry: Optional[tuple[str, set[str]]] = self.plot_filename_paths.get(file_path.name)
312
312
  if entry is not None:
313
- loaded_parent, duplicates = entry
313
+ _loaded_parent, duplicates = entry
314
314
  if str(file_path.parent) in duplicates:
315
- log.debug(f"Skip duplicated plot {str(file_path)}")
315
+ log.debug(f"Skip duplicated plot {file_path!s}")
316
316
  return None
317
317
  try:
318
318
  if not file_path.exists():
@@ -325,7 +325,7 @@ class PlotManager:
325
325
  if not cache_hit:
326
326
  prover = DiskProver(str(file_path))
327
327
 
328
- log.debug(f"process_file {str(file_path)}")
328
+ log.debug(f"process_file {file_path!s}")
329
329
 
330
330
  expected_size = _expected_plot_size(prover.get_size()) * UI_ACTUAL_SPACE_CONSTANT_FACTOR
331
331
 
@@ -383,7 +383,7 @@ class PlotManager:
383
383
  self.no_key_filenames.remove(file_path)
384
384
 
385
385
  with self.plot_filename_paths_lock:
386
- paths: Optional[Tuple[str, Set[str]]] = self.plot_filename_paths.get(file_path.name)
386
+ paths: Optional[tuple[str, set[str]]] = self.plot_filename_paths.get(file_path.name)
387
387
  if paths is None:
388
388
  paths = (str(Path(cache_entry.prover.get_filename()).parent), set())
389
389
  self.plot_filename_paths[file_path.name] = paths
@@ -419,7 +419,7 @@ class PlotManager:
419
419
  return new_plot_info
420
420
 
421
421
  with self, ThreadPoolExecutor() as executor:
422
- plots_refreshed: Dict[Path, PlotInfo] = {}
422
+ plots_refreshed: dict[Path, PlotInfo] = {}
423
423
  for new_plot in executor.map(process_file, plot_paths):
424
424
  if new_plot is not None:
425
425
  plots_refreshed[Path(new_plot.prover.get_filename())] = new_plot
chia/plotting/util.py CHANGED
@@ -4,7 +4,7 @@ import logging
4
4
  from dataclasses import dataclass, field
5
5
  from enum import Enum, IntEnum
6
6
  from pathlib import Path
7
- from typing import Any, Dict, List, Optional, Tuple, Union
7
+ from typing import Any, Optional, Union
8
8
 
9
9
  from chia_rs import G1Element, PrivateKey
10
10
  from chiapos import DiskProver
@@ -70,8 +70,8 @@ class PlotRefreshEvents(Enum):
70
70
 
71
71
  @dataclass
72
72
  class PlotRefreshResult:
73
- loaded: List[PlotInfo] = field(default_factory=list)
74
- removed: List[Path] = field(default_factory=list)
73
+ loaded: list[PlotInfo] = field(default_factory=list)
74
+ removed: list[Path] = field(default_factory=list)
75
75
  processed: int = 0
76
76
  remaining: int = 0
77
77
  duration: float = 0
@@ -99,28 +99,29 @@ class HarvestingMode(IntEnum):
99
99
  GPU = 2
100
100
 
101
101
 
102
- def get_plot_directories(root_path: Path, config: Dict = None) -> List[str]:
102
+ def get_plot_directories(root_path: Path, config: Optional[dict] = None) -> list[str]:
103
103
  if config is None:
104
104
  config = load_config(root_path, "config.yaml")
105
105
  return config["harvester"]["plot_directories"] or []
106
106
 
107
107
 
108
- def get_plot_filenames(root_path: Path) -> Dict[Path, List[Path]]:
108
+ def get_plot_filenames(root_path: Path) -> dict[Path, list[Path]]:
109
109
  # Returns a map from directory to a list of all plots in the directory
110
- all_files: Dict[Path, List[Path]] = {}
110
+ all_files: dict[Path, list[Path]] = {}
111
111
  config = load_config(root_path, "config.yaml")
112
112
  recursive_scan: bool = config["harvester"].get("recursive_plot_scan", DEFAULT_RECURSIVE_PLOT_SCAN)
113
+ recursive_follow_links: bool = config["harvester"].get("recursive_follow_links", False)
113
114
  for directory_name in get_plot_directories(root_path, config):
114
115
  try:
115
116
  directory = Path(directory_name).resolve()
116
117
  except (OSError, RuntimeError):
117
118
  log.exception(f"Failed to resolve {directory_name}")
118
119
  continue
119
- all_files[directory] = get_filenames(directory, recursive_scan)
120
+ all_files[directory] = get_filenames(directory, recursive_scan, recursive_follow_links)
120
121
  return all_files
121
122
 
122
123
 
123
- def add_plot_directory(root_path: Path, str_path: str) -> Dict:
124
+ def add_plot_directory(root_path: Path, str_path: str) -> dict:
124
125
  path: Path = Path(str_path).resolve()
125
126
  if not path.exists():
126
127
  raise ValueError(f"Path doesn't exist: {path}")
@@ -140,7 +141,7 @@ def add_plot_directory(root_path: Path, str_path: str) -> Dict:
140
141
  def remove_plot_directory(root_path: Path, str_path: str) -> None:
141
142
  log.debug(f"remove_plot_directory {str_path}")
142
143
  with lock_and_load_config(root_path, "config.yaml") as config:
143
- str_paths: List[str] = get_plot_directories(root_path, config)
144
+ str_paths: list[str] = get_plot_directories(root_path, config)
144
145
  # If path str matches exactly, remove
145
146
  if str_path in str_paths:
146
147
  str_paths.remove(str_path)
@@ -155,13 +156,13 @@ def remove_plot_directory(root_path: Path, str_path: str) -> None:
155
156
 
156
157
 
157
158
  def remove_plot(path: Path):
158
- log.debug(f"remove_plot {str(path)}")
159
+ log.debug(f"remove_plot {path!s}")
159
160
  # Remove absolute and relative paths
160
161
  if path.exists():
161
162
  path.unlink()
162
163
 
163
164
 
164
- def get_harvester_config(root_path: Path) -> Dict[str, Any]:
165
+ def get_harvester_config(root_path: Path) -> dict[str, Any]:
165
166
  config = load_config(root_path, "config.yaml")
166
167
 
167
168
  plots_refresh_parameter = (
@@ -219,7 +220,7 @@ def update_harvester_config(
219
220
  save_config(root_path, "config.yaml", config)
220
221
 
221
222
 
222
- def get_filenames(directory: Path, recursive: bool) -> List[Path]:
223
+ def get_filenames(directory: Path, recursive: bool, follow_links: bool) -> list[Path]:
223
224
  try:
224
225
  if not directory.exists():
225
226
  log.warning(f"Directory: {directory} does not exist.")
@@ -227,17 +228,28 @@ def get_filenames(directory: Path, recursive: bool) -> List[Path]:
227
228
  except OSError as e:
228
229
  log.warning(f"Error checking if directory {directory} exists: {e}")
229
230
  return []
230
- all_files: List[Path] = []
231
+ all_files: list[Path] = []
231
232
  try:
232
- glob_function = directory.rglob if recursive else directory.glob
233
- all_files = [child for child in glob_function("*.plot") if child.is_file() and not child.name.startswith("._")]
233
+ if follow_links and recursive:
234
+ import glob
235
+
236
+ files = glob.glob(str(directory / "**" / "*.plot"), recursive=True)
237
+ for file in files:
238
+ filepath = Path(file).resolve()
239
+ if filepath.is_file() and not filepath.name.startswith("._"):
240
+ all_files.append(filepath)
241
+ else:
242
+ glob_function = directory.rglob if recursive else directory.glob
243
+ all_files = [
244
+ child for child in glob_function("*.plot") if child.is_file() and not child.name.startswith("._")
245
+ ]
234
246
  log.debug(f"get_filenames: {len(all_files)} files found in {directory}, recursive: {recursive}")
235
247
  except Exception as e:
236
248
  log.warning(f"Error reading directory {directory} {e}")
237
249
  return all_files
238
250
 
239
251
 
240
- def parse_plot_info(memo: bytes) -> Tuple[Union[G1Element, bytes32], G1Element, PrivateKey]:
252
+ def parse_plot_info(memo: bytes) -> tuple[Union[G1Element, bytes32], G1Element, PrivateKey]:
241
253
  # Parses the plot info bytes into keys
242
254
  if len(memo) == (48 + 48 + 32):
243
255
  # This is a public key memo
@@ -286,12 +298,12 @@ def find_duplicate_plot_IDs(all_filenames=None) -> None:
286
298
  all_filenames = []
287
299
  plot_ids_set = set()
288
300
  duplicate_plot_ids = set()
289
- all_filenames_str: List[str] = []
301
+ all_filenames_str: list[str] = []
290
302
 
291
303
  for filename in all_filenames:
292
304
  filename_str: str = str(filename)
293
305
  all_filenames_str.append(filename_str)
294
- filename_parts: List[str] = filename_str.split("-")
306
+ filename_parts: list[str] = filename_str.split("-")
295
307
  plot_id: str = filename_parts[-1]
296
308
  # Skipped parsing and verifying plot ID for faster performance
297
309
  # Skipped checking K size for faster performance
@@ -306,7 +318,7 @@ def find_duplicate_plot_IDs(all_filenames=None) -> None:
306
318
 
307
319
  for plot_id in duplicate_plot_ids:
308
320
  log_message: str = plot_id + " found in multiple files:\n"
309
- duplicate_filenames: List[str] = [filename_str for filename_str in all_filenames_str if plot_id in filename_str]
321
+ duplicate_filenames: list[str] = [filename_str for filename_str in all_filenames_str if plot_id in filename_str]
310
322
  for filename_str in duplicate_filenames:
311
323
  log_message += "\t" + filename_str + "\n"
312
324
  log.warning(f"{log_message}")
chia/pools/pool_config.py CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import logging
4
4
  from dataclasses import dataclass
5
5
  from pathlib import Path
6
- from typing import Any, Callable, Dict, List
6
+ from typing import Any, Callable
7
7
 
8
8
  from chia_rs import G1Element
9
9
 
@@ -22,7 +22,7 @@ pool_list:
22
22
  pool_url: localhost
23
23
  p2_singleton_puzzle_hash: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
24
24
  target_puzzle_hash: 344587cf06a39db471d2cc027504e8688a0a67cce961253500c956c73603fd58
25
- """ # noqa
25
+ """
26
26
 
27
27
  log = logging.getLogger(__name__)
28
28
 
@@ -38,9 +38,9 @@ class PoolWalletConfig(Streamable):
38
38
  owner_public_key: G1Element
39
39
 
40
40
 
41
- def load_pool_config(root_path: Path) -> List[PoolWalletConfig]:
41
+ def load_pool_config(root_path: Path) -> list[PoolWalletConfig]:
42
42
  config = load_config(root_path, "config.yaml")
43
- ret_list: List[PoolWalletConfig] = []
43
+ ret_list: list[PoolWalletConfig] = []
44
44
  pool_list = config["pool"].get("pool_list", [])
45
45
  if pool_list is None:
46
46
  return ret_list
@@ -63,7 +63,7 @@ def load_pool_config(root_path: Path) -> List[PoolWalletConfig]:
63
63
 
64
64
 
65
65
  def update_pool_url(root_path: Path, pool_wallet_config: PoolWalletConfig, pool_url: str) -> None:
66
- def update_pool_url_for_entry(config_entry: Dict[str, Any]) -> bool:
66
+ def update_pool_url_for_entry(config_entry: dict[str, Any]) -> bool:
67
67
  if config_entry.get("pool_url", "") != pool_url:
68
68
  config_entry["pool_url"] = pool_url
69
69
 
@@ -82,7 +82,7 @@ def update_pool_url(root_path: Path, pool_wallet_config: PoolWalletConfig, pool_
82
82
  def update_pool_config_entry(
83
83
  root_path: Path,
84
84
  pool_wallet_config: PoolWalletConfig,
85
- update_closure: Callable[[Dict[str, Any]], bool],
85
+ update_closure: Callable[[dict[str, Any]], bool],
86
86
  update_log_message: str,
87
87
  ) -> None:
88
88
  with lock_and_load_config(root_path, "config.yaml") as config:
@@ -104,7 +104,7 @@ def update_pool_config_entry(
104
104
  save_config(root_path, "config.yaml", config)
105
105
 
106
106
 
107
- async def update_pool_config(root_path: Path, pool_config_list: List[PoolWalletConfig]) -> None:
107
+ async def update_pool_config(root_path: Path, pool_config_list: list[PoolWalletConfig]) -> None:
108
108
  with lock_and_load_config(root_path, "config.yaml") as full_config:
109
109
  full_config["pool"]["pool_list"] = [c.to_json_dict() for c in pool_config_list]
110
110
  save_config(root_path, "config.yaml", full_config)
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import List, Optional, Tuple
4
+ from typing import Optional
5
5
 
6
6
  from chia_rs import G1Element
7
7
  from clvm.casts import int_to_bytes
@@ -115,7 +115,7 @@ def launcher_id_to_p2_puzzle_hash(launcher_id: bytes32, seconds_delay: uint64, d
115
115
  return create_p2_singleton_puzzle_hash(SINGLETON_MOD_HASH, launcher_id, seconds_delay, delayed_puzzle_hash)
116
116
 
117
117
 
118
- def get_delayed_puz_info_from_launcher_spend(coinsol: CoinSpend) -> Tuple[uint64, bytes32]:
118
+ def get_delayed_puz_info_from_launcher_spend(coinsol: CoinSpend) -> tuple[uint64, bytes32]:
119
119
  extra_data = Program.from_bytes(bytes(coinsol.solution)).rest().rest().first()
120
120
  # Extra data is (pool_state delayed_puz_info)
121
121
  # Delayed puz info is (seconds delayed_puzzle_hash)
@@ -143,11 +143,11 @@ def get_template_singleton_inner_puzzle(inner_puzzle: Program) -> Program:
143
143
  r = inner_puzzle.uncurry()
144
144
  if r is None:
145
145
  return False
146
- uncurried_inner_puzzle, args = r
146
+ uncurried_inner_puzzle, _args = r
147
147
  return uncurried_inner_puzzle
148
148
 
149
149
 
150
- def get_seconds_and_delayed_puzhash_from_p2_singleton_puzzle(puzzle: Program) -> Tuple[uint64, bytes32]:
150
+ def get_seconds_and_delayed_puzhash_from_p2_singleton_puzzle(puzzle: Program) -> tuple[uint64, bytes32]:
151
151
  r = puzzle.uncurry()
152
152
  if r is None:
153
153
  return False
@@ -161,17 +161,17 @@ def get_seconds_and_delayed_puzhash_from_p2_singleton_puzzle(puzzle: Program) ->
161
161
  # Verify that a puzzle is a Pool Wallet Singleton
162
162
  def is_pool_singleton_inner_puzzle(inner_puzzle: Program) -> bool:
163
163
  inner_f = get_template_singleton_inner_puzzle(inner_puzzle)
164
- return inner_f in [POOL_WAITING_ROOM_MOD, POOL_MEMBER_MOD]
164
+ return inner_f in (POOL_WAITING_ROOM_MOD, POOL_MEMBER_MOD) # noqa: PLR6201
165
165
 
166
166
 
167
167
  def is_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> bool:
168
168
  inner_f = get_template_singleton_inner_puzzle(inner_puzzle)
169
- return inner_f in [POOL_WAITING_ROOM_MOD]
169
+ return inner_f == POOL_WAITING_ROOM_MOD
170
170
 
171
171
 
172
172
  def is_pool_member_inner_puzzle(inner_puzzle: Program) -> bool:
173
173
  inner_f = get_template_singleton_inner_puzzle(inner_puzzle)
174
- return inner_f in [POOL_MEMBER_MOD]
174
+ return inner_f == POOL_MEMBER_MOD
175
175
 
176
176
 
177
177
  # This spend will use the escape-type spend path for whichever state you are currently in
@@ -185,7 +185,7 @@ def create_travel_spend(
185
185
  genesis_challenge: bytes32,
186
186
  delay_time: uint64,
187
187
  delay_ph: bytes32,
188
- ) -> Tuple[CoinSpend, Program]:
188
+ ) -> tuple[CoinSpend, Program]:
189
189
  inner_puzzle: Program = pool_state_to_inner_puzzle(
190
190
  current,
191
191
  launcher_coin.name(),
@@ -251,7 +251,7 @@ def create_absorb_spend(
251
251
  genesis_challenge: bytes32,
252
252
  delay_time: uint64,
253
253
  delay_ph: bytes32,
254
- ) -> List[CoinSpend]:
254
+ ) -> list[CoinSpend]:
255
255
  inner_puzzle: Program = pool_state_to_inner_puzzle(
256
256
  current_state, launcher_coin.name(), genesis_challenge, delay_time, delay_ph
257
257
  )
@@ -309,7 +309,7 @@ def create_absorb_spend(
309
309
 
310
310
 
311
311
  def get_most_recent_singleton_coin_from_coin_spend(coin_sol: CoinSpend) -> Optional[Coin]:
312
- additions: List[Coin] = compute_additions(coin_sol)
312
+ additions: list[Coin] = compute_additions(coin_sol)
313
313
  for coin in additions:
314
314
  if coin.amount % 2 == 1:
315
315
  return coin
@@ -335,7 +335,7 @@ def get_pubkey_from_member_inner_puzzle(inner_puzzle: Program) -> G1Element:
335
335
 
336
336
  def uncurry_pool_member_inner_puzzle(
337
337
  inner_puzzle: Program,
338
- ) -> Tuple[Program, Program, Program, Program, Program, Program]:
338
+ ) -> tuple[Program, Program, Program, Program, Program, Program]:
339
339
  """
340
340
  Take a puzzle and return `None` if it's not a "pool member" inner puzzle, or
341
341
  a triple of `mod_hash, relative_lock_height, pubkey` if it is.
@@ -352,7 +352,7 @@ def uncurry_pool_member_inner_puzzle(
352
352
  return inner_f, target_puzzle_hash, p2_singleton_hash, owner_pubkey, pool_reward_prefix, escape_puzzlehash
353
353
 
354
354
 
355
- def uncurry_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> Tuple[Program, Program, Program, Program]:
355
+ def uncurry_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> tuple[Program, Program, Program, Program]:
356
356
  """
357
357
  Take a puzzle and return `None` if it's not a "pool member" inner puzzle, or
358
358
  a triple of `mod_hash, relative_lock_height, pubkey` if it is.
@@ -362,9 +362,9 @@ def uncurry_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> Tuple[Progra
362
362
  r = inner_puzzle.uncurry()
363
363
  if r is None:
364
364
  raise ValueError("Failed to unpack inner puzzle")
365
- inner_f, args = r
365
+ _inner_f, args = r
366
366
  v = args.as_iter()
367
- target_puzzle_hash, p2_singleton_hash, owner_pubkey, genesis_challenge, relative_lock_height = tuple(v)
367
+ target_puzzle_hash, p2_singleton_hash, owner_pubkey, _genesis_challenge, relative_lock_height = tuple(v)
368
368
  return target_puzzle_hash, relative_lock_height, owner_pubkey, p2_singleton_hash
369
369
 
370
370
 
@@ -410,7 +410,7 @@ def solution_to_pool_state(full_spend: CoinSpend) -> Optional[PoolState]:
410
410
 
411
411
  # Spend which is not absorb, and is not the launcher
412
412
  num_args = len(inner_solution.as_python())
413
- assert num_args in (2, 3)
413
+ assert num_args in {2, 3}
414
414
 
415
415
  if num_args == 2:
416
416
  # pool member
@@ -445,7 +445,7 @@ def pool_state_to_inner_puzzle(
445
445
  delay_time,
446
446
  delay_ph,
447
447
  )
448
- if pool_state.state in [LEAVING_POOL.value, SELF_POOLING.value]:
448
+ if pool_state.state in {LEAVING_POOL.value, SELF_POOLING.value}:
449
449
  return escaping_inner_puzzle
450
450
  else:
451
451
  return create_pooling_inner_puzzle(