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
@@ -3,10 +3,11 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  import contextlib
5
5
  import functools
6
+ from collections.abc import AsyncIterator
6
7
  from dataclasses import dataclass, field, replace
7
8
  from pathlib import Path
8
9
  from shutil import copy
9
- from typing import Any, AsyncIterator, Callable, List, Optional, Tuple
10
+ from typing import Any, Callable, Optional
10
11
 
11
12
  import pytest
12
13
  from chia_rs import G1Element
@@ -43,7 +44,7 @@ def synced(sender: Sender, receiver: Receiver, previous_last_sync_id: int) -> bo
43
44
  )
44
45
 
45
46
 
46
- def assert_path_list_matches(expected_list: List[str], actual_list: List[str]) -> None:
47
+ def assert_path_list_matches(expected_list: list[str], actual_list: list[str]) -> None:
47
48
  assert len(expected_list) == len(actual_list)
48
49
  for item in expected_list:
49
50
  assert str(item) in actual_list
@@ -61,12 +62,12 @@ class ExpectedResult:
61
62
  duplicates_delta: PathListDelta = field(default_factory=PathListDelta)
62
63
  callback_passed: bool = False
63
64
 
64
- def add_valid(self, list_plots: List[MockPlotInfo]) -> None:
65
+ def add_valid(self, list_plots: list[MockPlotInfo]) -> None:
65
66
  def create_mock_plot(info: MockPlotInfo) -> Plot:
66
67
  return Plot(
67
68
  info.prover.get_filename(),
68
69
  uint8(0),
69
- bytes32(b"\x00" * 32),
70
+ bytes32.zeros,
70
71
  None,
71
72
  None,
72
73
  G1Element(),
@@ -78,31 +79,31 @@ class ExpectedResult:
78
79
  self.valid_count += len(list_plots)
79
80
  self.valid_delta.additions.update({x.prover.get_filename(): create_mock_plot(x) for x in list_plots})
80
81
 
81
- def remove_valid(self, list_paths: List[Path]) -> None:
82
+ def remove_valid(self, list_paths: list[Path]) -> None:
82
83
  self.valid_count -= len(list_paths)
83
84
  self.valid_delta.removals += [str(x) for x in list_paths]
84
85
 
85
- def add_invalid(self, list_paths: List[Path]) -> None:
86
+ def add_invalid(self, list_paths: list[Path]) -> None:
86
87
  self.invalid_count += len(list_paths)
87
88
  self.invalid_delta.additions += [str(x) for x in list_paths]
88
89
 
89
- def remove_invalid(self, list_paths: List[Path]) -> None:
90
+ def remove_invalid(self, list_paths: list[Path]) -> None:
90
91
  self.invalid_count -= len(list_paths)
91
92
  self.invalid_delta.removals += [str(x) for x in list_paths]
92
93
 
93
- def add_keys_missing(self, list_paths: List[Path]) -> None:
94
+ def add_keys_missing(self, list_paths: list[Path]) -> None:
94
95
  self.keys_missing_count += len(list_paths)
95
96
  self.keys_missing_delta.additions += [str(x) for x in list_paths]
96
97
 
97
- def remove_keys_missing(self, list_paths: List[Path]) -> None:
98
+ def remove_keys_missing(self, list_paths: list[Path]) -> None:
98
99
  self.keys_missing_count -= len(list_paths)
99
100
  self.keys_missing_delta.removals += [str(x) for x in list_paths]
100
101
 
101
- def add_duplicates(self, list_paths: List[Path]) -> None:
102
+ def add_duplicates(self, list_paths: list[Path]) -> None:
102
103
  self.duplicates_count += len(list_paths)
103
104
  self.duplicates_delta.additions += [str(x) for x in list_paths]
104
105
 
105
- def remove_duplicates(self, list_paths: List[Path]) -> None:
106
+ def remove_duplicates(self, list_paths: list[Path]) -> None:
106
107
  self.duplicates_count -= len(list_paths)
107
108
  self.duplicates_delta.removals += [str(x) for x in list_paths]
108
109
 
@@ -110,9 +111,9 @@ class ExpectedResult:
110
111
  @dataclass
111
112
  class Environment:
112
113
  root_path: Path
113
- harvester_services: List[HarvesterService]
114
+ harvester_services: list[HarvesterService]
114
115
  farmer_service: FarmerService
115
- harvesters: List[Harvester]
116
+ harvesters: list[Harvester]
116
117
  farmer: Farmer
117
118
  dir_1: Directory
118
119
  dir_2: Directory
@@ -121,9 +122,9 @@ class Environment:
121
122
  dir_invalid: Directory
122
123
  dir_keys_missing: Directory
123
124
  dir_duplicates: Directory
124
- expected: List[ExpectedResult]
125
+ expected: list[ExpectedResult]
125
126
  split_farmer_service_manager: SplitAsyncManager[FarmerService]
126
- split_harvester_managers: List[SplitAsyncManager[Harvester]]
127
+ split_harvester_managers: list[SplitAsyncManager[Harvester]]
127
128
 
128
129
  def get_harvester(self, peer_id: bytes32) -> Optional[Harvester]:
129
130
  for harvester in self.harvesters:
@@ -218,7 +219,7 @@ class Environment:
218
219
  async def run_sync_test(self) -> None:
219
220
  plot_manager: PlotManager
220
221
  assert len(self.harvesters) == len(self.expected)
221
- last_sync_ids: List[uint64] = []
222
+ last_sync_ids: list[uint64] = []
222
223
  # Run the test in two steps, first trigger the refresh on both harvesters
223
224
  for harvester in self.harvesters:
224
225
  plot_manager = harvester.plot_manager
@@ -279,16 +280,16 @@ class Environment:
279
280
  @pytest.fixture(scope="function")
280
281
  async def environment(
281
282
  tmp_path: Path,
282
- farmer_two_harvester_not_started: Tuple[List[HarvesterService], FarmerService, BlockTools],
283
+ farmer_two_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
283
284
  ) -> AsyncIterator[Environment]:
284
- def new_test_dir(name: str, plot_list: List[Path]) -> Directory:
285
+ def new_test_dir(name: str, plot_list: list[Path]) -> Directory:
285
286
  return Directory(tmp_path / "plots" / name, plot_list)
286
287
 
287
- plots: List[Path] = get_test_plots()
288
- plots_invalid: List[Path] = get_test_plots()[0:3]
289
- plots_keys_missing: List[Path] = get_test_plots("not_in_keychain")
288
+ plots: list[Path] = get_test_plots()
289
+ plots_invalid: list[Path] = get_test_plots()[0:3]
290
+ plots_keys_missing: list[Path] = get_test_plots("not_in_keychain")
290
291
  # Create 4 directories where: dir_n contains n plots
291
- directories: List[Directory] = []
292
+ directories: list[Directory] = []
292
293
  offset: int = 0
293
294
  while len(directories) < 4:
294
295
  dir_number = len(directories) + 1
@@ -535,7 +536,7 @@ async def test_farmer_restart(environment: Environment) -> None:
535
536
  env: Environment = environment
536
537
  # Load all directories for both harvesters
537
538
  await add_and_validate_all_directories(env)
538
- last_sync_ids: List[uint64] = []
539
+ last_sync_ids: list[uint64] = []
539
540
  for i in range(0, len(env.harvesters)):
540
541
  last_sync_ids.append(env.harvesters[i].plot_sync_sender._last_sync_id)
541
542
  # Stop the farmer and make sure both receivers get dropped and refreshing gets stopped on the harvesters
@@ -569,7 +570,7 @@ async def test_farmer_restart(environment: Environment) -> None:
569
570
 
570
571
  @pytest.mark.anyio
571
572
  async def test_sync_start_and_disconnect_while_sync_is_active(
572
- farmer_one_harvester: Tuple[List[HarvesterService], FarmerService, BlockTools]
573
+ farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
573
574
  ) -> None:
574
575
  harvesters, farmer_service, _ = farmer_one_harvester
575
576
  harvester_service = harvesters[0]
@@ -4,7 +4,7 @@ import dataclasses
4
4
  import logging
5
5
  import random
6
6
  import time
7
- from typing import Any, Callable, List, Tuple, Type, Union
7
+ from typing import Any, Callable, Union
8
8
 
9
9
  import pytest
10
10
  from chia_rs import G1Element
@@ -57,7 +57,7 @@ class SyncStepData:
57
57
  args: Any
58
58
 
59
59
  def __init__(
60
- self, state: State, function: Callable[[_T_Streamable], Any], payload_type: Type[_T_Streamable], *args: Any
60
+ self, state: State, function: Callable[[_T_Streamable], Any], payload_type: type[_T_Streamable], *args: Any
61
61
  ) -> None:
62
62
  self.state = state
63
63
  self.function = function
@@ -89,7 +89,7 @@ def assert_error_response(plot_sync: Receiver, error_code: ErrorCodes) -> None:
89
89
  assert response.error.code == error_code.value
90
90
 
91
91
 
92
- def pre_function_validate(receiver: Receiver, data: Union[List[Plot], List[str]], expected_state: State) -> None:
92
+ def pre_function_validate(receiver: Receiver, data: Union[list[Plot], list[str]], expected_state: State) -> None:
93
93
  if expected_state == State.loaded:
94
94
  for plot_info in data:
95
95
  assert type(plot_info) is Plot
@@ -108,7 +108,7 @@ def pre_function_validate(receiver: Receiver, data: Union[List[Plot], List[str]]
108
108
  assert path not in receiver.duplicates()
109
109
 
110
110
 
111
- def post_function_validate(receiver: Receiver, data: Union[List[Plot], List[str]], expected_state: State) -> None:
111
+ def post_function_validate(receiver: Receiver, data: Union[list[Plot], list[str]], expected_state: State) -> None:
112
112
  if expected_state == State.loaded:
113
113
  for plot_info in data:
114
114
  assert type(plot_info) is Plot
@@ -132,7 +132,7 @@ async def run_sync_step(receiver: Receiver, sync_step: SyncStepData) -> None:
132
132
  assert receiver.current_sync().state == sync_step.state
133
133
  last_sync_time_before = receiver._last_sync.time_done
134
134
  # For the list types invoke the trigger function in batches
135
- if sync_step.payload_type == PlotSyncPlotList or sync_step.payload_type == PlotSyncPathList:
135
+ if sync_step.payload_type in {PlotSyncPlotList, PlotSyncPathList}:
136
136
  step_data, _ = sync_step.args
137
137
  assert len(step_data) == 10
138
138
  # Invoke batches of: 1, 2, 3, 4 items and validate the data against plot store before and after
@@ -161,7 +161,7 @@ async def run_sync_step(receiver: Receiver, sync_step: SyncStepData) -> None:
161
161
  assert receiver._last_sync.time_done == last_sync_time_before
162
162
 
163
163
 
164
- def plot_sync_setup(seeded_random: random.Random) -> Tuple[Receiver, List[SyncStepData]]:
164
+ def plot_sync_setup(seeded_random: random.Random) -> tuple[Receiver, list[SyncStepData]]:
165
165
  harvester_connection = get_dummy_connection(NodeType.HARVESTER, bytes32.random(seeded_random))
166
166
  receiver = Receiver(harvester_connection, dummy_callback) # type:ignore[arg-type]
167
167
 
@@ -188,7 +188,7 @@ def plot_sync_setup(seeded_random: random.Random) -> Tuple[Receiver, List[SyncSt
188
188
  receiver._total_effective_plot_size = int(
189
189
  sum(UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(plot.size)) for plot in receiver.plots().values())
190
190
  )
191
- sync_steps: List[SyncStepData] = [
191
+ sync_steps: list[SyncStepData] = [
192
192
  SyncStepData(
193
193
  State.idle,
194
194
  receiver.sync_started,
@@ -223,7 +223,7 @@ def test_default_values(seeded_random: random.Random) -> None:
223
223
 
224
224
  @pytest.mark.anyio
225
225
  async def test_reset(seeded_random: random.Random) -> None:
226
- receiver, sync_steps = plot_sync_setup(seeded_random=seeded_random)
226
+ receiver, _sync_steps = plot_sync_setup(seeded_random=seeded_random)
227
227
  connection_before = receiver.connection()
228
228
  # Assign some dummy values
229
229
  receiver._current_sync.state = State.done
@@ -289,7 +289,7 @@ async def test_to_dict(counts_only: bool, seeded_random: random.Random) -> None:
289
289
  for state in State:
290
290
  await run_sync_step(receiver, sync_steps[state])
291
291
 
292
- if state != State.idle and state != State.removed and state != State.done:
292
+ if state not in {State.idle, State.removed, State.done}:
293
293
  expected_plot_files_processed += len(sync_steps[state].args[0])
294
294
 
295
295
  sync_data = receiver.to_dict()["syncing"]
@@ -45,7 +45,7 @@ def test_set_connection_values(bt: BlockTools, seeded_random: random.Random) ->
45
45
  # Test setting a valid connection works
46
46
  sender.set_connection(farmer_connection) # type:ignore[arg-type]
47
47
  assert sender._connection is not None
48
- assert sender._connection == farmer_connection # type: ignore[comparison-overlap]
48
+ assert id(sender._connection) == id(farmer_connection)
49
49
 
50
50
 
51
51
  @pytest.mark.anyio
@@ -6,10 +6,11 @@ import functools
6
6
  import logging
7
7
  import random
8
8
  import time
9
+ from collections.abc import AsyncIterator
9
10
  from dataclasses import dataclass, field
10
11
  from enum import Enum
11
12
  from pathlib import Path
12
- from typing import Any, AsyncIterator, Dict, List, Optional, Set, Tuple
13
+ from typing import Any, Optional
13
14
 
14
15
  import pytest
15
16
  from chia_rs import G1Element
@@ -51,19 +52,19 @@ class TestData:
51
52
  plot_sync_sender: Sender
52
53
  plot_sync_receiver: Receiver
53
54
  event_loop: asyncio.AbstractEventLoop
54
- plots: Dict[Path, PlotInfo] = field(default_factory=dict)
55
- invalid: List[PlotInfo] = field(default_factory=list)
56
- keys_missing: List[PlotInfo] = field(default_factory=list)
57
- duplicates: List[PlotInfo] = field(default_factory=list)
55
+ plots: dict[Path, PlotInfo] = field(default_factory=dict)
56
+ invalid: list[PlotInfo] = field(default_factory=list)
57
+ keys_missing: list[PlotInfo] = field(default_factory=list)
58
+ duplicates: list[PlotInfo] = field(default_factory=list)
58
59
 
59
60
  async def run(
60
61
  self,
61
62
  *,
62
- loaded: List[PlotInfo],
63
- removed: List[PlotInfo],
64
- invalid: List[PlotInfo],
65
- keys_missing: List[PlotInfo],
66
- duplicates: List[PlotInfo],
63
+ loaded: list[PlotInfo],
64
+ removed: list[PlotInfo],
65
+ invalid: list[PlotInfo],
66
+ keys_missing: list[PlotInfo],
67
+ duplicates: list[PlotInfo],
67
68
  initial: bool,
68
69
  ) -> None:
69
70
  for plot_info in loaded:
@@ -75,10 +76,10 @@ class TestData:
75
76
  self.keys_missing = keys_missing
76
77
  self.duplicates = duplicates
77
78
 
78
- removed_paths: List[Path] = [p.prover.get_filename() for p in removed] if removed is not None else []
79
- invalid_dict: Dict[Path, int] = {p.prover.get_filename(): 0 for p in self.invalid}
80
- keys_missing_set: Set[Path] = {p.prover.get_filename() for p in self.keys_missing}
81
- duplicates_set: Set[str] = {p.prover.get_filename() for p in self.duplicates}
79
+ removed_paths: list[Path] = [p.prover.get_filename() for p in removed] if removed is not None else []
80
+ invalid_dict: dict[Path, int] = {p.prover.get_filename(): 0 for p in self.invalid}
81
+ keys_missing_set: set[Path] = {p.prover.get_filename() for p in self.keys_missing}
82
+ duplicates_set: set[str] = {p.prover.get_filename() for p in self.duplicates}
82
83
 
83
84
  # Inject invalid plots into `PlotManager` of the harvester so that the callback calls below can use them
84
85
  # to sync them to the farmer.
@@ -158,10 +159,10 @@ class TestData:
158
159
 
159
160
  @dataclass
160
161
  class TestRunner:
161
- test_data: List[TestData]
162
+ test_data: list[TestData]
162
163
 
163
164
  def __init__(
164
- self, harvesters: List[Harvester], farmer: Farmer, event_loop: asyncio.events.AbstractEventLoop
165
+ self, harvesters: list[Harvester], farmer: Farmer, event_loop: asyncio.events.AbstractEventLoop
165
166
  ) -> None:
166
167
  self.test_data = []
167
168
  for harvester in harvesters:
@@ -179,11 +180,11 @@ class TestRunner:
179
180
  self,
180
181
  index: int,
181
182
  *,
182
- loaded: List[PlotInfo],
183
- removed: List[PlotInfo],
184
- invalid: List[PlotInfo],
185
- keys_missing: List[PlotInfo],
186
- duplicates: List[PlotInfo],
183
+ loaded: list[PlotInfo],
184
+ removed: list[PlotInfo],
185
+ invalid: list[PlotInfo],
186
+ keys_missing: list[PlotInfo],
187
+ duplicates: list[PlotInfo],
187
188
  initial: bool,
188
189
  ) -> None:
189
190
  await self.test_data[index].run(
@@ -241,7 +242,7 @@ async def _testable_process(
241
242
 
242
243
  @contextlib.asynccontextmanager
243
244
  async def create_test_runner(
244
- harvester_services: List[HarvesterService],
245
+ harvester_services: list[HarvesterService],
245
246
  farmer_service: FarmerService,
246
247
  event_loop: asyncio.events.AbstractEventLoop,
247
248
  ) -> AsyncIterator[TestRunner]:
@@ -262,7 +263,7 @@ async def create_test_runner(
262
263
  yield TestRunner(harvesters, farmer, event_loop)
263
264
 
264
265
 
265
- def create_example_plots(count: int, seeded_random: random.Random) -> List[PlotInfo]:
266
+ def create_example_plots(count: int, seeded_random: random.Random) -> list[PlotInfo]:
266
267
  @dataclass
267
268
  class DiskProver:
268
269
  file_name: str
@@ -296,7 +297,7 @@ def create_example_plots(count: int, seeded_random: random.Random) -> List[PlotI
296
297
 
297
298
  @pytest.mark.anyio
298
299
  async def test_sync_simulated(
299
- farmer_three_harvester_not_started: Tuple[List[HarvesterService], FarmerService, BlockTools],
300
+ farmer_three_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
300
301
  event_loop: asyncio.events.AbstractEventLoop,
301
302
  seeded_random: random.Random,
302
303
  ) -> None:
@@ -376,7 +377,7 @@ async def test_sync_simulated(
376
377
  )
377
378
  @pytest.mark.anyio
378
379
  async def test_farmer_error_simulation(
379
- farmer_one_harvester_not_started: Tuple[List[HarvesterService], FarmerService, BlockTools],
380
+ farmer_one_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
380
381
  event_loop: asyncio.events.AbstractEventLoop,
381
382
  simulate_error: ErrorSimulation,
382
383
  seeded_random: random.Random,
@@ -402,7 +403,7 @@ async def test_farmer_error_simulation(
402
403
  @pytest.mark.parametrize("simulate_error", [ErrorSimulation.NonRecoverableError, ErrorSimulation.NotConnected])
403
404
  @pytest.mark.anyio
404
405
  async def test_sync_reset_cases(
405
- farmer_one_harvester_not_started: Tuple[List[HarvesterService], FarmerService, BlockTools],
406
+ farmer_one_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
406
407
  event_loop: asyncio.events.AbstractEventLoop,
407
408
  simulate_error: ErrorSimulation,
408
409
  seeded_random: random.Random,
@@ -2,8 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  import contextlib
4
4
  import time
5
+ from collections.abc import AsyncIterator
5
6
  from dataclasses import dataclass
6
- from typing import AsyncIterator, Optional
7
+ from typing import Optional
7
8
 
8
9
  from chia._tests.util.split_managers import SplitAsyncManager, split_async_manager
9
10
  from chia._tests.util.time_out_assert import time_out_assert
@@ -3,16 +3,18 @@ from __future__ import annotations
3
3
  import logging
4
4
  import sys
5
5
  import time
6
+ from collections.abc import Iterator
6
7
  from dataclasses import dataclass, replace
7
8
  from os import unlink
8
9
  from pathlib import Path
9
10
  from shutil import copy, move
10
- from typing import Callable, Iterator, List, Optional, cast
11
+ from typing import Callable, Optional, cast
11
12
 
12
13
  import pytest
13
14
  from chia_rs import G1Element
14
15
 
15
16
  from chia._tests.plotting.util import get_test_plots
17
+ from chia._tests.util.misc import boolean_datacases
16
18
  from chia._tests.util.time_out_assert import time_out_assert
17
19
  from chia.plotting.cache import CURRENT_VERSION, CacheDataV1
18
20
  from chia.plotting.manager import Cache, PlotManager
@@ -32,6 +34,9 @@ from chia.util.streamable import VersionedBlob
32
34
 
33
35
  log = logging.getLogger(__name__)
34
36
 
37
+ # These tests are not dependent on consensus rules
38
+ pytestmark = [pytest.mark.limit_consensus_modes(reason="does not depend on consensus rules")]
39
+
35
40
 
36
41
  @dataclass
37
42
  class MockDiskProver:
@@ -48,9 +53,9 @@ class MockPlotInfo:
48
53
 
49
54
  class Directory:
50
55
  path: Path
51
- plots: List[Path]
56
+ plots: list[Path]
52
57
 
53
- def __init__(self, path: Path, plots_origin: List[Path]):
58
+ def __init__(self, path: Path, plots_origin: list[Path]):
54
59
  self.path = path
55
60
  path.mkdir(parents=True, exist_ok=True)
56
61
  # Drop the existing files in the test directories
@@ -66,10 +71,10 @@ class Directory:
66
71
  def __len__(self):
67
72
  return len(self.plots)
68
73
 
69
- def plot_info_list(self) -> List[MockPlotInfo]:
74
+ def plot_info_list(self) -> list[MockPlotInfo]:
70
75
  return [MockPlotInfo(MockDiskProver(str(x))) for x in self.plots]
71
76
 
72
- def path_list(self) -> List[Path]:
77
+ def path_list(self) -> list[Path]:
73
78
  return self.plots
74
79
 
75
80
  def drop(self, path: Path):
@@ -149,7 +154,7 @@ class Environment:
149
154
  def environment(tmp_path, bt) -> Iterator[Environment]:
150
155
  dir_1_count: int = 7
151
156
  dir_2_count: int = 3
152
- plots: List[Path] = get_test_plots()
157
+ plots: list[Path] = get_test_plots()
153
158
  assert len(plots) >= dir_1_count + dir_2_count
154
159
 
155
160
  dir_1: Directory = Directory(tmp_path / "plots" / "1", plots[0:dir_1_count])
@@ -180,14 +185,14 @@ async def test_plot_refreshing(environment):
180
185
  *,
181
186
  trigger: Callable,
182
187
  test_path: Path,
183
- expect_loaded: List[MockPlotInfo],
184
- expect_removed: List[Path],
188
+ expect_loaded: list[MockPlotInfo],
189
+ expect_removed: list[Path],
185
190
  expect_processed: int,
186
191
  expect_duplicates: int,
187
192
  expected_directories: int,
188
193
  expect_total_plots: int,
189
194
  ):
190
- expected_result.loaded = cast(List[PlotInfo], expect_loaded)
195
+ expected_result.loaded = cast(list[PlotInfo], expect_loaded)
191
196
  expected_result.removed = expect_removed
192
197
  expected_result.processed = expect_processed
193
198
  trigger(env.root_path, str(test_path))
@@ -432,7 +437,7 @@ async def test_invalid_plots(environment):
432
437
  @pytest.mark.anyio
433
438
  async def test_keys_missing(environment: Environment) -> None:
434
439
  env: Environment = environment
435
- not_in_keychain_plots: List[Path] = get_test_plots("not_in_keychain")
440
+ not_in_keychain_plots: list[Path] = get_test_plots("not_in_keychain")
436
441
  dir_not_in_keychain: Directory = Directory(env.root_path / "plots" / "not_in_keychain", not_in_keychain_plots)
437
442
  expected_result = PlotRefreshResult()
438
443
  # The plots in "not_in_keychain" directory have infinity g1 elements as farmer/pool key so they should be plots
@@ -584,7 +589,7 @@ async def test_drop_too_large_cache_entries(environment, bt):
584
589
  )
585
590
  return path
586
591
 
587
- def assert_cache(expected: List[MockPlotInfo]) -> None:
592
+ def assert_cache(expected: list[MockPlotInfo]) -> None:
588
593
  test_cache = Cache(cache_path)
589
594
  assert len(test_cache) == 0
590
595
  test_cache.load()
@@ -736,3 +741,41 @@ async def test_recursive_plot_scan(environment: Environment) -> None:
736
741
  add_plot_directory(env.root_path, str(sub_dir_1_0_1.path))
737
742
  expected_result.loaded = []
738
743
  await env.refresh_tester.run(expected_result)
744
+
745
+
746
+ @boolean_datacases(name="follow_links", false="no_follow", true="follow")
747
+ @pytest.mark.anyio
748
+ async def test_recursive_plot_scan_symlinks(environment: Environment, follow_links: bool) -> None:
749
+ env: Environment = environment
750
+ # Create a directory tree with some subdirectories containing plots, others not.
751
+ root_plot_dir = env.root_path / "root"
752
+ sub_dir_0: Directory = Directory(root_plot_dir / "0", env.dir_1.plots[0:2])
753
+ sub_dir_0_1: Directory = Directory(sub_dir_0.path / "1", env.dir_1.plots[2:3])
754
+
755
+ # Create a plot directory outside of the root plot directory
756
+ other_plot_dir: Directory = Directory(env.root_path / "other", env.dir_1.plots[3:7])
757
+
758
+ # Create a symlink to the other plot directory from inside the root plot directory
759
+ symlink_path = Path(root_plot_dir / "other")
760
+ symlink_path.symlink_to(env.root_path / "other")
761
+
762
+ # Adding the root without `recursive_plot_scan` and running a test should not load any plots (match an empty result)
763
+ expected_result = PlotRefreshResult()
764
+ add_plot_directory(env.root_path, str(root_plot_dir))
765
+ await env.refresh_tester.run(expected_result)
766
+
767
+ if follow_links:
768
+ expected_plot_list = sub_dir_0.plot_info_list() + sub_dir_0_1.plot_info_list() + other_plot_dir.plot_info_list()
769
+ else:
770
+ expected_plot_list = sub_dir_0.plot_info_list() + sub_dir_0_1.plot_info_list()
771
+
772
+ # Set the recursive scan flag in the config and symlink flag
773
+ with lock_and_load_config(env.root_path, "config.yaml") as config:
774
+ config["harvester"]["recursive_plot_scan"] = True
775
+ config["harvester"]["recursive_follow_links"] = follow_links
776
+ save_config(env.root_path, "config.yaml", config)
777
+
778
+ # With the flag enabled it should load all expected plots
779
+ expected_result.loaded = expected_plot_list # type: ignore[assignment]
780
+ expected_result.processed = len(expected_plot_list)
781
+ await env.refresh_tester.run(expected_result)
@@ -1,13 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
- from typing import List
5
4
 
6
5
  from chia.simulator.block_tools import get_plot_dir
7
6
 
8
7
 
9
- def get_test_plots(sub_dir: str = "") -> List[Path]:
8
+ def get_test_plots(sub_dir: str = "") -> list[Path]:
10
9
  path = get_plot_dir()
11
10
  if sub_dir != "":
12
- path = path / sub_dir
11
+ path /= sub_dir
13
12
  return list(sorted(path.glob("*.plot")))
@@ -0,0 +1,128 @@
1
+ from __future__ import annotations
2
+
3
+ from chia._tests.cmds.test_cmd_framework import check_click_parsing
4
+ from chia.cmds.cmd_classes import ChiaCliContext
5
+ from chia.cmds.cmd_helpers import NeedsWalletRPC
6
+ from chia.cmds.param_types import CliAddress
7
+ from chia.cmds.plotnft import (
8
+ ChangePayoutInstructionsPlotNFTCMD,
9
+ ClaimPlotNFTCMD,
10
+ CreatePlotNFTCMD,
11
+ GetLoginLinkCMD,
12
+ InspectPlotNFTCMD,
13
+ JoinPlotNFTCMD,
14
+ LeavePlotNFTCMD,
15
+ ShowPlotNFTCMD,
16
+ )
17
+ from chia.types.blockchain_format.sized_bytes import bytes32
18
+ from chia.util.bech32m import encode_puzzle_hash
19
+ from chia.util.ints import uint64
20
+ from chia.wallet.util.address_type import AddressType
21
+
22
+
23
+ def test_plotnft_command_default_parsing() -> None:
24
+ launcher_id = bytes32([1] * 32)
25
+ check_click_parsing(
26
+ GetLoginLinkCMD(launcher_id=launcher_id),
27
+ "--launcher_id",
28
+ launcher_id.hex(),
29
+ )
30
+
31
+ burn_ph = bytes32.from_hexstr("0x000000000000000000000000000000000000000000000000000000000000dead")
32
+ burn_address = encode_puzzle_hash(burn_ph, "xch")
33
+ check_click_parsing(
34
+ ChangePayoutInstructionsPlotNFTCMD(
35
+ launcher_id=launcher_id, address=CliAddress(burn_ph, burn_address, AddressType.XCH)
36
+ ),
37
+ "--launcher_id",
38
+ launcher_id.hex(),
39
+ "--address",
40
+ burn_address,
41
+ # Needed for AddressParamType to work correctly without config
42
+ context=ChiaCliContext(expected_prefix="xch"),
43
+ )
44
+
45
+ check_click_parsing(
46
+ ClaimPlotNFTCMD(
47
+ rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None), fee=uint64(1), id=5
48
+ ),
49
+ "--id",
50
+ "5",
51
+ "--fee",
52
+ "0.000000000001",
53
+ )
54
+
55
+ check_click_parsing(
56
+ CreatePlotNFTCMD(
57
+ rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
58
+ pool_url="http://localhost:1234",
59
+ state="pool",
60
+ fee=uint64(0),
61
+ dont_prompt=False,
62
+ ),
63
+ "--state",
64
+ "pool",
65
+ "--pool-url",
66
+ "http://localhost:1234",
67
+ "--fee",
68
+ "0.0",
69
+ )
70
+
71
+ check_click_parsing(
72
+ CreatePlotNFTCMD(
73
+ rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
74
+ pool_url=None,
75
+ state="local",
76
+ fee=uint64(0),
77
+ dont_prompt=True,
78
+ ),
79
+ "--state",
80
+ "local",
81
+ "-y",
82
+ )
83
+
84
+ check_click_parsing(
85
+ InspectPlotNFTCMD(
86
+ rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
87
+ id=5,
88
+ ),
89
+ "--id",
90
+ "5",
91
+ )
92
+
93
+ check_click_parsing(
94
+ JoinPlotNFTCMD(
95
+ rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
96
+ id=5,
97
+ fee=uint64(3),
98
+ pool_url="http://localhost:1234",
99
+ dont_prompt=True,
100
+ ),
101
+ "--id",
102
+ "5",
103
+ "--fee",
104
+ "0.000000000003",
105
+ "--pool-url",
106
+ "http://localhost:1234",
107
+ "-y",
108
+ )
109
+
110
+ check_click_parsing(
111
+ LeavePlotNFTCMD(
112
+ rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
113
+ id=5,
114
+ fee=uint64(3),
115
+ dont_prompt=True,
116
+ ),
117
+ "--id",
118
+ "5",
119
+ "--fee",
120
+ "0.000000000003",
121
+ "-y",
122
+ )
123
+
124
+ check_click_parsing(
125
+ ShowPlotNFTCMD(rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None), id=5),
126
+ "--id",
127
+ "5",
128
+ )