chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
@@ -1,23 +1,1001 @@
1
- # flake8: noqa: E501
2
-
3
1
  from __future__ import annotations
4
2
 
5
- import click
3
+ import json
4
+ from dataclasses import dataclass
5
+ from io import StringIO
6
+ from typing import Optional, cast
7
+
6
8
  import pytest
7
- from click.testing import CliRunner, Result
9
+ from chia_rs import G1Element
10
+
11
+ # TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469
12
+ from pytest_mock import MockerFixture
13
+
14
+ from chia._tests.cmds.cmd_test_utils import TestWalletRpcClient
15
+ from chia._tests.conftest import ConsensusMode
16
+ from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
17
+ from chia._tests.pools.test_pool_rpc import (
18
+ LOCK_HEIGHT,
19
+ create_new_plotnft,
20
+ manage_temporary_pool_plot,
21
+ verify_pool_state,
22
+ )
23
+ from chia._tests.util.misc import Marks, boolean_datacases, datacases
24
+ from chia.cmds.cmd_classes import ChiaCliContext
25
+ from chia.cmds.cmd_helpers import NeedsWalletRPC, WalletClientInfo
26
+ from chia.cmds.param_types import CliAddress
27
+ from chia.cmds.plotnft import (
28
+ ChangePayoutInstructionsPlotNFTCMD,
29
+ ClaimPlotNFTCMD,
30
+ CreatePlotNFTCMD,
31
+ GetLoginLinkCMD,
32
+ InspectPlotNFTCMD,
33
+ JoinPlotNFTCMD,
34
+ LeavePlotNFTCMD,
35
+ ShowPlotNFTCMD,
36
+ )
37
+ from chia.pools.pool_config import PoolWalletConfig, load_pool_config, update_pool_config
38
+ from chia.pools.pool_wallet_info import PoolSingletonState, PoolWalletInfo
39
+ from chia.rpc.wallet_rpc_client import WalletRpcClient
40
+ from chia.simulator.setup_services import setup_farmer
41
+ from chia.types.blockchain_format.sized_bytes import bytes32
42
+ from chia.util.bech32m import encode_puzzle_hash
43
+ from chia.util.config import lock_and_load_config, save_config
44
+ from chia.util.errors import CliRpcConnectionError
45
+ from chia.util.ints import uint64
46
+ from chia.wallet.util.address_type import AddressType
47
+ from chia.wallet.util.wallet_types import WalletType
48
+ from chia.wallet.wallet_state_manager import WalletStateManager
49
+
50
+ # limit to plain consensus mode for all tests
51
+ pytestmark = [pytest.mark.limit_consensus_modes(reason="irrelevant")]
52
+
53
+
54
+ @dataclass
55
+ class StateUrlCase:
56
+ id: str
57
+ state: str
58
+ pool_url: Optional[str]
59
+ expected_error: Optional[str] = None
60
+ marks: Marks = ()
61
+
62
+
63
+ @pytest.mark.parametrize(
64
+ "wallet_environments",
65
+ [
66
+ {
67
+ "num_environments": 1,
68
+ "blocks_needed": [1],
69
+ }
70
+ ],
71
+ indirect=True,
72
+ )
73
+ @boolean_datacases(name="self_pool", true="local", false="pool")
74
+ @boolean_datacases(name="prompt", true="prompt", false="dont_prompt")
75
+ @pytest.mark.anyio
76
+ async def test_plotnft_cli_create(
77
+ wallet_environments: WalletTestFramework,
78
+ self_pool: bool,
79
+ prompt: bool,
80
+ mocker: MockerFixture,
81
+ ) -> None:
82
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
83
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
84
+ client_info: WalletClientInfo = WalletClientInfo(
85
+ wallet_rpc,
86
+ wallet_state_manager.root_pubkey.get_fingerprint(),
87
+ wallet_state_manager.config,
88
+ )
89
+
90
+ wallet_state_manager.config["reuse_public_key_for_change"][str(client_info.fingerprint)] = (
91
+ wallet_environments.tx_config.reuse_puzhash
92
+ )
93
+
94
+ state = "local" if self_pool else "pool"
95
+ pool_url = None if self_pool else "http://pool.example.com"
96
+
97
+ if not self_pool:
98
+ pool_response_dict = {
99
+ "name": "Pool Name",
100
+ "description": "Pool Description",
101
+ "logo_url": "https://subdomain.pool-domain.tld/path/to/logo.svg",
102
+ "target_puzzle_hash": "344587cf06a39db471d2cc027504e8688a0a67cce961253500c956c73603fd58",
103
+ "fee": "0.01",
104
+ "protocol_version": 1,
105
+ "relative_lock_height": 5,
106
+ "minimum_difficulty": 1,
107
+ "authentication_token_timeout": 5,
108
+ }
109
+
110
+ mock_get = mocker.patch("aiohttp.ClientSession.get")
111
+ mock_get.return_value.__aenter__.return_value.text.return_value = json.dumps(pool_response_dict)
112
+
113
+ if prompt:
114
+ mocker.patch("sys.stdin", StringIO("yes\n"))
115
+
116
+ await CreatePlotNFTCMD(
117
+ rpc_info=NeedsWalletRPC(
118
+ client_info=client_info,
119
+ ),
120
+ state=state,
121
+ dont_prompt=not prompt,
122
+ pool_url=pool_url,
123
+ ).run()
124
+
125
+ await wallet_environments.process_pending_states(
126
+ [
127
+ WalletStateTransition(
128
+ pre_block_balance_updates={
129
+ 1: {
130
+ "confirmed_wallet_balance": 0,
131
+ "unconfirmed_wallet_balance": -1,
132
+ "<=#spendable_balance": 1,
133
+ "<=#max_send_amount": 1,
134
+ ">=#pending_change": 1, # any amount increase
135
+ "pending_coin_removal_count": 1,
136
+ },
137
+ },
138
+ post_block_balance_updates={
139
+ 1: {
140
+ "confirmed_wallet_balance": -1,
141
+ "unconfirmed_wallet_balance": 0,
142
+ ">=#spendable_balance": 1,
143
+ ">=#max_send_amount": 1,
144
+ "<=#pending_change": 1, # any amount decrease
145
+ "<=#pending_coin_removal_count": 1,
146
+ },
147
+ 2: {"init": True, "unspent_coin_count": 1},
148
+ },
149
+ )
150
+ ]
151
+ )
152
+
153
+ summaries_response = await wallet_rpc.get_wallets(WalletType.POOLING_WALLET)
154
+ assert len(summaries_response) == 1
155
+ wallet_id: int = summaries_response[0]["id"]
156
+
157
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.SELF_POOLING)
158
+
159
+
160
+ @datacases(
161
+ StateUrlCase(
162
+ id="local state with pool url",
163
+ state="local",
164
+ pool_url="https://pool.example.com",
165
+ expected_error="is not allowed with 'local' state",
166
+ ),
167
+ StateUrlCase(
168
+ id="pool state no pool url",
169
+ state="pool",
170
+ pool_url=None,
171
+ expected_error="is required with 'pool' state",
172
+ ),
173
+ )
174
+ @pytest.mark.anyio
175
+ async def test_plotnft_cli_create_errors(
176
+ case: StateUrlCase,
177
+ consensus_mode: ConsensusMode,
178
+ ) -> None:
179
+ with pytest.raises(CliRpcConnectionError, match=case.expected_error):
180
+ await CreatePlotNFTCMD(
181
+ rpc_info=NeedsWalletRPC(
182
+ client_info=None,
183
+ wallet_rpc_port=None,
184
+ fingerprint=None,
185
+ ),
186
+ state=case.state,
187
+ dont_prompt=True,
188
+ pool_url=case.pool_url,
189
+ ).run()
190
+
191
+
192
+ @pytest.mark.parametrize(
193
+ "wallet_environments",
194
+ [
195
+ {
196
+ "num_environments": 1,
197
+ "blocks_needed": [1],
198
+ }
199
+ ],
200
+ indirect=True,
201
+ )
202
+ @pytest.mark.anyio
203
+ async def test_plotnft_cli_show(
204
+ wallet_environments: WalletTestFramework,
205
+ capsys: pytest.CaptureFixture[str],
206
+ ) -> None:
207
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
208
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
209
+ client_info: WalletClientInfo = WalletClientInfo(
210
+ wallet_rpc,
211
+ wallet_state_manager.root_pubkey.get_fingerprint(),
212
+ wallet_state_manager.config,
213
+ )
214
+ root_path = wallet_environments.environments[0].node.root_path
215
+ wallet_state_manager.config["reuse_public_key_for_change"][str(client_info.fingerprint)] = (
216
+ wallet_environments.tx_config.reuse_puzhash
217
+ )
218
+
219
+ await ShowPlotNFTCMD(
220
+ # we need this for the farmer rpc client which is used in the comment
221
+ context=ChiaCliContext(root_path=root_path),
222
+ rpc_info=NeedsWalletRPC(
223
+ client_info=client_info,
224
+ ),
225
+ id=None,
226
+ ).run()
227
+ out, _err = capsys.readouterr()
228
+ assert "Wallet height: 3\nSync status: Synced\n" == out
229
+
230
+ with pytest.raises(CliRpcConnectionError, match="is not a pool wallet"):
231
+ await ShowPlotNFTCMD(
232
+ context=ChiaCliContext(root_path=root_path),
233
+ rpc_info=NeedsWalletRPC(
234
+ client_info=client_info,
235
+ ),
236
+ id=15,
237
+ ).run()
238
+
239
+ wallet_id = await create_new_plotnft(wallet_environments)
240
+
241
+ # need to capture the output and verify
242
+ await ShowPlotNFTCMD(
243
+ context=ChiaCliContext(root_path=root_path),
244
+ rpc_info=NeedsWalletRPC(
245
+ client_info=client_info,
246
+ ),
247
+ id=wallet_id,
248
+ ).run()
249
+ out, _err = capsys.readouterr()
250
+ assert "Current state: FARMING_TO_POOL" in out
251
+ assert f"Wallet ID: {wallet_id}" in out
252
+
253
+ wallet_id_2 = await create_new_plotnft(wallet_environments, self_pool=False, second_nft=True)
254
+
255
+ # Passing in None when there are multiple pool wallets
256
+ # Should show the state of all pool wallets
257
+ await ShowPlotNFTCMD(
258
+ context=ChiaCliContext(root_path=root_path),
259
+ rpc_info=NeedsWalletRPC(
260
+ client_info=client_info,
261
+ ),
262
+ id=None,
263
+ ).run()
264
+ out, _err = capsys.readouterr()
265
+ assert "Current state: FARMING_TO_POOL" in out
266
+ assert f"Wallet ID: {wallet_id}" in out
267
+ assert f"Wallet ID: {wallet_id_2}" in out
268
+
269
+
270
+ @pytest.mark.parametrize(
271
+ "wallet_environments",
272
+ [
273
+ {
274
+ "num_environments": 1,
275
+ "blocks_needed": [1],
276
+ }
277
+ ],
278
+ indirect=True,
279
+ )
280
+ @pytest.mark.anyio
281
+ async def test_plotnft_cli_show_with_farmer(
282
+ wallet_environments: WalletTestFramework,
283
+ capsys: pytest.CaptureFixture[str],
284
+ self_hostname: str,
285
+ # with_wallet_id: bool,
286
+ ) -> None:
287
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
288
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
289
+ client_info: WalletClientInfo = WalletClientInfo(
290
+ wallet_rpc,
291
+ wallet_state_manager.root_pubkey.get_fingerprint(),
292
+ wallet_state_manager.config,
293
+ )
294
+ wallet_state_manager.config["reuse_public_key_for_change"][str(client_info.fingerprint)] = (
295
+ wallet_environments.tx_config.reuse_puzhash
296
+ )
297
+
298
+ # Need to run the farmer to make further tests
299
+ root_path = wallet_environments.environments[0].node.root_path
300
+
301
+ async with setup_farmer(
302
+ b_tools=wallet_environments.full_node.bt,
303
+ root_path=root_path,
304
+ self_hostname=self_hostname,
305
+ consensus_constants=wallet_environments.full_node.bt.constants,
306
+ ) as farmer:
307
+ assert farmer.rpc_server and farmer.rpc_server.webserver
308
+
309
+ with lock_and_load_config(root_path, "config.yaml") as config:
310
+ config["farmer"]["rpc_port"] = farmer.rpc_server.webserver.listen_port
311
+ save_config(root_path, "config.yaml", config)
312
+
313
+ await ShowPlotNFTCMD(
314
+ context=ChiaCliContext(root_path=root_path),
315
+ rpc_info=NeedsWalletRPC(
316
+ client_info=client_info,
317
+ ),
318
+ id=None,
319
+ ).run()
320
+ out, _err = capsys.readouterr()
321
+ assert "Sync status: Synced" in out
322
+ assert "Current state" not in out
323
+
324
+ wallet_id = await create_new_plotnft(wallet_environments)
325
+ pw_info, _ = await wallet_rpc.pw_status(wallet_id)
326
+
327
+ await ShowPlotNFTCMD(
328
+ context=ChiaCliContext(root_path=root_path),
329
+ rpc_info=NeedsWalletRPC(
330
+ client_info=client_info,
331
+ ),
332
+ id=wallet_id,
333
+ ).run()
334
+ out, _err = capsys.readouterr()
335
+ assert "Current state: FARMING_TO_POOL" in out
336
+ assert f"Wallet ID: {wallet_id}" in out
337
+ assert f"Launcher ID: {pw_info.launcher_id.hex()}" in out
338
+
339
+
340
+ @pytest.mark.parametrize(
341
+ "wallet_environments",
342
+ [
343
+ {
344
+ "num_environments": 1,
345
+ "blocks_needed": [10],
346
+ }
347
+ ],
348
+ indirect=True,
349
+ )
350
+ @boolean_datacases(name="prompt", true="prompt", false="dont_prompt")
351
+ @pytest.mark.anyio
352
+ async def test_plotnft_cli_leave(
353
+ wallet_environments: WalletTestFramework,
354
+ prompt: bool,
355
+ mocker: MockerFixture,
356
+ ) -> None:
357
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
358
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
359
+ client_info: WalletClientInfo = WalletClientInfo(
360
+ wallet_rpc,
361
+ wallet_state_manager.root_pubkey.get_fingerprint(),
362
+ wallet_state_manager.config,
363
+ )
364
+ wallet_state_manager.config["reuse_public_key_for_change"][str(client_info.fingerprint)] = (
365
+ wallet_environments.tx_config.reuse_puzhash
366
+ )
367
+
368
+ if prompt:
369
+ mocker.patch("sys.stdin", StringIO("yes\n"))
370
+
371
+ with pytest.raises(CliRpcConnectionError, match="No pool wallet found"):
372
+ await LeavePlotNFTCMD(
373
+ rpc_info=NeedsWalletRPC(
374
+ client_info=client_info,
375
+ ),
376
+ id=None,
377
+ dont_prompt=not prompt,
378
+ ).run()
379
+
380
+ with pytest.raises(CliRpcConnectionError, match="is not a pool wallet"):
381
+ await LeavePlotNFTCMD(
382
+ rpc_info=NeedsWalletRPC(
383
+ client_info=client_info,
384
+ ),
385
+ id=15,
386
+ dont_prompt=not prompt,
387
+ ).run()
388
+
389
+ wallet_id = await create_new_plotnft(wallet_environments)
390
+
391
+ await LeavePlotNFTCMD(
392
+ rpc_info=NeedsWalletRPC(
393
+ client_info=client_info,
394
+ ),
395
+ id=wallet_id,
396
+ dont_prompt=not prompt,
397
+ ).run()
398
+
399
+ await wallet_environments.process_pending_states(
400
+ [
401
+ WalletStateTransition(
402
+ pre_block_balance_updates={
403
+ 1: {
404
+ "<=#spendable_balance": 1,
405
+ "<=#max_send_amount": 1,
406
+ "pending_coin_removal_count": 0,
407
+ },
408
+ 2: {"pending_coin_removal_count": 1},
409
+ },
410
+ post_block_balance_updates={
411
+ 1: {
412
+ "<=#pending_coin_removal_count": 1,
413
+ },
414
+ 2: {"pending_coin_removal_count": -1},
415
+ },
416
+ )
417
+ ]
418
+ )
419
+
420
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.LEAVING_POOL)
421
+
422
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(
423
+ count=LOCK_HEIGHT + 2, guarantee_transaction_blocks=True
424
+ )
425
+
426
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.SELF_POOLING)
427
+
428
+
429
+ @pytest.mark.parametrize(
430
+ "wallet_environments",
431
+ [
432
+ {
433
+ "num_environments": 1,
434
+ "blocks_needed": [10],
435
+ }
436
+ ],
437
+ indirect=True,
438
+ )
439
+ @boolean_datacases(name="prompt", true="prompt", false="dont_prompt")
440
+ @pytest.mark.anyio
441
+ async def test_plotnft_cli_join(
442
+ wallet_environments: WalletTestFramework,
443
+ prompt: bool,
444
+ mocker: MockerFixture,
445
+ ) -> None:
446
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
447
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
448
+ client_info: WalletClientInfo = WalletClientInfo(
449
+ wallet_rpc,
450
+ wallet_state_manager.root_pubkey.get_fingerprint(),
451
+ wallet_state_manager.config,
452
+ )
453
+ wallet_state_manager.config["reuse_public_key_for_change"][str(client_info.fingerprint)] = (
454
+ wallet_environments.tx_config.reuse_puzhash
455
+ )
456
+
457
+ # Test error cases
458
+ # No pool wallet found
459
+ with pytest.raises(CliRpcConnectionError, match="No pool wallet found"):
460
+ await JoinPlotNFTCMD(
461
+ rpc_info=NeedsWalletRPC(
462
+ client_info=client_info,
463
+ ),
464
+ pool_url="http://127.0.0.1",
465
+ id=None,
466
+ dont_prompt=not prompt,
467
+ ).run()
468
+
469
+ # Wallet id not a pool wallet
470
+ with pytest.raises(CliRpcConnectionError, match="is not a pool wallet"):
471
+ await JoinPlotNFTCMD(
472
+ rpc_info=NeedsWalletRPC(
473
+ client_info=client_info,
474
+ ),
475
+ pool_url="http://127.0.0.1",
476
+ id=1,
477
+ dont_prompt=not prompt,
478
+ ).run()
479
+
480
+ # Create a farming plotnft to url http://pool.example.com
481
+ wallet_id = await create_new_plotnft(wallet_environments)
482
+
483
+ # HTTPS check on mainnet
484
+ with pytest.raises(CliRpcConnectionError, match="must be HTTPS on mainnet"):
485
+ config_override = wallet_state_manager.config.copy()
486
+ config_override["selected_network"] = "mainnet"
487
+ mainnet_override = WalletClientInfo(client_info.client, client_info.fingerprint, config_override)
488
+ await JoinPlotNFTCMD(
489
+ rpc_info=NeedsWalletRPC(
490
+ client_info=mainnet_override,
491
+ ),
492
+ pool_url="http://127.0.0.1",
493
+ id=wallet_id,
494
+ dont_prompt=not prompt,
495
+ ).run()
496
+
497
+ # Some more error cases
498
+ with pytest.raises(CliRpcConnectionError, match="Error connecting to pool"):
499
+ await JoinPlotNFTCMD(
500
+ rpc_info=NeedsWalletRPC(
501
+ client_info=client_info,
502
+ ),
503
+ id=wallet_id,
504
+ pool_url="http://127.0.0.1",
505
+ dont_prompt=not prompt,
506
+ ).run()
507
+
508
+ with pytest.raises(CliRpcConnectionError, match="Error connecting to pool"):
509
+ await JoinPlotNFTCMD(
510
+ rpc_info=NeedsWalletRPC(
511
+ client_info=client_info,
512
+ ),
513
+ id=wallet_id,
514
+ pool_url="",
515
+ dont_prompt=not prompt,
516
+ ).run()
517
+
518
+ pool_response_dict = {
519
+ "name": "Pool Name",
520
+ "description": "Pool Description",
521
+ "logo_url": "https://subdomain.pool-domain.tld/path/to/logo.svg",
522
+ "target_puzzle_hash": "344587cf06a39db471d2cc027504e8688a0a67cce961253500c956c73603fd58",
523
+ "fee": "0.01",
524
+ "protocol_version": 1,
525
+ "relative_lock_height": 50000,
526
+ "minimum_difficulty": 1,
527
+ "authentication_token_timeout": 5,
528
+ }
529
+
530
+ mock_get = mocker.patch("aiohttp.ClientSession.get")
531
+ mock_get.return_value.__aenter__.return_value.text.return_value = json.dumps(pool_response_dict)
532
+
533
+ with pytest.raises(CliRpcConnectionError, match="Relative lock height too high for this pool"):
534
+ await JoinPlotNFTCMD(
535
+ rpc_info=NeedsWalletRPC(
536
+ client_info=client_info,
537
+ ),
538
+ id=wallet_id,
539
+ pool_url="",
540
+ dont_prompt=not prompt,
541
+ ).run()
542
+
543
+ pool_response_dict["relative_lock_height"] = LOCK_HEIGHT
544
+ pool_response_dict["protocol_version"] = 2
545
+ mock_get.return_value.__aenter__.return_value.text.return_value = json.dumps(pool_response_dict)
546
+
547
+ with pytest.raises(CliRpcConnectionError, match="Incorrect version"):
548
+ await JoinPlotNFTCMD(
549
+ rpc_info=NeedsWalletRPC(
550
+ client_info=client_info,
551
+ ),
552
+ id=wallet_id,
553
+ pool_url="",
554
+ dont_prompt=not prompt,
555
+ ).run()
556
+
557
+ pool_response_dict["relative_lock_height"] = LOCK_HEIGHT
558
+ pool_response_dict["protocol_version"] = 1
559
+ mock_get.return_value.__aenter__.return_value.text.return_value = json.dumps(pool_response_dict)
560
+
561
+ if prompt:
562
+ mocker.patch("sys.stdin", StringIO("yes\n"))
563
+
564
+ # Join the new pool - this will leave the prior pool and join the new one
565
+ # Here you can use None as the wallet_id and the code will pick the only pool wallet automatically
566
+ await JoinPlotNFTCMD(
567
+ rpc_info=NeedsWalletRPC(
568
+ client_info=client_info,
569
+ ),
570
+ id=None,
571
+ pool_url="http://127.0.0.1",
572
+ dont_prompt=not prompt,
573
+ ).run()
574
+
575
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
576
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.LEAVING_POOL)
577
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(
578
+ count=LOCK_HEIGHT + 2, guarantee_transaction_blocks=True
579
+ )
580
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.FARMING_TO_POOL)
581
+ await wallet_environments.full_node.wait_for_wallet_synced(
582
+ wallet_node=wallet_environments.environments[0].node, timeout=20
583
+ )
584
+
585
+ # Create a second farming plotnft to url http://pool.example.com
586
+ wallet_id = await create_new_plotnft(wallet_environments, self_pool=False, second_nft=True)
587
+
588
+ # Join the new pool - this will leave the prior pool and join the new one
589
+ # Will fail because we don't specify a wallet ID and there are multiple pool wallets
590
+ with pytest.raises(CliRpcConnectionError, match="More than one pool wallet"):
591
+ await JoinPlotNFTCMD(
592
+ rpc_info=NeedsWalletRPC(
593
+ client_info=client_info,
594
+ ),
595
+ id=None,
596
+ pool_url="http://127.0.0.1",
597
+ dont_prompt=not prompt,
598
+ ).run()
599
+
600
+ if prompt:
601
+ mocker.patch("sys.stdin", StringIO("yes\n"))
602
+
603
+ # Join the new pool - this will leave the prior pool and join the new one and specific wallet_id
604
+ await JoinPlotNFTCMD(
605
+ rpc_info=NeedsWalletRPC(
606
+ client_info=client_info,
607
+ ),
608
+ id=wallet_id,
609
+ pool_url="http://127.0.0.1",
610
+ dont_prompt=not prompt,
611
+ ).run()
612
+
613
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
614
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.LEAVING_POOL)
615
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(
616
+ count=LOCK_HEIGHT + 2, guarantee_transaction_blocks=True
617
+ )
618
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.FARMING_TO_POOL)
619
+
620
+ # Join the same pool test - code not ready yet for test
621
+ # Needs PR #18822
622
+ # with pytest.raises(CliRpcConnectionError, match="already joined"):
623
+ # await JoinPlotNFTCMD(
624
+ # rpc_info=NeedsWalletRPC(
625
+ # client_info=client_info,
626
+ # ),
627
+ # id=wallet_id,
628
+ # pool_url="http://127.0.0.1",
629
+ # dont_prompt=not prompt,
630
+ # ).run()
631
+
632
+
633
+ @pytest.mark.parametrize(
634
+ "wallet_environments",
635
+ [
636
+ {
637
+ "num_environments": 1,
638
+ "blocks_needed": [10],
639
+ }
640
+ ],
641
+ indirect=True,
642
+ )
643
+ @pytest.mark.anyio
644
+ async def test_plotnft_cli_claim(
645
+ wallet_environments: WalletTestFramework,
646
+ ) -> None:
647
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
648
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
649
+ client_info: WalletClientInfo = WalletClientInfo(
650
+ wallet_rpc,
651
+ wallet_state_manager.root_pubkey.get_fingerprint(),
652
+ wallet_state_manager.config,
653
+ )
654
+ wallet_state_manager.config["reuse_public_key_for_change"][str(client_info.fingerprint)] = (
655
+ wallet_environments.tx_config.reuse_puzhash
656
+ )
657
+
658
+ # Test error cases
659
+ # No pool wallet found
660
+ with pytest.raises(CliRpcConnectionError, match="No pool wallet found"):
661
+ await ClaimPlotNFTCMD(
662
+ rpc_info=NeedsWalletRPC(
663
+ client_info=client_info,
664
+ ),
665
+ id=None,
666
+ ).run()
667
+
668
+ # Wallet id not a pool wallet
669
+ with pytest.raises(CliRpcConnectionError, match="is not a pool wallet"):
670
+ await ClaimPlotNFTCMD(
671
+ rpc_info=NeedsWalletRPC(
672
+ client_info=client_info,
673
+ ),
674
+ id=1,
675
+ ).run()
676
+
677
+ # Create a self-pooling plotnft
678
+ wallet_id = await create_new_plotnft(wallet_environments, self_pool=True)
679
+
680
+ status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
681
+ our_ph = await wallet_state_manager.main_wallet.get_new_puzzlehash()
682
+ bt = wallet_environments.full_node.bt
683
+
684
+ async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
685
+ all_blocks = await wallet_environments.full_node.get_all_full_blocks()
686
+ blocks = bt.get_consecutive_blocks(
687
+ 3,
688
+ block_list_input=all_blocks,
689
+ force_plot_id=pool_plot.plot_id,
690
+ farmer_reward_puzzle_hash=our_ph,
691
+ guarantee_transaction_block=True,
692
+ )
693
+
694
+ for block in blocks[-3:]:
695
+ await wallet_environments.full_node.full_node.add_block(block)
696
+
697
+ await wallet_environments.full_node.wait_for_wallet_synced(
698
+ wallet_node=wallet_environments.environments[0].node, timeout=20
699
+ )
700
+ await ClaimPlotNFTCMD(
701
+ rpc_info=NeedsWalletRPC(
702
+ client_info=client_info,
703
+ ),
704
+ id=None,
705
+ ).run()
706
+
707
+ await wallet_environments.process_pending_states(
708
+ [
709
+ WalletStateTransition(
710
+ pre_block_balance_updates={
711
+ 1: {
712
+ "confirmed_wallet_balance": 500_000_000_000,
713
+ "unconfirmed_wallet_balance": 500_000_000_000,
714
+ "spendable_balance": 500_000_000_000,
715
+ "max_send_amount": 500_000_000_000,
716
+ "pending_change": 0,
717
+ "unspent_coin_count": 2,
718
+ "pending_coin_removal_count": 0,
719
+ },
720
+ 2: {
721
+ "confirmed_wallet_balance": 2 * 1_750_000_000_000,
722
+ "unconfirmed_wallet_balance": 2 * 1_750_000_000_000,
723
+ "spendable_balance": 2 * 1_750_000_000_000,
724
+ "max_send_amount": 0,
725
+ "pending_change": 0,
726
+ "unspent_coin_count": 2,
727
+ "pending_coin_removal_count": 3,
728
+ },
729
+ },
730
+ post_block_balance_updates={
731
+ 1: {
732
+ "confirmed_wallet_balance": +3_750_000_000_000, # two pool rewards and 1 farm reward
733
+ "unconfirmed_wallet_balance": +3_750_000_000_000,
734
+ "spendable_balance": +3_750_000_000_000,
735
+ "max_send_amount": +3_750_000_000_000,
736
+ "pending_change": 0,
737
+ "unspent_coin_count": +3,
738
+ "pending_coin_removal_count": 0,
739
+ },
740
+ 2: {
741
+ "confirmed_wallet_balance": -1_750_000_000_000,
742
+ "unconfirmed_wallet_balance": -1_750_000_000_000,
743
+ "spendable_balance": -1_750_000_000_000,
744
+ "max_send_amount": 0,
745
+ "pending_change": 0,
746
+ "unspent_coin_count": -1,
747
+ "pending_coin_removal_count": -3,
748
+ },
749
+ },
750
+ )
751
+ ]
752
+ )
753
+
754
+
755
+ @pytest.mark.parametrize(
756
+ "wallet_environments",
757
+ [
758
+ {
759
+ "num_environments": 1,
760
+ "blocks_needed": [10],
761
+ }
762
+ ],
763
+ indirect=True,
764
+ )
765
+ @pytest.mark.anyio
766
+ async def test_plotnft_cli_inspect(
767
+ wallet_environments: WalletTestFramework,
768
+ capsys: pytest.CaptureFixture[str],
769
+ ) -> None:
770
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
771
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
772
+ client_info: WalletClientInfo = WalletClientInfo(
773
+ wallet_rpc,
774
+ wallet_state_manager.root_pubkey.get_fingerprint(),
775
+ wallet_state_manager.config,
776
+ )
777
+ wallet_state_manager.config["reuse_public_key_for_change"][str(client_info.fingerprint)] = (
778
+ wallet_environments.tx_config.reuse_puzhash
779
+ )
780
+
781
+ with pytest.raises(CliRpcConnectionError, match="No pool wallet found"):
782
+ await InspectPlotNFTCMD(
783
+ rpc_info=NeedsWalletRPC(
784
+ client_info=client_info,
785
+ ),
786
+ id=None,
787
+ ).run()
788
+
789
+ with pytest.raises(CliRpcConnectionError, match="is not a pool wallet"):
790
+ await InspectPlotNFTCMD(
791
+ rpc_info=NeedsWalletRPC(
792
+ client_info=client_info,
793
+ ),
794
+ id=15,
795
+ ).run()
796
+
797
+ wallet_id = await create_new_plotnft(wallet_environments)
798
+
799
+ # need to capture the output and verify
800
+ await InspectPlotNFTCMD(
801
+ rpc_info=NeedsWalletRPC(
802
+ client_info=client_info,
803
+ ),
804
+ id=wallet_id,
805
+ ).run()
806
+ out, _err = capsys.readouterr()
807
+ json_output = json.loads(out)
808
+
809
+ assert (
810
+ json_output["pool_wallet_info"]["current"]["owner_pubkey"]
811
+ == "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
812
+ )
813
+ assert json_output["pool_wallet_info"]["current"]["state"] == PoolSingletonState.FARMING_TO_POOL.value
814
+
815
+ wallet_id = await create_new_plotnft(wallet_environments, self_pool=True, second_nft=True)
816
+
817
+ with pytest.raises(CliRpcConnectionError, match="More than one pool wallet"):
818
+ await InspectPlotNFTCMD(
819
+ rpc_info=NeedsWalletRPC(
820
+ client_info=client_info,
821
+ ),
822
+ id=None,
823
+ ).run()
824
+
825
+ await InspectPlotNFTCMD(
826
+ rpc_info=NeedsWalletRPC(
827
+ client_info=client_info,
828
+ ),
829
+ id=wallet_id,
830
+ ).run()
831
+ out, _err = capsys.readouterr()
832
+ json_output = json.loads(out)
833
+
834
+ assert (
835
+ json_output["pool_wallet_info"]["current"]["owner_pubkey"]
836
+ == "0x893474c97d04a0283483ba1af9e070768dff9e9a83d9ae2cf00a34be96ca29aec387dfb7474f2548d777000e5463f602"
837
+ )
838
+
839
+ assert json_output["pool_wallet_info"]["current"]["state"] == PoolSingletonState.SELF_POOLING.value
840
+
841
+
842
+ @pytest.mark.parametrize(
843
+ "wallet_environments",
844
+ [
845
+ {
846
+ "num_environments": 1,
847
+ "blocks_needed": [10],
848
+ }
849
+ ],
850
+ indirect=True,
851
+ )
852
+ @pytest.mark.anyio
853
+ async def test_plotnft_cli_change_payout(
854
+ wallet_environments: WalletTestFramework,
855
+ mocker: MockerFixture,
856
+ capsys: pytest.CaptureFixture[str],
857
+ ) -> None:
858
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
859
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
860
+ client_info: WalletClientInfo = WalletClientInfo(
861
+ wallet_rpc,
862
+ wallet_state_manager.root_pubkey.get_fingerprint(),
863
+ wallet_state_manager.config,
864
+ )
865
+ wallet_state_manager.config["reuse_public_key_for_change"][str(client_info.fingerprint)] = (
866
+ wallet_environments.tx_config.reuse_puzhash
867
+ )
868
+
869
+ zero_ph = bytes32.from_hexstr("0x0000000000000000000000000000000000000000000000000000000000000000")
870
+ zero_address = encode_puzzle_hash(zero_ph, "xch")
871
+
872
+ burn_ph = bytes32.from_hexstr("0x000000000000000000000000000000000000000000000000000000000000dead")
873
+ burn_address = encode_puzzle_hash(burn_ph, "xch")
874
+ root_path = wallet_environments.environments[0].node.root_path
875
+
876
+ wallet_id = await create_new_plotnft(wallet_environments)
877
+ pw_info, _ = await wallet_rpc.pw_status(wallet_id)
878
+
879
+ # This tests what happens when using None for root_path
880
+ mocker.patch("chia.cmds.plotnft_funcs.DEFAULT_ROOT_PATH", root_path)
881
+ await ChangePayoutInstructionsPlotNFTCMD(
882
+ context=ChiaCliContext(root_path=wallet_environments.environments[0].node.root_path),
883
+ launcher_id=bytes32(32 * b"0"),
884
+ address=CliAddress(burn_ph, burn_address, AddressType.XCH),
885
+ ).run()
886
+ out, _err = capsys.readouterr()
887
+ assert f"{bytes32(32 * b'0').hex()} Not found." in out
888
+
889
+ new_config: PoolWalletConfig = PoolWalletConfig(
890
+ launcher_id=pw_info.launcher_id,
891
+ pool_url="http://pool.example.com",
892
+ payout_instructions=zero_address,
893
+ target_puzzle_hash=bytes32(32 * b"0"),
894
+ p2_singleton_puzzle_hash=pw_info.p2_singleton_puzzle_hash,
895
+ owner_public_key=G1Element(),
896
+ )
897
+
898
+ await update_pool_config(root_path=root_path, pool_config_list=[new_config])
899
+ config: list[PoolWalletConfig] = load_pool_config(root_path)
900
+ wanted_config = next((x for x in config if x.launcher_id == pw_info.launcher_id), None)
901
+ assert wanted_config is not None
902
+ assert wanted_config.payout_instructions == zero_address
903
+
904
+ await ChangePayoutInstructionsPlotNFTCMD(
905
+ context=ChiaCliContext(root_path=root_path),
906
+ launcher_id=pw_info.launcher_id,
907
+ address=CliAddress(burn_ph, burn_address, AddressType.XCH),
908
+ ).run()
909
+ out, _err = capsys.readouterr()
910
+ assert f"Payout Instructions for launcher id: {pw_info.launcher_id.hex()} successfully updated" in out
911
+
912
+ config = load_pool_config(root_path)
913
+ wanted_config = next((x for x in config if x.launcher_id == pw_info.launcher_id), None)
914
+ assert wanted_config is not None
915
+ assert wanted_config.payout_instructions == burn_ph.hex()
916
+
917
+
918
+ @pytest.mark.parametrize(
919
+ "wallet_environments",
920
+ [
921
+ {
922
+ "num_environments": 1,
923
+ "blocks_needed": [10],
924
+ }
925
+ ],
926
+ indirect=True,
927
+ )
928
+ @pytest.mark.anyio
929
+ async def test_plotnft_cli_get_login_link(
930
+ capsys: pytest.CaptureFixture[str],
931
+ wallet_environments: WalletTestFramework,
932
+ self_hostname: str,
933
+ ) -> None:
934
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
935
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
936
+ _client_info: WalletClientInfo = WalletClientInfo(
937
+ wallet_rpc,
938
+ wallet_state_manager.root_pubkey.get_fingerprint(),
939
+ wallet_state_manager.config,
940
+ )
941
+ bt = wallet_environments.full_node.bt
942
+
943
+ async with setup_farmer(
944
+ b_tools=bt,
945
+ root_path=wallet_environments.environments[0].node.root_path,
946
+ self_hostname=self_hostname,
947
+ consensus_constants=bt.constants,
948
+ ) as farmer:
949
+ root_path = wallet_environments.environments[0].node.root_path
950
+
951
+ assert farmer.rpc_server and farmer.rpc_server.webserver
952
+ with lock_and_load_config(root_path, "config.yaml") as config:
953
+ config["farmer"]["rpc_port"] = farmer.rpc_server.webserver.listen_port
954
+ save_config(root_path, "config.yaml", config)
955
+ with pytest.raises(CliRpcConnectionError, match="Was not able to get login link"):
956
+ await GetLoginLinkCMD(
957
+ context=ChiaCliContext(root_path=root_path),
958
+ launcher_id=bytes32(32 * b"0"),
959
+ ).run()
960
+
8
961
 
9
- from chia.cmds.plotnft import create_cmd, show_cmd
962
+ @pytest.mark.anyio
963
+ async def test_plotnft_cli_misc(mocker: MockerFixture, consensus_mode: ConsensusMode) -> None:
964
+ from chia.cmds.plotnft_funcs import create
10
965
 
11
- pytestmark = pytest.mark.skip("TODO: Works locally but fails on CI, needs to be fixed!")
966
+ test_rpc_client = TestWalletRpcClient()
12
967
 
968
+ with pytest.raises(CliRpcConnectionError, match="Pool URLs must be HTTPS on mainnet"):
969
+ await create(
970
+ wallet_info=WalletClientInfo(
971
+ client=cast(WalletRpcClient, test_rpc_client),
972
+ fingerprint=0,
973
+ config={"selected_network": "mainnet"},
974
+ ),
975
+ pool_url="http://pool.example.com",
976
+ state="FARMING_TO_POOL",
977
+ fee=uint64(0),
978
+ prompt=False,
979
+ )
13
980
 
14
- class TestPoolNFTCommands:
15
- def test_plotnft_show(self):
16
- runner = CliRunner()
17
- result = runner.invoke(show_cmd, [], catch_exceptions=False)
18
- assert result.exit_code == 0
981
+ with pytest.raises(ValueError, match="Plot NFT must be created in SELF_POOLING or FARMING_TO_POOL state"):
982
+ await create(
983
+ wallet_info=WalletClientInfo(client=cast(WalletRpcClient, test_rpc_client), fingerprint=0, config=dict()),
984
+ pool_url=None,
985
+ state="Invalid State",
986
+ fee=uint64(0),
987
+ prompt=False,
988
+ )
19
989
 
20
- def test_validate_fee_cmdline(self):
21
- runner = CliRunner()
22
- result = runner.invoke(create_cmd, ["create", "-s", "local", "--fee", "0.005"], catch_exceptions=False)
23
- assert result.exit_code != 0
990
+ # Test fall-through raise in create
991
+ mocker.patch.object(
992
+ test_rpc_client, "create_new_pool_wallet", create=True, side_effect=ValueError("Injected error")
993
+ )
994
+ with pytest.raises(CliRpcConnectionError, match="Error creating plot NFT: Injected error"):
995
+ await create(
996
+ wallet_info=WalletClientInfo(client=cast(WalletRpcClient, test_rpc_client), fingerprint=0, config=dict()),
997
+ pool_url=None,
998
+ state="SELF_POOLING",
999
+ fee=uint64(0),
1000
+ prompt=False,
1001
+ )