chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
@@ -2,17 +2,18 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import dataclasses
5
+ import io
5
6
  import json
6
7
  import logging
7
8
  import random
8
9
  from operator import attrgetter
9
- from typing import Any, Dict, List, Optional, Tuple, cast
10
+ from typing import Any, Optional, cast
11
+ from unittest.mock import patch
10
12
 
11
13
  import aiosqlite
12
14
  import pytest
13
15
  from chia_rs import G1Element, G2Element
14
16
 
15
- from chia._tests.conftest import ConsensusMode
16
17
  from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
17
18
  from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
18
19
  from chia._tests.wallet.test_wallet_coin_store import (
@@ -41,6 +42,8 @@ from chia._tests.wallet.test_wallet_coin_store import (
41
42
  record_8,
42
43
  record_9,
43
44
  )
45
+ from chia.cmds.coins import CombineCMD, SplitCMD
46
+ from chia.cmds.param_types import CliAmount
44
47
  from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
45
48
  from chia.consensus.coinbase import create_puzzlehash_for_pk
46
49
  from chia.rpc.full_node_rpc_client import FullNodeRpcClient
@@ -55,9 +58,13 @@ from chia.rpc.wallet_request_types import (
55
58
  DIDGetPubkey,
56
59
  GetNotifications,
57
60
  GetPrivateKey,
61
+ GetSyncStatusResponse,
62
+ GetTimestampForHeight,
58
63
  LogIn,
64
+ PushTransactions,
65
+ PushTX,
66
+ SetWalletResyncOnStartup,
59
67
  SplitCoins,
60
- SplitCoinsResponse,
61
68
  VerifySignature,
62
69
  VerifySignatureResponse,
63
70
  )
@@ -139,6 +146,10 @@ class WalletRpcTestEnvironment:
139
146
  full_node: FullNodeBundle
140
147
 
141
148
 
149
+ async def check_client_synced(wallet_client: WalletRpcClient) -> bool:
150
+ return (await wallet_client.get_sync_status()).synced
151
+
152
+
142
153
  async def farm_transaction_block(full_node_api: FullNodeSimulator, wallet_node: WalletNode):
143
154
  await full_node_api.farm_blocks_to_puzzlehash(count=1)
144
155
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
@@ -174,7 +185,7 @@ async def generate_funds(full_node_api: FullNodeSimulator, wallet_bundle: Wallet
174
185
  expected_unconfirmed = initial_balances["unconfirmed_wallet_balance"] + generated_funds
175
186
  await time_out_assert(20, get_confirmed_balance, expected_confirmed, wallet_bundle.rpc_client, wallet_id)
176
187
  await time_out_assert(20, get_unconfirmed_balance, expected_unconfirmed, wallet_bundle.rpc_client, wallet_id)
177
- await time_out_assert(20, wallet_bundle.rpc_client.get_synced)
188
+ await time_out_assert(20, check_client_synced, True, wallet_bundle.rpc_client)
178
189
 
179
190
  return generated_funds
180
191
 
@@ -224,7 +235,7 @@ async def wallet_rpc_environment(two_wallet_nodes_services, request, self_hostna
224
235
  yield WalletRpcTestEnvironment(wallet_bundle_1, wallet_bundle_2, node_bundle)
225
236
 
226
237
 
227
- async def create_tx_outputs(wallet: Wallet, output_args: List[Tuple[int, Optional[List[str]]]]) -> List[Dict[str, Any]]:
238
+ async def create_tx_outputs(wallet: Wallet, output_args: list[tuple[int, Optional[list[str]]]]) -> list[dict[str, Any]]:
228
239
  outputs = []
229
240
  for args in output_args:
230
241
  output = {"amount": uint64(args[0]), "puzzle_hash": await wallet.get_new_puzzlehash()}
@@ -235,7 +246,7 @@ async def create_tx_outputs(wallet: Wallet, output_args: List[Tuple[int, Optiona
235
246
  return outputs
236
247
 
237
248
 
238
- async def assert_wallet_types(client: WalletRpcClient, expected: Dict[WalletType, int]) -> None:
249
+ async def assert_wallet_types(client: WalletRpcClient, expected: dict[WalletType, int]) -> None:
239
250
  for wallet_type in WalletType:
240
251
  wallets = await client.get_wallets(wallet_type)
241
252
  wallet_count = len(wallets)
@@ -247,7 +258,7 @@ async def assert_wallet_types(client: WalletRpcClient, expected: Dict[WalletType
247
258
 
248
259
  def assert_tx_amounts(
249
260
  tx: TransactionRecord,
250
- outputs: List[Dict[str, Any]],
261
+ outputs: list[dict[str, Any]],
251
262
  *,
252
263
  amount_fee: uint64,
253
264
  change_expected: bool,
@@ -274,7 +285,7 @@ async def assert_push_tx_error(node_rpc: FullNodeRpcClient, tx: TransactionRecor
274
285
  try:
275
286
  await node_rpc.push_tx(spend_bundle)
276
287
  except ValueError as error:
277
- error_string = error.args[0]["error"] # noqa: # pylint: disable=E1126
288
+ error_string = error.args[0]["error"]
278
289
  if error_string.find("ASSERT_ANNOUNCE_CONSUMED_FAILED") == -1:
279
290
  raise ValueError from error
280
291
 
@@ -322,7 +333,7 @@ async def test_send_transaction(wallet_rpc_environment: WalletRpcTestEnvironment
322
333
 
323
334
  # Tests sending a basic transaction
324
335
  extra_conditions = (Remark(Program.to(("test", None))),)
325
- non_existent_coin = Coin(bytes32([0] * 32), bytes32([0] * 32), uint64(0))
336
+ non_existent_coin = Coin(bytes32.zeros, bytes32.zeros, uint64(0))
326
337
  tx_no_push = (
327
338
  await client.send_transaction(
328
339
  1,
@@ -379,7 +390,7 @@ async def test_send_transaction(wallet_rpc_environment: WalletRpcTestEnvironment
379
390
  assert tx_confirmed.confirmed
380
391
  assert len(tx_confirmed.get_memos()) == 1
381
392
  assert [b"this is a basic tx"] in tx_confirmed.get_memos().values()
382
- assert list(tx_confirmed.get_memos().keys())[0] in [a.name() for a in spend_bundle.additions()]
393
+ assert next(iter(tx_confirmed.get_memos().keys())) in [a.name() for a in spend_bundle.additions()]
383
394
 
384
395
  await time_out_assert(20, get_confirmed_balance, generated_funds - tx_amount, client, 1)
385
396
 
@@ -405,29 +416,30 @@ async def test_push_transactions(wallet_rpc_environment: WalletRpcTestEnvironmen
405
416
  )
406
417
  ).signed_tx
407
418
 
408
- resp_client = await client.push_transactions([tx], fee=uint64(10))
419
+ resp_client = await client.push_transactions(
420
+ PushTransactions(transactions=[tx], fee=uint64(10)),
421
+ DEFAULT_TX_CONFIG,
422
+ )
409
423
  resp = await client.fetch(
410
424
  "push_transactions", {"transactions": [tx.to_json_dict_convenience(wallet_node.config)], "fee": 10}
411
425
  )
412
426
  assert resp["success"]
413
- resp = await client.fetch("push_transactions", {"transactions": [tx.to_json_dict()], "fee": 10})
427
+ resp = await client.fetch("push_transactions", {"transactions": [bytes(tx).hex()], "fee": 10})
414
428
  assert resp["success"]
415
429
 
416
430
  spend_bundle = WalletSpendBundle.aggregate(
417
- [
418
- # We ARE checking that the spend bundle is not None but mypy can't recognize this
419
- TransactionRecord.from_json_dict_convenience(tx).spend_bundle # type: ignore[type-var]
420
- for tx in resp_client["transactions"]
421
- if tx["spend_bundle"] is not None
422
- ]
431
+ [tx.spend_bundle for tx in resp_client.transactions if tx.spend_bundle is not None]
423
432
  )
424
433
  assert spend_bundle is not None
425
434
  await farm_transaction(full_node_api, wallet_node, spend_bundle)
426
435
 
427
- for tx_json in resp_client["transactions"]:
428
- tx = TransactionRecord.from_json_dict_convenience(tx_json)
429
- tx = await client.get_transaction(transaction_id=tx.name)
430
- assert tx.confirmed
436
+ for tx in resp_client.transactions:
437
+ assert (await client.get_transaction(transaction_id=tx.name)).confirmed
438
+
439
+ # Just testing NOT failure here really (parsing)
440
+ await client.push_tx(PushTX(spend_bundle))
441
+ resp = await client.fetch("push_tx", {"spend_bundle": bytes(spend_bundle).hex()})
442
+ assert resp["success"]
431
443
 
432
444
 
433
445
  @pytest.mark.anyio
@@ -461,7 +473,9 @@ async def test_get_farmed_amount(wallet_rpc_environment: WalletRpcTestEnvironmen
461
473
  await full_node_api.farm_blocks_to_wallet(2, wallet)
462
474
 
463
475
  get_farmed_amount_result = await wallet_rpc_client.get_farmed_amount()
464
- get_timestamp_for_height_result = await wallet_rpc_client.get_timestamp_for_height(uint32(3)) # genesis + 2
476
+ get_timestamp_for_height_result = await wallet_rpc_client.get_timestamp_for_height(
477
+ GetTimestampForHeight(uint32(3))
478
+ ) # genesis + 2
465
479
 
466
480
  expected_result = {
467
481
  "blocks_won": 2,
@@ -469,7 +483,7 @@ async def test_get_farmed_amount(wallet_rpc_environment: WalletRpcTestEnvironmen
469
483
  "farmer_reward_amount": 500_000_000_000,
470
484
  "fee_amount": 0,
471
485
  "last_height_farmed": 3,
472
- "last_time_farmed": get_timestamp_for_height_result,
486
+ "last_time_farmed": get_timestamp_for_height_result.timestamp,
473
487
  "pool_reward_amount": 3_500_000_000_000,
474
488
  "success": True,
475
489
  }
@@ -490,7 +504,7 @@ async def test_get_farmed_amount_with_fee(wallet_rpc_environment: WalletRpcTestE
490
504
  async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
491
505
  await wallet.generate_signed_transaction(
492
506
  amount=uint64(5),
493
- puzzle_hash=bytes32([0] * 32),
507
+ puzzle_hash=bytes32.zeros,
494
508
  action_scope=action_scope,
495
509
  fee=uint64(fee_amount),
496
510
  )
@@ -513,8 +527,8 @@ async def test_get_timestamp_for_height(wallet_rpc_environment: WalletRpcTestEnv
513
527
 
514
528
  await generate_funds(full_node_api, env.wallet_1)
515
529
 
516
- # This tests that the client returns a uint64, rather than raising or returning something unexpected
517
- uint64(await client.get_timestamp_for_height(uint32(1)))
530
+ # This tests that the client returns successfully, rather than raising or returning something unexpected
531
+ await client.get_timestamp_for_height(GetTimestampForHeight(uint32(1)))
518
532
 
519
533
 
520
534
  @pytest.mark.parametrize(
@@ -536,7 +550,7 @@ async def test_get_timestamp_for_height(wallet_rpc_environment: WalletRpcTestEnv
536
550
  @pytest.mark.anyio
537
551
  async def test_create_signed_transaction(
538
552
  wallet_rpc_environment: WalletRpcTestEnvironment,
539
- output_args: List[Tuple[int, Optional[List[str]]]],
553
+ output_args: list[tuple[int, Optional[list[str]]]],
540
554
  fee: int,
541
555
  select_coin: bool,
542
556
  is_cat: bool,
@@ -604,7 +618,7 @@ async def test_create_signed_transaction(
604
618
  await time_out_assert(20, get_confirmed_balance, generated_funds - amount_total, wallet_1_rpc, wallet_id)
605
619
 
606
620
  # Assert every coin comes from the same parent
607
- additions: List[Coin] = spend_bundle.additions()
621
+ additions: list[Coin] = spend_bundle.additions()
608
622
  assert len({c.parent_coin_info for c in additions}) == 2 if is_cat else 1
609
623
 
610
624
  # Assert you can get the spend for each addition
@@ -617,8 +631,8 @@ async def test_create_signed_transaction(
617
631
  assert spend is not None
618
632
 
619
633
  # Assert the memos are all correct
620
- addition_dict: Dict[bytes32, Coin] = {addition.name(): addition for addition in additions}
621
- memo_dictionary: Dict[bytes32, List[bytes]] = compute_memos(spend_bundle)
634
+ addition_dict: dict[bytes32, Coin] = {addition.name(): addition for addition in additions}
635
+ memo_dictionary: dict[bytes32, list[bytes]] = compute_memos(spend_bundle)
622
636
  for output in outputs:
623
637
  if "memos" in output:
624
638
  found: bool = False
@@ -1044,7 +1058,7 @@ async def test_cat_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment):
1044
1058
 
1045
1059
  # Creates a CAT wallet with 100 mojos and a CAT with 20 mojos and fee=10
1046
1060
  await client.create_new_cat_and_wallet(uint64(100), fee=uint64(10), test=True)
1047
- await time_out_assert(20, client.get_synced)
1061
+ await time_out_assert(20, check_client_synced, True, client)
1048
1062
 
1049
1063
  res = await client.create_new_cat_and_wallet(uint64(20), test=True)
1050
1064
  assert res["success"]
@@ -1068,7 +1082,7 @@ async def test_cat_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment):
1068
1082
  wid, name = result
1069
1083
  assert wid == cat_0_id
1070
1084
  assert name == "My cat"
1071
- result = await client.cat_asset_id_to_name(bytes32([0] * 32))
1085
+ result = await client.cat_asset_id_to_name(bytes32.zeros)
1072
1086
  assert result is None
1073
1087
  verified_asset_id = next(iter(DEFAULT_CATS.items()))[1]["asset_id"]
1074
1088
  result = await client.cat_asset_id_to_name(bytes32.from_hexstr(verified_asset_id))
@@ -1119,7 +1133,7 @@ async def test_cat_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment):
1119
1133
  cat_0_id,
1120
1134
  DEFAULT_TX_CONFIG.override(
1121
1135
  excluded_coin_amounts=[uint64(20)],
1122
- excluded_coin_ids=[bytes32([0] * 32)],
1136
+ excluded_coin_ids=[bytes32.zeros],
1123
1137
  ),
1124
1138
  uint64(4),
1125
1139
  addr_1,
@@ -1217,7 +1231,7 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
1217
1231
  assert spend_bundle is not None
1218
1232
  await farm_transaction(full_node_api, wallet_node, spend_bundle)
1219
1233
  await time_out_assert(5, get_confirmed_balance, 4, wallet_2_rpc, cat_wallet_id)
1220
- test_crs: List[CoinRecord] = await wallet_1_rpc.get_coin_records_by_names(
1234
+ test_crs: list[CoinRecord] = await wallet_1_rpc.get_coin_records_by_names(
1221
1235
  [a.name() for a in spend_bundle.additions() if a.amount != 4]
1222
1236
  )
1223
1237
  for cr in test_crs:
@@ -1231,7 +1245,7 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
1231
1245
  all_offers = await wallet_1_rpc.get_all_offers()
1232
1246
  assert len(all_offers) == 0
1233
1247
 
1234
- driver_dict: Dict[str, Any] = {cat_asset_id.hex(): {"type": "CAT", "tail": "0x" + cat_asset_id.hex()}}
1248
+ driver_dict: dict[str, Any] = {cat_asset_id.hex(): {"type": "CAT", "tail": "0x" + cat_asset_id.hex()}}
1235
1249
 
1236
1250
  create_res = await wallet_1_rpc.create_offer_for_ids(
1237
1251
  {uint32(1): -5, cat_asset_id.hex(): 1},
@@ -1261,7 +1275,7 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
1261
1275
  }
1262
1276
  assert advanced_summary == summary
1263
1277
 
1264
- id, valid = await wallet_1_rpc.check_offer_validity(offer)
1278
+ id, _valid = await wallet_1_rpc.check_offer_validity(offer)
1265
1279
  assert id == offer.name()
1266
1280
 
1267
1281
  all_offers = await wallet_1_rpc.get_all_offers(file_contents=True)
@@ -1412,7 +1426,7 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
1412
1426
  driver_dict=driver_dict,
1413
1427
  )
1414
1428
  assert len([o for o in await wallet_1_rpc.get_all_offers() if o.status == TradeStatus.PENDING_ACCEPT.value]) == 1
1415
- await wallet_1_rpc.cancel_offers(DEFAULT_TX_CONFIG, asset_id=bytes32([0] * 32))
1429
+ await wallet_1_rpc.cancel_offers(DEFAULT_TX_CONFIG, asset_id=bytes32.zeros)
1416
1430
  assert len([o for o in await wallet_1_rpc.get_all_offers() if o.status == TradeStatus.PENDING_ACCEPT.value]) == 1
1417
1431
  await wallet_1_rpc.cancel_offers(DEFAULT_TX_CONFIG, asset_id=cat_asset_id)
1418
1432
  assert len([o for o in await wallet_1_rpc.get_all_offers() if o.status == TradeStatus.PENDING_ACCEPT.value]) == 0
@@ -1748,7 +1762,7 @@ async def test_key_and_address_endpoints(wallet_rpc_environment: WalletRpcTestEn
1748
1762
 
1749
1763
  await generate_funds(env.full_node.api, env.wallet_1)
1750
1764
 
1751
- assert (await client.get_height_info()) > 0
1765
+ assert (await client.get_height_info()).height > 0
1752
1766
 
1753
1767
  ph = await wallet.get_new_puzzlehash()
1754
1768
  addr = encode_puzzle_hash(ph, "txch")
@@ -1810,7 +1824,7 @@ async def test_key_and_address_endpoints(wallet_rpc_environment: WalletRpcTestEn
1810
1824
  await client.log_in(LogIn(uint32(pks[1])))
1811
1825
  assert len((await client.get_public_keys()).pk_fingerprints) == 1
1812
1826
 
1813
- assert not (await client.get_sync_status())
1827
+ assert not (await client.get_sync_status()).synced
1814
1828
 
1815
1829
  wallets = await client.get_wallets()
1816
1830
  assert len(wallets) == 1
@@ -1837,8 +1851,8 @@ async def test_select_coins_rpc(wallet_rpc_environment: WalletRpcTestEnvironment
1837
1851
  funds = await generate_funds(full_node_api, env.wallet_1)
1838
1852
 
1839
1853
  addr = encode_puzzle_hash(await wallet_2.get_new_puzzlehash(), "txch")
1840
- coin_300: List[Coin]
1841
- tx_amounts: List[uint64] = [uint64(1000), uint64(300), uint64(1000), uint64(1000), uint64(10000)]
1854
+ coin_300: list[Coin]
1855
+ tx_amounts: list[uint64] = [uint64(1000), uint64(300), uint64(1000), uint64(1000), uint64(10000)]
1842
1856
  for tx_amount in tx_amounts:
1843
1857
  funds -= tx_amount
1844
1858
  # create coins for tests
@@ -1854,7 +1868,7 @@ async def test_select_coins_rpc(wallet_rpc_environment: WalletRpcTestEnvironment
1854
1868
  await time_out_assert(20, get_confirmed_balance, funds, client, 1)
1855
1869
 
1856
1870
  # test min coin amount
1857
- min_coins: List[Coin] = await client_2.select_coins(
1871
+ min_coins: list[Coin] = await client_2.select_coins(
1858
1872
  amount=1000,
1859
1873
  wallet_id=1,
1860
1874
  coin_selection_config=DEFAULT_COIN_SELECTION_CONFIG.override(min_coin_amount=uint64(1001)),
@@ -1863,7 +1877,7 @@ async def test_select_coins_rpc(wallet_rpc_environment: WalletRpcTestEnvironment
1863
1877
  assert len(min_coins) == 1 and min_coins[0].amount == uint64(10000)
1864
1878
 
1865
1879
  # test max coin amount
1866
- max_coins: List[Coin] = await client_2.select_coins(
1880
+ max_coins: list[Coin] = await client_2.select_coins(
1867
1881
  amount=2000,
1868
1882
  wallet_id=1,
1869
1883
  coin_selection_config=DEFAULT_COIN_SELECTION_CONFIG.override(
@@ -1875,7 +1889,7 @@ async def test_select_coins_rpc(wallet_rpc_environment: WalletRpcTestEnvironment
1875
1889
 
1876
1890
  # test excluded coin amounts
1877
1891
  non_1000_amt: int = sum(a for a in tx_amounts if a != 1000)
1878
- excluded_amt_coins: List[Coin] = await client_2.select_coins(
1892
+ excluded_amt_coins: list[Coin] = await client_2.select_coins(
1879
1893
  amount=non_1000_amt,
1880
1894
  wallet_id=1,
1881
1895
  coin_selection_config=DEFAULT_COIN_SELECTION_CONFIG.override(excluded_coin_amounts=[uint64(1000)]),
@@ -1958,7 +1972,7 @@ async def test_get_coin_records_rpc(wallet_rpc_environment: WalletRpcTestEnviron
1958
1972
  test_case: str,
1959
1973
  test_request: GetCoinRecords,
1960
1974
  test_total_count: Optional[int],
1961
- test_records: List[WalletCoinRecord],
1975
+ test_records: list[WalletCoinRecord],
1962
1976
  ):
1963
1977
  response = await client.get_coin_records(test_request)
1964
1978
  assert response["coin_records"] == [coin.to_json_dict_parsed_metadata() for coin in test_records], test_case
@@ -2089,7 +2103,7 @@ async def test_get_coin_records_rpc_failures(
2089
2103
  with pytest.raises(ValueError, match=name):
2090
2104
  await client.get_coin_records(request)
2091
2105
 
2092
- # Type validation is handled via `Streamable.from_json_dict´ but the below should make at least sure it triggers.
2106
+ # Type validation is handled via `Streamable.from_json_dict` but the below should make at least sure it triggers.
2093
2107
  for field, value in {
2094
2108
  "offset": "invalid",
2095
2109
  "limit": "invalid",
@@ -2319,8 +2333,8 @@ async def test_notification_rpcs(wallet_rpc_environment: WalletRpcTestEnvironmen
2319
2333
  @pytest.mark.limit_consensus_modes(reason="irrelevant")
2320
2334
  async def test_verify_signature(
2321
2335
  wallet_rpc_environment: WalletRpcTestEnvironment,
2322
- rpc_request: Dict[str, Any],
2323
- rpc_response: Dict[str, Any],
2336
+ rpc_request: dict[str, Any],
2337
+ rpc_response: dict[str, Any],
2324
2338
  prefix_hex_strings: bool,
2325
2339
  ):
2326
2340
  rpc_server: Optional[RpcServer] = wallet_rpc_environment.wallet_1.service.rpc_server
@@ -2386,7 +2400,7 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
2386
2400
  await wc.create_new_did_wallet(1, DEFAULT_TX_CONFIG, 0)
2387
2401
  await time_out_assert(5, check_mempool_spend_count, True, full_node_api, 1)
2388
2402
  await farm_transaction_block(full_node_api, env.wallet_1.node)
2389
- await time_out_assert(20, wc.get_synced)
2403
+ await time_out_assert(20, check_client_synced, True, wc)
2390
2404
 
2391
2405
  nft_wallet = await wc.create_new_nft_wallet(None)
2392
2406
  nft_wallet_id = nft_wallet["wallet_id"]
@@ -2401,7 +2415,7 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
2401
2415
  )
2402
2416
  await time_out_assert(5, check_mempool_spend_count, True, full_node_api, 1)
2403
2417
  await farm_transaction_block(full_node_api, env.wallet_1.node)
2404
- await time_out_assert(20, wc.get_synced)
2418
+ await time_out_assert(20, check_client_synced, True, wc)
2405
2419
 
2406
2420
  wallet_node: WalletNode = env.wallet_1.node
2407
2421
  wallet_node_2: WalletNode = env.wallet_2.node
@@ -2419,7 +2433,7 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
2419
2433
  clawback_coin_id = tx.additions[0].name()
2420
2434
  assert tx.spend_bundle is not None
2421
2435
  await farm_transaction(full_node_api, wallet_node, tx.spend_bundle)
2422
- await time_out_assert(20, wc.get_synced)
2436
+ await time_out_assert(20, check_client_synced, True, wc)
2423
2437
  await asyncio.sleep(10)
2424
2438
  resp = await wc.spend_clawback_coins([clawback_coin_id], 0)
2425
2439
  assert resp["success"]
@@ -2428,11 +2442,11 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
2428
2442
  10, full_node_api.full_node.mempool_manager.get_spendbundle, bytes32.from_hexstr(resp["transaction_ids"][0])
2429
2443
  )
2430
2444
  await farm_transaction_block(full_node_api, wallet_node)
2431
- await time_out_assert(20, wc.get_synced)
2445
+ await time_out_assert(20, check_client_synced, True, wc)
2432
2446
  wallet_node_2._close()
2433
2447
  await wallet_node_2._await_closed()
2434
2448
  # set flag to reset wallet sync data on start
2435
- await client.set_wallet_resync_on_startup()
2449
+ await client.set_wallet_resync_on_startup(SetWalletResyncOnStartup())
2436
2450
  fingerprint = wallet_node.logged_in_fingerprint
2437
2451
  assert wallet_node._wallet_state_manager
2438
2452
  # 2 reward coins, 1 DID, 1 NFT, 1 clawbacked coin
@@ -2484,12 +2498,12 @@ async def test_set_wallet_resync_on_startup_disable(wallet_rpc_environment: Wall
2484
2498
  wallet_node_2._close()
2485
2499
  await wallet_node_2._await_closed()
2486
2500
  # set flag to reset wallet sync data on start
2487
- await client.set_wallet_resync_on_startup()
2501
+ await client.set_wallet_resync_on_startup(SetWalletResyncOnStartup())
2488
2502
  fingerprint = wallet_node.logged_in_fingerprint
2489
2503
  assert wallet_node._wallet_state_manager
2490
2504
  assert len(await wallet_node._wallet_state_manager.coin_store.get_all_unspent_coins()) == 2
2491
2505
  before_txs = await wallet_node.wallet_state_manager.tx_store.get_all_transactions()
2492
- await client.set_wallet_resync_on_startup(False)
2506
+ await client.set_wallet_resync_on_startup(SetWalletResyncOnStartup(False))
2493
2507
  wallet_node._close()
2494
2508
  await wallet_node._await_closed()
2495
2509
  config = load_config(wallet_node.root_path, "config.yaml")
@@ -2625,16 +2639,16 @@ async def test_get_balances(wallet_rpc_environment: WalletRpcTestEnvironment):
2625
2639
 
2626
2640
  await generate_funds(full_node_api, env.wallet_1, 1)
2627
2641
 
2628
- await time_out_assert(20, client.get_synced)
2642
+ await time_out_assert(20, check_client_synced, True, client)
2629
2643
  # Creates a CAT wallet with 100 mojos and a CAT with 20 mojos
2630
2644
  await client.create_new_cat_and_wallet(uint64(100), test=True)
2631
2645
 
2632
- await time_out_assert(20, client.get_synced)
2646
+ await time_out_assert(20, check_client_synced, True, client)
2633
2647
  res = await client.create_new_cat_and_wallet(uint64(20), test=True)
2634
2648
  assert res["success"]
2635
2649
  await time_out_assert(5, check_mempool_spend_count, True, full_node_api, 2)
2636
2650
  await farm_transaction_block(full_node_api, wallet_node)
2637
- await time_out_assert(20, client.get_synced)
2651
+ await time_out_assert(20, check_client_synced, True, client)
2638
2652
  bal = await client.get_wallet_balances()
2639
2653
  assert len(bal) == 3
2640
2654
  assert bal["1"]["confirmed_wallet_balance"] == 1999999999880
@@ -2656,9 +2670,9 @@ async def test_get_balances(wallet_rpc_environment: WalletRpcTestEnvironment):
2656
2670
  ],
2657
2671
  indirect=True,
2658
2672
  )
2659
- @pytest.mark.limit_consensus_modes([ConsensusMode.PLAIN], reason="irrelevant")
2673
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
2660
2674
  @pytest.mark.anyio
2661
- async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
2675
+ async def test_split_coins(wallet_environments: WalletTestFramework, capsys: pytest.CaptureFixture[str]) -> None:
2662
2676
  env = wallet_environments.environments[0]
2663
2677
  env.wallet_aliases = {
2664
2678
  "xch": 1,
@@ -2667,60 +2681,62 @@ async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
2667
2681
 
2668
2682
  # Test XCH first
2669
2683
  async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config) as action_scope:
2670
- target_coin = list(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope))[0]
2684
+ target_coin = next(iter(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope)))
2671
2685
  assert target_coin.amount == 250_000_000_000
2672
2686
 
2673
- xch_request = SplitCoins(
2674
- wallet_id=uint32(1),
2675
- number_of_coins=uint16(100),
2676
- amount_per_coin=uint64(100),
2677
- target_coin_id=target_coin.name(),
2678
- fee=uint64(1_000_000_000_000), # 1 XCH
2679
- push=True,
2687
+ xch_request = SplitCMD(
2688
+ **{
2689
+ **wallet_environments.cmd_tx_endpoint_args(env),
2690
+ **dict(
2691
+ id=env.wallet_aliases["xch"],
2692
+ number_of_coins=100,
2693
+ amount_per_coin=CliAmount(amount=uint64(100), mojos=True),
2694
+ target_coin_id=target_coin.name(),
2695
+ fee=uint64(1_000_000_000_000), # 1 XCH
2696
+ push=True,
2697
+ ),
2698
+ }
2680
2699
  )
2681
2700
 
2682
2701
  with pytest.raises(ResponseFailureError, match="501 coins is greater then the maximum limit of 500 coins"):
2683
- await env.rpc_client.split_coins(
2684
- dataclasses.replace(xch_request, number_of_coins=uint16(501)),
2685
- wallet_environments.tx_config,
2686
- )
2702
+ await dataclasses.replace(xch_request, number_of_coins=501).run()
2687
2703
 
2688
2704
  with pytest.raises(ResponseFailureError, match="Could not find coin with ID 00000000000000000"):
2689
- await env.rpc_client.split_coins(
2690
- dataclasses.replace(xch_request, target_coin_id=bytes32([0] * 32)),
2691
- wallet_environments.tx_config,
2692
- )
2705
+ await dataclasses.replace(xch_request, target_coin_id=bytes32.zeros).run()
2693
2706
 
2694
2707
  with pytest.raises(ResponseFailureError, match="is less than the total amount of the split"):
2695
- await env.rpc_client.split_coins(
2696
- dataclasses.replace(xch_request, amount_per_coin=uint64(1_000_000_000_000)),
2697
- wallet_environments.tx_config,
2698
- )
2708
+ await dataclasses.replace(
2709
+ xch_request, amount_per_coin=CliAmount(amount=uint64(1_000_000_000_000), mojos=True)
2710
+ ).run()
2699
2711
 
2700
- with pytest.raises(ResponseFailureError, match="Wallet with ID 42 does not exist"):
2701
- await env.rpc_client.split_coins(
2702
- dataclasses.replace(xch_request, wallet_id=uint32(42)),
2703
- wallet_environments.tx_config,
2704
- )
2712
+ # We catch this one
2713
+ capsys.readouterr()
2714
+ await dataclasses.replace(xch_request, id=50).run()
2715
+ output = (capsys.readouterr()).out
2716
+ assert "Wallet id: 50 not found" in output
2705
2717
 
2718
+ # This one only "works" on the RPC
2706
2719
  env.wallet_state_manager.wallets[uint32(42)] = object() # type: ignore[assignment]
2707
2720
  with pytest.raises(ResponseFailureError, match="Cannot split coins from non-fungible wallet types"):
2708
- await env.rpc_client.split_coins(
2709
- dataclasses.replace(xch_request, wallet_id=uint32(42)),
2710
- wallet_environments.tx_config,
2721
+ assert xch_request.amount_per_coin is not None # hey there mypy
2722
+ rpc_request = SplitCoins(
2723
+ wallet_id=uint32(42),
2724
+ number_of_coins=uint16(xch_request.number_of_coins),
2725
+ amount_per_coin=xch_request.amount_per_coin.convert_amount(1),
2726
+ target_coin_id=xch_request.target_coin_id,
2727
+ fee=xch_request.fee,
2728
+ push=xch_request.push,
2711
2729
  )
2730
+ await env.rpc_client.split_coins(rpc_request, wallet_environments.tx_config)
2731
+
2712
2732
  del env.wallet_state_manager.wallets[uint32(42)]
2713
2733
 
2714
- response = await env.rpc_client.split_coins(
2715
- dataclasses.replace(xch_request, number_of_coins=uint16(0)),
2716
- wallet_environments.tx_config,
2717
- )
2718
- assert response == SplitCoinsResponse([], [])
2734
+ await dataclasses.replace(xch_request, number_of_coins=0).run()
2735
+ output = (capsys.readouterr()).out
2736
+ assert "Transaction sent" not in output
2719
2737
 
2720
- await env.rpc_client.split_coins(
2721
- xch_request,
2722
- wallet_environments.tx_config,
2723
- )
2738
+ with wallet_environments.new_puzzle_hashes_allowed():
2739
+ await xch_request.run()
2724
2740
 
2725
2741
  await wallet_environments.process_pending_states(
2726
2742
  [
@@ -2775,21 +2791,24 @@ async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
2775
2791
  )
2776
2792
 
2777
2793
  async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config) as action_scope:
2778
- target_coin = list(await cat_wallet.select_coins(uint64(50), action_scope))[0]
2794
+ target_coin = next(iter(await cat_wallet.select_coins(uint64(50), action_scope)))
2779
2795
  assert target_coin.amount == 50
2780
2796
 
2781
- cat_request = SplitCoins(
2782
- wallet_id=uint32(2),
2783
- number_of_coins=uint16(50),
2784
- amount_per_coin=uint64(1),
2785
- target_coin_id=target_coin.name(),
2786
- push=True,
2797
+ cat_request = SplitCMD(
2798
+ **{
2799
+ **wallet_environments.cmd_tx_endpoint_args(env),
2800
+ **dict(
2801
+ id=env.wallet_aliases["cat"],
2802
+ number_of_coins=50,
2803
+ amount_per_coin=CliAmount(amount=uint64(1), mojos=True),
2804
+ target_coin_id=target_coin.name(),
2805
+ push=True,
2806
+ ),
2807
+ }
2787
2808
  )
2788
2809
 
2789
- await env.rpc_client.split_coins(
2790
- cat_request,
2791
- wallet_environments.tx_config,
2792
- )
2810
+ with wallet_environments.new_puzzle_hashes_allowed():
2811
+ await dataclasses.replace(cat_request).run()
2793
2812
 
2794
2813
  await wallet_environments.process_pending_states(
2795
2814
  [
@@ -2817,6 +2836,17 @@ async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
2817
2836
  ]
2818
2837
  )
2819
2838
 
2839
+ # Test a not synced error
2840
+ assert xch_request.rpc_info.client_info is not None
2841
+
2842
+ async def not_synced() -> GetSyncStatusResponse:
2843
+ return GetSyncStatusResponse(False, False)
2844
+
2845
+ xch_request.rpc_info.client_info.client.get_sync_status = not_synced # type: ignore[method-assign]
2846
+ await xch_request.run()
2847
+ output = (capsys.readouterr()).out
2848
+ assert "Wallet not synced. Please wait." in output
2849
+
2820
2850
 
2821
2851
  @pytest.mark.parametrize(
2822
2852
  "wallet_environments",
@@ -2828,9 +2858,9 @@ async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
2828
2858
  ],
2829
2859
  indirect=True,
2830
2860
  )
2831
- @pytest.mark.limit_consensus_modes([ConsensusMode.PLAIN], reason="irrelevant")
2861
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
2832
2862
  @pytest.mark.anyio
2833
- async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
2863
+ async def test_combine_coins(wallet_environments: WalletTestFramework, capsys: pytest.CaptureFixture[str]) -> None:
2834
2864
  env = wallet_environments.environments[0]
2835
2865
  env.wallet_aliases = {
2836
2866
  "xch": 1,
@@ -2841,7 +2871,7 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
2841
2871
 
2842
2872
  # Grab one of the 0.25 ones to specify
2843
2873
  async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config) as action_scope:
2844
- target_coin = list(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope))[0]
2874
+ target_coin = next(iter(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope)))
2845
2875
  assert target_coin.amount == 250_000_000_000
2846
2876
 
2847
2877
  # These parameters will give us the maximum amount of behavior coverage
@@ -2849,53 +2879,55 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
2849
2879
  # - Less amount than will have to be selected in order create it
2850
2880
  # - Higher # coins than necessary to create it
2851
2881
  fee = uint64(100)
2852
- xch_combine_request = CombineCoins(
2853
- wallet_id=uint32(1),
2854
- target_coin_amount=uint64(1_000_000_000_000),
2855
- number_of_coins=uint16(3),
2856
- target_coin_ids=[target_coin.name()],
2857
- fee=fee,
2858
- push=True,
2882
+ xch_combine_request = CombineCMD(
2883
+ **{
2884
+ **wallet_environments.cmd_tx_endpoint_args(env),
2885
+ **dict(
2886
+ id=env.wallet_aliases["xch"],
2887
+ target_amount=CliAmount(amount=uint64(1_000_000_000_000), mojos=True),
2888
+ number_of_coins=uint16(3),
2889
+ input_coins=(target_coin.name(),),
2890
+ fee=fee,
2891
+ push=True,
2892
+ ),
2893
+ }
2859
2894
  )
2860
2895
 
2861
2896
  # Test some error cases first
2862
2897
  with pytest.raises(ResponseFailureError, match="greater then the maximum limit"):
2863
- await env.rpc_client.combine_coins(
2864
- dataclasses.replace(xch_combine_request, number_of_coins=uint16(501)),
2865
- wallet_environments.tx_config,
2866
- )
2898
+ await dataclasses.replace(xch_combine_request, number_of_coins=uint16(501)).run()
2867
2899
 
2868
2900
  with pytest.raises(ResponseFailureError, match="You need at least two coins to combine"):
2869
- await env.rpc_client.combine_coins(
2870
- dataclasses.replace(xch_combine_request, number_of_coins=uint16(0)),
2871
- wallet_environments.tx_config,
2872
- )
2901
+ await dataclasses.replace(xch_combine_request, number_of_coins=uint16(0)).run()
2873
2902
 
2874
2903
  with pytest.raises(ResponseFailureError, match="More coin IDs specified than desired number of coins to combine"):
2875
- await env.rpc_client.combine_coins(
2876
- dataclasses.replace(xch_combine_request, target_coin_ids=[bytes32([0] * 32)] * 100),
2877
- wallet_environments.tx_config,
2878
- )
2904
+ await dataclasses.replace(xch_combine_request, input_coins=(bytes32.zeros,) * 100).run()
2879
2905
 
2880
- with pytest.raises(ResponseFailureError, match="Wallet with ID 50 does not exist"):
2881
- await env.rpc_client.combine_coins(
2882
- dataclasses.replace(xch_combine_request, wallet_id=uint32(50)),
2883
- wallet_environments.tx_config,
2884
- )
2906
+ # We catch this one
2907
+ capsys.readouterr()
2908
+ await dataclasses.replace(xch_combine_request, id=50).run()
2909
+ output = (capsys.readouterr()).out
2910
+ assert "Wallet id: 50 not found" in output
2885
2911
 
2912
+ # This one only "works" on the RPC
2886
2913
  env.wallet_state_manager.wallets[uint32(42)] = object() # type: ignore[assignment]
2887
2914
  with pytest.raises(ResponseFailureError, match="Cannot combine coins from non-fungible wallet types"):
2888
- await env.rpc_client.combine_coins(
2889
- dataclasses.replace(xch_combine_request, wallet_id=uint32(42)),
2890
- wallet_environments.tx_config,
2915
+ assert xch_combine_request.target_amount is not None # hey there mypy
2916
+ rpc_request = CombineCoins(
2917
+ wallet_id=uint32(42),
2918
+ target_coin_amount=xch_combine_request.target_amount.convert_amount(1),
2919
+ number_of_coins=uint16(xch_combine_request.number_of_coins),
2920
+ target_coin_ids=list(xch_combine_request.input_coins),
2921
+ fee=xch_combine_request.fee,
2922
+ push=xch_combine_request.push,
2891
2923
  )
2924
+ await env.rpc_client.combine_coins(rpc_request, wallet_environments.tx_config)
2925
+
2892
2926
  del env.wallet_state_manager.wallets[uint32(42)]
2893
2927
 
2894
2928
  # Now push the request
2895
- await env.rpc_client.combine_coins(
2896
- xch_combine_request,
2897
- wallet_environments.tx_config,
2898
- )
2929
+ with patch("sys.stdin", new=io.StringIO("y\n")):
2930
+ await xch_combine_request.run()
2899
2931
 
2900
2932
  await wallet_environments.process_pending_states(
2901
2933
  [
@@ -2955,7 +2987,7 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
2955
2987
  async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config, push=True) as action_scope:
2956
2988
  await cat_wallet.generate_signed_transaction(
2957
2989
  [BIG_COIN_AMOUNT, SMALL_COIN_AMOUNT, REALLY_SMALL_COIN_AMOUNT],
2958
- [await env.xch_wallet.get_puzzle_hash(new=action_scope.config.tx_config.reuse_puzhash)] * 3,
2990
+ [await env.xch_wallet.get_puzzle_hash(new=not action_scope.config.tx_config.reuse_puzhash)] * 3,
2959
2991
  action_scope,
2960
2992
  )
2961
2993
 
@@ -2976,20 +3008,23 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
2976
3008
  )
2977
3009
 
2978
3010
  # We're going to test that we select the two smaller coins
2979
- cat_combine_request = CombineCoins(
2980
- wallet_id=uint32(2),
2981
- target_coin_amount=None,
2982
- number_of_coins=uint16(2),
2983
- target_coin_ids=[],
2984
- largest_first=False,
2985
- fee=fee,
2986
- push=True,
3011
+ cat_combine_request = CombineCMD(
3012
+ **{
3013
+ **wallet_environments.cmd_tx_endpoint_args(env),
3014
+ **dict(
3015
+ id=env.wallet_aliases["cat"],
3016
+ target_amount=None,
3017
+ number_of_coins=uint16(2),
3018
+ input_coins=(),
3019
+ largest_first=False,
3020
+ fee=fee,
3021
+ push=True,
3022
+ ),
3023
+ }
2987
3024
  )
2988
3025
 
2989
- await env.rpc_client.combine_coins(
2990
- cat_combine_request,
2991
- wallet_environments.tx_config,
2992
- )
3026
+ with patch("sys.stdin", new=io.StringIO("y\n")):
3027
+ await cat_combine_request.run()
2993
3028
 
2994
3029
  await wallet_environments.process_pending_states(
2995
3030
  [
@@ -3023,6 +3058,17 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
3023
3058
  ]
3024
3059
  )
3025
3060
 
3061
+ # Test a not synced error
3062
+ assert xch_combine_request.rpc_info.client_info is not None
3063
+
3064
+ async def not_synced() -> GetSyncStatusResponse:
3065
+ return GetSyncStatusResponse(False, False)
3066
+
3067
+ xch_combine_request.rpc_info.client_info.client.get_sync_status = not_synced # type: ignore[method-assign]
3068
+ await xch_combine_request.run()
3069
+ output = (capsys.readouterr()).out
3070
+ assert "Wallet not synced. Please wait." in output
3071
+
3026
3072
 
3027
3073
  @pytest.mark.parametrize(
3028
3074
  "wallet_environments",
@@ -3053,31 +3099,32 @@ async def test_fee_bigger_than_selection_coin_combining(wallet_environments: Wal
3053
3099
 
3054
3100
  # Grab one of the 0.25 ones to specify
3055
3101
  async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config) as action_scope:
3056
- target_coin = list(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope))[0]
3102
+ target_coin = next(iter(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope)))
3057
3103
  assert target_coin.amount == 250_000_000_000
3058
3104
 
3059
3105
  fee = uint64(1_750_000_000_000)
3060
3106
  # Under standard circumstances we would select the small coins, but this is not enough to pay the fee
3061
3107
  # Instead, we will grab the big coin first and combine it with one of the smaller coins
3062
- xch_combine_request = CombineCoins(
3063
- wallet_id=uint32(1),
3064
- number_of_coins=uint16(2),
3065
- fee=fee,
3066
- largest_first=False,
3067
- push=True,
3108
+ xch_combine_request = CombineCMD(
3109
+ **{
3110
+ **wallet_environments.cmd_tx_endpoint_args(env),
3111
+ **dict(
3112
+ id=env.wallet_aliases["xch"],
3113
+ number_of_coins=uint16(2),
3114
+ input_coins=(),
3115
+ fee=fee,
3116
+ push=True,
3117
+ largest_first=False,
3118
+ ),
3119
+ }
3068
3120
  )
3069
3121
 
3070
3122
  # First test an error where fee selection causes too many coins to be selected
3071
3123
  with pytest.raises(ResponseFailureError, match="without selecting more coins than specified: 3"):
3072
- await env.rpc_client.combine_coins(
3073
- dataclasses.replace(xch_combine_request, fee=uint64(2_250_000_000_000)),
3074
- wallet_environments.tx_config,
3075
- )
3124
+ await dataclasses.replace(xch_combine_request, fee=uint64(2_250_000_000_000)).run()
3076
3125
 
3077
- await env.rpc_client.combine_coins(
3078
- xch_combine_request,
3079
- wallet_environments.tx_config,
3080
- )
3126
+ with patch("sys.stdin", new=io.StringIO("y\n")):
3127
+ await xch_combine_request.run()
3081
3128
 
3082
3129
  await wallet_environments.process_pending_states(
3083
3130
  [