chia-blockchain 2.5.4rc1__py3-none-any.whl → 2.5.5__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 (453) hide show
  1. chia/_tests/blockchain/blockchain_test_utils.py +2 -3
  2. chia/_tests/blockchain/test_augmented_chain.py +2 -3
  3. chia/_tests/blockchain/test_blockchain.py +261 -44
  4. chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
  5. chia/_tests/blockchain/test_build_chains.py +197 -1
  6. chia/_tests/blockchain/test_get_block_generator.py +1 -1
  7. chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
  8. chia/_tests/clvm/benchmark_costs.py +1 -1
  9. chia/_tests/clvm/coin_store.py +3 -4
  10. chia/_tests/clvm/test_message_conditions.py +2 -2
  11. chia/_tests/clvm/test_puzzle_compression.py +2 -3
  12. chia/_tests/clvm/test_puzzles.py +1 -2
  13. chia/_tests/clvm/test_singletons.py +2 -3
  14. chia/_tests/clvm/test_spend_sim.py +7 -7
  15. chia/_tests/cmds/cmd_test_utils.py +30 -25
  16. chia/_tests/cmds/test_dev_gh.py +1 -1
  17. chia/_tests/cmds/test_farm_cmd.py +1 -1
  18. chia/_tests/cmds/test_show.py +1 -2
  19. chia/_tests/cmds/wallet/test_did.py +101 -56
  20. chia/_tests/cmds/wallet/test_nft.py +109 -84
  21. chia/_tests/cmds/wallet/test_notifications.py +1 -1
  22. chia/_tests/cmds/wallet/test_offer.toffer +1 -1
  23. chia/_tests/cmds/wallet/test_vcs.py +8 -8
  24. chia/_tests/cmds/wallet/test_wallet.py +100 -46
  25. chia/_tests/conftest.py +31 -20
  26. chia/_tests/connection_utils.py +1 -1
  27. chia/_tests/core/consensus/stores/__init__.py +0 -0
  28. chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
  29. chia/_tests/core/consensus/test_block_creation.py +2 -31
  30. chia/_tests/core/consensus/test_pot_iterations.py +38 -3
  31. chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
  32. chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
  33. chia/_tests/core/daemon/test_daemon.py +80 -0
  34. chia/_tests/core/data_layer/test_data_layer.py +1 -1
  35. chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
  36. chia/_tests/core/data_layer/test_data_rpc.py +14 -10
  37. chia/_tests/core/data_layer/test_data_store.py +5 -5
  38. chia/_tests/core/farmer/test_farmer_api.py +2 -2
  39. chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
  40. chia/_tests/core/full_node/ram_db.py +3 -1
  41. chia/_tests/core/full_node/stores/test_block_store.py +28 -16
  42. chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
  43. chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
  44. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  45. chia/_tests/core/full_node/test_address_manager.py +200 -27
  46. chia/_tests/core/full_node/test_block_height_map.py +2 -2
  47. chia/_tests/core/full_node/test_conditions.py +7 -6
  48. chia/_tests/core/full_node/test_full_node.py +456 -40
  49. chia/_tests/core/full_node/test_generator_tools.py +32 -2
  50. chia/_tests/core/full_node/test_hint_management.py +1 -1
  51. chia/_tests/core/full_node/test_node_load.py +20 -21
  52. chia/_tests/core/full_node/test_performance.py +3 -4
  53. chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
  54. chia/_tests/core/full_node/test_subscriptions.py +1 -2
  55. chia/_tests/core/full_node/test_transactions.py +9 -5
  56. chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
  57. chia/_tests/core/large_block.py +1 -2
  58. chia/_tests/core/make_block_generator.py +3 -4
  59. chia/_tests/core/mempool/test_mempool.py +36 -86
  60. chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
  61. chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
  62. chia/_tests/core/mempool/test_mempool_manager.py +529 -69
  63. chia/_tests/core/mempool/test_mempool_performance.py +3 -2
  64. chia/_tests/core/mempool/test_singleton_fast_forward.py +61 -132
  65. chia/_tests/core/server/flood.py +1 -1
  66. chia/_tests/core/server/test_dos.py +1 -1
  67. chia/_tests/core/server/test_node_discovery.py +41 -27
  68. chia/_tests/core/server/test_rate_limits.py +1 -1
  69. chia/_tests/core/server/test_server.py +1 -1
  70. chia/_tests/core/services/test_services.py +5 -5
  71. chia/_tests/core/ssl/test_ssl.py +1 -1
  72. chia/_tests/core/test_cost_calculation.py +6 -6
  73. chia/_tests/core/test_crawler.py +2 -2
  74. chia/_tests/core/test_crawler_rpc.py +1 -1
  75. chia/_tests/core/test_db_conversion.py +3 -1
  76. chia/_tests/core/test_db_validation.py +5 -3
  77. chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
  78. chia/_tests/core/test_filter.py +4 -1
  79. chia/_tests/core/test_full_node_rpc.py +99 -82
  80. chia/_tests/core/test_program.py +2 -2
  81. chia/_tests/core/util/test_block_cache.py +1 -1
  82. chia/_tests/core/util/test_keychain.py +2 -2
  83. chia/_tests/core/util/test_lockfile.py +1 -1
  84. chia/_tests/core/util/test_log_exceptions.py +5 -5
  85. chia/_tests/core/util/test_streamable.py +81 -22
  86. chia/_tests/db/test_db_wrapper.py +1 -3
  87. chia/_tests/environments/wallet.py +5 -5
  88. chia/_tests/farmer_harvester/test_farmer.py +9 -7
  89. chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
  90. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  91. chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
  92. chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
  93. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
  94. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
  95. chia/_tests/generator/test_compression.py +1 -2
  96. chia/_tests/generator/test_rom.py +8 -4
  97. chia/_tests/plot_sync/test_plot_sync.py +3 -3
  98. chia/_tests/plot_sync/test_receiver.py +3 -3
  99. chia/_tests/plot_sync/test_sender.py +1 -1
  100. chia/_tests/plot_sync/test_sync_simulated.py +3 -3
  101. chia/_tests/plot_sync/util.py +2 -2
  102. chia/_tests/pools/test_pool_cmdline.py +48 -21
  103. chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
  104. chia/_tests/pools/test_pool_rpc.py +237 -105
  105. chia/_tests/pools/test_pool_wallet.py +11 -2
  106. chia/_tests/pools/test_wallet_pool_store.py +5 -4
  107. chia/_tests/rpc/test_rpc_client.py +1 -1
  108. chia/_tests/simulation/test_simulation.py +13 -8
  109. chia/_tests/simulation/test_simulator.py +2 -2
  110. chia/_tests/timelord/test_new_peak.py +191 -47
  111. chia/_tests/timelord/test_timelord.py +1 -1
  112. chia/_tests/tools/test_full_sync.py +0 -2
  113. chia/_tests/tools/test_run_block.py +3 -1
  114. chia/_tests/util/benchmark_cost.py +3 -3
  115. chia/_tests/util/benchmarks.py +2 -2
  116. chia/_tests/util/blockchain.py +11 -5
  117. chia/_tests/util/blockchain_mock.py +1 -4
  118. chia/_tests/util/coin_store.py +29 -0
  119. chia/_tests/util/constants.py +2 -18
  120. chia/_tests/util/full_sync.py +3 -3
  121. chia/_tests/util/generator_tools_testing.py +2 -3
  122. chia/_tests/util/key_tool.py +2 -3
  123. chia/_tests/util/misc.py +33 -31
  124. chia/_tests/util/network_protocol_data.py +19 -17
  125. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  126. chia/_tests/util/protocol_messages_json.py +3 -1
  127. chia/_tests/util/run_block.py +2 -2
  128. chia/_tests/util/setup_nodes.py +7 -7
  129. chia/_tests/util/spend_sim.py +47 -55
  130. chia/_tests/util/test_condition_tools.py +5 -4
  131. chia/_tests/util/test_config.py +2 -2
  132. chia/_tests/util/test_dump_keyring.py +1 -1
  133. chia/_tests/util/test_full_block_utils.py +12 -14
  134. chia/_tests/util/test_misc.py +2 -2
  135. chia/_tests/util/test_paginator.py +4 -4
  136. chia/_tests/util/test_priority_mutex.py +2 -2
  137. chia/_tests/util/test_replace_str_to_bytes.py +15 -5
  138. chia/_tests/util/test_ssl_check.py +1 -1
  139. chia/_tests/util/test_testnet_overrides.py +13 -3
  140. chia/_tests/util/time_out_assert.py +4 -2
  141. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
  142. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
  143. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
  144. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
  145. chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
  146. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
  147. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
  148. chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
  149. chia/_tests/wallet/conftest.py +11 -12
  150. chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
  151. chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
  152. chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
  153. chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
  154. chia/_tests/wallet/nft_wallet/config.py +1 -1
  155. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
  156. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
  157. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
  158. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
  159. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
  160. chia/_tests/wallet/rpc/test_wallet_rpc.py +495 -265
  161. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
  162. chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
  163. chia/_tests/wallet/test_clvm_casts.py +88 -0
  164. chia/_tests/wallet/test_coin_management.py +1 -1
  165. chia/_tests/wallet/test_coin_selection.py +1 -1
  166. chia/_tests/wallet/test_conditions.py +1 -1
  167. chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
  168. chia/_tests/wallet/test_notifications.py +5 -3
  169. chia/_tests/wallet/test_sign_coin_spends.py +6 -6
  170. chia/_tests/wallet/test_signer_protocol.py +13 -12
  171. chia/_tests/wallet/test_singleton.py +1 -1
  172. chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
  173. chia/_tests/wallet/test_util.py +2 -2
  174. chia/_tests/wallet/test_wallet.py +108 -29
  175. chia/_tests/wallet/test_wallet_action_scope.py +9 -2
  176. chia/_tests/wallet/test_wallet_blockchain.py +2 -3
  177. chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
  178. chia/_tests/wallet/test_wallet_node.py +2 -4
  179. chia/_tests/wallet/test_wallet_retry.py +4 -2
  180. chia/_tests/wallet/test_wallet_state_manager.py +191 -5
  181. chia/_tests/wallet/test_wallet_test_framework.py +1 -1
  182. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
  183. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
  184. chia/_tests/wallet/wallet_block_tools.py +6 -6
  185. chia/_tests/weight_proof/test_weight_proof.py +10 -48
  186. chia/apis.py +1 -1
  187. chia/cmds/beta.py +1 -1
  188. chia/cmds/chia.py +9 -9
  189. chia/cmds/cmd_classes.py +12 -11
  190. chia/cmds/cmd_helpers.py +1 -1
  191. chia/cmds/cmds_util.py +12 -9
  192. chia/cmds/coin_funcs.py +2 -2
  193. chia/cmds/configure.py +2 -2
  194. chia/cmds/data.py +0 -2
  195. chia/cmds/data_funcs.py +1 -1
  196. chia/cmds/db_validate_func.py +1 -2
  197. chia/cmds/dev/__init__.py +0 -0
  198. chia/cmds/dev/data.py +273 -0
  199. chia/cmds/{gh.py → dev/gh.py} +5 -5
  200. chia/cmds/dev/main.py +22 -0
  201. chia/cmds/dev/mempool.py +78 -0
  202. chia/cmds/dev/mempool_funcs.py +63 -0
  203. chia/cmds/farm_funcs.py +5 -4
  204. chia/cmds/init_funcs.py +11 -11
  205. chia/cmds/keys.py +2 -2
  206. chia/cmds/keys_funcs.py +4 -4
  207. chia/cmds/netspace_funcs.py +1 -1
  208. chia/cmds/peer_funcs.py +2 -2
  209. chia/cmds/plotnft_funcs.py +72 -26
  210. chia/cmds/rpc.py +1 -1
  211. chia/cmds/show_funcs.py +5 -5
  212. chia/cmds/signer.py +8 -7
  213. chia/cmds/sim_funcs.py +8 -9
  214. chia/cmds/wallet.py +2 -2
  215. chia/cmds/wallet_funcs.py +165 -131
  216. chia/{util → consensus}/augmented_chain.py +1 -2
  217. chia/consensus/block_body_validation.py +54 -40
  218. chia/consensus/block_creation.py +42 -76
  219. chia/consensus/block_header_validation.py +32 -26
  220. chia/consensus/block_record.py +0 -3
  221. chia/consensus/blockchain.py +23 -32
  222. chia/consensus/blockchain_interface.py +1 -5
  223. chia/consensus/check_time_locks.py +57 -0
  224. chia/consensus/coin_store_protocol.py +151 -0
  225. chia/consensus/coinbase.py +0 -6
  226. chia/consensus/condition_costs.py +4 -0
  227. chia/{util → consensus}/condition_tools.py +4 -5
  228. chia/consensus/cost_calculator.py +1 -1
  229. chia/consensus/default_constants.py +32 -9
  230. chia/consensus/deficit.py +1 -3
  231. chia/consensus/difficulty_adjustment.py +1 -2
  232. chia/consensus/find_fork_point.py +1 -3
  233. chia/consensus/full_block_to_block_record.py +1 -6
  234. chia/{util → consensus}/generator_tools.py +1 -3
  235. chia/consensus/get_block_challenge.py +30 -7
  236. chia/consensus/make_sub_epoch_summary.py +1 -5
  237. chia/consensus/multiprocess_validation.py +21 -20
  238. chia/consensus/pot_iterations.py +74 -13
  239. chia/{util → consensus}/prev_transaction_block.py +1 -1
  240. chia/consensus/vdf_info_computation.py +1 -3
  241. chia/daemon/keychain_proxy.py +5 -5
  242. chia/daemon/server.py +22 -5
  243. chia/data_layer/data_layer.py +92 -51
  244. chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
  245. chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
  246. chia/data_layer/data_layer_util.py +4 -6
  247. chia/data_layer/data_layer_wallet.py +42 -69
  248. chia/data_layer/dl_wallet_store.py +12 -6
  249. chia/data_layer/download_data.py +3 -3
  250. chia/data_layer/s3_plugin_service.py +0 -1
  251. chia/farmer/farmer.py +3 -4
  252. chia/farmer/farmer_api.py +11 -7
  253. chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
  254. chia/full_node/block_height_map.py +7 -6
  255. chia/full_node/block_store.py +5 -7
  256. chia/full_node/bundle_tools.py +1 -2
  257. chia/full_node/coin_store.py +153 -124
  258. chia/{types → full_node}/eligible_coin_spends.py +39 -70
  259. chia/full_node/fee_estimator.py +1 -1
  260. chia/full_node/fee_estimator_interface.py +0 -8
  261. chia/full_node/fee_tracker.py +25 -25
  262. chia/full_node/full_node.py +70 -53
  263. chia/full_node/full_node_api.py +57 -40
  264. chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
  265. chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
  266. chia/full_node/full_node_store.py +23 -8
  267. chia/full_node/mempool.py +206 -53
  268. chia/full_node/mempool_check_conditions.py +20 -63
  269. chia/full_node/mempool_manager.py +53 -47
  270. chia/full_node/subscriptions.py +1 -3
  271. chia/full_node/tx_processing_queue.py +50 -3
  272. chia/full_node/weight_proof.py +46 -37
  273. chia/harvester/harvester.py +1 -1
  274. chia/harvester/harvester_api.py +22 -7
  275. chia/introducer/introducer.py +1 -1
  276. chia/introducer/introducer_api.py +1 -1
  277. chia/plot_sync/exceptions.py +1 -1
  278. chia/plot_sync/receiver.py +1 -1
  279. chia/plot_sync/sender.py +2 -2
  280. chia/pools/pool_puzzles.py +13 -18
  281. chia/pools/pool_wallet.py +23 -46
  282. chia/protocols/farmer_protocol.py +11 -3
  283. chia/protocols/full_node_protocol.py +1 -4
  284. chia/protocols/harvester_protocol.py +3 -3
  285. chia/protocols/pool_protocol.py +1 -2
  286. chia/protocols/shared_protocol.py +3 -3
  287. chia/protocols/timelord_protocol.py +1 -3
  288. chia/protocols/wallet_protocol.py +3 -3
  289. chia/rpc/rpc_client.py +7 -8
  290. chia/rpc/rpc_server.py +3 -3
  291. chia/rpc/util.py +3 -1
  292. chia/seeder/crawler.py +1 -1
  293. chia/seeder/crawler_api.py +1 -1
  294. chia/seeder/dns_server.py +2 -0
  295. chia/seeder/start_crawler.py +3 -3
  296. chia/server/address_manager.py +286 -38
  297. chia/server/address_manager_store.py +0 -215
  298. chia/{types → server}/aliases.py +7 -7
  299. chia/server/api_protocol.py +1 -1
  300. chia/server/chia_policy.py +1 -1
  301. chia/server/node_discovery.py +76 -113
  302. chia/server/rate_limits.py +1 -1
  303. chia/server/resolve_peer_info.py +43 -0
  304. chia/server/server.py +5 -5
  305. chia/server/start_data_layer.py +4 -4
  306. chia/server/start_farmer.py +5 -4
  307. chia/server/start_full_node.py +5 -4
  308. chia/server/start_harvester.py +7 -5
  309. chia/server/start_introducer.py +2 -2
  310. chia/server/start_service.py +1 -1
  311. chia/server/start_timelord.py +7 -5
  312. chia/server/start_wallet.py +7 -5
  313. chia/server/ws_connection.py +1 -1
  314. chia/simulator/add_blocks_in_batches.py +2 -2
  315. chia/simulator/block_tools.py +245 -201
  316. chia/simulator/full_node_simulator.py +38 -10
  317. chia/simulator/setup_services.py +12 -12
  318. chia/simulator/simulator_full_node_rpc_api.py +2 -2
  319. chia/simulator/simulator_full_node_rpc_client.py +2 -2
  320. chia/simulator/simulator_test_tools.py +2 -2
  321. chia/simulator/start_simulator.py +1 -1
  322. chia/simulator/wallet_tools.py +10 -18
  323. chia/ssl/create_ssl.py +1 -1
  324. chia/timelord/iters_from_block.py +14 -14
  325. chia/timelord/timelord.py +15 -11
  326. chia/timelord/timelord_api.py +14 -2
  327. chia/timelord/timelord_state.py +20 -14
  328. chia/types/blockchain_format/program.py +53 -10
  329. chia/types/blockchain_format/proof_of_space.py +73 -19
  330. chia/types/coin_spend.py +3 -56
  331. chia/types/generator_types.py +28 -0
  332. chia/types/internal_mempool_item.py +1 -2
  333. chia/types/mempool_item.py +12 -7
  334. chia/types/unfinished_header_block.py +1 -2
  335. chia/types/validation_state.py +1 -2
  336. chia/types/weight_proof.py +1 -3
  337. chia/util/action_scope.py +3 -3
  338. chia/util/block_cache.py +1 -2
  339. chia/util/byte_types.py +1 -1
  340. chia/util/casts.py +21 -0
  341. chia/util/config.py +0 -37
  342. chia/util/db_wrapper.py +8 -1
  343. chia/util/errors.py +3 -2
  344. chia/util/initial-config.yaml +21 -5
  345. chia/util/keychain.py +6 -7
  346. chia/util/keyring_wrapper.py +5 -5
  347. chia/util/limited_semaphore.py +1 -1
  348. chia/util/priority_mutex.py +1 -1
  349. chia/util/streamable.py +63 -5
  350. chia/util/task_timing.py +1 -1
  351. chia/util/virtual_project_analysis.py +1 -1
  352. chia/wallet/cat_wallet/cat_info.py +7 -3
  353. chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
  354. chia/wallet/cat_wallet/cat_utils.py +1 -1
  355. chia/wallet/cat_wallet/cat_wallet.py +44 -36
  356. chia/wallet/cat_wallet/lineage_store.py +7 -0
  357. chia/wallet/cat_wallet/r_cat_wallet.py +274 -0
  358. chia/wallet/conditions.py +5 -10
  359. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
  360. chia/wallet/derivation_record.py +33 -0
  361. chia/wallet/derive_keys.py +3 -3
  362. chia/wallet/did_wallet/did_info.py +12 -3
  363. chia/wallet/did_wallet/did_wallet.py +132 -101
  364. chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
  365. chia/wallet/driver_protocol.py +3 -1
  366. chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
  367. chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
  368. chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
  369. chia/wallet/nft_wallet/nft_wallet.py +69 -112
  370. chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
  371. chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
  372. chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
  373. chia/wallet/nft_wallet/uncurry_nft.py +4 -6
  374. chia/wallet/notification_manager.py +2 -3
  375. chia/wallet/outer_puzzles.py +7 -2
  376. chia/wallet/puzzle_drivers.py +1 -1
  377. chia/wallet/puzzles/clawback/drivers.py +5 -4
  378. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
  379. chia/wallet/puzzles/singleton_top_layer.py +2 -1
  380. chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
  381. chia/wallet/puzzles/tails.py +1 -3
  382. chia/wallet/signer_protocol.py +5 -6
  383. chia/wallet/singleton.py +5 -4
  384. chia/wallet/singleton_record.py +1 -1
  385. chia/wallet/trade_manager.py +18 -20
  386. chia/wallet/trade_record.py +3 -6
  387. chia/wallet/trading/offer.py +12 -13
  388. chia/wallet/uncurried_puzzle.py +2 -2
  389. chia/wallet/util/compute_additions.py +58 -0
  390. chia/wallet/util/compute_hints.py +3 -3
  391. chia/wallet/util/compute_memos.py +4 -4
  392. chia/wallet/util/curry_and_treehash.py +2 -1
  393. chia/wallet/util/debug_spend_bundle.py +1 -1
  394. chia/wallet/util/merkle_tree.py +1 -1
  395. chia/wallet/util/peer_request_cache.py +1 -2
  396. chia/wallet/util/tx_config.py +3 -8
  397. chia/wallet/util/wallet_sync_utils.py +10 -5
  398. chia/wallet/util/wallet_types.py +1 -0
  399. chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
  400. chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
  401. chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
  402. chia/wallet/vc_wallet/vc_drivers.py +50 -8
  403. chia/wallet/vc_wallet/vc_store.py +3 -5
  404. chia/wallet/vc_wallet/vc_wallet.py +15 -22
  405. chia/wallet/wallet.py +36 -46
  406. chia/wallet/wallet_action_scope.py +73 -4
  407. chia/wallet/wallet_blockchain.py +1 -3
  408. chia/wallet/wallet_interested_store.py +1 -1
  409. chia/wallet/wallet_nft_store.py +3 -3
  410. chia/wallet/wallet_node.py +17 -16
  411. chia/wallet/wallet_node_api.py +4 -5
  412. chia/wallet/wallet_pool_store.py +1 -1
  413. chia/wallet/wallet_protocol.py +2 -0
  414. chia/wallet/wallet_puzzle_store.py +1 -1
  415. chia/{rpc → wallet}/wallet_request_types.py +670 -81
  416. chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
  417. chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
  418. chia/wallet/wallet_singleton_store.py +8 -7
  419. chia/wallet/wallet_spend_bundle.py +4 -3
  420. chia/wallet/wallet_state_manager.py +320 -191
  421. chia/wallet/wallet_weight_proof_handler.py +1 -2
  422. chia/wallet/wsm_apis.py +98 -0
  423. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/RECORD +443 -436
  425. mozilla-ca/cacert.pem +3 -165
  426. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
  427. chia/cmds/dev.py +0 -18
  428. chia/types/blockchain_format/slots.py +0 -9
  429. chia/types/blockchain_format/sub_epoch_summary.py +0 -5
  430. chia/types/end_of_slot_bundle.py +0 -5
  431. chia/types/full_block.py +0 -5
  432. chia/types/header_block.py +0 -5
  433. chia/types/spend_bundle_conditions.py +0 -7
  434. chia/types/transaction_queue_entry.py +0 -56
  435. chia/types/unfinished_block.py +0 -5
  436. /chia/cmds/{installers.py → dev/installers.py} +0 -0
  437. /chia/cmds/{sim.py → dev/sim.py} +0 -0
  438. /chia/{util → cmds}/dump_keyring.py +0 -0
  439. /chia/{full_node → consensus}/signage_point.py +0 -0
  440. /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
  441. /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
  442. /chia/{util → full_node}/full_block_utils.py +0 -0
  443. /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
  444. /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
  445. /chia/{full_node → protocols}/fee_estimate.py +0 -0
  446. /chia/{server → protocols}/outbound_message.py +0 -0
  447. /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
  448. /chia/{util → simulator}/vdf_prover.py +0 -0
  449. /chia/{util → ssl}/ssl_check.py +0 -0
  450. /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
  451. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
@@ -16,19 +16,20 @@ import pytest
16
16
  from _pytest.fixtures import SubRequest
17
17
  from chia_rs import ConsensusConstants, G1Element
18
18
  from chia_rs.sized_bytes import bytes32
19
- from chia_rs.sized_ints import uint32, uint64
19
+ from chia_rs.sized_ints import uint16, uint32, uint64
20
+ from pytest_mock import MockerFixture
20
21
 
21
22
  from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
22
23
  from chia._tests.util.setup_nodes import setup_simulators_and_wallets_service
23
24
  from chia._tests.util.time_out_assert import time_out_assert
24
25
  from chia.pools.pool_wallet_info import PoolSingletonState, PoolWalletInfo
25
- from chia.rpc.wallet_rpc_client import WalletRpcClient
26
+ from chia.rpc.rpc_client import ResponseFailureError
27
+ from chia.server.aliases import WalletService
26
28
  from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
27
29
  from chia.simulator.block_tools import BlockTools, get_plot_dir
28
30
  from chia.simulator.full_node_simulator import FullNodeSimulator
29
31
  from chia.simulator.simulator_protocol import ReorgProtocol
30
32
  from chia.simulator.start_simulator import SimulatorFullNodeService
31
- from chia.types.aliases import WalletService
32
33
  from chia.types.peer_info import PeerInfo
33
34
  from chia.util.bech32m import encode_puzzle_hash
34
35
  from chia.util.byte_types import hexstr_to_bytes
@@ -40,6 +41,8 @@ from chia.wallet.util.transaction_type import TransactionType
40
41
  from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
41
42
  from chia.wallet.util.wallet_types import WalletType
42
43
  from chia.wallet.wallet_node import WalletNode
44
+ from chia.wallet.wallet_request_types import PWAbsorbRewards, PWJoinPool, PWSelfPool, PWStatus
45
+ from chia.wallet.wallet_rpc_client import WalletRpcClient
43
46
  from chia.wallet.wallet_state_manager import WalletStateManager
44
47
 
45
48
  # TODO: Compare deducted fees in all tests against reported total_fee
@@ -189,7 +192,7 @@ async def setup(
189
192
 
190
193
 
191
194
  async def verify_pool_state(wallet_rpc: WalletRpcClient, w_id: int, expected_state: PoolSingletonState) -> bool:
192
- pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(w_id))[0]
195
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(PWStatus(uint32(w_id)))).state
193
196
  return pw_status.current.state == expected_state.value
194
197
 
195
198
 
@@ -253,7 +256,8 @@ async def create_new_plotnft(
253
256
  wallet_state_manager: WalletStateManager = wallet_test_framework.environments[0].wallet_state_manager
254
257
  wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
255
258
 
256
- our_ph = await wallet_state_manager.main_wallet.get_new_puzzlehash()
259
+ async with wallet_state_manager.new_action_scope(wallet_test_framework.tx_config, push=True) as action_scope:
260
+ our_ph = await action_scope.get_puzzle_hash(wallet_state_manager)
257
261
 
258
262
  await wallet_rpc.create_new_pool_wallet(
259
263
  target_puzzlehash=our_ph,
@@ -283,7 +287,8 @@ class TestPoolWalletRpc:
283
287
  client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
284
288
  wallet = wallet_node.wallet_state_manager.main_wallet
285
289
 
286
- our_ph = await wallet.get_new_puzzlehash()
290
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
291
+ our_ph = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
287
292
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
288
293
  assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
289
294
  creation_tx: TransactionRecord = await client.create_new_pool_wallet(
@@ -295,13 +300,13 @@ class TestPoolWalletRpc:
295
300
  summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
296
301
  assert len(summaries_response) == 1
297
302
  wallet_id: int = summaries_response[0]["id"]
298
- status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
303
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
299
304
 
300
305
  assert status.current.state == PoolSingletonState.SELF_POOLING.value
301
306
  assert status.target is None
302
307
  assert status.current.owner_pubkey == G1Element.from_bytes(
303
308
  bytes.fromhex(
304
- "b286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
309
+ "880afd6f9e123005655376e389015877e60060b768592809d2c746325d256edeb0017e1b406cba0832aa983e5c4bbf54"
305
310
  )
306
311
  )
307
312
  assert status.current.pool_url == ""
@@ -314,7 +319,7 @@ class TestPoolWalletRpc:
314
319
  pool_config = pool_list[0]
315
320
  assert (
316
321
  pool_config["owner_public_key"]
317
- == "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
322
+ == "0x880afd6f9e123005655376e389015877e60060b768592809d2c746325d256edeb0017e1b406cba0832aa983e5c4bbf54"
318
323
  )
319
324
  # It can be one of multiple launcher IDs, due to selecting a different coin
320
325
  launcher_id = None
@@ -335,7 +340,8 @@ class TestPoolWalletRpc:
335
340
  client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
336
341
  wallet = wallet_node.wallet_state_manager.main_wallet
337
342
 
338
- our_ph = await wallet.get_new_puzzlehash()
343
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
344
+ our_ph = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
339
345
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
340
346
  assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
341
347
 
@@ -348,13 +354,13 @@ class TestPoolWalletRpc:
348
354
  summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
349
355
  assert len(summaries_response) == 1
350
356
  wallet_id: int = summaries_response[0]["id"]
351
- status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
357
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
352
358
 
353
359
  assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
354
360
  assert status.target is None
355
361
  assert status.current.owner_pubkey == G1Element.from_bytes(
356
362
  bytes.fromhex(
357
- "b286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
363
+ "880afd6f9e123005655376e389015877e60060b768592809d2c746325d256edeb0017e1b406cba0832aa983e5c4bbf54"
358
364
  )
359
365
  )
360
366
  assert status.current.pool_url == "http://pool.example.com"
@@ -367,7 +373,7 @@ class TestPoolWalletRpc:
367
373
  pool_config = pool_list[0]
368
374
  assert (
369
375
  pool_config["owner_public_key"]
370
- == "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
376
+ == "0x880afd6f9e123005655376e389015877e60060b768592809d2c746325d256edeb0017e1b406cba0832aa983e5c4bbf54"
371
377
  )
372
378
  # It can be one of multiple launcher IDs, due to selecting a different coin
373
379
  launcher_id = None
@@ -390,8 +396,9 @@ class TestPoolWalletRpc:
390
396
 
391
397
  wallet = wallet_node.wallet_state_manager.main_wallet
392
398
 
393
- our_ph_1 = await wallet.get_new_puzzlehash()
394
- our_ph_2 = await wallet.get_new_puzzlehash()
399
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
400
+ our_ph_1 = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
401
+ our_ph_2 = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
395
402
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
396
403
  assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
397
404
 
@@ -408,15 +415,15 @@ class TestPoolWalletRpc:
408
415
 
409
416
  async def pw_created(check_wallet_id: int) -> bool:
410
417
  try:
411
- await client.pw_status(check_wallet_id)
418
+ await client.pw_status(PWStatus(uint32(check_wallet_id)))
412
419
  return True
413
420
  except ValueError:
414
421
  return False
415
422
 
416
423
  await time_out_assert(10, pw_created, True, 2)
417
424
  await time_out_assert(10, pw_created, True, 3)
418
- status_2: PoolWalletInfo = (await client.pw_status(2))[0]
419
- status_3: PoolWalletInfo = (await client.pw_status(3))[0]
425
+ status_2: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(2)))).state
426
+ status_3: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(3)))).state
420
427
 
421
428
  if status_2.current.state == PoolSingletonState.SELF_POOLING.value:
422
429
  assert status_3.current.state == PoolSingletonState.FARMING_TO_POOL.value
@@ -437,9 +444,9 @@ class TestPoolWalletRpc:
437
444
  assert len(summaries_response) == 1
438
445
 
439
446
  with pytest.raises(ValueError):
440
- await client.pw_status(2)
447
+ await client.pw_status(PWStatus(uint32(2)))
441
448
  with pytest.raises(ValueError):
442
- await client.pw_status(3)
449
+ await client.pw_status(PWStatus(uint32(3)))
443
450
 
444
451
  # Create some CAT wallets to increase wallet IDs
445
452
  def mempool_empty() -> bool:
@@ -476,11 +483,9 @@ class TestPoolWalletRpc:
476
483
  pool_list = full_config["pool"]["pool_list"]
477
484
  assert len(pool_list) == i + 3
478
485
  if i == 0:
479
- # Ensures that the CAT creation does not cause pool wallet IDs to increment
480
486
  for some_wallet in wallet_node.wallet_state_manager.wallets.values():
481
487
  if some_wallet.type() == WalletType.POOLING_WALLET:
482
- status: PoolWalletInfo = (await client.pw_status(some_wallet.id()))[0]
483
- assert (await some_wallet.get_pool_wallet_index()) < 5
488
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(some_wallet.id()))).state
484
489
  auth_sk = find_authentication_sk(
485
490
  [some_wallet.wallet_state_manager.get_master_private_key()], status.current.owner_pubkey
486
491
  )
@@ -500,7 +505,8 @@ class TestPoolWalletRpc:
500
505
 
501
506
  wallet = wallet_node.wallet_state_manager.main_wallet
502
507
 
503
- our_ph = await wallet.get_new_puzzlehash()
508
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
509
+ our_ph = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
504
510
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
505
511
  assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
506
512
 
@@ -509,7 +515,7 @@ class TestPoolWalletRpc:
509
515
  )
510
516
  await full_node_api.process_transaction_records(records=[creation_tx])
511
517
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
512
- status: PoolWalletInfo = (await client.pw_status(2))[0]
518
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(2)))).state
513
519
 
514
520
  assert status.current.state == PoolSingletonState.SELF_POOLING.value
515
521
  async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
@@ -529,7 +535,11 @@ class TestPoolWalletRpc:
529
535
  assert bal["confirmed_wallet_balance"] == 2 * 1_750_000_000_000
530
536
 
531
537
  # Claim 2 * 1.75, and farm a new 1.75
532
- absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
538
+ absorb_txs = (
539
+ await client.pw_absorb_rewards(
540
+ PWAbsorbRewards(wallet_id=uint32(2), fee=uint64(fee), push=True), DEFAULT_TX_CONFIG
541
+ )
542
+ ).transactions
533
543
  await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs)
534
544
  await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
535
545
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
@@ -544,14 +554,18 @@ class TestPoolWalletRpc:
544
554
  )
545
555
  == 2
546
556
  )
547
- new_status: PoolWalletInfo = (await client.pw_status(2))[0]
557
+ new_status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(2)))).state
548
558
  assert status.current == new_status.current
549
559
  assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
550
560
  bal = await client.get_wallet_balance(2)
551
561
  assert bal["confirmed_wallet_balance"] == 1 * 1_750_000_000_000
552
562
 
553
563
  # Claim another 1.75
554
- absorb_txs1: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
564
+ absorb_txs1 = (
565
+ await client.pw_absorb_rewards(
566
+ PWAbsorbRewards(wallet_id=uint32(2), fee=uint64(fee), push=True), DEFAULT_TX_CONFIG
567
+ )
568
+ ).transactions
555
569
 
556
570
  await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs1)
557
571
 
@@ -576,7 +590,9 @@ class TestPoolWalletRpc:
576
590
  assert bal["confirmed_wallet_balance"] == 0
577
591
 
578
592
  with pytest.raises(ValueError):
579
- await client.pw_absorb_rewards(2, uint64(fee))
593
+ await client.pw_absorb_rewards(
594
+ PWAbsorbRewards(wallet_id=uint32(2), fee=uint64(fee), push=True), DEFAULT_TX_CONFIG
595
+ )
580
596
 
581
597
  tx1 = await client.get_transactions(1)
582
598
  assert (250_000_000_000 + fee) in [tx.amount for tx in tx1]
@@ -590,7 +606,8 @@ class TestPoolWalletRpc:
590
606
 
591
607
  wallet = wallet_node.wallet_state_manager.main_wallet
592
608
 
593
- our_ph = await wallet.get_new_puzzlehash()
609
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
610
+ our_ph = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
594
611
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
595
612
  assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
596
613
 
@@ -607,7 +624,7 @@ class TestPoolWalletRpc:
607
624
  main_bal = await client.get_wallet_balance(1)
608
625
  assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance
609
626
 
610
- status: PoolWalletInfo = (await client.pw_status(2))[0]
627
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(2)))).state
611
628
  assert status.current.state == PoolSingletonState.SELF_POOLING.value
612
629
 
613
630
  async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
@@ -634,14 +651,19 @@ class TestPoolWalletRpc:
634
651
  assert bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
635
652
 
636
653
  # Claim
637
- absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee), 1))["transactions"]
654
+ absorb_txs = (
655
+ await client.pw_absorb_rewards(
656
+ PWAbsorbRewards(wallet_id=uint32(2), fee=uint64(fee), max_spends_in_tx=uint16(1), push=True),
657
+ DEFAULT_TX_CONFIG,
658
+ )
659
+ ).transactions
638
660
  await full_node_api.process_transaction_records(records=absorb_txs)
639
661
  main_expected_confirmed_balance -= fee
640
662
  main_expected_confirmed_balance += 1_750_000_000_000
641
663
  pool_expected_confirmed_balance -= 1_750_000_000_000
642
664
 
643
665
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
644
- new_status: PoolWalletInfo = (await client.pw_status(2))[0]
666
+ new_status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(2)))).state
645
667
  assert status.current == new_status.current
646
668
  assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
647
669
  main_bal = await client.get_wallet_balance(1)
@@ -660,7 +682,8 @@ class TestPoolWalletRpc:
660
682
 
661
683
  wallet = wallet_node.wallet_state_manager.main_wallet
662
684
 
663
- our_ph = await wallet.get_new_puzzlehash()
685
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
686
+ our_ph = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
664
687
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
665
688
  assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
666
689
  creation_tx: TransactionRecord = await client.create_new_pool_wallet(
@@ -673,14 +696,14 @@ class TestPoolWalletRpc:
673
696
 
674
697
  async def farming_to_pool() -> bool:
675
698
  try:
676
- status: PoolWalletInfo = (await client.pw_status(2))[0]
699
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(2)))).state
677
700
  return status.current.state == PoolSingletonState.FARMING_TO_POOL.value
678
701
  except ValueError:
679
702
  return False
680
703
 
681
704
  await time_out_assert(20, farming_to_pool)
682
705
 
683
- status: PoolWalletInfo = (await client.pw_status(2))[0]
706
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(2)))).state
684
707
  async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
685
708
  all_blocks = await full_node_api.get_all_full_blocks()
686
709
  blocks = bt.get_consecutive_blocks(
@@ -701,12 +724,15 @@ class TestPoolWalletRpc:
701
724
  assert bal["confirmed_wallet_balance"] == 0
702
725
 
703
726
  # Claim block_count * 1.75
704
- ret = await client.pw_absorb_rewards(2, uint64(fee))
705
- absorb_txs: list[TransactionRecord] = ret["transactions"]
727
+ ret = await client.pw_absorb_rewards(
728
+ PWAbsorbRewards(wallet_id=uint32(2), fee=uint64(fee), push=True), DEFAULT_TX_CONFIG
729
+ )
730
+ absorb_txs = ret.transactions
706
731
  if fee == 0:
707
- assert ret["fee_transaction"] is None
732
+ assert ret.fee_transaction is None
708
733
  else:
709
- assert ret["fee_transaction"].fee_amount == fee
734
+ assert ret.fee_transaction is not None
735
+ assert ret.fee_transaction.fee_amount == fee
710
736
  for tx in absorb_txs:
711
737
  assert tx.fee_amount == fee
712
738
  await full_node_api.process_transaction_records(records=absorb_txs)
@@ -714,11 +740,11 @@ class TestPoolWalletRpc:
714
740
  main_expected_confirmed_balance += block_count * 1_750_000_000_000
715
741
 
716
742
  async def status_updated() -> bool:
717
- new_st: PoolWalletInfo = (await client.pw_status(2))[0]
743
+ new_st: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(2)))).state
718
744
  return status.current == new_st.current and status.tip_singleton_coin_id != new_st.tip_singleton_coin_id
719
745
 
720
746
  await time_out_assert(20, status_updated)
721
- new_status = (await client.pw_status(2))[0]
747
+ new_status = (await client.pw_status(PWStatus(uint32(2)))).state
722
748
  bal = await client.get_wallet_balance(2)
723
749
  assert bal["confirmed_wallet_balance"] == 0
724
750
 
@@ -755,14 +781,16 @@ class TestPoolWalletRpc:
755
781
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
756
782
 
757
783
  # Absorb the farmed reward
758
- ret = await client.pw_absorb_rewards(2, fee)
759
- absorb_tx = ret["transaction"]
784
+ ret = await client.pw_absorb_rewards(
785
+ PWAbsorbRewards(wallet_id=uint32(2), fee=uint64(fee), push=True), DEFAULT_TX_CONFIG
786
+ )
787
+ absorb_tx = ret.transaction
760
788
  await full_node_api.process_transaction_records(records=[absorb_tx])
761
789
 
762
790
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
763
791
  await time_out_assert(20, status_updated)
764
- status = (await client.pw_status(2))[0]
765
- assert ret["fee_transaction"] is None
792
+ status = (await client.pw_status(PWStatus(uint32(2)))).state
793
+ assert ret.fee_transaction is None
766
794
 
767
795
  bal2 = await client.get_wallet_balance(2)
768
796
  assert bal2["confirmed_wallet_balance"] == 0
@@ -804,8 +832,8 @@ class TestPoolWalletRpc:
804
832
  assert len(summaries_response) == 2
805
833
  wallet_id: int = summaries_response[0]["id"]
806
834
  wallet_id_2: int = summaries_response[1]["id"]
807
- status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
808
- status_2: PoolWalletInfo = (await client.pw_status(wallet_id_2))[0]
835
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
836
+ status_2: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id_2)))).state
809
837
 
810
838
  assert status.current.state == PoolSingletonState.SELF_POOLING.value
811
839
  assert status_2.current.state == PoolSingletonState.SELF_POOLING.value
@@ -813,30 +841,40 @@ class TestPoolWalletRpc:
813
841
  assert status_2.target is None
814
842
 
815
843
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
816
- join_pool: dict[str, Any] = await client.pw_join_pool(
817
- wallet_id,
818
- pool_ph,
819
- "https://pool.example.com",
820
- uint32(10),
821
- uint64(fee),
844
+ join_pool = await client.pw_join_pool(
845
+ PWJoinPool(
846
+ wallet_id=uint32(wallet_id),
847
+ target_puzzlehash=pool_ph,
848
+ pool_url="https://pool.example.com",
849
+ relative_lock_height=uint32(10),
850
+ fee=uint64(fee),
851
+ push=True,
852
+ ),
853
+ DEFAULT_TX_CONFIG,
822
854
  )
823
- assert join_pool["success"]
824
- join_pool_tx: TransactionRecord = join_pool["transaction"]
855
+ join_pool_tx: TransactionRecord = join_pool.transaction
825
856
  assert join_pool_tx is not None
826
857
  await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx])
827
858
 
828
- join_pool_2: dict[str, Any] = await client.pw_join_pool(
829
- wallet_id_2, pool_ph, "https://pool.example.com", uint32(10), uint64(fee)
859
+ join_pool_2 = await client.pw_join_pool(
860
+ PWJoinPool(
861
+ wallet_id=uint32(wallet_id_2),
862
+ target_puzzlehash=pool_ph,
863
+ pool_url="https://pool.example.com",
864
+ relative_lock_height=uint32(10),
865
+ fee=uint64(fee),
866
+ push=True,
867
+ ),
868
+ DEFAULT_TX_CONFIG,
830
869
  )
831
- assert join_pool_2["success"]
832
- join_pool_tx_2: TransactionRecord = join_pool_2["transaction"]
870
+ join_pool_tx_2: TransactionRecord = join_pool_2.transaction
833
871
  for r in join_pool_tx.removals:
834
872
  assert r not in join_pool_tx_2.removals
835
873
  assert join_pool_tx_2 is not None
836
874
  await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx_2])
837
875
 
838
- status = (await client.pw_status(wallet_id))[0]
839
- status_2 = (await client.pw_status(wallet_id_2))[0]
876
+ status = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
877
+ status_2 = (await client.pw_status(PWStatus(uint32(wallet_id_2)))).state
840
878
 
841
879
  assert status.current.state == PoolSingletonState.SELF_POOLING.value
842
880
  assert status.target is not None
@@ -848,7 +886,7 @@ class TestPoolWalletRpc:
848
886
  await full_node_api.process_transaction_records(records=[join_pool_tx, join_pool_tx_2])
849
887
 
850
888
  async def status_is_farming_to_pool(w_id: int) -> bool:
851
- pw_status: PoolWalletInfo = (await client.pw_status(w_id))[0]
889
+ pw_status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(w_id)))).state
852
890
  return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
853
891
 
854
892
  await time_out_assert(20, status_is_farming_to_pool, True, wallet_id)
@@ -879,23 +917,24 @@ class TestPoolWalletRpc:
879
917
  summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
880
918
  assert len(summaries_response) == 1
881
919
  wallet_id: int = summaries_response[0]["id"]
882
- status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
920
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
883
921
 
884
922
  assert status.current.state == PoolSingletonState.SELF_POOLING.value
885
923
  assert status.target is None
886
924
 
887
- join_pool_tx: TransactionRecord = (
888
- await client.pw_join_pool(
889
- wallet_id,
890
- pool_ph,
891
- "https://pool.example.com",
892
- uint32(5),
893
- fee,
894
- )
895
- )["transaction"]
896
- assert join_pool_tx is not None
925
+ await client.pw_join_pool(
926
+ PWJoinPool(
927
+ wallet_id=uint32(wallet_id),
928
+ target_puzzlehash=pool_ph,
929
+ pool_url="https://pool.example.com",
930
+ relative_lock_height=uint32(5),
931
+ fee=fee,
932
+ push=True,
933
+ ),
934
+ DEFAULT_TX_CONFIG,
935
+ )
897
936
 
898
- status = (await client.pw_status(wallet_id))[0]
937
+ status = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
899
938
 
900
939
  assert status.current.state == PoolSingletonState.SELF_POOLING.value
901
940
  assert status.current.pool_url == ""
@@ -911,22 +950,24 @@ class TestPoolWalletRpc:
911
950
 
912
951
  async def status_is_farming_to_pool() -> bool:
913
952
  await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
914
- pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
953
+ pw_status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
915
954
  return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
916
955
 
917
956
  await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_farming_to_pool)
918
957
 
919
958
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
920
959
 
921
- leave_pool_tx: dict[str, Any] = await client.pw_self_pool(wallet_id, uint64(fee))
922
- assert leave_pool_tx["transaction"].wallet_id == wallet_id
923
- assert leave_pool_tx["transaction"].amount == 1
924
- await full_node_api.wait_transaction_records_entered_mempool(records=leave_pool_tx["transactions"])
960
+ leave_pool_tx = await client.pw_self_pool(
961
+ PWSelfPool(wallet_id=uint32(wallet_id), fee=uint64(fee), push=True), DEFAULT_TX_CONFIG
962
+ )
963
+ assert leave_pool_tx.transaction.wallet_id == wallet_id
964
+ assert leave_pool_tx.transaction.amount == 1
965
+ await full_node_api.wait_transaction_records_entered_mempool(records=leave_pool_tx.transactions)
925
966
 
926
967
  await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
927
968
 
928
969
  async def status_is_leaving() -> bool:
929
- pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
970
+ pw_status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
930
971
  return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
931
972
 
932
973
  await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_leaving)
@@ -934,7 +975,7 @@ class TestPoolWalletRpc:
934
975
 
935
976
  async def status_is_self_pooling() -> bool:
936
977
  # Farm enough blocks to wait for relative_lock_height
937
- pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
978
+ pw_status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
938
979
  log.warning(f"PW status state: {pw_status.current}")
939
980
  return pw_status.current.state == PoolSingletonState.SELF_POOLING.value
940
981
 
@@ -983,16 +1024,17 @@ class TestPoolWalletRpc:
983
1024
  wallet_id = await create_new_plotnft(wallet_environments)
984
1025
 
985
1026
  # Join a different pool
986
- join_pool_tx: TransactionRecord = (
987
- await wallet_rpc.pw_join_pool(
988
- wallet_id,
989
- bytes32.zeros,
990
- "https://pool-b.org",
991
- LOCK_HEIGHT,
992
- uint64(fee),
993
- )
994
- )["transaction"]
995
- assert join_pool_tx is not None
1027
+ await wallet_rpc.pw_join_pool(
1028
+ PWJoinPool(
1029
+ wallet_id=uint32(wallet_id),
1030
+ target_puzzlehash=bytes32.zeros,
1031
+ pool_url="https://pool-b.org",
1032
+ relative_lock_height=LOCK_HEIGHT,
1033
+ fee=uint64(fee),
1034
+ push=True,
1035
+ ),
1036
+ DEFAULT_TX_CONFIG,
1037
+ )
996
1038
 
997
1039
  await wallet_environments.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
998
1040
  await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.LEAVING_POOL)
@@ -1019,7 +1061,7 @@ class TestPoolWalletRpc:
1019
1061
  print(f"Checking state after {total_blocks_farmed} blocks")
1020
1062
 
1021
1063
  await full_node.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
1022
- pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
1064
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(PWStatus(uint32(wallet_id)))).state
1023
1065
  if pw_status.current.state == state.value:
1024
1066
  return True
1025
1067
  return False
@@ -1032,7 +1074,7 @@ class TestPoolWalletRpc:
1032
1074
  wallet_environments.environments[0].node,
1033
1075
  )
1034
1076
 
1035
- pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
1077
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(PWStatus(uint32(wallet_id)))).state
1036
1078
  assert pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
1037
1079
  assert pw_status.current.pool_url == "https://pool-b.org"
1038
1080
  assert pw_status.current.relative_lock_height == LOCK_HEIGHT
@@ -1063,35 +1105,39 @@ class TestPoolWalletRpc:
1063
1105
  summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
1064
1106
  assert len(summaries_response) == 1
1065
1107
  wallet_id: int = summaries_response[0]["id"]
1066
- status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
1108
+ status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
1067
1109
 
1068
1110
  assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
1069
1111
  assert status.target is None
1070
1112
 
1071
1113
  async def status_is_farming_to_pool() -> bool:
1072
- pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
1114
+ pw_status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
1073
1115
  return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
1074
1116
 
1075
1117
  await time_out_assert(timeout=WAIT_SECS, function=status_is_farming_to_pool)
1076
1118
 
1077
- pw_info: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
1119
+ pw_info: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
1078
1120
  assert pw_info.current.pool_url == "https://pool-a.org"
1079
1121
  assert pw_info.current.relative_lock_height == 5
1080
1122
 
1081
- join_pool_txs: list[TransactionRecord] = (
1123
+ join_pool_txs = (
1082
1124
  await client.pw_join_pool(
1083
- wallet_id,
1084
- pool_b_ph,
1085
- "https://pool-b.org",
1086
- uint32(10),
1087
- uint64(fee),
1125
+ PWJoinPool(
1126
+ wallet_id=uint32(wallet_id),
1127
+ target_puzzlehash=pool_b_ph,
1128
+ pool_url="https://pool-b.org",
1129
+ relative_lock_height=uint32(10),
1130
+ fee=uint64(fee),
1131
+ push=True,
1132
+ ),
1133
+ DEFAULT_TX_CONFIG,
1088
1134
  )
1089
- )["transactions"]
1135
+ ).transactions
1090
1136
  await full_node_api.wait_transaction_records_entered_mempool(records=join_pool_txs)
1091
1137
  await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
1092
1138
 
1093
1139
  async def status_is_leaving_no_blocks() -> bool:
1094
- pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
1140
+ pw_status: PoolWalletInfo = (await client.pw_status(PWStatus(uint32(wallet_id)))).state
1095
1141
  return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
1096
1142
 
1097
1143
  await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
@@ -1120,3 +1166,89 @@ class TestPoolWalletRpc:
1120
1166
 
1121
1167
  # Eventually, leaves pool
1122
1168
  assert await status_is_farming_to_pool()
1169
+
1170
+ @pytest.mark.parametrize(
1171
+ "wallet_environments",
1172
+ [
1173
+ {
1174
+ "num_environments": 1,
1175
+ "blocks_needed": [10],
1176
+ }
1177
+ ],
1178
+ indirect=True,
1179
+ )
1180
+ @pytest.mark.anyio
1181
+ async def test_join_pool_twice(
1182
+ self,
1183
+ fee: uint64,
1184
+ wallet_environments: WalletTestFramework,
1185
+ ) -> None:
1186
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
1187
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
1188
+
1189
+ wallet_state_manager.config["reuse_public_key_for_change"][
1190
+ str(wallet_state_manager.root_pubkey.get_fingerprint())
1191
+ ] = wallet_environments.tx_config.reuse_puzhash
1192
+
1193
+ # Create a farming plotnft to url http://pool.example.com
1194
+ wallet_id = await create_new_plotnft(wallet_environments)
1195
+
1196
+ # Test joining the same pool via the RPC client
1197
+ with pytest.raises(ResponseFailureError, match="Already farming to pool"):
1198
+ await wallet_rpc.pw_join_pool(
1199
+ PWJoinPool(
1200
+ wallet_id=uint32(wallet_id),
1201
+ target_puzzlehash=bytes32.zeros,
1202
+ pool_url="http://pool.example.com",
1203
+ relative_lock_height=uint32(10),
1204
+ fee=uint64(0),
1205
+ push=True,
1206
+ ),
1207
+ DEFAULT_TX_CONFIG,
1208
+ )
1209
+
1210
+ @pytest.mark.parametrize(
1211
+ "wallet_environments",
1212
+ [
1213
+ {
1214
+ "num_environments": 1,
1215
+ "blocks_needed": [10],
1216
+ "trusted": True,
1217
+ "reuse_puzhash": False,
1218
+ }
1219
+ ],
1220
+ indirect=True,
1221
+ )
1222
+ @pytest.mark.anyio
1223
+ async def test_join_pool_unsynced(
1224
+ self,
1225
+ fee: uint64,
1226
+ wallet_environments: WalletTestFramework,
1227
+ mocker: MockerFixture,
1228
+ ) -> None:
1229
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
1230
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
1231
+
1232
+ wallet_state_manager.config["reuse_public_key_for_change"][
1233
+ str(wallet_state_manager.root_pubkey.get_fingerprint())
1234
+ ] = wallet_environments.tx_config.reuse_puzhash
1235
+
1236
+ # Create a farming plotnft to url http://pool.example.com
1237
+ wallet_id = await create_new_plotnft(wallet_environments)
1238
+
1239
+ mock = mocker.patch.object(wallet_state_manager, "synced")
1240
+ mock.return_value = False
1241
+
1242
+ # Test joining the same pool via the RPC client
1243
+ with pytest.raises(ResponseFailureError, match="Wallet needs to be fully synced."):
1244
+ await wallet_rpc.pw_join_pool(
1245
+ PWJoinPool(
1246
+ wallet_id=uint32(wallet_id),
1247
+ target_puzzlehash=bytes32.zeros,
1248
+ pool_url="http://pool.example.com",
1249
+ relative_lock_height=uint32(10),
1250
+ fee=uint64(0),
1251
+ push=True,
1252
+ ),
1253
+ DEFAULT_TX_CONFIG,
1254
+ )