chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_build_chains.py +2 -4
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  7. chia/_tests/clvm/coin_store.py +4 -7
  8. chia/_tests/clvm/test_clvm_step.py +4 -4
  9. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  10. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  11. chia/_tests/clvm/test_singletons.py +2 -4
  12. chia/_tests/clvm/test_spend_sim.py +2 -2
  13. chia/_tests/cmds/cmd_test_utils.py +27 -45
  14. chia/_tests/cmds/test_cmd_framework.py +6 -6
  15. chia/_tests/cmds/test_daemon.py +3 -3
  16. chia/_tests/cmds/test_show.py +4 -4
  17. chia/_tests/cmds/test_tx_config_args.py +1 -2
  18. chia/_tests/cmds/testing_classes.py +4 -5
  19. chia/_tests/cmds/wallet/test_did.py +24 -27
  20. chia/_tests/cmds/wallet/test_nft.py +12 -10
  21. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  22. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  23. chia/_tests/conftest.py +59 -30
  24. chia/_tests/connection_utils.py +2 -2
  25. chia/_tests/core/cmds/test_beta.py +4 -4
  26. chia/_tests/core/cmds/test_keys.py +2 -3
  27. chia/_tests/core/cmds/test_wallet.py +15 -15
  28. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  29. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  30. chia/_tests/core/daemon/test_daemon.py +11 -11
  31. chia/_tests/core/data_layer/conftest.py +2 -2
  32. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  33. chia/_tests/core/data_layer/test_data_store.py +10 -10
  34. chia/_tests/core/data_layer/util.py +11 -11
  35. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  36. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  37. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  38. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  39. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  40. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  41. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  42. chia/_tests/core/full_node/test_conditions.py +21 -23
  43. chia/_tests/core/full_node/test_full_node.py +225 -62
  44. chia/_tests/core/full_node/test_hint_management.py +2 -4
  45. chia/_tests/core/full_node/test_performance.py +0 -1
  46. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  47. chia/_tests/core/full_node/test_transactions.py +1 -2
  48. chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
  49. chia/_tests/core/mempool/test_mempool.py +29 -37
  50. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  51. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  52. chia/_tests/core/mempool/test_mempool_manager.py +963 -839
  53. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  54. chia/_tests/core/server/serve.py +7 -7
  55. chia/_tests/core/server/test_dos.py +1 -2
  56. chia/_tests/core/server/test_event_loop.py +12 -4
  57. chia/_tests/core/server/test_loop.py +7 -8
  58. chia/_tests/core/server/test_rate_limits.py +9 -8
  59. chia/_tests/core/server/test_server.py +61 -1
  60. chia/_tests/core/services/test_services.py +2 -2
  61. chia/_tests/core/ssl/test_ssl.py +2 -2
  62. chia/_tests/core/test_cost_calculation.py +2 -6
  63. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  64. chia/_tests/core/test_filter.py +0 -1
  65. chia/_tests/core/test_full_node_rpc.py +2 -2
  66. chia/_tests/core/test_merkle_set.py +1 -2
  67. chia/_tests/core/test_seeder.py +4 -4
  68. chia/_tests/core/util/test_config.py +4 -4
  69. chia/_tests/core/util/test_jsonify.py +2 -2
  70. chia/_tests/core/util/test_keychain.py +3 -3
  71. chia/_tests/core/util/test_lockfile.py +2 -1
  72. chia/_tests/core/util/test_log_exceptions.py +1 -2
  73. chia/_tests/core/util/test_streamable.py +17 -17
  74. chia/_tests/db/test_db_wrapper.py +3 -2
  75. chia/_tests/environments/wallet.py +14 -14
  76. chia/_tests/ether.py +4 -3
  77. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  78. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  79. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  80. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  81. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  82. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  83. chia/_tests/harvester/test_harvester_api.py +11 -4
  84. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  85. chia/_tests/plot_sync/test_receiver.py +11 -10
  86. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  87. chia/_tests/plot_sync/util.py +1 -2
  88. chia/_tests/plotting/test_plot_manager.py +7 -6
  89. chia/_tests/plotting/test_prover.py +30 -38
  90. chia/_tests/pools/test_pool_cmdline.py +4 -6
  91. chia/_tests/pools/test_pool_rpc.py +203 -61
  92. chia/_tests/pools/test_pool_wallet.py +3 -3
  93. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  94. chia/_tests/process_junit.py +2 -2
  95. chia/_tests/rpc/test_rpc_client.py +4 -4
  96. chia/_tests/rpc/test_rpc_server.py +3 -3
  97. chia/_tests/simulation/test_simulation.py +12 -25
  98. chia/_tests/solver/test_solver_service.py +13 -4
  99. chia/_tests/testconfig.py +2 -2
  100. chia/_tests/timelord/test_new_peak.py +22 -11
  101. chia/_tests/tools/test_run_block.py +0 -2
  102. chia/_tests/tools/test_virtual_project.py +2 -1
  103. chia/_tests/util/benchmarks.py +1 -0
  104. chia/_tests/util/blockchain.py +38 -36
  105. chia/_tests/util/blockchain_mock.py +11 -11
  106. chia/_tests/util/build_network_protocol_files.py +2 -1
  107. chia/_tests/util/coin_store.py +2 -1
  108. chia/_tests/util/config.py +1 -1
  109. chia/_tests/util/db_connection.py +2 -3
  110. chia/_tests/util/full_sync.py +9 -11
  111. chia/_tests/util/gen_ssl_certs.py +4 -5
  112. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  113. chia/_tests/util/misc.py +24 -24
  114. chia/_tests/util/network_protocol_data.py +20 -3
  115. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  116. chia/_tests/util/protocol_messages_json.py +292 -3
  117. chia/_tests/util/setup_nodes.py +62 -47
  118. chia/_tests/util/spend_sim.py +57 -57
  119. chia/_tests/util/test_async_pool.py +2 -3
  120. chia/_tests/util/test_chia_version.py +1 -3
  121. chia/_tests/util/test_config.py +3 -3
  122. chia/_tests/util/test_full_block_utils.py +6 -3
  123. chia/_tests/util/test_limited_semaphore.py +1 -2
  124. chia/_tests/util/test_misc.py +2 -2
  125. chia/_tests/util/test_network.py +1 -2
  126. chia/_tests/util/test_priority_mutex.py +3 -3
  127. chia/_tests/util/test_recursive_replace.py +5 -6
  128. chia/_tests/util/test_replace_str_to_bytes.py +8 -10
  129. chia/_tests/util/test_testnet_overrides.py +3 -3
  130. chia/_tests/util/time_out_assert.py +2 -2
  131. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  132. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  133. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  134. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  135. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  136. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  137. chia/_tests/wallet/conftest.py +6 -6
  138. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  139. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  140. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  141. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  142. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  145. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  146. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  147. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  148. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  149. chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
  150. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  151. chia/_tests/wallet/test_coin_management.py +2 -2
  152. chia/_tests/wallet/test_conditions.py +45 -51
  153. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  154. chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
  155. chia/_tests/wallet/test_notifications.py +14 -14
  156. chia/_tests/wallet/test_signer_protocol.py +5 -5
  157. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  158. chia/_tests/wallet/test_transaction_store.py +20 -20
  159. chia/_tests/wallet/test_util.py +2 -2
  160. chia/_tests/wallet/test_wallet.py +380 -228
  161. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  162. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  163. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  164. chia/_tests/wallet/test_wallet_node.py +14 -14
  165. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  166. chia/_tests/wallet/test_wallet_utils.py +2 -3
  167. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  168. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  169. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  170. chia/_tests/wallet/wallet_block_tools.py +12 -11
  171. chia/_tests/weight_proof/config.py +1 -0
  172. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  173. chia/apis/__init__.py +21 -0
  174. chia/apis/farmer_stub.py +102 -0
  175. chia/apis/full_node_stub.py +372 -0
  176. chia/apis/harvester_stub.py +57 -0
  177. chia/apis/introducer_stub.py +35 -0
  178. chia/apis/solver_stub.py +30 -0
  179. chia/apis/stub_protocol_registry.py +21 -0
  180. chia/apis/timelord_stub.py +39 -0
  181. chia/apis/wallet_stub.py +161 -0
  182. chia/cmds/beta.py +3 -4
  183. chia/cmds/beta_funcs.py +4 -3
  184. chia/cmds/check_wallet_db.py +4 -4
  185. chia/cmds/chia.py +1 -2
  186. chia/cmds/cmd_classes.py +11 -13
  187. chia/cmds/cmd_helpers.py +11 -11
  188. chia/cmds/cmds_util.py +15 -15
  189. chia/cmds/coin_funcs.py +6 -7
  190. chia/cmds/coins.py +2 -3
  191. chia/cmds/configure.py +1 -2
  192. chia/cmds/data.py +42 -42
  193. chia/cmds/data_funcs.py +81 -81
  194. chia/cmds/db.py +4 -5
  195. chia/cmds/db_backup_func.py +2 -2
  196. chia/cmds/db_upgrade_func.py +3 -3
  197. chia/cmds/db_validate_func.py +2 -2
  198. chia/cmds/dev/data.py +4 -4
  199. chia/cmds/dev/gh.py +5 -5
  200. chia/cmds/dev/installers.py +2 -3
  201. chia/cmds/dev/mempool.py +3 -4
  202. chia/cmds/dev/mempool_funcs.py +4 -4
  203. chia/cmds/dev/sim.py +8 -8
  204. chia/cmds/dump_keyring.py +3 -3
  205. chia/cmds/farm.py +6 -8
  206. chia/cmds/farm_funcs.py +25 -24
  207. chia/cmds/init_funcs.py +4 -4
  208. chia/cmds/keys.py +16 -18
  209. chia/cmds/keys_funcs.py +36 -36
  210. chia/cmds/netspace.py +1 -3
  211. chia/cmds/netspace_funcs.py +1 -2
  212. chia/cmds/options.py +3 -2
  213. chia/cmds/param_types.py +17 -16
  214. chia/cmds/passphrase.py +6 -7
  215. chia/cmds/passphrase_funcs.py +11 -13
  216. chia/cmds/peer.py +1 -3
  217. chia/cmds/peer_funcs.py +3 -3
  218. chia/cmds/plotnft.py +6 -7
  219. chia/cmds/plotnft_funcs.py +37 -26
  220. chia/cmds/rpc.py +3 -3
  221. chia/cmds/show.py +3 -5
  222. chia/cmds/show_funcs.py +9 -9
  223. chia/cmds/sim_funcs.py +25 -26
  224. chia/cmds/solver.py +1 -3
  225. chia/cmds/solver_funcs.py +1 -2
  226. chia/cmds/start_funcs.py +2 -2
  227. chia/cmds/wallet.py +76 -81
  228. chia/cmds/wallet_funcs.py +206 -177
  229. chia/consensus/augmented_chain.py +6 -6
  230. chia/consensus/block_body_validation.py +19 -15
  231. chia/consensus/block_creation.py +25 -21
  232. chia/consensus/block_header_validation.py +27 -13
  233. chia/consensus/block_height_map.py +3 -6
  234. chia/consensus/block_height_map_protocol.py +2 -2
  235. chia/consensus/block_record.py +2 -4
  236. chia/consensus/blockchain.py +58 -40
  237. chia/consensus/blockchain_interface.py +7 -7
  238. chia/consensus/coin_store_protocol.py +5 -6
  239. chia/consensus/condition_tools.py +4 -4
  240. chia/consensus/cost_calculator.py +2 -3
  241. chia/consensus/default_constants.py +16 -13
  242. chia/consensus/deficit.py +1 -3
  243. chia/consensus/difficulty_adjustment.py +3 -5
  244. chia/consensus/find_fork_point.py +2 -4
  245. chia/consensus/full_block_to_block_record.py +11 -13
  246. chia/consensus/generator_tools.py +2 -3
  247. chia/consensus/get_block_challenge.py +42 -26
  248. chia/consensus/get_block_generator.py +2 -3
  249. chia/consensus/make_sub_epoch_summary.py +8 -7
  250. chia/consensus/multiprocess_validation.py +31 -20
  251. chia/consensus/pos_quality.py +6 -23
  252. chia/consensus/pot_iterations.py +17 -44
  253. chia/consensus/signage_point.py +4 -5
  254. chia/consensus/vdf_info_computation.py +2 -4
  255. chia/daemon/client.py +8 -8
  256. chia/daemon/keychain_proxy.py +31 -37
  257. chia/daemon/server.py +32 -33
  258. chia/daemon/windows_signal.py +4 -3
  259. chia/data_layer/data_layer.py +86 -77
  260. chia/data_layer/data_layer_rpc_api.py +9 -9
  261. chia/data_layer/data_layer_rpc_client.py +13 -15
  262. chia/data_layer/data_layer_server.py +3 -3
  263. chia/data_layer/data_layer_util.py +14 -14
  264. chia/data_layer/data_layer_wallet.py +94 -101
  265. chia/data_layer/data_store.py +50 -50
  266. chia/data_layer/dl_wallet_store.py +9 -12
  267. chia/data_layer/download_data.py +8 -9
  268. chia/data_layer/s3_plugin_service.py +5 -9
  269. chia/data_layer/start_data_layer.py +5 -5
  270. chia/farmer/farmer.py +31 -31
  271. chia/farmer/farmer_api.py +45 -33
  272. chia/farmer/farmer_rpc_api.py +5 -4
  273. chia/farmer/farmer_rpc_client.py +6 -6
  274. chia/farmer/start_farmer.py +6 -6
  275. chia/full_node/block_store.py +13 -16
  276. chia/full_node/check_fork_next_block.py +1 -2
  277. chia/full_node/coin_store.py +15 -16
  278. chia/full_node/eligible_coin_spends.py +3 -3
  279. chia/full_node/fee_estimate_store.py +2 -3
  280. chia/full_node/fee_tracker.py +1 -2
  281. chia/full_node/full_block_utils.py +4 -4
  282. chia/full_node/full_node.py +238 -224
  283. chia/full_node/full_node_api.py +193 -150
  284. chia/full_node/full_node_rpc_api.py +53 -31
  285. chia/full_node/full_node_rpc_client.py +18 -19
  286. chia/full_node/full_node_store.py +45 -43
  287. chia/full_node/hint_management.py +2 -2
  288. chia/full_node/mempool.py +17 -19
  289. chia/full_node/mempool_manager.py +89 -42
  290. chia/full_node/pending_tx_cache.py +2 -3
  291. chia/full_node/start_full_node.py +5 -5
  292. chia/full_node/sync_store.py +3 -4
  293. chia/full_node/tx_processing_queue.py +34 -13
  294. chia/full_node/weight_proof.py +61 -48
  295. chia/harvester/harvester.py +25 -24
  296. chia/harvester/harvester_api.py +61 -38
  297. chia/harvester/harvester_rpc_api.py +10 -10
  298. chia/harvester/start_harvester.py +4 -4
  299. chia/introducer/introducer.py +3 -3
  300. chia/introducer/introducer_api.py +6 -4
  301. chia/introducer/start_introducer.py +4 -4
  302. chia/legacy/keyring.py +3 -3
  303. chia/plot_sync/delta.py +1 -2
  304. chia/plot_sync/receiver.py +20 -17
  305. chia/plot_sync/sender.py +15 -10
  306. chia/plotters/bladebit.py +7 -7
  307. chia/plotters/chiapos.py +2 -2
  308. chia/plotters/madmax.py +4 -4
  309. chia/plotters/plotters.py +4 -4
  310. chia/plotters/plotters_util.py +3 -3
  311. chia/plotting/cache.py +20 -14
  312. chia/plotting/check_plots.py +26 -35
  313. chia/plotting/create_plots.py +22 -23
  314. chia/plotting/manager.py +21 -14
  315. chia/plotting/prover.py +59 -42
  316. chia/plotting/util.py +16 -16
  317. chia/pools/pool_config.py +2 -1
  318. chia/pools/pool_puzzles.py +11 -12
  319. chia/pools/pool_wallet.py +34 -57
  320. chia/pools/pool_wallet_info.py +39 -10
  321. chia/protocols/farmer_protocol.py +8 -9
  322. chia/protocols/fee_estimate.py +3 -4
  323. chia/protocols/full_node_protocol.py +3 -4
  324. chia/protocols/harvester_protocol.py +27 -15
  325. chia/protocols/outbound_message.py +3 -3
  326. chia/protocols/pool_protocol.py +8 -9
  327. chia/protocols/shared_protocol.py +1 -2
  328. chia/protocols/solver_protocol.py +9 -2
  329. chia/protocols/timelord_protocol.py +4 -7
  330. chia/protocols/wallet_protocol.py +11 -12
  331. chia/rpc/rpc_client.py +9 -9
  332. chia/rpc/rpc_server.py +17 -17
  333. chia/rpc/util.py +2 -2
  334. chia/seeder/crawler.py +8 -8
  335. chia/seeder/crawler_api.py +21 -27
  336. chia/seeder/crawler_rpc_api.py +2 -2
  337. chia/seeder/dns_server.py +21 -21
  338. chia/seeder/start_crawler.py +4 -4
  339. chia/server/address_manager.py +15 -16
  340. chia/server/api_protocol.py +11 -11
  341. chia/server/chia_policy.py +46 -26
  342. chia/server/introducer_peers.py +2 -3
  343. chia/server/node_discovery.py +19 -19
  344. chia/server/rate_limit_numbers.py +4 -5
  345. chia/server/rate_limits.py +4 -4
  346. chia/server/resolve_peer_info.py +4 -4
  347. chia/server/server.py +49 -52
  348. chia/server/signal_handlers.py +6 -6
  349. chia/server/start_service.py +17 -17
  350. chia/server/upnp.py +4 -6
  351. chia/server/ws_connection.py +52 -37
  352. chia/simulator/add_blocks_in_batches.py +1 -3
  353. chia/simulator/block_tools.py +312 -200
  354. chia/simulator/full_node_simulator.py +56 -35
  355. chia/simulator/keyring.py +2 -3
  356. chia/simulator/setup_services.py +15 -15
  357. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  358. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  359. chia/simulator/simulator_protocol.py +1 -2
  360. chia/simulator/simulator_test_tools.py +3 -3
  361. chia/simulator/start_simulator.py +7 -7
  362. chia/simulator/wallet_tools.py +10 -10
  363. chia/solver/solver.py +10 -10
  364. chia/solver/solver_api.py +10 -8
  365. chia/solver/solver_rpc_api.py +2 -2
  366. chia/solver/start_solver.py +4 -4
  367. chia/ssl/cacert.pem +148 -90
  368. chia/ssl/chia_ca.crt +14 -10
  369. chia/ssl/chia_ca_old.crt +19 -0
  370. chia/ssl/create_ssl.py +4 -4
  371. chia/ssl/renewedselfsignedca.conf +4 -0
  372. chia/ssl/ssl_check.py +1 -2
  373. chia/timelord/iters_from_block.py +1 -4
  374. chia/timelord/start_timelord.py +4 -4
  375. chia/timelord/timelord.py +44 -40
  376. chia/timelord/timelord_api.py +6 -4
  377. chia/timelord/timelord_launcher.py +2 -2
  378. chia/timelord/timelord_rpc_api.py +2 -2
  379. chia/timelord/timelord_state.py +11 -12
  380. chia/types/block_protocol.py +1 -3
  381. chia/types/blockchain_format/coin.py +1 -3
  382. chia/types/blockchain_format/program.py +11 -8
  383. chia/types/blockchain_format/proof_of_space.py +123 -76
  384. chia/types/blockchain_format/tree_hash.py +3 -3
  385. chia/types/blockchain_format/vdf.py +1 -2
  386. chia/types/coin_spend.py +3 -3
  387. chia/types/mempool_item.py +5 -5
  388. chia/types/mempool_submission_status.py +2 -3
  389. chia/types/peer_info.py +1 -2
  390. chia/types/unfinished_header_block.py +3 -4
  391. chia/types/validation_state.py +1 -2
  392. chia/util/action_scope.py +8 -8
  393. chia/util/async_pool.py +5 -5
  394. chia/util/bech32m.py +1 -2
  395. chia/util/beta_metrics.py +2 -2
  396. chia/util/block_cache.py +4 -4
  397. chia/util/chia_logging.py +2 -2
  398. chia/util/chia_version.py +1 -2
  399. chia/util/config.py +15 -16
  400. chia/util/db_wrapper.py +26 -27
  401. chia/util/default_root.py +1 -2
  402. chia/util/errors.py +3 -3
  403. chia/util/file_keyring.py +14 -14
  404. chia/util/files.py +2 -3
  405. chia/util/hash.py +4 -4
  406. chia/util/initial-config.yaml +3 -5
  407. chia/util/inline_executor.py +2 -1
  408. chia/util/ip_address.py +1 -2
  409. chia/util/keychain.py +25 -27
  410. chia/util/keyring_wrapper.py +18 -19
  411. chia/util/lock.py +3 -4
  412. chia/util/log_exceptions.py +1 -2
  413. chia/util/lru_cache.py +2 -2
  414. chia/util/network.py +6 -6
  415. chia/util/path.py +2 -3
  416. chia/util/priority_mutex.py +2 -2
  417. chia/util/profiler.py +1 -2
  418. chia/util/safe_cancel_task.py +1 -2
  419. chia/util/streamable.py +22 -8
  420. chia/util/task_referencer.py +1 -1
  421. chia/util/timing.py +3 -3
  422. chia/util/virtual_project_analysis.py +6 -5
  423. chia/util/ws_message.py +2 -2
  424. chia/wallet/cat_wallet/cat_info.py +3 -4
  425. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  426. chia/wallet/cat_wallet/cat_utils.py +3 -4
  427. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  428. chia/wallet/cat_wallet/lineage_store.py +3 -4
  429. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  430. chia/wallet/coin_selection.py +9 -10
  431. chia/wallet/conditions.py +120 -105
  432. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  433. chia/wallet/derivation_record.py +1 -2
  434. chia/wallet/derive_keys.py +2 -4
  435. chia/wallet/did_wallet/did_info.py +10 -11
  436. chia/wallet/did_wallet/did_wallet.py +36 -82
  437. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  438. chia/wallet/driver_protocol.py +5 -7
  439. chia/wallet/lineage_proof.py +4 -4
  440. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  441. chia/wallet/nft_wallet/nft_info.py +8 -9
  442. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  443. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  444. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  445. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  446. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  447. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  448. chia/wallet/notification_manager.py +3 -3
  449. chia/wallet/notification_store.py +44 -61
  450. chia/wallet/outer_puzzles.py +6 -7
  451. chia/wallet/puzzle_drivers.py +34 -6
  452. chia/wallet/puzzles/clawback/drivers.py +6 -6
  453. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  454. chia/wallet/puzzles/load_clvm.py +1 -1
  455. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  456. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  457. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  458. chia/wallet/puzzles/tails.py +3 -3
  459. chia/wallet/singleton.py +5 -7
  460. chia/wallet/singleton_record.py +3 -3
  461. chia/wallet/start_wallet.py +5 -5
  462. chia/wallet/trade_manager.py +37 -58
  463. chia/wallet/trade_record.py +4 -4
  464. chia/wallet/trading/offer.py +59 -46
  465. chia/wallet/trading/trade_store.py +8 -9
  466. chia/wallet/transaction_record.py +8 -8
  467. chia/wallet/uncurried_puzzle.py +1 -2
  468. chia/wallet/util/clvm_streamable.py +12 -12
  469. chia/wallet/util/compute_hints.py +4 -5
  470. chia/wallet/util/curry_and_treehash.py +1 -2
  471. chia/wallet/util/merkle_tree.py +2 -3
  472. chia/wallet/util/peer_request_cache.py +8 -8
  473. chia/wallet/util/signing.py +85 -0
  474. chia/wallet/util/tx_config.py +15 -6
  475. chia/wallet/util/wallet_sync_utils.py +14 -16
  476. chia/wallet/util/wallet_types.py +2 -2
  477. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  478. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  479. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  480. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  481. chia/wallet/vc_wallet/vc_store.py +5 -6
  482. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  483. chia/wallet/wallet.py +50 -78
  484. chia/wallet/wallet_action_scope.py +11 -11
  485. chia/wallet/wallet_blockchain.py +12 -12
  486. chia/wallet/wallet_coin_record.py +12 -6
  487. chia/wallet/wallet_coin_store.py +24 -25
  488. chia/wallet/wallet_interested_store.py +3 -5
  489. chia/wallet/wallet_nft_store.py +10 -11
  490. chia/wallet/wallet_node.py +53 -61
  491. chia/wallet/wallet_node_api.py +5 -3
  492. chia/wallet/wallet_protocol.py +23 -23
  493. chia/wallet/wallet_puzzle_store.py +15 -18
  494. chia/wallet/wallet_request_types.py +778 -114
  495. chia/wallet/wallet_retry_store.py +1 -3
  496. chia/wallet/wallet_rpc_api.py +572 -909
  497. chia/wallet/wallet_rpc_client.py +87 -279
  498. chia/wallet/wallet_singleton_store.py +3 -4
  499. chia/wallet/wallet_state_manager.py +332 -106
  500. chia/wallet/wallet_transaction_store.py +11 -14
  501. chia/wallet/wallet_user_store.py +4 -6
  502. chia/wallet/wallet_weight_proof_handler.py +4 -4
  503. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
  505. chia/apis.py +0 -21
  506. chia/consensus/check_time_locks.py +0 -57
  507. chia/data_layer/puzzles/__init__.py +0 -0
  508. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  509. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  510. chia/types/coin_record.py +0 -44
  511. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  512. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  513. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  514. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  515. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  516. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  517. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  518. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  520. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  521. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  522. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  524. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  525. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  526. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
@@ -2,12 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  from pathlib import Path
5
- from typing import Any, Optional
5
+ from typing import Any
6
6
 
7
7
  import pytest
8
- from chia_rs import AugSchemeMPL, CoinSpend, G1Element, G2Element
8
+ from chia_rs import AugSchemeMPL, Coin, CoinSpend, G1Element, G2Element
9
9
  from chia_rs.sized_bytes import bytes32
10
- from chia_rs.sized_ints import uint16, uint32, uint64
10
+ from chia_rs.sized_ints import uint8, uint16, uint32, uint64
11
11
 
12
12
  from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
13
13
  from chia._tests.util.time_out_assert import time_out_assert
@@ -21,18 +21,23 @@ from chia.types.signing_mode import CHIP_0002_SIGN_MESSAGE_PREFIX
21
21
  from chia.util.bech32m import encode_puzzle_hash
22
22
  from chia.util.byte_types import hexstr_to_bytes
23
23
  from chia.util.errors import Err
24
- from chia.wallet.conditions import ConditionValidTimes
25
24
  from chia.wallet.derive_keys import master_sk_to_wallet_sk
26
25
  from chia.wallet.estimate_fees import estimate_fees
27
26
  from chia.wallet.puzzles.clawback.metadata import AutoClaimSettings
28
- from chia.wallet.transaction_record import TransactionRecord
29
27
  from chia.wallet.util.compute_additions import compute_additions
30
28
  from chia.wallet.util.query_filter import TransactionTypeFilter
31
29
  from chia.wallet.util.transaction_type import TransactionType
32
30
  from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
33
- from chia.wallet.util.wallet_types import CoinType
31
+ from chia.wallet.util.wallet_types import CoinType, WalletType
32
+ from chia.wallet.wallet_coin_store import GetCoinRecords
34
33
  from chia.wallet.wallet_node import WalletNode, get_wallet_db_path
35
- from chia.wallet.wallet_request_types import GetTransactionMemo
34
+ from chia.wallet.wallet_request_types import (
35
+ ClawbackPuzzleDecoratorOverride,
36
+ GetTransactionMemo,
37
+ GetTransactions,
38
+ SendTransaction,
39
+ SpendClawbackCoins,
40
+ )
36
41
 
37
42
 
38
43
  class TestWalletSimulator:
@@ -169,6 +174,120 @@ class TestWalletSimulator:
169
174
  ]
170
175
  )
171
176
 
177
+ @pytest.mark.parametrize(
178
+ "wallet_environments",
179
+ [{"num_environments": 2, "blocks_needed": [1, 1], "reuse_puzhash": True}],
180
+ indirect=True,
181
+ )
182
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
183
+ @pytest.mark.anyio
184
+ async def test_wallet_clawback_errors(self, wallet_environments: WalletTestFramework) -> None:
185
+ env_1 = wallet_environments.environments[0]
186
+ env_2 = wallet_environments.environments[1]
187
+ env_1.wallet_aliases = {"xch": 1}
188
+ env_2.wallet_aliases = {"xch": 1}
189
+
190
+ async with env_2.wallet_state_manager.new_action_scope(
191
+ wallet_environments.tx_config, push=True
192
+ ) as action_scope:
193
+ wallet_2_puzhash = await action_scope.get_puzzle_hash(env_2.wallet_state_manager)
194
+
195
+ send_response = await env_1.rpc_client.send_transaction(
196
+ SendTransaction(
197
+ wallet_id=uint32(1),
198
+ amount=uint64(500),
199
+ address=encode_puzzle_hash(wallet_2_puzhash, "txch"),
200
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
201
+ push=True,
202
+ ),
203
+ tx_config=wallet_environments.tx_config,
204
+ )
205
+ clawback_coin_id = send_response.transactions[0].additions[0].name()
206
+
207
+ await wallet_environments.process_pending_states(
208
+ [
209
+ WalletStateTransition(
210
+ pre_block_balance_updates={"xch": {"set_remainder": True}},
211
+ post_block_balance_updates={"xch": {"set_remainder": True}},
212
+ ),
213
+ WalletStateTransition(
214
+ pre_block_balance_updates={"xch": {"set_remainder": True}},
215
+ post_block_balance_updates={"xch": {"set_remainder": True}},
216
+ ),
217
+ ]
218
+ )
219
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(1) # make clawback expire
220
+
221
+ # no transaction from invalid coins specified
222
+ resp = await env_2.rpc_client.spend_clawback_coins(
223
+ SpendClawbackCoins(coin_ids=[bytes32.zeros]), tx_config=wallet_environments.tx_config
224
+ )
225
+ assert resp.transaction_ids == []
226
+
227
+ # no transaction from invalid wallet specified
228
+ coin_record = await env_2.wallet_state_manager.coin_store.get_coin_record(clawback_coin_id)
229
+ assert coin_record is not None
230
+ await env_2.wallet_state_manager.coin_store.add_coin_record(
231
+ dataclasses.replace(coin_record, wallet_type=WalletType.CAT)
232
+ )
233
+ resp = await env_2.rpc_client.spend_clawback_coins(
234
+ SpendClawbackCoins(coin_ids=[clawback_coin_id]), tx_config=wallet_environments.tx_config
235
+ )
236
+ assert resp.transaction_ids == []
237
+
238
+ # no transaction from missing metadata
239
+ await env_2.wallet_state_manager.coin_store.add_coin_record(dataclasses.replace(coin_record, metadata=None))
240
+ resp = await env_2.rpc_client.spend_clawback_coins(
241
+ SpendClawbackCoins(coin_ids=[clawback_coin_id]), tx_config=wallet_environments.tx_config
242
+ )
243
+ assert resp.transaction_ids == []
244
+
245
+ # reset
246
+ await env_2.wallet_state_manager.coin_store.add_coin_record(coin_record)
247
+
248
+ # no transaction from missing corresponding TX record
249
+ fake_coin = Coin(coin_record.coin.parent_coin_info, bytes32.zeros, coin_record.coin.amount)
250
+ fake_coin_id = fake_coin.name()
251
+ await env_2.wallet_state_manager.coin_store.add_coin_record(dataclasses.replace(coin_record, coin=fake_coin))
252
+ resp = await env_2.rpc_client.spend_clawback_coins(
253
+ SpendClawbackCoins(coin_ids=[fake_coin_id]), tx_config=wallet_environments.tx_config
254
+ )
255
+ assert resp.transaction_ids == []
256
+
257
+ # no transaction from coin that doesn't belong to wallet
258
+ farmed_tx = (await env_2.wallet_state_manager.tx_store.get_farming_rewards())[0]
259
+ await env_2.wallet_state_manager.tx_store.add_transaction_record(
260
+ dataclasses.replace(farmed_tx, name=fake_coin_id)
261
+ )
262
+ resp = await env_2.rpc_client.spend_clawback_coins(
263
+ SpendClawbackCoins(coin_ids=[fake_coin_id]), tx_config=wallet_environments.tx_config
264
+ )
265
+ assert resp.transaction_ids == []
266
+
267
+ # reset and claim the coin
268
+ await env_2.wallet_state_manager.coin_store.add_coin_record(coin_record)
269
+ resp = await env_2.rpc_client.spend_clawback_coins(
270
+ SpendClawbackCoins(coin_ids=[clawback_coin_id], push=True), tx_config=wallet_environments.tx_config
271
+ )
272
+ await wallet_environments.process_pending_states(
273
+ [
274
+ WalletStateTransition(
275
+ pre_block_balance_updates={"xch": {"set_remainder": True}},
276
+ post_block_balance_updates={"xch": {"set_remainder": True}},
277
+ ),
278
+ WalletStateTransition(
279
+ pre_block_balance_updates={"xch": {"set_remainder": True}},
280
+ post_block_balance_updates={"xch": {"set_remainder": True}},
281
+ ),
282
+ ]
283
+ )
284
+
285
+ # no transaction for attempting to claim a coin already claimed
286
+ resp = await env_2.rpc_client.spend_clawback_coins(
287
+ SpendClawbackCoins(coin_ids=[clawback_coin_id]), tx_config=wallet_environments.tx_config
288
+ )
289
+ assert resp.transaction_ids == []
290
+
172
291
  @pytest.mark.parametrize(
173
292
  "wallet_environments",
174
293
  [{"num_environments": 2, "blocks_needed": [2, 1], "reuse_puzhash": True}],
@@ -182,25 +301,27 @@ class TestWalletSimulator:
182
301
  ) -> None:
183
302
  env = wallet_environments.environments[0]
184
303
  env_1 = wallet_environments.environments[1]
185
- wallet = env.xch_wallet
186
- wallet_1 = env_1.xch_wallet
187
304
  wsm = env.wallet_state_manager
188
305
  wsm_1 = env_1.wallet_state_manager
189
306
 
190
307
  tx_amount = 500
191
- async with wallet_1.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
192
- normal_puzhash = await action_scope.get_puzzle_hash(wallet_1.wallet_state_manager)
308
+ async with env_1.xch_wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
309
+ normal_puzhash = await action_scope.get_puzzle_hash(env_1.xch_wallet.wallet_state_manager)
193
310
 
194
311
  # Transfer to normal wallet
195
312
  for _ in range(number_of_coins):
196
- async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
197
- await wallet.generate_signed_transaction(
198
- [uint64(tx_amount)],
199
- [normal_puzhash],
200
- action_scope,
201
- uint64(0),
202
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 10}],
203
- )
313
+ await env.rpc_client.send_transaction(
314
+ SendTransaction(
315
+ wallet_id=env.xch_wallet.id(),
316
+ amount=uint64(tx_amount),
317
+ address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
318
+ puzzle_decorator=[
319
+ ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(10))
320
+ ],
321
+ push=True,
322
+ ),
323
+ wallet_environments.tx_config,
324
+ )
204
325
 
205
326
  await wallet_environments.process_pending_states(
206
327
  [
@@ -236,15 +357,17 @@ class TestWalletSimulator:
236
357
  20, wsm_1.coin_store.count_small_unspent, number_of_coins, tx_amount * 2, CoinType.CLAWBACK
237
358
  )
238
359
 
239
- async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
240
- await wallet.generate_signed_transaction(
241
- [uint64(tx_amount)],
242
- [normal_puzhash],
243
- action_scope,
244
- uint64(0),
245
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 10}],
246
- )
247
- [tx_bad] = action_scope.side_effects.transactions
360
+ bad_send = await env.rpc_client.send_transaction(
361
+ SendTransaction(
362
+ wallet_id=env.xch_wallet.id(),
363
+ amount=uint64(tx_amount),
364
+ address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
365
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(10))],
366
+ push=True,
367
+ ),
368
+ wallet_environments.tx_config,
369
+ )
370
+ [tx_bad] = bad_send.transactions
248
371
 
249
372
  await wallet_environments.process_pending_states(
250
373
  [
@@ -281,7 +404,11 @@ class TestWalletSimulator:
281
404
  assert coin_record is not None
282
405
  await wsm_1.coin_store.add_coin_record(dataclasses.replace(coin_record, metadata=None))
283
406
  # Claim merkle coin
284
- env_1.node.set_auto_claim(AutoClaimSettings(enabled=True, batch_size=uint16(2)))
407
+ original_settings = AutoClaimSettings.from_json_dict(env_1.wallet_state_manager.config["auto_claim"])
408
+ await env_1.rpc_client.set_auto_claim(AutoClaimSettings(enabled=True, batch_size=uint16(2)))
409
+ assert await env_1.rpc_client.get_auto_claim() == dataclasses.replace(
410
+ original_settings, enabled=True, batch_size=uint16(2)
411
+ )
285
412
  # Trigger auto claim
286
413
  await wallet_environments.process_pending_states(
287
414
  [
@@ -333,25 +460,23 @@ class TestWalletSimulator:
333
460
  env_2 = wallet_environments.environments[1]
334
461
  wsm = env.wallet_state_manager
335
462
  wsm_2 = env_2.wallet_state_manager
336
- wallet = env.xch_wallet
337
- wallet_1 = env_2.xch_wallet
338
- api_0 = env.rpc_api
339
- api_1 = env_2.rpc_api
340
463
 
341
464
  tx_amount = 500
342
- async with wallet_1.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
343
- normal_puzhash = await action_scope.get_puzzle_hash(wallet_1.wallet_state_manager)
465
+ async with wsm_2.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
466
+ normal_puzhash = await action_scope.get_puzzle_hash(wsm_2)
344
467
 
345
468
  # Transfer to normal wallet
346
- async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
347
- await wallet.generate_signed_transaction(
348
- [uint64(tx_amount)],
349
- [normal_puzhash],
350
- action_scope,
351
- uint64(0),
352
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 500}],
353
- memos=[[b"Test"]],
354
- )
469
+ send_response = await env.rpc_client.send_transaction(
470
+ SendTransaction(
471
+ wallet_id=env.xch_wallet.id(),
472
+ amount=uint64(tx_amount),
473
+ address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
474
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(500))],
475
+ memos=["Test"],
476
+ push=True,
477
+ ),
478
+ wallet_environments.tx_config,
479
+ )
355
480
 
356
481
  await wallet_environments.process_pending_states(
357
482
  [
@@ -385,28 +510,35 @@ class TestWalletSimulator:
385
510
  # Check merkle coins
386
511
  await time_out_assert(20, wsm.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
387
512
  await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
388
- txs = await api_0.get_transactions(
389
- dict(type_filter={"values": [TransactionType.INCOMING_CLAWBACK_SEND], "mode": 1}, wallet_id=1)
513
+ txs_response = await env.rpc_client.get_transactions(
514
+ GetTransactions(
515
+ wallet_id=env.xch_wallet.id(),
516
+ type_filter=TransactionTypeFilter(
517
+ values=[uint8(TransactionType.INCOMING_CLAWBACK_SEND.value)], mode=uint8(1)
518
+ ),
519
+ ),
390
520
  )
391
521
  # clawback merkle coin
392
- [tx] = action_scope.side_effects.transactions
522
+ [tx] = send_response.transactions
393
523
  merkle_coin = tx.additions[0] if tx.additions[0].amount == tx_amount else tx.additions[1]
394
524
  interested_coins = await wsm_2.interested_store.get_interested_coin_ids()
395
525
  assert merkle_coin.name() in set(interested_coins)
396
- assert len(txs["transactions"]) == 1
397
- assert not txs["transactions"][0]["confirmed"]
398
- assert txs["transactions"][0]["metadata"]["recipient_puzzle_hash"][2:] == normal_puzhash.hex()
399
- assert txs["transactions"][0]["metadata"]["coin_id"] == "0x" + merkle_coin.name().hex()
526
+ assert len(txs_response.transactions) == 1
527
+ assert not txs_response.transactions[0].confirmed
528
+ assert txs_response.transactions[0].metadata is not None
529
+ assert txs_response.transactions[0].metadata.content["recipient_puzzle_hash"] == f"0x{normal_puzhash.hex()}"
530
+ assert txs_response.transactions[0].metadata.coin_id == merkle_coin.name()
400
531
 
401
532
  test_fee = 10
402
- resp = await api_0.spend_clawback_coins(
403
- {
404
- "coin_ids": [normal_puzhash.hex(), merkle_coin.name().hex()],
405
- "fee": test_fee,
406
- **wallet_environments.tx_config.to_json_dict(),
407
- }
533
+ resp = await env.rpc_client.spend_clawback_coins(
534
+ SpendClawbackCoins(
535
+ coin_ids=[merkle_coin.name()],
536
+ fee=uint64(test_fee),
537
+ push=True,
538
+ ),
539
+ wallet_environments.tx_config,
408
540
  )
409
- assert len(resp["transaction_ids"]) == 1
541
+ assert len(resp.transaction_ids) == 1
410
542
 
411
543
  await wallet_environments.process_pending_states(
412
544
  [
@@ -440,33 +572,36 @@ class TestWalletSimulator:
440
572
 
441
573
  await time_out_assert(20, wsm.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
442
574
  await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
443
- txs = await api_0.get_transactions(
444
- dict(
445
- type_filter={
446
- "values": [TransactionType.INCOMING_CLAWBACK_SEND.value, TransactionType.OUTGOING_CLAWBACK.value],
447
- "mode": 1,
448
- },
449
- wallet_id=1,
450
- )
451
- )
452
- assert len(txs["transactions"]) == 2
453
- assert txs["transactions"][0]["confirmed"]
454
- assert txs["transactions"][1]["confirmed"]
455
-
456
- txs = await api_1.get_transactions(
457
- dict(
458
- type_filter={
459
- "values": [
460
- TransactionType.INCOMING_CLAWBACK_RECEIVE.value,
461
- TransactionType.OUTGOING_CLAWBACK.value,
575
+ txs_response = await env.rpc_client.get_transactions(
576
+ GetTransactions(
577
+ wallet_id=env.xch_wallet.id(),
578
+ type_filter=TransactionTypeFilter(
579
+ values=[
580
+ uint8(TransactionType.INCOMING_CLAWBACK_SEND.value),
581
+ uint8(TransactionType.OUTGOING_CLAWBACK.value),
462
582
  ],
463
- "mode": 1,
464
- },
465
- wallet_id=1,
466
- )
583
+ mode=uint8(1),
584
+ ),
585
+ ),
586
+ )
587
+ assert len(txs_response.transactions) == 2
588
+ assert txs_response.transactions[0].confirmed
589
+ assert txs_response.transactions[1].confirmed
590
+
591
+ txs_response = await env_2.rpc_client.get_transactions(
592
+ GetTransactions(
593
+ wallet_id=env_2.xch_wallet.id(),
594
+ type_filter=TransactionTypeFilter(
595
+ values=[
596
+ uint8(TransactionType.INCOMING_CLAWBACK_RECEIVE.value),
597
+ uint8(TransactionType.OUTGOING_CLAWBACK.value),
598
+ ],
599
+ mode=uint8(1),
600
+ ),
601
+ ),
467
602
  )
468
- assert len(txs["transactions"]) == 1
469
- assert txs["transactions"][0]["confirmed"]
603
+ assert len(txs_response.transactions) == 1
604
+ assert txs_response.transactions[0].confirmed
470
605
  interested_coins = await wsm_2.interested_store.get_interested_coin_ids()
471
606
  assert merkle_coin.name() not in set(interested_coins)
472
607
 
@@ -481,20 +616,23 @@ class TestWalletSimulator:
481
616
  env = wallet_environments.environments[0]
482
617
  wsm = env.wallet_state_manager
483
618
  wallet = env.xch_wallet
484
- api_0 = env.rpc_api
485
619
 
486
620
  tx_amount = 500
487
621
  # Transfer to normal wallet
488
622
  async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
489
623
  normal_puzhash = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
490
- await wallet.generate_signed_transaction(
491
- [uint64(tx_amount)],
492
- [normal_puzhash],
493
- action_scope,
494
- uint64(0),
495
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 5}],
496
- memos=[[b"Test"]],
497
- )
624
+
625
+ send_response = await env.rpc_client.send_transaction(
626
+ SendTransaction(
627
+ wallet_id=env.xch_wallet.id(),
628
+ amount=uint64(tx_amount),
629
+ address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
630
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
631
+ memos=["Test"],
632
+ push=True,
633
+ ),
634
+ wallet_environments.tx_config,
635
+ )
498
636
 
499
637
  await wallet_environments.process_pending_states(
500
638
  [
@@ -528,17 +666,18 @@ class TestWalletSimulator:
528
666
  # Check merkle coins
529
667
  await time_out_assert(20, wsm.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
530
668
  # Claim merkle coin
531
- [tx] = action_scope.side_effects.transactions
669
+ [tx] = send_response.transactions
532
670
  merkle_coin = tx.additions[0] if tx.additions[0].amount == tx_amount else tx.additions[1]
533
671
  test_fee = 10
534
- resp = await api_0.spend_clawback_coins(
535
- {
536
- "coin_ids": [merkle_coin.name().hex(), normal_puzhash.hex()],
537
- "fee": test_fee,
538
- **wallet_environments.tx_config.to_json_dict(),
539
- }
672
+ resp = await env.rpc_client.spend_clawback_coins(
673
+ SpendClawbackCoins(
674
+ coin_ids=[merkle_coin.name()],
675
+ fee=uint64(test_fee),
676
+ push=True,
677
+ ),
678
+ wallet_environments.tx_config,
540
679
  )
541
- assert len(resp["transaction_ids"]) == 1
680
+ assert len(resp.transaction_ids) == 1
542
681
  # Wait mempool update
543
682
  await wallet_environments.process_pending_states(
544
683
  [
@@ -571,20 +710,23 @@ class TestWalletSimulator:
571
710
  )
572
711
  await time_out_assert(20, wsm.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
573
712
 
574
- txs = await api_0.get_transactions(
575
- dict(
576
- type_filter={
577
- "values": [TransactionType.INCOMING_CLAWBACK_SEND.value, TransactionType.OUTGOING_CLAWBACK.value],
578
- "mode": 1,
579
- },
580
- wallet_id=1,
581
- )
713
+ txs_response = await env.rpc_client.get_transactions(
714
+ GetTransactions(
715
+ wallet_id=env.xch_wallet.id(),
716
+ type_filter=TransactionTypeFilter(
717
+ values=[
718
+ uint8(TransactionType.INCOMING_CLAWBACK_SEND.value),
719
+ uint8(TransactionType.OUTGOING_CLAWBACK.value),
720
+ ],
721
+ mode=uint8(1),
722
+ ),
723
+ ),
582
724
  )
583
- assert len(txs["transactions"]) == 2
584
- assert txs["transactions"][0]["confirmed"]
585
- assert txs["transactions"][1]["confirmed"]
586
- assert txs["transactions"][0]["memos"] != txs["transactions"][1]["memos"]
587
- assert "0x" + b"Test".hex() in next(iter(txs["transactions"][0]["memos"].values()))
725
+ assert len(txs_response.transactions) == 2
726
+ assert txs_response.transactions[0].confirmed
727
+ assert txs_response.transactions[1].confirmed
728
+ assert txs_response.transactions[0].memos != txs_response.transactions[1].memos
729
+ assert b"Test" in next(iter(txs_response.transactions[0].memos.values()))
588
730
 
589
731
  @pytest.mark.parametrize(
590
732
  "wallet_environments",
@@ -598,43 +740,53 @@ class TestWalletSimulator:
598
740
  env_2 = wallet_environments.environments[1]
599
741
  wsm = env.wallet_state_manager
600
742
  wsm_2 = env_2.wallet_state_manager
601
- wallet = env.xch_wallet
602
- wallet_1 = env_2.xch_wallet
603
- api_0 = env.rpc_api
604
- api_1 = env_2.rpc_api
605
743
 
606
- tx_amount = 500
607
- async with wallet_1.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
608
- normal_puzhash = await action_scope.get_puzzle_hash(wallet_1.wallet_state_manager)
744
+ tx_amount_1 = 500
745
+ tx_amount_2 = 600
746
+ total_tx_amount = tx_amount_1 + tx_amount_2
747
+ async with wsm_2.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
748
+ normal_puzhash = await action_scope.get_puzzle_hash(wsm_2)
609
749
  # Transfer to normal wallet
610
- async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
611
- await wallet.generate_signed_transaction(
612
- [uint64(tx_amount)],
613
- [normal_puzhash],
614
- action_scope,
615
- uint64(0),
616
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 5}],
617
- )
750
+ send_response_1 = await env.rpc_client.send_transaction(
751
+ SendTransaction(
752
+ wallet_id=env.xch_wallet.id(),
753
+ amount=uint64(tx_amount_1),
754
+ address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
755
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
756
+ push=True,
757
+ ),
758
+ wallet_environments.tx_config,
759
+ )
760
+ send_response_2 = await env.rpc_client.send_transaction(
761
+ SendTransaction(
762
+ wallet_id=env.xch_wallet.id(),
763
+ amount=uint64(tx_amount_2),
764
+ address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
765
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
766
+ push=True,
767
+ ),
768
+ wallet_environments.tx_config,
769
+ )
618
770
 
619
771
  await wallet_environments.process_pending_states(
620
772
  [
621
773
  WalletStateTransition(
622
774
  pre_block_balance_updates={
623
775
  1: {
624
- "unconfirmed_wallet_balance": -1 * tx_amount,
625
- "<=#spendable_balance": -1 * tx_amount,
626
- "<=#max_send_amount": -1 * tx_amount,
776
+ "unconfirmed_wallet_balance": -1 * total_tx_amount,
777
+ "<=#spendable_balance": -1 * total_tx_amount,
778
+ "<=#max_send_amount": -1 * total_tx_amount,
627
779
  ">=#pending_change": 1, # any amount increase
628
- "pending_coin_removal_count": 1,
780
+ "pending_coin_removal_count": 2,
629
781
  }
630
782
  },
631
783
  post_block_balance_updates={
632
784
  1: {
633
- "confirmed_wallet_balance": -1 * tx_amount,
785
+ "confirmed_wallet_balance": -1 * total_tx_amount,
634
786
  ">=#spendable_balance": 1, # any amount increase
635
787
  ">=#max_send_amount": 1, # any amount increase
636
788
  "<=#pending_change": -1, # any amount decrease
637
- "pending_coin_removal_count": -1,
789
+ "pending_coin_removal_count": -2,
638
790
  }
639
791
  },
640
792
  ),
@@ -646,8 +798,8 @@ class TestWalletSimulator:
646
798
  )
647
799
 
648
800
  # Check merkle coins
649
- await time_out_assert(20, wsm.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
650
- await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
801
+ await time_out_assert(20, wsm.coin_store.count_small_unspent, 2, 1000, CoinType.CLAWBACK)
802
+ await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 2, 1000, CoinType.CLAWBACK)
651
803
 
652
804
  # Farm a block to pass timelock
653
805
  await wallet_environments.process_pending_states(
@@ -664,17 +816,20 @@ class TestWalletSimulator:
664
816
  )
665
817
 
666
818
  # Claim merkle coin
667
- [tx] = action_scope.side_effects.transactions
668
- merkle_coin = tx.additions[0] if tx.additions[0].amount == tx_amount else tx.additions[1]
819
+ [tx_1] = send_response_1.transactions
820
+ [tx_2] = send_response_2.transactions
821
+ merkle_coin_1 = tx_1.additions[0] if tx_1.additions[0].amount == tx_amount_1 else tx_1.additions[1]
822
+ merkle_coin_2 = tx_2.additions[0] if tx_2.additions[0].amount == tx_amount_2 else tx_2.additions[1]
669
823
  test_fee = 10
670
- resp = await api_1.spend_clawback_coins(
671
- {
672
- "coin_ids": [merkle_coin.name().hex(), normal_puzhash.hex()],
673
- "fee": test_fee,
674
- **wallet_environments.tx_config.to_json_dict(),
675
- }
824
+ resp = await env_2.rpc_client.spend_clawback_coins(
825
+ SpendClawbackCoins(
826
+ coin_ids=[merkle_coin_1.name(), merkle_coin_2.name()],
827
+ fee=uint64(test_fee),
828
+ push=True,
829
+ ),
830
+ wallet_environments.tx_config,
676
831
  )
677
- assert len(resp["transaction_ids"]) == 1
832
+ assert len(resp.transaction_ids) == 1
678
833
 
679
834
  await wallet_environments.process_pending_states(
680
835
  [
@@ -685,21 +840,21 @@ class TestWalletSimulator:
685
840
  WalletStateTransition(
686
841
  pre_block_balance_updates={
687
842
  1: {
688
- "unconfirmed_wallet_balance": tx_amount - test_fee,
689
- "<=#spendable_balance": -1 * tx_amount,
690
- "<=#max_send_amount": -1 * tx_amount,
843
+ "unconfirmed_wallet_balance": total_tx_amount - test_fee,
844
+ "<=#spendable_balance": -1 * total_tx_amount,
845
+ "<=#max_send_amount": -1 * total_tx_amount,
691
846
  ">=#pending_change": 1, # any amount increase
692
- "pending_coin_removal_count": 2, # 1 for fee, 1 for clawback
847
+ "pending_coin_removal_count": 3, # 1 for fee, 2 for clawback
693
848
  }
694
849
  },
695
850
  post_block_balance_updates={
696
851
  1: {
697
- "confirmed_wallet_balance": tx_amount - test_fee,
852
+ "confirmed_wallet_balance": total_tx_amount - test_fee,
698
853
  ">=#spendable_balance": 1, # any amount increase
699
854
  ">=#max_send_amount": 1, # any amount increase
700
855
  "<=#pending_change": -1, # any amount decrease
701
- "unspent_coin_count": 1,
702
- "pending_coin_removal_count": -2,
856
+ "unspent_coin_count": 2,
857
+ "pending_coin_removal_count": -3,
703
858
  }
704
859
  },
705
860
  ),
@@ -709,19 +864,20 @@ class TestWalletSimulator:
709
864
  await time_out_assert(20, wsm.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
710
865
  await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
711
866
 
712
- txs = await api_0.get_transactions(
713
- dict(
714
- type_filter={
715
- "values": [
716
- TransactionType.INCOMING_CLAWBACK_SEND.value,
867
+ txs_response = await env.rpc_client.get_transactions(
868
+ GetTransactions(
869
+ wallet_id=env.xch_wallet.id(),
870
+ type_filter=TransactionTypeFilter(
871
+ values=[
872
+ uint8(TransactionType.INCOMING_CLAWBACK_SEND.value),
717
873
  ],
718
- "mode": 1,
719
- },
720
- wallet_id=1,
721
- )
874
+ mode=uint8(1),
875
+ ),
876
+ ),
722
877
  )
723
- assert len(txs["transactions"]) == 1
724
- assert txs["transactions"][0]["confirmed"]
878
+ assert len(txs_response.transactions) == 2
879
+ assert txs_response.transactions[0].confirmed
880
+ assert txs_response.transactions[1].confirmed
725
881
 
726
882
  @pytest.mark.parametrize(
727
883
  "wallet_environments",
@@ -736,21 +892,21 @@ class TestWalletSimulator:
736
892
  env_2 = wallet_environments.environments[1]
737
893
  wsm = env.wallet_state_manager
738
894
  wsm_2 = env_2.wallet_state_manager
739
- wallet = env.xch_wallet
740
- wallet_1 = env_2.xch_wallet
741
895
 
742
896
  tx_amount = 500
743
- async with wallet_1.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
744
- normal_puzhash = await action_scope.get_puzzle_hash(wallet_1.wallet_state_manager)
897
+ async with wsm_2.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
898
+ normal_puzhash = await action_scope.get_puzzle_hash(wsm_2)
745
899
  # Transfer to normal wallet
746
- async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
747
- await wallet.generate_signed_transaction(
748
- [uint64(tx_amount)],
749
- [normal_puzhash],
750
- action_scope,
751
- uint64(0),
752
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 5}],
753
- )
900
+ await env.rpc_client.send_transaction(
901
+ SendTransaction(
902
+ wallet_id=env.xch_wallet.id(),
903
+ amount=uint64(tx_amount),
904
+ address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
905
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
906
+ push=True,
907
+ ),
908
+ wallet_environments.tx_config,
909
+ )
754
910
 
755
911
  await wallet_environments.process_pending_states(
756
912
  [
@@ -829,7 +985,7 @@ class TestWalletSimulator:
829
985
  await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
830
986
 
831
987
  # Claim merkle coin
832
- env_2.node.set_auto_claim(AutoClaimSettings(enabled=True))
988
+ await env_2.rpc_client.set_auto_claim(AutoClaimSettings(enabled=True))
833
989
  # clawback merkle coin
834
990
  await wallet_environments.process_pending_states(
835
991
  [
@@ -921,18 +1077,18 @@ class TestWalletSimulator:
921
1077
  async def test_get_clawback_coins(self, wallet_environments: WalletTestFramework) -> None:
922
1078
  env = wallet_environments.environments[0]
923
1079
  wsm = env.wallet_state_manager
924
- wallet = env.xch_wallet
925
1080
 
926
1081
  tx_amount = 500
927
- # Transfer to normal wallet
928
- async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
929
- await wallet.generate_signed_transaction(
930
- [uint64(tx_amount)],
931
- [bytes32.zeros],
932
- action_scope,
933
- uint64(0),
934
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 500}],
935
- )
1082
+ send_response = await env.rpc_client.send_transaction(
1083
+ SendTransaction(
1084
+ wallet_id=env.xch_wallet.id(),
1085
+ amount=uint64(tx_amount),
1086
+ address=env.wallet_state_manager.encode_puzzle_hash(bytes32.zeros),
1087
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
1088
+ push=True,
1089
+ ),
1090
+ wallet_environments.tx_config,
1091
+ )
936
1092
 
937
1093
  await wallet_environments.process_pending_states(
938
1094
  [
@@ -966,9 +1122,9 @@ class TestWalletSimulator:
966
1122
  # Check merkle coins
967
1123
  await time_out_assert(20, wsm.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
968
1124
  # clawback merkle coin
969
- [tx] = action_scope.side_effects.transactions
1125
+ [tx] = send_response.transactions
970
1126
  merkle_coin = tx.additions[0] if tx.additions[0].amount == tx_amount else tx.additions[1]
971
- resp = await env.rpc_api.get_coin_records({"wallet_id": 1, "coin_type": 1})
1127
+ resp = await env.rpc_client.get_coin_records(GetCoinRecords(wallet_id=uint32(1), coin_type=uint8(1)))
972
1128
  assert len(resp["coin_records"]) == 1
973
1129
  assert resp["coin_records"][0]["id"][2:] == merkle_coin.name().hex()
974
1130
 
@@ -987,7 +1143,6 @@ class TestWalletSimulator:
987
1143
  wsm_2 = env_2.wallet_state_manager
988
1144
  wallet_1 = env_1.xch_wallet
989
1145
  wallet_2 = env_2.xch_wallet
990
- api_1 = env_1.rpc_api
991
1146
 
992
1147
  async with wallet_1.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
993
1148
  wallet_1_puzhash = await action_scope.get_puzzle_hash(wallet_1.wallet_state_manager)
@@ -996,16 +1151,18 @@ class TestWalletSimulator:
996
1151
 
997
1152
  tx_amount = 500
998
1153
  # Transfer to normal wallet
999
- async with wallet_1.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1000
- await wallet_1.generate_signed_transaction(
1001
- [uint64(tx_amount)],
1002
- [wallet_2_puzhash],
1003
- action_scope,
1004
- uint64(0),
1005
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 5}],
1006
- )
1154
+ send_response = await env_1.rpc_client.send_transaction(
1155
+ SendTransaction(
1156
+ wallet_id=env_1.xch_wallet.id(),
1157
+ amount=uint64(tx_amount),
1158
+ address=env_1.wallet_state_manager.encode_puzzle_hash(wallet_2_puzhash),
1159
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
1160
+ push=True,
1161
+ ),
1162
+ wallet_environments.tx_config,
1163
+ )
1007
1164
 
1008
- [tx1] = action_scope.side_effects.transactions
1165
+ [tx1] = send_response.transactions
1009
1166
  clawback_coin_id_1 = tx1.additions[0].name()
1010
1167
  assert tx1.spend_bundle is not None
1011
1168
 
@@ -1043,15 +1200,17 @@ class TestWalletSimulator:
1043
1200
  await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
1044
1201
 
1045
1202
  tx_amount2 = 700
1046
- async with wallet_1.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1047
- await wallet_1.generate_signed_transaction(
1048
- [uint64(tx_amount2)],
1049
- [wallet_1_puzhash],
1050
- action_scope,
1051
- uint64(0),
1052
- puzzle_decorator_override=[{"decorator": "CLAWBACK", "clawback_timelock": 5}],
1053
- )
1054
- [tx2] = action_scope.side_effects.transactions
1203
+ send_response = await env_1.rpc_client.send_transaction(
1204
+ SendTransaction(
1205
+ wallet_id=env_1.xch_wallet.id(),
1206
+ amount=uint64(tx_amount2),
1207
+ address=env_1.wallet_state_manager.encode_puzzle_hash(wallet_1_puzhash),
1208
+ puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
1209
+ push=True,
1210
+ ),
1211
+ wallet_environments.tx_config,
1212
+ )
1213
+ [tx2] = send_response.transactions
1055
1214
  clawback_coin_id_2 = tx2.additions[0].name()
1056
1215
  assert tx2.spend_bundle is not None
1057
1216
 
@@ -1088,10 +1247,14 @@ class TestWalletSimulator:
1088
1247
  await time_out_assert(20, wsm_1.coin_store.count_small_unspent, 2, 1000, CoinType.CLAWBACK)
1089
1248
  await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
1090
1249
  # clawback merkle coin
1091
- resp = await api_1.spend_clawback_coins({"coin_ids": [clawback_coin_id_1.hex()], "fee": 0})
1092
- assert len(resp["transaction_ids"]) == 1
1093
- resp = await api_1.spend_clawback_coins({"coin_ids": [clawback_coin_id_2.hex()], "fee": 0})
1094
- assert len(resp["transaction_ids"]) == 1
1250
+ resp = await env_1.rpc_client.spend_clawback_coins(
1251
+ SpendClawbackCoins(coin_ids=[clawback_coin_id_1], push=True), wallet_environments.tx_config
1252
+ )
1253
+ assert len(resp.transaction_ids) == 1
1254
+ resp = await env_1.rpc_client.spend_clawback_coins(
1255
+ SpendClawbackCoins(coin_ids=[clawback_coin_id_2], push=True), wallet_environments.tx_config
1256
+ )
1257
+ assert len(resp.transaction_ids) == 1
1095
1258
 
1096
1259
  await wallet_environments.process_pending_states(
1097
1260
  [
@@ -1696,7 +1859,7 @@ class TestWalletSimulator:
1696
1859
  [tx] = action_scope.side_effects.transactions
1697
1860
  assert tx.spend_bundle is not None
1698
1861
 
1699
- stolen_cs: Optional[CoinSpend] = None
1862
+ stolen_cs: CoinSpend | None = None
1700
1863
  # extract coin_spend from generated spend_bundle
1701
1864
  for cs in tx.spend_bundle.coin_spends:
1702
1865
  if compute_additions(cs) == []:
@@ -1706,26 +1869,15 @@ class TestWalletSimulator:
1706
1869
 
1707
1870
  # get a legit signature
1708
1871
  stolen_sb, _ = await wallet.wallet_state_manager.sign_bundle([stolen_cs])
1709
- name = stolen_sb.name()
1710
- stolen_tx = TransactionRecord(
1711
- confirmed_at_height=uint32(0),
1712
- created_at_time=uint64(0),
1713
- to_puzzle_hash=bytes32(32 * b"0"),
1714
- to_address=encode_puzzle_hash(bytes32(32 * b"0"), "txch"),
1872
+ stolen_tx = wallet.wallet_state_manager.new_outgoing_transaction(
1873
+ wallet_id=wallet.id(),
1874
+ puzzle_hash=bytes32.zeros,
1715
1875
  amount=uint64(0),
1716
- fee_amount=uint64(0),
1717
- confirmed=False,
1718
- sent=uint32(0),
1876
+ fee=uint64(0),
1719
1877
  spend_bundle=stolen_sb,
1720
1878
  additions=[],
1721
1879
  removals=[],
1722
- wallet_id=wallet.id(),
1723
- sent_to=[],
1724
- trade_id=None,
1725
- type=uint32(TransactionType.OUTGOING_TX.value),
1726
- name=name,
1727
- memos={},
1728
- valid_times=ConditionValidTimes(),
1880
+ name=stolen_sb.name(),
1729
1881
  )
1730
1882
  [stolen_tx] = await wallet.wallet_state_manager.add_pending_transactions([stolen_tx])
1731
1883