chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__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 (528) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_build_chains.py +2 -4
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  7. chia/_tests/clvm/coin_store.py +4 -7
  8. chia/_tests/clvm/test_clvm_step.py +4 -4
  9. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  10. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  11. chia/_tests/clvm/test_singletons.py +2 -4
  12. chia/_tests/clvm/test_spend_sim.py +2 -2
  13. chia/_tests/cmds/cmd_test_utils.py +27 -45
  14. chia/_tests/cmds/test_cmd_framework.py +6 -6
  15. chia/_tests/cmds/test_daemon.py +3 -3
  16. chia/_tests/cmds/test_show.py +4 -4
  17. chia/_tests/cmds/test_tx_config_args.py +1 -2
  18. chia/_tests/cmds/testing_classes.py +4 -5
  19. chia/_tests/cmds/wallet/test_did.py +24 -27
  20. chia/_tests/cmds/wallet/test_nft.py +12 -10
  21. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  22. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  23. chia/_tests/conftest.py +59 -30
  24. chia/_tests/connection_utils.py +2 -2
  25. chia/_tests/core/cmds/test_beta.py +4 -4
  26. chia/_tests/core/cmds/test_keys.py +2 -3
  27. chia/_tests/core/cmds/test_wallet.py +15 -15
  28. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  29. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  30. chia/_tests/core/daemon/test_daemon.py +11 -11
  31. chia/_tests/core/data_layer/conftest.py +2 -2
  32. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  33. chia/_tests/core/data_layer/test_data_store.py +10 -10
  34. chia/_tests/core/data_layer/util.py +11 -11
  35. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  36. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  37. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  38. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  39. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  40. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  41. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  42. chia/_tests/core/full_node/test_conditions.py +21 -23
  43. chia/_tests/core/full_node/test_full_node.py +225 -62
  44. chia/_tests/core/full_node/test_hint_management.py +2 -4
  45. chia/_tests/core/full_node/test_performance.py +0 -1
  46. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  47. chia/_tests/core/full_node/test_transactions.py +1 -2
  48. chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
  49. chia/_tests/core/mempool/test_mempool.py +29 -37
  50. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  51. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  52. chia/_tests/core/mempool/test_mempool_manager.py +963 -839
  53. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  54. chia/_tests/core/server/serve.py +7 -7
  55. chia/_tests/core/server/test_dos.py +1 -2
  56. chia/_tests/core/server/test_event_loop.py +12 -4
  57. chia/_tests/core/server/test_loop.py +7 -8
  58. chia/_tests/core/server/test_rate_limits.py +9 -8
  59. chia/_tests/core/server/test_server.py +61 -1
  60. chia/_tests/core/services/test_services.py +2 -2
  61. chia/_tests/core/ssl/test_ssl.py +2 -2
  62. chia/_tests/core/test_cost_calculation.py +2 -6
  63. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  64. chia/_tests/core/test_filter.py +0 -1
  65. chia/_tests/core/test_full_node_rpc.py +2 -2
  66. chia/_tests/core/test_merkle_set.py +1 -2
  67. chia/_tests/core/test_seeder.py +4 -4
  68. chia/_tests/core/util/test_config.py +4 -4
  69. chia/_tests/core/util/test_jsonify.py +2 -2
  70. chia/_tests/core/util/test_keychain.py +3 -3
  71. chia/_tests/core/util/test_lockfile.py +2 -1
  72. chia/_tests/core/util/test_log_exceptions.py +1 -2
  73. chia/_tests/core/util/test_streamable.py +17 -17
  74. chia/_tests/db/test_db_wrapper.py +3 -2
  75. chia/_tests/environments/wallet.py +14 -14
  76. chia/_tests/ether.py +4 -3
  77. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  78. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  79. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  80. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  81. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  82. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  83. chia/_tests/harvester/test_harvester_api.py +11 -4
  84. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  85. chia/_tests/plot_sync/test_receiver.py +11 -10
  86. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  87. chia/_tests/plot_sync/util.py +1 -2
  88. chia/_tests/plotting/test_plot_manager.py +7 -6
  89. chia/_tests/plotting/test_prover.py +30 -38
  90. chia/_tests/pools/test_pool_cmdline.py +4 -6
  91. chia/_tests/pools/test_pool_rpc.py +203 -61
  92. chia/_tests/pools/test_pool_wallet.py +3 -3
  93. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  94. chia/_tests/process_junit.py +2 -2
  95. chia/_tests/rpc/test_rpc_client.py +4 -4
  96. chia/_tests/rpc/test_rpc_server.py +3 -3
  97. chia/_tests/simulation/test_simulation.py +12 -25
  98. chia/_tests/solver/test_solver_service.py +13 -4
  99. chia/_tests/testconfig.py +2 -2
  100. chia/_tests/timelord/test_new_peak.py +22 -11
  101. chia/_tests/tools/test_run_block.py +0 -2
  102. chia/_tests/tools/test_virtual_project.py +2 -1
  103. chia/_tests/util/benchmarks.py +1 -0
  104. chia/_tests/util/blockchain.py +38 -36
  105. chia/_tests/util/blockchain_mock.py +11 -11
  106. chia/_tests/util/build_network_protocol_files.py +2 -1
  107. chia/_tests/util/coin_store.py +2 -1
  108. chia/_tests/util/config.py +1 -1
  109. chia/_tests/util/db_connection.py +2 -3
  110. chia/_tests/util/full_sync.py +9 -11
  111. chia/_tests/util/gen_ssl_certs.py +4 -5
  112. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  113. chia/_tests/util/misc.py +24 -24
  114. chia/_tests/util/network_protocol_data.py +20 -3
  115. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  116. chia/_tests/util/protocol_messages_json.py +292 -3
  117. chia/_tests/util/setup_nodes.py +62 -47
  118. chia/_tests/util/spend_sim.py +57 -57
  119. chia/_tests/util/test_async_pool.py +2 -3
  120. chia/_tests/util/test_chia_version.py +1 -3
  121. chia/_tests/util/test_config.py +3 -3
  122. chia/_tests/util/test_full_block_utils.py +6 -3
  123. chia/_tests/util/test_limited_semaphore.py +1 -2
  124. chia/_tests/util/test_misc.py +2 -2
  125. chia/_tests/util/test_network.py +1 -2
  126. chia/_tests/util/test_priority_mutex.py +3 -3
  127. chia/_tests/util/test_recursive_replace.py +5 -6
  128. chia/_tests/util/test_replace_str_to_bytes.py +8 -10
  129. chia/_tests/util/test_testnet_overrides.py +3 -3
  130. chia/_tests/util/time_out_assert.py +2 -2
  131. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  132. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  133. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  134. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  135. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  136. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  137. chia/_tests/wallet/conftest.py +6 -6
  138. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  139. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  140. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  141. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  142. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  145. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  146. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  147. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  148. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  149. chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
  150. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  151. chia/_tests/wallet/test_coin_management.py +2 -2
  152. chia/_tests/wallet/test_conditions.py +45 -51
  153. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  154. chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
  155. chia/_tests/wallet/test_notifications.py +14 -14
  156. chia/_tests/wallet/test_signer_protocol.py +5 -5
  157. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  158. chia/_tests/wallet/test_transaction_store.py +20 -20
  159. chia/_tests/wallet/test_util.py +2 -2
  160. chia/_tests/wallet/test_wallet.py +380 -228
  161. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  162. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  163. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  164. chia/_tests/wallet/test_wallet_node.py +14 -14
  165. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  166. chia/_tests/wallet/test_wallet_utils.py +2 -3
  167. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  168. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  169. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  170. chia/_tests/wallet/wallet_block_tools.py +12 -11
  171. chia/_tests/weight_proof/config.py +1 -0
  172. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  173. chia/apis/__init__.py +21 -0
  174. chia/apis/farmer_stub.py +102 -0
  175. chia/apis/full_node_stub.py +372 -0
  176. chia/apis/harvester_stub.py +57 -0
  177. chia/apis/introducer_stub.py +35 -0
  178. chia/apis/solver_stub.py +30 -0
  179. chia/apis/stub_protocol_registry.py +21 -0
  180. chia/apis/timelord_stub.py +39 -0
  181. chia/apis/wallet_stub.py +161 -0
  182. chia/cmds/beta.py +3 -4
  183. chia/cmds/beta_funcs.py +4 -3
  184. chia/cmds/check_wallet_db.py +4 -4
  185. chia/cmds/chia.py +1 -2
  186. chia/cmds/cmd_classes.py +11 -13
  187. chia/cmds/cmd_helpers.py +11 -11
  188. chia/cmds/cmds_util.py +15 -15
  189. chia/cmds/coin_funcs.py +6 -7
  190. chia/cmds/coins.py +2 -3
  191. chia/cmds/configure.py +1 -2
  192. chia/cmds/data.py +42 -42
  193. chia/cmds/data_funcs.py +81 -81
  194. chia/cmds/db.py +4 -5
  195. chia/cmds/db_backup_func.py +2 -2
  196. chia/cmds/db_upgrade_func.py +3 -3
  197. chia/cmds/db_validate_func.py +2 -2
  198. chia/cmds/dev/data.py +4 -4
  199. chia/cmds/dev/gh.py +5 -5
  200. chia/cmds/dev/installers.py +2 -3
  201. chia/cmds/dev/mempool.py +3 -4
  202. chia/cmds/dev/mempool_funcs.py +4 -4
  203. chia/cmds/dev/sim.py +8 -8
  204. chia/cmds/dump_keyring.py +3 -3
  205. chia/cmds/farm.py +6 -8
  206. chia/cmds/farm_funcs.py +25 -24
  207. chia/cmds/init_funcs.py +4 -4
  208. chia/cmds/keys.py +16 -18
  209. chia/cmds/keys_funcs.py +36 -36
  210. chia/cmds/netspace.py +1 -3
  211. chia/cmds/netspace_funcs.py +1 -2
  212. chia/cmds/options.py +3 -2
  213. chia/cmds/param_types.py +17 -16
  214. chia/cmds/passphrase.py +6 -7
  215. chia/cmds/passphrase_funcs.py +11 -13
  216. chia/cmds/peer.py +1 -3
  217. chia/cmds/peer_funcs.py +3 -3
  218. chia/cmds/plotnft.py +6 -7
  219. chia/cmds/plotnft_funcs.py +37 -26
  220. chia/cmds/rpc.py +3 -3
  221. chia/cmds/show.py +3 -5
  222. chia/cmds/show_funcs.py +9 -9
  223. chia/cmds/sim_funcs.py +25 -26
  224. chia/cmds/solver.py +1 -3
  225. chia/cmds/solver_funcs.py +1 -2
  226. chia/cmds/start_funcs.py +2 -2
  227. chia/cmds/wallet.py +76 -81
  228. chia/cmds/wallet_funcs.py +206 -177
  229. chia/consensus/augmented_chain.py +6 -6
  230. chia/consensus/block_body_validation.py +19 -15
  231. chia/consensus/block_creation.py +25 -21
  232. chia/consensus/block_header_validation.py +27 -13
  233. chia/consensus/block_height_map.py +3 -6
  234. chia/consensus/block_height_map_protocol.py +2 -2
  235. chia/consensus/block_record.py +2 -4
  236. chia/consensus/blockchain.py +58 -40
  237. chia/consensus/blockchain_interface.py +7 -7
  238. chia/consensus/coin_store_protocol.py +5 -6
  239. chia/consensus/condition_tools.py +4 -4
  240. chia/consensus/cost_calculator.py +2 -3
  241. chia/consensus/default_constants.py +16 -13
  242. chia/consensus/deficit.py +1 -3
  243. chia/consensus/difficulty_adjustment.py +3 -5
  244. chia/consensus/find_fork_point.py +2 -4
  245. chia/consensus/full_block_to_block_record.py +11 -13
  246. chia/consensus/generator_tools.py +2 -3
  247. chia/consensus/get_block_challenge.py +42 -26
  248. chia/consensus/get_block_generator.py +2 -3
  249. chia/consensus/make_sub_epoch_summary.py +8 -7
  250. chia/consensus/multiprocess_validation.py +31 -20
  251. chia/consensus/pos_quality.py +6 -23
  252. chia/consensus/pot_iterations.py +17 -44
  253. chia/consensus/signage_point.py +4 -5
  254. chia/consensus/vdf_info_computation.py +2 -4
  255. chia/daemon/client.py +8 -8
  256. chia/daemon/keychain_proxy.py +31 -37
  257. chia/daemon/server.py +32 -33
  258. chia/daemon/windows_signal.py +4 -3
  259. chia/data_layer/data_layer.py +86 -77
  260. chia/data_layer/data_layer_rpc_api.py +9 -9
  261. chia/data_layer/data_layer_rpc_client.py +13 -15
  262. chia/data_layer/data_layer_server.py +3 -3
  263. chia/data_layer/data_layer_util.py +14 -14
  264. chia/data_layer/data_layer_wallet.py +94 -101
  265. chia/data_layer/data_store.py +50 -50
  266. chia/data_layer/dl_wallet_store.py +9 -12
  267. chia/data_layer/download_data.py +8 -9
  268. chia/data_layer/s3_plugin_service.py +5 -9
  269. chia/data_layer/start_data_layer.py +5 -5
  270. chia/farmer/farmer.py +31 -31
  271. chia/farmer/farmer_api.py +45 -33
  272. chia/farmer/farmer_rpc_api.py +5 -4
  273. chia/farmer/farmer_rpc_client.py +6 -6
  274. chia/farmer/start_farmer.py +6 -6
  275. chia/full_node/block_store.py +13 -16
  276. chia/full_node/check_fork_next_block.py +1 -2
  277. chia/full_node/coin_store.py +15 -16
  278. chia/full_node/eligible_coin_spends.py +3 -3
  279. chia/full_node/fee_estimate_store.py +2 -3
  280. chia/full_node/fee_tracker.py +1 -2
  281. chia/full_node/full_block_utils.py +4 -4
  282. chia/full_node/full_node.py +238 -224
  283. chia/full_node/full_node_api.py +193 -150
  284. chia/full_node/full_node_rpc_api.py +53 -31
  285. chia/full_node/full_node_rpc_client.py +18 -19
  286. chia/full_node/full_node_store.py +45 -43
  287. chia/full_node/hint_management.py +2 -2
  288. chia/full_node/mempool.py +17 -19
  289. chia/full_node/mempool_manager.py +89 -42
  290. chia/full_node/pending_tx_cache.py +2 -3
  291. chia/full_node/start_full_node.py +5 -5
  292. chia/full_node/sync_store.py +3 -4
  293. chia/full_node/tx_processing_queue.py +34 -13
  294. chia/full_node/weight_proof.py +61 -48
  295. chia/harvester/harvester.py +25 -24
  296. chia/harvester/harvester_api.py +61 -38
  297. chia/harvester/harvester_rpc_api.py +10 -10
  298. chia/harvester/start_harvester.py +4 -4
  299. chia/introducer/introducer.py +3 -3
  300. chia/introducer/introducer_api.py +6 -4
  301. chia/introducer/start_introducer.py +4 -4
  302. chia/legacy/keyring.py +3 -3
  303. chia/plot_sync/delta.py +1 -2
  304. chia/plot_sync/receiver.py +20 -17
  305. chia/plot_sync/sender.py +15 -10
  306. chia/plotters/bladebit.py +7 -7
  307. chia/plotters/chiapos.py +2 -2
  308. chia/plotters/madmax.py +4 -4
  309. chia/plotters/plotters.py +4 -4
  310. chia/plotters/plotters_util.py +3 -3
  311. chia/plotting/cache.py +20 -14
  312. chia/plotting/check_plots.py +26 -35
  313. chia/plotting/create_plots.py +22 -23
  314. chia/plotting/manager.py +21 -14
  315. chia/plotting/prover.py +59 -42
  316. chia/plotting/util.py +16 -16
  317. chia/pools/pool_config.py +2 -1
  318. chia/pools/pool_puzzles.py +11 -12
  319. chia/pools/pool_wallet.py +34 -57
  320. chia/pools/pool_wallet_info.py +39 -10
  321. chia/protocols/farmer_protocol.py +8 -9
  322. chia/protocols/fee_estimate.py +3 -4
  323. chia/protocols/full_node_protocol.py +3 -4
  324. chia/protocols/harvester_protocol.py +27 -15
  325. chia/protocols/outbound_message.py +3 -3
  326. chia/protocols/pool_protocol.py +8 -9
  327. chia/protocols/shared_protocol.py +1 -2
  328. chia/protocols/solver_protocol.py +9 -2
  329. chia/protocols/timelord_protocol.py +4 -7
  330. chia/protocols/wallet_protocol.py +11 -12
  331. chia/rpc/rpc_client.py +9 -9
  332. chia/rpc/rpc_server.py +17 -17
  333. chia/rpc/util.py +2 -2
  334. chia/seeder/crawler.py +8 -8
  335. chia/seeder/crawler_api.py +21 -27
  336. chia/seeder/crawler_rpc_api.py +2 -2
  337. chia/seeder/dns_server.py +21 -21
  338. chia/seeder/start_crawler.py +4 -4
  339. chia/server/address_manager.py +15 -16
  340. chia/server/api_protocol.py +11 -11
  341. chia/server/chia_policy.py +46 -26
  342. chia/server/introducer_peers.py +2 -3
  343. chia/server/node_discovery.py +19 -19
  344. chia/server/rate_limit_numbers.py +4 -5
  345. chia/server/rate_limits.py +4 -4
  346. chia/server/resolve_peer_info.py +4 -4
  347. chia/server/server.py +49 -52
  348. chia/server/signal_handlers.py +6 -6
  349. chia/server/start_service.py +17 -17
  350. chia/server/upnp.py +4 -6
  351. chia/server/ws_connection.py +52 -37
  352. chia/simulator/add_blocks_in_batches.py +1 -3
  353. chia/simulator/block_tools.py +312 -200
  354. chia/simulator/full_node_simulator.py +56 -35
  355. chia/simulator/keyring.py +2 -3
  356. chia/simulator/setup_services.py +15 -15
  357. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  358. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  359. chia/simulator/simulator_protocol.py +1 -2
  360. chia/simulator/simulator_test_tools.py +3 -3
  361. chia/simulator/start_simulator.py +7 -7
  362. chia/simulator/wallet_tools.py +10 -10
  363. chia/solver/solver.py +10 -10
  364. chia/solver/solver_api.py +10 -8
  365. chia/solver/solver_rpc_api.py +2 -2
  366. chia/solver/start_solver.py +4 -4
  367. chia/ssl/cacert.pem +148 -90
  368. chia/ssl/chia_ca.crt +14 -10
  369. chia/ssl/chia_ca_old.crt +19 -0
  370. chia/ssl/create_ssl.py +4 -4
  371. chia/ssl/renewedselfsignedca.conf +4 -0
  372. chia/ssl/ssl_check.py +1 -2
  373. chia/timelord/iters_from_block.py +1 -4
  374. chia/timelord/start_timelord.py +4 -4
  375. chia/timelord/timelord.py +44 -40
  376. chia/timelord/timelord_api.py +6 -4
  377. chia/timelord/timelord_launcher.py +2 -2
  378. chia/timelord/timelord_rpc_api.py +2 -2
  379. chia/timelord/timelord_state.py +11 -12
  380. chia/types/block_protocol.py +1 -3
  381. chia/types/blockchain_format/coin.py +1 -3
  382. chia/types/blockchain_format/program.py +11 -8
  383. chia/types/blockchain_format/proof_of_space.py +123 -76
  384. chia/types/blockchain_format/tree_hash.py +3 -3
  385. chia/types/blockchain_format/vdf.py +1 -2
  386. chia/types/coin_spend.py +3 -3
  387. chia/types/mempool_item.py +5 -5
  388. chia/types/mempool_submission_status.py +2 -3
  389. chia/types/peer_info.py +1 -2
  390. chia/types/unfinished_header_block.py +3 -4
  391. chia/types/validation_state.py +1 -2
  392. chia/util/action_scope.py +8 -8
  393. chia/util/async_pool.py +5 -5
  394. chia/util/bech32m.py +1 -2
  395. chia/util/beta_metrics.py +2 -2
  396. chia/util/block_cache.py +4 -4
  397. chia/util/chia_logging.py +2 -2
  398. chia/util/chia_version.py +1 -2
  399. chia/util/config.py +15 -16
  400. chia/util/db_wrapper.py +26 -27
  401. chia/util/default_root.py +1 -2
  402. chia/util/errors.py +3 -3
  403. chia/util/file_keyring.py +14 -14
  404. chia/util/files.py +2 -3
  405. chia/util/hash.py +4 -4
  406. chia/util/initial-config.yaml +3 -5
  407. chia/util/inline_executor.py +2 -1
  408. chia/util/ip_address.py +1 -2
  409. chia/util/keychain.py +25 -27
  410. chia/util/keyring_wrapper.py +18 -19
  411. chia/util/lock.py +3 -4
  412. chia/util/log_exceptions.py +1 -2
  413. chia/util/lru_cache.py +2 -2
  414. chia/util/network.py +6 -6
  415. chia/util/path.py +2 -3
  416. chia/util/priority_mutex.py +2 -2
  417. chia/util/profiler.py +1 -2
  418. chia/util/safe_cancel_task.py +1 -2
  419. chia/util/streamable.py +22 -8
  420. chia/util/task_referencer.py +1 -1
  421. chia/util/timing.py +3 -3
  422. chia/util/virtual_project_analysis.py +6 -5
  423. chia/util/ws_message.py +2 -2
  424. chia/wallet/cat_wallet/cat_info.py +3 -4
  425. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  426. chia/wallet/cat_wallet/cat_utils.py +3 -4
  427. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  428. chia/wallet/cat_wallet/lineage_store.py +3 -4
  429. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  430. chia/wallet/coin_selection.py +9 -10
  431. chia/wallet/conditions.py +120 -105
  432. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  433. chia/wallet/derivation_record.py +1 -2
  434. chia/wallet/derive_keys.py +2 -4
  435. chia/wallet/did_wallet/did_info.py +10 -11
  436. chia/wallet/did_wallet/did_wallet.py +36 -82
  437. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  438. chia/wallet/driver_protocol.py +5 -7
  439. chia/wallet/lineage_proof.py +4 -4
  440. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  441. chia/wallet/nft_wallet/nft_info.py +8 -9
  442. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  443. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  444. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  445. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  446. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  447. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  448. chia/wallet/notification_manager.py +3 -3
  449. chia/wallet/notification_store.py +44 -61
  450. chia/wallet/outer_puzzles.py +6 -7
  451. chia/wallet/puzzle_drivers.py +34 -6
  452. chia/wallet/puzzles/clawback/drivers.py +6 -6
  453. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  454. chia/wallet/puzzles/load_clvm.py +1 -1
  455. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  456. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  457. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  458. chia/wallet/puzzles/tails.py +3 -3
  459. chia/wallet/singleton.py +5 -7
  460. chia/wallet/singleton_record.py +3 -3
  461. chia/wallet/start_wallet.py +5 -5
  462. chia/wallet/trade_manager.py +37 -58
  463. chia/wallet/trade_record.py +4 -4
  464. chia/wallet/trading/offer.py +59 -46
  465. chia/wallet/trading/trade_store.py +8 -9
  466. chia/wallet/transaction_record.py +8 -8
  467. chia/wallet/uncurried_puzzle.py +1 -2
  468. chia/wallet/util/clvm_streamable.py +12 -12
  469. chia/wallet/util/compute_hints.py +4 -5
  470. chia/wallet/util/curry_and_treehash.py +1 -2
  471. chia/wallet/util/merkle_tree.py +2 -3
  472. chia/wallet/util/peer_request_cache.py +8 -8
  473. chia/wallet/util/signing.py +85 -0
  474. chia/wallet/util/tx_config.py +15 -6
  475. chia/wallet/util/wallet_sync_utils.py +14 -16
  476. chia/wallet/util/wallet_types.py +2 -2
  477. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  478. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  479. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  480. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  481. chia/wallet/vc_wallet/vc_store.py +5 -6
  482. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  483. chia/wallet/wallet.py +50 -78
  484. chia/wallet/wallet_action_scope.py +11 -11
  485. chia/wallet/wallet_blockchain.py +12 -12
  486. chia/wallet/wallet_coin_record.py +12 -6
  487. chia/wallet/wallet_coin_store.py +24 -25
  488. chia/wallet/wallet_interested_store.py +3 -5
  489. chia/wallet/wallet_nft_store.py +10 -11
  490. chia/wallet/wallet_node.py +53 -61
  491. chia/wallet/wallet_node_api.py +5 -3
  492. chia/wallet/wallet_protocol.py +23 -23
  493. chia/wallet/wallet_puzzle_store.py +15 -18
  494. chia/wallet/wallet_request_types.py +778 -114
  495. chia/wallet/wallet_retry_store.py +1 -3
  496. chia/wallet/wallet_rpc_api.py +572 -909
  497. chia/wallet/wallet_rpc_client.py +87 -279
  498. chia/wallet/wallet_singleton_store.py +3 -4
  499. chia/wallet/wallet_state_manager.py +332 -106
  500. chia/wallet/wallet_transaction_store.py +11 -14
  501. chia/wallet/wallet_user_store.py +4 -6
  502. chia/wallet/wallet_weight_proof_handler.py +4 -4
  503. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
  505. chia/apis.py +0 -21
  506. chia/consensus/check_time_locks.py +0 -57
  507. chia/data_layer/puzzles/__init__.py +0 -0
  508. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  509. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  510. chia/types/coin_record.py +0 -44
  511. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  512. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  513. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  514. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  515. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  516. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  517. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  518. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  520. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  521. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  522. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  524. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  525. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  526. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/farmer/farmer.py CHANGED
@@ -11,7 +11,7 @@ from collections.abc import AsyncIterator
11
11
  from dataclasses import dataclass
12
12
  from math import floor
13
13
  from pathlib import Path
14
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast
14
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
15
15
 
16
16
  import aiohttp
17
17
  from chia_rs import AugSchemeMPL, ConsensusConstants, G1Element, G2Element, PrivateKey, ProofOfSpace
@@ -70,7 +70,7 @@ UPDATE_POOL_FARMER_INFO_INTERVAL: int = 300
70
70
  @dataclass(frozen=True)
71
71
  class GetPoolInfoResult:
72
72
  pool_info: dict[str, Any]
73
- new_pool_url: Optional[str]
73
+ new_pool_url: str | None
74
74
 
75
75
 
76
76
  def strip_old_entries(pairs: list[tuple[float, Any]], before: float) -> list[tuple[float, Any]]:
@@ -89,7 +89,7 @@ def increment_pool_stats(
89
89
  name: str,
90
90
  current_time: float,
91
91
  count: int = 1,
92
- value: Optional[Union[int, dict[str, Any]]] = None,
92
+ value: int | dict[str, Any] | None = None,
93
93
  ) -> None:
94
94
  if p2_singleton_puzzlehash not in pool_states:
95
95
  return
@@ -127,9 +127,9 @@ class Farmer:
127
127
  farmer_config: dict[str, Any],
128
128
  pool_config: dict[str, Any],
129
129
  consensus_constants: ConsensusConstants,
130
- local_keychain: Optional[Keychain] = None,
130
+ local_keychain: Keychain | None = None,
131
131
  ):
132
- self.keychain_proxy: Optional[KeychainProxy] = None
132
+ self.keychain_proxy: KeychainProxy | None = None
133
133
  self.local_keychain = local_keychain
134
134
  self._root_path = root_path
135
135
  self.config = farmer_config
@@ -155,18 +155,18 @@ class Farmer:
155
155
 
156
156
  self.plot_sync_receivers: dict[bytes32, Receiver] = {}
157
157
 
158
- self.cache_clear_task: Optional[asyncio.Task[None]] = None
159
- self.update_pool_state_task: Optional[asyncio.Task[None]] = None
158
+ self.cache_clear_task: asyncio.Task[None] | None = None
159
+ self.update_pool_state_task: asyncio.Task[None] | None = None
160
160
  self.constants = consensus_constants
161
161
  self._shut_down = False
162
162
  self.server: Any = None
163
- self.state_changed_callback: Optional[StateChangedProtocol] = None
163
+ self.state_changed_callback: StateChangedProtocol | None = None
164
164
  self.log = log
165
165
  self.log.addFilter(TimedDuplicateFilter("No pool specific authentication_token_timeout.*", 60 * 10))
166
166
  self.log.addFilter(TimedDuplicateFilter("No pool specific difficulty has been set.*", 60 * 10))
167
167
 
168
168
  self.started = False
169
- self.harvester_handshake_task: Optional[asyncio.Task[None]] = None
169
+ self.harvester_handshake_task: asyncio.Task[None] | None = None
170
170
 
171
171
  # From p2_singleton_puzzle_hash to pool state dict
172
172
  self.pool_state: dict[bytes32, dict[str, Any]] = {}
@@ -180,7 +180,7 @@ class Farmer:
180
180
  self.all_root_sks: list[PrivateKey] = []
181
181
 
182
182
  # Use to find missing signage points. (new_signage_point, time)
183
- self.prev_signage_point: Optional[tuple[uint64, farmer_protocol.NewSignagePoint]] = None
183
+ self.prev_signage_point: tuple[uint64, farmer_protocol.NewSignagePoint] | None = None
184
184
 
185
185
  @contextlib.asynccontextmanager
186
186
  async def manage(self) -> AsyncIterator[None]:
@@ -219,7 +219,7 @@ class Farmer:
219
219
  await asyncio.sleep(0.5) # https://docs.aiohttp.org/en/stable/client_advanced.html#graceful-shutdown
220
220
  self.started = False
221
221
 
222
- def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
222
+ def get_connections(self, request_node_type: NodeType | None) -> list[dict[str, Any]]:
223
223
  return default_get_connections(server=self.server, request_node_type=request_node_type)
224
224
 
225
225
  async def ensure_keychain_proxy(self) -> KeychainProxy:
@@ -312,7 +312,7 @@ class Farmer:
312
312
  self.harvester_handshake_task = None
313
313
 
314
314
  if peer.connection_type is NodeType.HARVESTER:
315
- self.plot_sync_receivers[peer.peer_node_id] = Receiver(peer, self.plot_sync_callback)
315
+ self.plot_sync_receivers[peer.peer_node_id] = Receiver(peer, self.plot_sync_callback, self.constants)
316
316
  self.harvester_handshake_task = create_referenced_task(handshake_task())
317
317
 
318
318
  def set_server(self, server: ChiaServer) -> None:
@@ -339,14 +339,14 @@ class Farmer:
339
339
  del self.plot_sync_receivers[connection.peer_node_id]
340
340
  self.state_changed("harvester_removed", {"node_id": connection.peer_node_id})
341
341
 
342
- async def plot_sync_callback(self, peer_id: bytes32, delta: Optional[Delta]) -> None:
342
+ async def plot_sync_callback(self, peer_id: bytes32, delta: Delta | None) -> None:
343
343
  log.debug(f"plot_sync_callback: peer_id {peer_id}, delta {delta}")
344
344
  receiver: Receiver = self.plot_sync_receivers[peer_id]
345
345
  harvester_updated: bool = delta is not None and not delta.empty()
346
346
  if receiver.initial_sync() or harvester_updated:
347
347
  self.state_changed("harvester_update", receiver.to_dict(True))
348
348
 
349
- async def _pool_get_pool_info(self, pool_config: PoolWalletConfig) -> Optional[GetPoolInfoResult]:
349
+ async def _pool_get_pool_info(self, pool_config: PoolWalletConfig) -> GetPoolInfoResult | None:
350
350
  try:
351
351
  async with aiohttp.ClientSession(trust_env=True) as session:
352
352
  url = f"{pool_config.pool_url}/pool_info"
@@ -354,7 +354,7 @@ class Farmer:
354
354
  if resp.ok:
355
355
  response: dict[str, Any] = json.loads(await resp.text())
356
356
  self.log.info(f"GET /pool_info response: {response}")
357
- new_pool_url: Optional[str] = None
357
+ new_pool_url: str | None = None
358
358
  response_url_str = f"{resp.url}"
359
359
  if (
360
360
  response_url_str != url
@@ -379,7 +379,7 @@ class Farmer:
379
379
 
380
380
  async def _pool_get_farmer(
381
381
  self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, authentication_sk: PrivateKey
382
- ) -> Optional[dict[str, Any]]:
382
+ ) -> dict[str, Any] | None:
383
383
  authentication_token = get_current_authentication_token(authentication_token_timeout)
384
384
  message: bytes32 = std_hash(
385
385
  AuthenticationPayload(
@@ -387,7 +387,7 @@ class Farmer:
387
387
  )
388
388
  )
389
389
  signature: G2Element = AugSchemeMPL.sign(authentication_sk, message)
390
- get_farmer_params: dict[str, Union[str, int]] = {
390
+ get_farmer_params: dict[str, str | int] = {
391
391
  "launcher_id": pool_config.launcher_id.hex(),
392
392
  "authentication_token": authentication_token,
393
393
  "signature": bytes(signature).hex(),
@@ -426,8 +426,8 @@ class Farmer:
426
426
 
427
427
  async def _pool_post_farmer(
428
428
  self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, owner_sk: PrivateKey
429
- ) -> Optional[dict[str, Any]]:
430
- auth_sk: Optional[PrivateKey] = self.get_authentication_sk(pool_config)
429
+ ) -> dict[str, Any] | None:
430
+ auth_sk: PrivateKey | None = self.get_authentication_sk(pool_config)
431
431
  assert auth_sk is not None
432
432
  post_farmer_payload: PostFarmerPayload = PostFarmerPayload(
433
433
  pool_config.launcher_id,
@@ -475,7 +475,7 @@ class Farmer:
475
475
  async def _pool_put_farmer(
476
476
  self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, owner_sk: PrivateKey
477
477
  ) -> None:
478
- auth_sk: Optional[PrivateKey] = self.get_authentication_sk(pool_config)
478
+ auth_sk: PrivateKey | None = self.get_authentication_sk(pool_config)
479
479
  assert auth_sk is not None
480
480
  put_farmer_payload: PutFarmerPayload = PutFarmerPayload(
481
481
  pool_config.launcher_id,
@@ -518,10 +518,10 @@ class Farmer:
518
518
  pool_config.p2_singleton_puzzle_hash, f"Exception in PUT /farmer {pool_config.pool_url}, {e}"
519
519
  )
520
520
 
521
- def get_authentication_sk(self, pool_config: PoolWalletConfig) -> Optional[PrivateKey]:
521
+ def get_authentication_sk(self, pool_config: PoolWalletConfig) -> PrivateKey | None:
522
522
  if pool_config.p2_singleton_puzzle_hash in self.authentication_keys:
523
523
  return self.authentication_keys[pool_config.p2_singleton_puzzle_hash]
524
- auth_sk: Optional[PrivateKey] = find_authentication_sk(self.all_root_sks, pool_config.owner_public_key)
524
+ auth_sk: PrivateKey | None = find_authentication_sk(self.all_root_sks, pool_config.owner_public_key)
525
525
  if auth_sk is not None:
526
526
  self.authentication_keys[pool_config.p2_singleton_puzzle_hash] = auth_sk
527
527
  return auth_sk
@@ -534,7 +534,7 @@ class Farmer:
534
534
  p2_singleton_puzzle_hash = pool_config.p2_singleton_puzzle_hash
535
535
 
536
536
  try:
537
- authentication_sk: Optional[PrivateKey] = self.get_authentication_sk(pool_config)
537
+ authentication_sk: PrivateKey | None = self.get_authentication_sk(pool_config)
538
538
 
539
539
  if authentication_sk is None:
540
540
  self.log.error(f"Could not find authentication sk for {p2_singleton_puzzle_hash}")
@@ -602,13 +602,13 @@ class Farmer:
602
602
  pool_state["next_farmer_update"] = time.time() + UPDATE_POOL_FARMER_INFO_INTERVAL
603
603
  authentication_token_timeout = pool_state["authentication_token_timeout"]
604
604
 
605
- async def update_pool_farmer_info() -> tuple[Optional[GetFarmerResponse], Optional[PoolErrorCode]]:
605
+ async def update_pool_farmer_info() -> tuple[GetFarmerResponse | None, PoolErrorCode | None]:
606
606
  # Run a GET /farmer to see if the farmer is already known by the pool
607
607
  response = await self._pool_get_farmer(
608
608
  pool_config, authentication_token_timeout, authentication_sk
609
609
  )
610
- farmer_response: Optional[GetFarmerResponse] = None
611
- error_code_response: Optional[PoolErrorCode] = None
610
+ farmer_response: GetFarmerResponse | None = None
611
+ error_code_response: PoolErrorCode | None = None
612
612
  if response is not None:
613
613
  if "error_code" not in response:
614
614
  farmer_response = GetFarmerResponse.from_json_dict(response)
@@ -701,7 +701,7 @@ class Farmer:
701
701
  "pool_target": self.pool_target_encoded,
702
702
  }
703
703
 
704
- def set_reward_targets(self, farmer_target_encoded: Optional[str], pool_target_encoded: Optional[str]) -> None:
704
+ def set_reward_targets(self, farmer_target_encoded: str | None, pool_target_encoded: str | None) -> None:
705
705
  with lock_and_load_config(self._root_path, "config.yaml") as config:
706
706
  if farmer_target_encoded is not None:
707
707
  self.farmer_target_encoded = farmer_target_encoded
@@ -733,13 +733,13 @@ class Farmer:
733
733
 
734
734
  self.log.warning(f"Launcher id: {launcher_id} not found")
735
735
 
736
- async def generate_login_link(self, launcher_id: bytes32) -> Optional[str]:
736
+ async def generate_login_link(self, launcher_id: bytes32) -> str | None:
737
737
  for pool_state in self.pool_state.values():
738
738
  pool_config: PoolWalletConfig = pool_state["pool_config"]
739
739
  if pool_config.launcher_id != launcher_id:
740
740
  continue
741
741
 
742
- authentication_sk: Optional[PrivateKey] = self.get_authentication_sk(pool_config)
742
+ authentication_sk: PrivateKey | None = self.get_authentication_sk(pool_config)
743
743
  if authentication_sk is None:
744
744
  self.log.error(f"Could not find authentication sk for {pool_config.p2_singleton_puzzle_hash}")
745
745
  continue
@@ -781,14 +781,14 @@ class Farmer:
781
781
  return {"harvesters": harvesters}
782
782
 
783
783
  def get_receiver(self, node_id: bytes32) -> Receiver:
784
- receiver: Optional[Receiver] = self.plot_sync_receivers.get(node_id)
784
+ receiver: Receiver | None = self.plot_sync_receivers.get(node_id)
785
785
  if receiver is None:
786
786
  raise KeyError(f"Receiver missing for {node_id}")
787
787
  return receiver
788
788
 
789
789
  def check_missing_signage_points(
790
790
  self, timestamp: uint64, new_signage_point: farmer_protocol.NewSignagePoint
791
- ) -> Optional[tuple[uint64, uint32]]:
791
+ ) -> tuple[uint64, uint32] | None:
792
792
  if self.prev_signage_point is None:
793
793
  self.prev_signage_point = (timestamp, new_signage_point)
794
794
  return None
chia/farmer/farmer_api.py CHANGED
@@ -3,10 +3,10 @@ from __future__ import annotations
3
3
  import json
4
4
  import logging
5
5
  import time
6
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast
6
+ from typing import TYPE_CHECKING, Any, ClassVar
7
7
 
8
8
  import aiohttp
9
- from chia_rs import AugSchemeMPL, G2Element, PlotSize, PoolTarget, PrivateKey, ProofOfSpace
9
+ from chia_rs import AugSchemeMPL, G2Element, PlotParam, PoolTarget, PrivateKey, ProofOfSpace
10
10
  from chia_rs.sized_bytes import bytes32
11
11
  from chia_rs.sized_ints import uint8, uint16, uint32, uint64
12
12
  from packaging.version import Version
@@ -51,9 +51,11 @@ from chia.types.blockchain_format.proof_of_space import (
51
51
 
52
52
  class FarmerAPI:
53
53
  if TYPE_CHECKING:
54
- from chia.server.api_protocol import ApiProtocol
54
+ from chia.apis.farmer_stub import FarmerApiStub
55
55
 
56
- _protocol_check: ClassVar[ApiProtocol] = cast("FarmerAPI", None)
56
+ # Verify this class implements the FarmerApiStub protocol
57
+ def _protocol_check(self: FarmerAPI) -> FarmerApiStub:
58
+ return self
57
59
 
58
60
  log: logging.Logger
59
61
  farmer: Farmer
@@ -104,6 +106,7 @@ class FarmerAPI:
104
106
  new_proof_of_space.challenge_hash,
105
107
  new_proof_of_space.sp_hash,
106
108
  height=sp.peak_height,
109
+ prev_transaction_block_height=sp.last_tx_height,
107
110
  )
108
111
  if computed_quality_string is None:
109
112
  plotid: bytes32 = get_plot_id(new_proof_of_space.proof)
@@ -115,11 +118,9 @@ class FarmerAPI:
115
118
  required_iters: uint64 = calculate_iterations_quality(
116
119
  self.farmer.constants,
117
120
  computed_quality_string,
118
- new_proof_of_space.proof.size(),
121
+ new_proof_of_space.proof.param(),
119
122
  sp.difficulty,
120
123
  new_proof_of_space.sp_hash,
121
- sp.sub_slot_iters,
122
- sp.last_tx_height,
123
124
  )
124
125
 
125
126
  # If the iters are good enough to make a block, proceed with the block making flow
@@ -127,7 +128,7 @@ class FarmerAPI:
127
128
  if new_proof_of_space.farmer_reward_address_override is not None:
128
129
  self.farmer.notify_farmer_reward_taken_by_harvester_as_fee(sp, new_proof_of_space)
129
130
 
130
- sp_src_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
131
+ sp_src_data: list[SignatureRequestSourceData | None] | None = None
131
132
  if (
132
133
  new_proof_of_space.include_source_signature_data
133
134
  or new_proof_of_space.farmer_reward_address_override is not None
@@ -224,11 +225,9 @@ class FarmerAPI:
224
225
  required_iters = calculate_iterations_quality(
225
226
  self.farmer.constants,
226
227
  computed_quality_string,
227
- new_proof_of_space.proof.size(),
228
+ new_proof_of_space.proof.param(),
228
229
  pool_state_dict["current_difficulty"],
229
230
  new_proof_of_space.sp_hash,
230
- sp.sub_slot_iters,
231
- sp.last_tx_height,
232
231
  )
233
232
  if required_iters >= calculate_sp_interval_iters(
234
233
  self.farmer.constants, self.farmer.constants.POOL_SUB_SLOT_ITERS
@@ -280,7 +279,7 @@ class FarmerAPI:
280
279
 
281
280
  # The plot key is 2/2 so we need the harvester's half of the signature
282
281
  m_to_sign = payload.get_hash()
283
- m_src_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
282
+ m_src_data: list[SignatureRequestSourceData | None] | None = None
284
283
 
285
284
  if ( # pragma: no cover
286
285
  new_proof_of_space.include_source_signature_data
@@ -313,7 +312,7 @@ class FarmerAPI:
313
312
 
314
313
  assert len(response.message_signatures) == 1
315
314
 
316
- plot_signature: Optional[G2Element] = None
315
+ plot_signature: G2Element | None = None
317
316
  for sk in self.farmer.get_private_keys():
318
317
  pk = sk.get_g1()
319
318
  if pk == response.farmer_pk:
@@ -328,9 +327,7 @@ class FarmerAPI:
328
327
  )
329
328
  assert AugSchemeMPL.verify(agg_pk, m_to_sign, plot_signature)
330
329
 
331
- authentication_sk: Optional[PrivateKey] = self.farmer.get_authentication_sk(
332
- pool_state_dict["pool_config"]
333
- )
330
+ authentication_sk: PrivateKey | None = self.farmer.get_authentication_sk(pool_state_dict["pool_config"])
334
331
  if authentication_sk is None:
335
332
  self.farmer.log.error(f"No authentication sk for {p2_singleton_puzzle_hash}")
336
333
  increment_pool_stats(
@@ -507,11 +504,17 @@ class FarmerAPI:
507
504
 
508
505
  # Process each partial proof chain through solver service to get full proofs
509
506
  for partial_proof in partial_proof_data.partial_proofs:
510
- solver_info = SolverInfo(partial_proof=partial_proof)
507
+ solver_info = SolverInfo(
508
+ partial_proof=partial_proof,
509
+ plot_id=partial_proof_data.plot_id,
510
+ strength=partial_proof_data.strength,
511
+ size=partial_proof_data.plot_size,
512
+ )
511
513
 
514
+ key = bytes(partial_proof)
512
515
  try:
513
516
  # store pending request data for matching with response
514
- self.farmer.pending_solver_requests[partial_proof] = {
517
+ self.farmer.pending_solver_requests[key] = {
515
518
  "proof_data": partial_proof_data,
516
519
  "peer": peer,
517
520
  }
@@ -519,15 +522,15 @@ class FarmerAPI:
519
522
  # send solve request to all solver connections
520
523
  msg = make_msg(ProtocolMessageTypes.solve, solver_info)
521
524
  await self.farmer.server.send_to_all([msg], NodeType.SOLVER)
522
- self.farmer.log.debug(f"Sent solve request for partial proof {partial_proof.hex()[:10]}...")
525
+ self.farmer.log.debug(f"Sent solve request for partial proof {partial_proof.proof_fragments[:5]}...")
523
526
 
524
527
  except Exception as e:
525
528
  self.farmer.log.error(
526
- f"Failed to call solver service for partial proof {partial_proof.hex()[:10]}...: {e}"
529
+ f"Failed to call solver service for partial proof {partial_proof.proof_fragments[:5]}...: {e}"
527
530
  )
528
531
  # clean up pending request
529
- if partial_proof in self.farmer.pending_solver_requests:
530
- del self.farmer.pending_solver_requests[partial_proof]
532
+ if key in self.farmer.pending_solver_requests:
533
+ del self.farmer.pending_solver_requests[key]
531
534
 
532
535
  @metadata.request()
533
536
  async def solution_response(self, response: SolverResponse, peer: WSChiaConnection) -> None:
@@ -539,14 +542,15 @@ class FarmerAPI:
539
542
 
540
543
  # find the matching pending request using partial_proof
541
544
 
542
- if response.partial_proof not in self.farmer.pending_solver_requests:
545
+ key = bytes(response.partial_proof)
546
+ if key not in self.farmer.pending_solver_requests:
543
547
  self.farmer.log.warning(
544
- f"Received solver response for unknown partial proof {response.partial_proof.hex()}"
548
+ f"Received solver response for unknown partial proof {response.partial_proof.proof_fragments[:5]}"
545
549
  )
546
550
  return
547
551
 
548
552
  # get the original request data
549
- request_data = self.farmer.pending_solver_requests.pop(response.partial_proof)
553
+ request_data = self.farmer.pending_solver_requests.pop(key)
550
554
  proof_data = request_data["proof_data"]
551
555
  original_peer = request_data["peer"]
552
556
  partial_proof = response.partial_proof
@@ -554,7 +558,9 @@ class FarmerAPI:
554
558
  # create the proof of space with the solver's proof
555
559
  proof_bytes = response.proof
556
560
  if proof_bytes is None or len(proof_bytes) == 0:
557
- self.farmer.log.warning(f"Received empty proof from solver for proof {partial_proof.hex()}...")
561
+ self.farmer.log.warning(
562
+ f"Received empty proof from solver for proof {partial_proof.proof_fragments[:5]}..."
563
+ )
558
564
  return
559
565
 
560
566
  sp_challenge_hash = proof_data.challenge_hash
@@ -651,7 +657,7 @@ class FarmerAPI:
651
657
  new_signage_point.challenge_chain_sp,
652
658
  pool_difficulties,
653
659
  uint8(
654
- calculate_prefix_bits(self.farmer.constants, new_signage_point.peak_height, PlotSize.make_v1(32))
660
+ calculate_prefix_bits(self.farmer.constants, new_signage_point.peak_height, PlotParam.make_v1(32))
655
661
  ),
656
662
  )
657
663
 
@@ -692,7 +698,7 @@ class FarmerAPI:
692
698
  )
693
699
 
694
700
  @metadata.request()
695
- async def request_signed_values(self, full_node_request: farmer_protocol.RequestSignedValues) -> Optional[Message]:
701
+ async def request_signed_values(self, full_node_request: farmer_protocol.RequestSignedValues) -> Message | None:
696
702
  if full_node_request.quality_string not in self.farmer.quality_str_to_identifiers:
697
703
  self.farmer.log.error(f"Do not have quality string {full_node_request.quality_string}")
698
704
  return None
@@ -701,7 +707,7 @@ class FarmerAPI:
701
707
  full_node_request.quality_string
702
708
  ]
703
709
 
704
- message_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
710
+ message_data: list[SignatureRequestSourceData | None] | None = None
705
711
 
706
712
  if full_node_request.foliage_block_data is not None:
707
713
  message_data = [
@@ -792,7 +798,7 @@ class FarmerAPI:
792
798
 
793
799
  def _process_respond_signatures(
794
800
  self, response: harvester_protocol.RespondSignatures
795
- ) -> Optional[Union[DeclareProofOfSpace, SignedValues]]:
801
+ ) -> DeclareProofOfSpace | SignedValues | None:
796
802
  """
797
803
  Processing the responded signatures happens when receiving an unsolicited request for an SP or when receiving
798
804
  the signature response for a block from a harvester.
@@ -803,6 +809,7 @@ class FarmerAPI:
803
809
  is_sp_signatures: bool = False
804
810
  sps = self.farmer.sps[response.sp_hash]
805
811
  peak_height = sps[0].peak_height
812
+ last_tx_height = sps[0].last_tx_height
806
813
  signage_point_index = sps[0].signage_point_index
807
814
  found_sp_hash_debug = False
808
815
  for sp_candidate in sps:
@@ -821,7 +828,12 @@ class FarmerAPI:
821
828
  include_taproot: bool = pospace.pool_contract_puzzle_hash is not None
822
829
 
823
830
  computed_quality_string = verify_and_get_quality_string(
824
- pospace, self.farmer.constants, response.challenge_hash, response.sp_hash, height=peak_height
831
+ pospace,
832
+ self.farmer.constants,
833
+ response.challenge_hash,
834
+ response.sp_hash,
835
+ height=peak_height,
836
+ prev_transaction_block_height=last_tx_height,
825
837
  )
826
838
  if computed_quality_string is None:
827
839
  self.farmer.log.warning(f"Have invalid PoSpace {pospace}")
@@ -867,9 +879,9 @@ class FarmerAPI:
867
879
  )
868
880
  return None
869
881
 
870
- pool_target: Optional[PoolTarget] = PoolTarget(self.farmer.pool_target, uint32(0))
882
+ pool_target: PoolTarget | None = PoolTarget(self.farmer.pool_target, uint32(0))
871
883
  assert pool_target is not None
872
- pool_target_signature: Optional[G2Element] = AugSchemeMPL.sign(
884
+ pool_target_signature: G2Element | None = AugSchemeMPL.sign(
873
885
  self.farmer.pool_sks_map[pool_pk], bytes(pool_target)
874
886
  )
875
887
  else:
@@ -2,7 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  import operator
5
- from typing import TYPE_CHECKING, Any, Callable, ClassVar, Optional, cast
5
+ from collections.abc import Callable
6
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
6
7
 
7
8
  from chia_rs.sized_bytes import bytes32
8
9
  from chia_rs.sized_ints import uint32
@@ -33,7 +34,7 @@ class PaginatedRequestData(Protocol):
33
34
  @dataclasses.dataclass(frozen=True)
34
35
  class FilterItem(Streamable):
35
36
  key: str
36
- value: Optional[str]
37
+ value: str | None
37
38
 
38
39
 
39
40
  @streamable
@@ -108,7 +109,7 @@ class FarmerRpcApi:
108
109
  "/connect_to_solver": self.connect_to_solver,
109
110
  }
110
111
 
111
- async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]]) -> list[WsRpcMessage]:
112
+ async def _state_changed(self, change: str, change_data: dict[str, Any] | None) -> list[WsRpcMessage]:
112
113
  payloads = []
113
114
 
114
115
  if change_data is None:
@@ -363,7 +364,7 @@ class FarmerRpcApi:
363
364
 
364
365
  async def get_pool_login_link(self, request: dict[str, Any]) -> EndpointResult:
365
366
  launcher_id: bytes32 = bytes32.from_hexstr(request["launcher_id"])
366
- login_link: Optional[str] = await self.service.generate_login_link(launcher_id)
367
+ login_link: str | None = await self.service.generate_login_link(launcher_id)
367
368
  if login_link is None:
368
369
  raise ValueError(f"Failed to generate login link for {launcher_id.hex()}")
369
370
  return {"login_link": login_link}
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Optional, cast
3
+ from typing import Any, cast
4
4
 
5
5
  from chia_rs.sized_bytes import bytes32
6
6
 
@@ -18,7 +18,7 @@ class FarmerRpcClient(RpcClient):
18
18
  to the full node.
19
19
  """
20
20
 
21
- async def get_signage_point(self, sp_hash: bytes32) -> Optional[dict[str, Any]]:
21
+ async def get_signage_point(self, sp_hash: bytes32) -> dict[str, Any] | None:
22
22
  try:
23
23
  return await self.fetch("get_signage_point", {"sp_hash": sp_hash.hex()})
24
24
  except ValueError: # not synced
@@ -44,8 +44,8 @@ class FarmerRpcClient(RpcClient):
44
44
 
45
45
  async def set_reward_targets(
46
46
  self,
47
- farmer_target: Optional[str] = None,
48
- pool_target: Optional[str] = None,
47
+ farmer_target: str | None = None,
48
+ pool_target: str | None = None,
49
49
  ) -> dict[str, Any]:
50
50
  request = {}
51
51
  if farmer_target is not None:
@@ -79,10 +79,10 @@ class FarmerRpcClient(RpcClient):
79
79
  async def get_harvester_plots_duplicates(self, request: PlotPathRequestData) -> dict[str, Any]:
80
80
  return await self.fetch("get_harvester_plots_duplicates", recurse_jsonify(request))
81
81
 
82
- async def get_pool_login_link(self, launcher_id: bytes32) -> Optional[str]:
82
+ async def get_pool_login_link(self, launcher_id: bytes32) -> str | None:
83
83
  try:
84
84
  result = await self.fetch("get_pool_login_link", {"launcher_id": launcher_id.hex()})
85
- return cast(Optional[str], result["login_link"])
85
+ return cast(str | None, result["login_link"])
86
86
  except ValueError: # not connected to pool.
87
87
  return None
88
88
 
@@ -3,11 +3,11 @@ from __future__ import annotations
3
3
  import os
4
4
  import pathlib
5
5
  import sys
6
- from typing import Any, Optional
6
+ from typing import Any
7
7
 
8
8
  from chia_rs import ConsensusConstants
9
9
 
10
- from chia.apis import ApiProtocolRegistry
10
+ from chia.apis import StubMetadataRegistry
11
11
  from chia.consensus.constants import replace_str_to_bytes
12
12
  from chia.consensus.default_constants import DEFAULT_CONSTANTS, update_testnet_overrides
13
13
  from chia.farmer.farmer import Farmer
@@ -36,9 +36,9 @@ def create_farmer_service(
36
36
  config: dict[str, Any],
37
37
  config_pool: dict[str, Any],
38
38
  consensus_constants: ConsensusConstants,
39
- keychain: Optional[Keychain] = None,
39
+ keychain: Keychain | None = None,
40
40
  connect_to_daemon: bool = True,
41
- solver_peer: Optional[UnresolvedPeerInfo] = None,
41
+ solver_peer: UnresolvedPeerInfo | None = None,
42
42
  ) -> FarmerService:
43
43
  service_config = config[SERVICE_NAME]
44
44
 
@@ -52,7 +52,7 @@ def create_farmer_service(
52
52
  )
53
53
  peer_api = FarmerAPI(node)
54
54
 
55
- rpc_info: Optional[RpcInfo[FarmerRpcApi]] = None
55
+ rpc_info: RpcInfo[FarmerRpcApi] | None = None
56
56
  if service_config.get("start_rpc_server", True):
57
57
  rpc_info = (FarmerRpcApi, service_config["rpc_port"])
58
58
 
@@ -73,7 +73,7 @@ def create_farmer_service(
73
73
  network_id=network_id,
74
74
  rpc_info=rpc_info,
75
75
  connect_to_daemon=connect_to_daemon,
76
- class_for_type=ApiProtocolRegistry,
76
+ stub_metadata_for_type=StubMetadataRegistry,
77
77
  )
78
78
 
79
79