chia-blockchain 2.5.7rc3__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 +12 -7
  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 +16 -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.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc3.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.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/plotting/prover.py CHANGED
@@ -1,9 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from dataclasses import dataclass
3
4
  from enum import IntEnum
4
5
  from typing import TYPE_CHECKING, ClassVar, Protocol, cast
5
6
 
6
- from chia_rs import PlotSize
7
+ from chia_rs import PartialProof, PlotParam, Prover, QualityProof
7
8
  from chia_rs.sized_bytes import bytes32
8
9
  from chia_rs.sized_ints import uint8
9
10
  from chiapos import DiskProver
@@ -19,46 +20,65 @@ class PlotVersion(IntEnum):
19
20
  V2 = 2
20
21
 
21
22
 
23
+ class QualityProtocol(Protocol):
24
+ def get_string(self) -> bytes32: ...
25
+
26
+
22
27
  class ProverProtocol(Protocol):
23
28
  def get_filename(self) -> str: ...
24
- def get_size(self) -> PlotSize: ...
29
+ def get_param(self) -> PlotParam: ...
30
+ def get_strength(self) -> uint8: ...
25
31
  def get_memo(self) -> bytes: ...
26
32
  def get_compression_level(self) -> uint8: ...
27
33
  def get_version(self) -> PlotVersion: ...
28
34
  def __bytes__(self) -> bytes: ...
29
35
  def get_id(self) -> bytes32: ...
30
- def get_qualities_for_challenge(self, challenge: bytes32) -> list[bytes32]: ...
31
-
32
- # this is only supported by v2 plots
33
- def get_partial_proofs_for_challenge(self, challenge: bytes32, required_plot_strength: uint8) -> list[bytes]: ...
34
-
35
- # this is only supported by v1 plots. v2 plots first get the partial proof
36
- # and turn it into a full proof by calling solve_proof(), or pass it to the solver service
37
- def get_full_proof(self, challenge: bytes32, index: int, parallel_read: bool = True) -> bytes: ...
36
+ def get_qualities_for_challenge(
37
+ self, challenge: bytes32, proof_fragment_filter: uint8
38
+ ) -> list[QualityProtocol]: ...
38
39
 
39
40
  @classmethod
40
41
  def from_bytes(cls, data: bytes) -> ProverProtocol: ...
41
42
 
42
43
 
44
+ @dataclass(frozen=True)
45
+ class V2Quality(QualityProtocol):
46
+ _quality_proof: QualityProof
47
+
48
+ def get_string(self) -> bytes32:
49
+ return self._quality_proof.serialize()
50
+
51
+
43
52
  class V2Prover:
44
53
  """Placeholder for future V2 plot format support"""
45
54
 
55
+ _prover: Prover
56
+
46
57
  if TYPE_CHECKING:
47
58
  _protocol_check: ClassVar[ProverProtocol] = cast("V2Prover", None)
48
59
 
49
- def __init__(self, filename: str):
50
- self._filename = filename
60
+ @classmethod
61
+ def from_filename(cls, path: str) -> V2Prover:
62
+ return V2Prover(Prover(path))
63
+
64
+ @classmethod
65
+ def from_bytes(cls, data: bytes) -> V2Prover:
66
+ return V2Prover(Prover.from_bytes(data))
67
+
68
+ def __init__(self, prover: Prover):
69
+ self._prover = prover
51
70
 
52
71
  def get_filename(self) -> str:
53
- return str(self._filename)
72
+ return self._prover.get_filename()
54
73
 
55
- def get_size(self) -> PlotSize:
56
- # TODO: todo_v2_plots get k size from plot
57
- raise NotImplementedError("V2 plot format is not yet implemented")
74
+ def get_param(self) -> PlotParam:
75
+ return PlotParam.make_v2(self._prover.get_strength())
76
+
77
+ def get_strength(self) -> uint8:
78
+ return uint8(self._prover.get_strength())
58
79
 
59
80
  def get_memo(self) -> bytes:
60
- # TODO: todo_v2_plots
61
- raise NotImplementedError("V2 plot format is not yet implemented")
81
+ return self._prover.get_memo()
62
82
 
63
83
  def get_compression_level(self) -> uint8:
64
84
  # v2 plots are never compressed
@@ -68,27 +88,24 @@ class V2Prover:
68
88
  return PlotVersion.V2
69
89
 
70
90
  def __bytes__(self) -> bytes:
71
- # TODO: todo_v2_plots Implement prover serialization for caching
72
- raise NotImplementedError("V2 plot format is not yet implemented")
91
+ return self._prover.to_bytes()
73
92
 
74
93
  def get_id(self) -> bytes32:
75
- # TODO: Extract plot ID from V2 plot file
76
- raise NotImplementedError("V2 plot format is not yet implemented")
94
+ return self._prover.plot_id()
77
95
 
78
- def get_qualities_for_challenge(self, challenge: bytes32) -> list[bytes32]:
79
- raise AssertionError("V2 plot format does not support qualities directly, use partial proofs")
96
+ def get_qualities_for_challenge(self, challenge: bytes32, proof_fragment_filter: uint8) -> list[QualityProtocol]:
97
+ return [V2Quality(q) for q in self._prover.get_qualities_for_challenge(challenge, proof_fragment_filter)]
80
98
 
81
- def get_partial_proofs_for_challenge(self, challenge: bytes, required_plot_strength: uint8) -> list[bytes]:
82
- # TODO: todo_v2_plots Implement plot partial proof lookup
83
- raise NotImplementedError("V2 plot format is not yet implemented")
99
+ def get_partial_proof(self, quality: V2Quality) -> PartialProof:
100
+ return self._prover.get_partial_proof(quality._quality_proof)[0]
84
101
 
85
- def get_full_proof(self, challenge: bytes32, index: int, parallel_read: bool = True) -> bytes:
86
- raise AssertionError("V2 plot format require solver to get full proof")
87
102
 
88
- @classmethod
89
- def from_bytes(cls, data: bytes) -> V2Prover:
90
- # TODO: todo_v2_plots Implement prover deserialization from cache
91
- raise NotImplementedError("V2 plot format is not yet implemented")
103
+ @dataclass(frozen=True)
104
+ class V1Quality(QualityProtocol):
105
+ _quality: bytes32
106
+
107
+ def get_string(self) -> bytes32:
108
+ return self._quality
92
109
 
93
110
 
94
111
  class V1Prover:
@@ -103,8 +120,11 @@ class V1Prover:
103
120
  def get_filename(self) -> str:
104
121
  return str(self._disk_prover.get_filename())
105
122
 
106
- def get_size(self) -> PlotSize:
107
- return PlotSize.make_v1(uint8(self._disk_prover.get_size()))
123
+ def get_param(self) -> PlotParam:
124
+ return PlotParam.make_v1(uint8(self._disk_prover.get_size()))
125
+
126
+ def get_strength(self) -> uint8:
127
+ raise AssertionError("V1 plot format doesn't use strength")
108
128
 
109
129
  def get_memo(self) -> bytes:
110
130
  return bytes(self._disk_prover.get_memo())
@@ -121,11 +141,8 @@ class V1Prover:
121
141
  def get_id(self) -> bytes32:
122
142
  return bytes32(self._disk_prover.get_id())
123
143
 
124
- def get_qualities_for_challenge(self, challenge: bytes32) -> list[bytes32]:
125
- return [bytes32(quality) for quality in self._disk_prover.get_qualities_for_challenge(challenge)]
126
-
127
- def get_partial_proofs_for_challenge(self, challenge: bytes32, required_plot_strength: uint8) -> list[bytes]:
128
- raise AssertionError("V1 plot format doesn't use partial proofs")
144
+ def get_qualities_for_challenge(self, challenge: bytes32, proof_fragment_filter: uint8) -> list[QualityProtocol]:
145
+ return [V1Quality(bytes32(quality)) for quality in self._disk_prover.get_qualities_for_challenge(challenge)]
129
146
 
130
147
  def get_full_proof(self, challenge: bytes32, index: int, parallel_read: bool = True) -> bytes:
131
148
  return bytes(self._disk_prover.get_full_proof(challenge, index, parallel_read))
@@ -137,7 +154,7 @@ class V1Prover:
137
154
 
138
155
  def get_prover_from_bytes(filename: str, prover_data: bytes) -> ProverProtocol:
139
156
  if filename.endswith(".plot2"):
140
- return V2Prover.from_bytes(prover_data)
157
+ return V2Prover(Prover.from_bytes(prover_data))
141
158
  elif filename.endswith(".plot"):
142
159
  return V1Prover(DiskProver.from_bytes(prover_data))
143
160
  else:
@@ -146,7 +163,7 @@ def get_prover_from_bytes(filename: str, prover_data: bytes) -> ProverProtocol:
146
163
 
147
164
  def get_prover_from_file(filename: str) -> ProverProtocol:
148
165
  if filename.endswith(".plot2"):
149
- return V2Prover(filename)
166
+ return V2Prover(Prover(filename))
150
167
  elif filename.endswith(".plot"):
151
168
  return V1Prover(DiskProver(filename))
152
169
  else:
chia/plotting/util.py CHANGED
@@ -4,7 +4,7 @@ import logging
4
4
  from dataclasses import dataclass, field
5
5
  from enum import Enum, IntEnum
6
6
  from pathlib import Path
7
- from typing import TYPE_CHECKING, Any, Optional, Union
7
+ from typing import TYPE_CHECKING, Any
8
8
 
9
9
  if TYPE_CHECKING:
10
10
  from chia.plotting.prover import ProverProtocol
@@ -42,8 +42,8 @@ class PlotsRefreshParameter(Streamable):
42
42
  @dataclass
43
43
  class PlotInfo:
44
44
  prover: ProverProtocol
45
- pool_public_key: Optional[G1Element]
46
- pool_contract_puzzle_hash: Optional[bytes32]
45
+ pool_public_key: G1Element | None
46
+ pool_contract_puzzle_hash: bytes32 | None
47
47
  plot_public_key: G1Element
48
48
  file_size: int
49
49
  time_modified: float
@@ -88,10 +88,10 @@ class Params:
88
88
  num_threads: int
89
89
  buckets: int
90
90
  tmp_dir: Path
91
- tmp2_dir: Optional[Path]
91
+ tmp2_dir: Path | None
92
92
  final_dir: Path
93
- plotid: Optional[str]
94
- memo: Optional[str]
93
+ plotid: str | None
94
+ memo: str | None
95
95
  nobitfield: bool
96
96
  stripe_size: int = 65536
97
97
 
@@ -101,7 +101,7 @@ class HarvestingMode(IntEnum):
101
101
  GPU = 2
102
102
 
103
103
 
104
- def get_plot_directories(root_path: Path, config: Optional[dict] = None) -> list[str]:
104
+ def get_plot_directories(root_path: Path, config: dict | None = None) -> list[str]:
105
105
  if config is None:
106
106
  config = load_config(root_path, "config.yaml")
107
107
  return config["harvester"]["plot_directories"] or []
@@ -192,14 +192,14 @@ def get_harvester_config(root_path: Path) -> dict[str, Any]:
192
192
  def update_harvester_config(
193
193
  root_path: Path,
194
194
  *,
195
- use_gpu_harvesting: Optional[bool] = None,
196
- gpu_index: Optional[int] = None,
197
- enforce_gpu_index: Optional[bool] = None,
198
- disable_cpu_affinity: Optional[bool] = None,
199
- parallel_decompressor_count: Optional[int] = None,
200
- decompressor_thread_count: Optional[int] = None,
201
- recursive_plot_scan: Optional[bool] = None,
202
- refresh_parameter: Optional[PlotsRefreshParameter] = None,
195
+ use_gpu_harvesting: bool | None = None,
196
+ gpu_index: int | None = None,
197
+ enforce_gpu_index: bool | None = None,
198
+ disable_cpu_affinity: bool | None = None,
199
+ parallel_decompressor_count: int | None = None,
200
+ decompressor_thread_count: int | None = None,
201
+ recursive_plot_scan: bool | None = None,
202
+ refresh_parameter: PlotsRefreshParameter | None = None,
203
203
  ):
204
204
  with lock_and_load_config(root_path, "config.yaml") as config:
205
205
  if use_gpu_harvesting is not None:
@@ -257,7 +257,7 @@ def get_filenames(directory: Path, recursive: bool, follow_links: bool) -> list[
257
257
  return all_files
258
258
 
259
259
 
260
- def parse_plot_info(memo: bytes) -> tuple[Union[G1Element, bytes32], G1Element, PrivateKey]:
260
+ def parse_plot_info(memo: bytes) -> tuple[G1Element | bytes32, G1Element, PrivateKey]:
261
261
  # Parses the plot info bytes into keys
262
262
  if len(memo) == (48 + 48 + 32):
263
263
  # This is a public key memo
chia/pools/pool_config.py CHANGED
@@ -1,9 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
+ from collections.abc import Callable
4
5
  from dataclasses import dataclass
5
6
  from pathlib import Path
6
- from typing import Any, Callable
7
+ from typing import Any
7
8
 
8
9
  from chia_rs import G1Element
9
10
  from chia_rs.sized_bytes import bytes32
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Optional
5
4
 
6
5
  from chia_puzzles_py.programs import (
7
6
  P2_SINGLETON_OR_DELAYED_PUZHASH,
@@ -126,8 +125,8 @@ def get_delayed_puz_info_from_launcher_spend(coinsol: CoinSpend) -> tuple[uint64
126
125
  extra_data = Program.from_bytes(bytes(coinsol.solution)).rest().rest().first()
127
126
  # Extra data is (pool_state delayed_puz_info)
128
127
  # Delayed puz info is (seconds delayed_puzzle_hash)
129
- seconds: Optional[uint64] = None
130
- delayed_puzzle_hash: Optional[bytes32] = None
128
+ seconds: uint64 | None = None
129
+ delayed_puzzle_hash: bytes32 | None = None
131
130
  for key_value_pairs in extra_data.as_iter():
132
131
  key_value_pair = key_value_pairs.as_pair()
133
132
  if key_value_pair is None:
@@ -221,14 +220,14 @@ def create_travel_spend(
221
220
  else:
222
221
  raise ValueError
223
222
 
224
- current_singleton: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(last_coin_spend)
223
+ current_singleton: Coin | None = get_most_recent_singleton_coin_from_coin_spend(last_coin_spend)
225
224
  assert current_singleton is not None
226
225
 
227
226
  if current_singleton.parent_coin_info == launcher_coin.name():
228
227
  parent_info_list = Program.to([launcher_coin.parent_coin_info, launcher_coin.amount])
229
228
  else:
230
229
  p = Program.from_bytes(bytes(last_coin_spend.puzzle_reveal))
231
- last_coin_spend_inner_puzzle: Optional[Program] = get_inner_puzzle_from_puzzle(p)
230
+ last_coin_spend_inner_puzzle: Program | None = get_inner_puzzle_from_puzzle(p)
232
231
  assert last_coin_spend_inner_puzzle is not None
233
232
  parent_info_list = Program.to(
234
233
  [
@@ -272,14 +271,14 @@ def create_absorb_spend(
272
271
  else:
273
272
  raise ValueError
274
273
  # full sol = (parent_info, my_amount, inner_solution)
275
- coin: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(last_coin_spend)
274
+ coin: Coin | None = get_most_recent_singleton_coin_from_coin_spend(last_coin_spend)
276
275
  assert coin is not None
277
276
 
278
277
  if coin.parent_coin_info == launcher_coin.name():
279
278
  parent_info: Program = Program.to([launcher_coin.parent_coin_info, launcher_coin.amount])
280
279
  else:
281
280
  p = Program.from_bytes(bytes(last_coin_spend.puzzle_reveal))
282
- last_coin_spend_inner_puzzle: Optional[Program] = get_inner_puzzle_from_puzzle(p)
281
+ last_coin_spend_inner_puzzle: Program | None = get_inner_puzzle_from_puzzle(p)
283
282
  assert last_coin_spend_inner_puzzle is not None
284
283
  parent_info = Program.to(
285
284
  [
@@ -309,7 +308,7 @@ def create_absorb_spend(
309
308
  return coin_spends
310
309
 
311
310
 
312
- def get_most_recent_singleton_coin_from_coin_spend(coin_sol: CoinSpend) -> Optional[Coin]:
311
+ def get_most_recent_singleton_coin_from_coin_spend(coin_sol: CoinSpend) -> Coin | None:
313
312
  additions: list[Coin] = compute_additions(coin_sol)
314
313
  for coin in additions:
315
314
  if coin.amount % 2 == 1:
@@ -369,7 +368,7 @@ def uncurry_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> tuple[Progra
369
368
  return target_puzzle_hash, relative_lock_height, owner_pubkey, p2_singleton_hash
370
369
 
371
370
 
372
- def get_inner_puzzle_from_puzzle(full_puzzle: Program) -> Optional[Program]:
371
+ def get_inner_puzzle_from_puzzle(full_puzzle: Program) -> Program | None:
373
372
  p = Program.from_bytes(bytes(full_puzzle))
374
373
  r = p.uncurry()
375
374
  if r is None:
@@ -382,8 +381,8 @@ def get_inner_puzzle_from_puzzle(full_puzzle: Program) -> Optional[Program]:
382
381
  return inner_puzzle
383
382
 
384
383
 
385
- def pool_state_from_extra_data(extra_data: Program) -> Optional[PoolState]:
386
- state_bytes: Optional[bytes] = None
384
+ def pool_state_from_extra_data(extra_data: Program) -> PoolState | None:
385
+ state_bytes: bytes | None = None
387
386
  try:
388
387
  for key, value in extra_data.as_python():
389
388
  if key == b"p":
@@ -397,7 +396,7 @@ def pool_state_from_extra_data(extra_data: Program) -> Optional[PoolState]:
397
396
  return None
398
397
 
399
398
 
400
- def solution_to_pool_state(full_spend: CoinSpend) -> Optional[PoolState]:
399
+ def solution_to_pool_state(full_spend: CoinSpend) -> PoolState | None:
401
400
  full_solution_ser: SerializedProgram = full_spend.solution
402
401
  full_solution: Program = Program.from_bytes(bytes(full_solution_ser))
403
402
 
chia/pools/pool_wallet.py CHANGED
@@ -2,8 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  import logging
5
- import time
6
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
5
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
7
6
 
8
7
  from chia_rs import CoinSpend, G1Element, G2Element
9
8
  from chia_rs.sized_bytes import bytes32
@@ -41,11 +40,10 @@ from chia.server.ws_connection import WSChiaConnection
41
40
  from chia.types.blockchain_format.coin import Coin
42
41
  from chia.types.blockchain_format.program import Program
43
42
  from chia.types.coin_spend import make_spend
44
- from chia.wallet.conditions import AssertCoinAnnouncement, Condition, ConditionValidTimes
43
+ from chia.wallet.conditions import AssertCoinAnnouncement, Condition
45
44
  from chia.wallet.puzzles.singleton_top_layer import SINGLETON_LAUNCHER
46
45
  from chia.wallet.transaction_record import TransactionRecord
47
46
  from chia.wallet.util.compute_additions import compute_additions
48
- from chia.wallet.util.transaction_type import TransactionType
49
47
  from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig
50
48
  from chia.wallet.util.wallet_types import WalletType
51
49
  from chia.wallet.wallet import Wallet
@@ -79,7 +77,7 @@ class PoolWallet:
79
77
  wallet_id: int
80
78
  next_transaction_fee: uint64 = uint64(0)
81
79
  next_tx_config: TXConfig = DEFAULT_TX_CONFIG
82
- target_state: Optional[PoolState] = None
80
+ target_state: PoolState | None = None
83
81
 
84
82
  """
85
83
  From the user's perspective, this is not a wallet at all, but a way to control
@@ -134,7 +132,7 @@ class PoolWallet:
134
132
  return self.wallet_info.id
135
133
 
136
134
  @classmethod
137
- def _verify_self_pooled(cls, state: PoolState) -> Optional[str]:
135
+ def _verify_self_pooled(cls, state: PoolState) -> str | None:
138
136
  err = ""
139
137
  if state.pool_url not in {None, ""}:
140
138
  err += " Unneeded pool_url for self-pooling"
@@ -145,7 +143,7 @@ class PoolWallet:
145
143
  return None if err == "" else err
146
144
 
147
145
  @classmethod
148
- def _verify_pooling_state(cls, state: PoolState) -> Optional[str]:
146
+ def _verify_pooling_state(cls, state: PoolState) -> str | None:
149
147
  err = ""
150
148
  if state.relative_lock_height < cls.MINIMUM_RELATIVE_LOCK_HEIGHT:
151
149
  err += (
@@ -163,7 +161,7 @@ class PoolWallet:
163
161
  return err
164
162
 
165
163
  @classmethod
166
- def _verify_pool_state(cls, state: PoolState) -> Optional[str]:
164
+ def _verify_pool_state(cls, state: PoolState) -> str | None:
167
165
  if state.target_puzzle_hash is None:
168
166
  return "Invalid puzzle_hash"
169
167
 
@@ -199,13 +197,13 @@ class PoolWallet:
199
197
 
200
198
  launcher_coin: Coin = all_spends[0].coin
201
199
  delayed_seconds, delayed_puzhash = get_delayed_puz_info_from_launcher_spend(all_spends[0])
202
- tip_singleton_coin: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(all_spends[-1])
200
+ tip_singleton_coin: Coin | None = get_most_recent_singleton_coin_from_coin_spend(all_spends[-1])
203
201
  launcher_id: bytes32 = launcher_coin.name()
204
202
  p2_singleton_puzzle_hash = launcher_id_to_p2_puzzle_hash(launcher_id, delayed_seconds, delayed_puzhash)
205
203
  assert tip_singleton_coin is not None
206
204
 
207
205
  curr_spend_i = len(all_spends) - 1
208
- pool_state: Optional[PoolState] = None
206
+ pool_state: PoolState | None = None
209
207
  last_singleton_spend_height = uint32(0)
210
208
  while pool_state is None:
211
209
  full_spend: CoinSpend = all_spends[curr_spend_i]
@@ -234,7 +232,7 @@ class PoolWallet:
234
232
  current_state: PoolWalletInfo = await self.get_current_state()
235
233
  pool_config_list: list[PoolWalletConfig] = load_pool_config(self.wallet_state_manager.root_path)
236
234
  pool_config_dict: dict[bytes32, PoolWalletConfig] = {c.launcher_id: c for c in pool_config_list}
237
- existing_config: Optional[PoolWalletConfig] = pool_config_dict.get(current_state.launcher_id, None)
235
+ existing_config: PoolWalletConfig | None = pool_config_dict.get(current_state.launcher_id, None)
238
236
  payout_instructions: str = existing_config.payout_instructions if existing_config is not None else ""
239
237
 
240
238
  if len(payout_instructions) == 0:
@@ -263,7 +261,7 @@ class PoolWallet:
263
261
  tip: tuple[uint32, CoinSpend] = await self.get_tip()
264
262
  tip_spend = tip[1]
265
263
 
266
- tip_coin: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
264
+ tip_coin: Coin | None = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
267
265
  assert tip_coin is not None
268
266
  spent_coin_name: bytes32 = tip_coin.name()
269
267
 
@@ -285,7 +283,7 @@ class PoolWallet:
285
283
  for _, added_spend in reversed(
286
284
  await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id)
287
285
  ):
288
- latest_state: Optional[PoolState] = solution_to_pool_state(added_spend)
286
+ latest_state: PoolState | None = solution_to_pool_state(added_spend)
289
287
  if latest_state is not None:
290
288
  if self.target_state == latest_state:
291
289
  self.target_state = None
@@ -328,7 +326,7 @@ class PoolWallet:
328
326
  block_spends: list[CoinSpend],
329
327
  block_height: uint32,
330
328
  *,
331
- name: Optional[str] = None,
329
+ name: str | None = None,
332
330
  ) -> PoolWallet:
333
331
  """
334
332
  This creates a new PoolWallet with only one spend: the launcher spend. The DB MUST be committed after calling
@@ -346,7 +344,7 @@ class PoolWallet:
346
344
  standard_wallet=wallet,
347
345
  )
348
346
 
349
- launcher_spend: Optional[CoinSpend] = None
347
+ launcher_spend: CoinSpend | None = None
350
348
  for spend in block_spends:
351
349
  if spend.coin.name() == launcher_coin_id:
352
350
  launcher_spend = spend
@@ -366,7 +364,7 @@ class PoolWallet:
366
364
  wallet_state_manager: Any,
367
365
  wallet: Wallet,
368
366
  wallet_info: WalletInfo,
369
- name: Optional[str] = None,
367
+ name: str | None = None,
370
368
  ) -> PoolWallet:
371
369
  """
372
370
  This creates a PoolWallet from DB. However, all data is already handled by WalletPoolStore, so we don't need
@@ -388,8 +386,8 @@ class PoolWallet:
388
386
  initial_target_state: PoolState,
389
387
  action_scope: WalletActionScope,
390
388
  fee: uint64 = uint64(0),
391
- p2_singleton_delay_time: Optional[uint64] = None,
392
- p2_singleton_delayed_ph: Optional[bytes32] = None,
389
+ p2_singleton_delay_time: uint64 | None = None,
390
+ p2_singleton_delayed_ph: bytes32 | None = None,
393
391
  extra_conditions: tuple[Condition, ...] = tuple(),
394
392
  ) -> tuple[bytes32, bytes32]:
395
393
  """
@@ -523,25 +521,15 @@ class PoolWallet:
523
521
 
524
522
  async with action_scope.use() as interface:
525
523
  interface.side_effects.transactions.append(
526
- TransactionRecord(
527
- confirmed_at_height=uint32(0),
528
- created_at_time=uint64(time.time()),
529
- to_puzzle_hash=new_full_puzzle.get_tree_hash(),
530
- to_address=self.wallet_state_manager.encode_puzzle_hash(new_full_puzzle.get_tree_hash()),
524
+ self.wallet_state_manager.new_outgoing_transaction(
525
+ wallet_id=self.id(),
526
+ puzzle_hash=new_full_puzzle.get_tree_hash(),
531
527
  amount=uint64(1),
532
- fee_amount=fee,
533
- confirmed=False,
534
- sent=uint32(0),
528
+ fee=fee,
535
529
  spend_bundle=unsigned_spend_bundle,
536
530
  additions=unsigned_spend_bundle.additions(),
537
531
  removals=unsigned_spend_bundle.removals(),
538
- wallet_id=self.id(),
539
- sent_to=[],
540
- trade_id=None,
541
- memos={},
542
- type=uint32(TransactionType.OUTGOING_TX.value),
543
532
  name=unsigned_spend_bundle.name(),
544
- valid_times=ConditionValidTimes(),
545
533
  )
546
534
  )
547
535
 
@@ -714,7 +702,7 @@ class PoolWallet:
714
702
  return total_fee
715
703
 
716
704
  async def claim_pool_rewards(
717
- self, fee: uint64, max_spends_in_tx: Optional[int], action_scope: WalletActionScope
705
+ self, fee: uint64, max_spends_in_tx: int | None, action_scope: WalletActionScope
718
706
  ) -> None:
719
707
  # Search for p2_puzzle_hash coins, and spend them with the singleton
720
708
  if await self.have_unconfirmed_transaction():
@@ -734,7 +722,7 @@ class PoolWallet:
734
722
  farming_rewards: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_farming_rewards()
735
723
  coin_to_height_farmed: dict[Coin, uint32] = {}
736
724
  for tx_record in farming_rewards:
737
- height_farmed: Optional[uint32] = tx_record.height_farmed(
725
+ height_farmed: uint32 | None = tx_record.height_farmed(
738
726
  self.wallet_state_manager.constants.GENESIS_CHALLENGE
739
727
  )
740
728
  assert height_farmed is not None
@@ -793,29 +781,18 @@ class PoolWallet:
793
781
  ),
794
782
  )
795
783
 
796
- current_time = uint64(time.time())
797
784
  # The claim spend, minus the fee amount from the main wallet
798
785
  async with action_scope.use() as interface:
799
786
  interface.side_effects.transactions.append(
800
- TransactionRecord(
801
- confirmed_at_height=uint32(0),
802
- created_at_time=current_time,
803
- to_puzzle_hash=current_state.current.target_puzzle_hash,
804
- to_address=self.wallet_state_manager.encode_puzzle_hash(current_state.current.target_puzzle_hash),
787
+ self.wallet_state_manager.new_outgoing_transaction(
788
+ wallet_id=uint32(self.wallet_id),
789
+ puzzle_hash=current_state.current.target_puzzle_hash,
805
790
  amount=uint64(total_amount),
806
- fee_amount=fee, # This will not be double counted in self.standard_wallet
807
- confirmed=False,
808
- sent=uint32(0),
791
+ fee=fee,
809
792
  spend_bundle=claim_spend,
810
793
  additions=[add for add in claim_spend.additions() if add.amount == last_solution.coin.amount],
811
794
  removals=claim_spend.removals(),
812
- wallet_id=uint32(self.wallet_id),
813
- sent_to=[],
814
- memos={},
815
- trade_id=None,
816
- type=uint32(TransactionType.OUTGOING_TX.value),
817
795
  name=claim_spend.name(),
818
- valid_times=ConditionValidTimes(),
819
796
  )
820
797
  )
821
798
 
@@ -842,7 +819,7 @@ class PoolWallet:
842
819
  unconfirmed: list[
843
820
  TransactionRecord
844
821
  ] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
845
- next_tip: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
822
+ next_tip: Coin | None = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
846
823
  assert next_tip is not None
847
824
 
848
825
  if any([rem.name() == next_tip.name() for tx_rec in unconfirmed for rem in tx_rec.removals]):
@@ -870,7 +847,7 @@ class PoolWallet:
870
847
  )
871
848
  return len(unconfirmed) > 0
872
849
 
873
- async def get_confirmed_balance(self, _: Optional[object] = None) -> uint128:
850
+ async def get_confirmed_balance(self, _: object | None = None) -> uint128:
874
851
  amount: uint128 = uint128(0)
875
852
  if (await self.get_current_state()).current.state == SELF_POOLING.value:
876
853
  unspent_coin_records: list[WalletCoinRecord] = list(
@@ -881,19 +858,19 @@ class PoolWallet:
881
858
  amount = uint128(amount + record.coin.amount)
882
859
  return amount
883
860
 
884
- async def get_unconfirmed_balance(self, record_list: Optional[object] = None) -> uint128:
861
+ async def get_unconfirmed_balance(self, record_list: object | None = None) -> uint128:
885
862
  return await self.get_confirmed_balance(record_list)
886
863
 
887
- async def get_spendable_balance(self, record_list: Optional[object] = None) -> uint128:
864
+ async def get_spendable_balance(self, record_list: object | None = None) -> uint128:
888
865
  return await self.get_confirmed_balance(record_list)
889
866
 
890
867
  async def get_pending_change_balance(self) -> uint64:
891
868
  return uint64(0)
892
869
 
893
- async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
870
+ async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
894
871
  return uint128(0)
895
872
 
896
- async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[object]) -> None:
873
+ async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: object | None) -> None:
897
874
  pass
898
875
 
899
876
  async def select_coins(self, amount: uint64, action_scope: WalletActionScope) -> set[Coin]:
@@ -917,8 +894,8 @@ class PoolWallet:
917
894
  puzzle_hashes: list[bytes32],
918
895
  action_scope: WalletActionScope,
919
896
  fee: uint64 = uint64(0),
920
- coins: Optional[set[Coin]] = None,
921
- memos: Optional[list[list[bytes]]] = None,
897
+ coins: set[Coin] | None = None,
898
+ memos: list[list[bytes]] | None = None,
922
899
  extra_conditions: tuple[Condition, ...] = tuple(),
923
900
  **kwargs: Unpack[GSTOptionalArgs],
924
901
  ) -> None: