chia-blockchain 2.5.1rc1__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 (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -0,0 +1,2600 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ from typing import Any, Union
5
+
6
+ import pytest
7
+ from chia_rs import G2Element
8
+
9
+ from chia._tests.conftest import SOFTFORK_HEIGHTS
10
+ from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
11
+ from chia._tests.util.get_name_puzzle_conditions import get_name_puzzle_conditions
12
+ from chia._tests.util.time_out_assert import time_out_assert
13
+ from chia._tests.wallet.vc_wallet.test_vc_wallet import mint_cr_cat
14
+ from chia.consensus.cost_calculator import NPCResult
15
+ from chia.consensus.default_constants import DEFAULT_CONSTANTS
16
+ from chia.full_node.bundle_tools import simple_solution_generator
17
+ from chia.rpc.wallet_request_types import VCAddProofs, VCGetList, VCGetProofsForRoot, VCMint, VCSpend
18
+ from chia.types.blockchain_format.program import INFINITE_COST, Program
19
+ from chia.types.blockchain_format.sized_bytes import bytes32
20
+ from chia.types.spend_bundle import SpendBundle
21
+ from chia.util.bech32m import encode_puzzle_hash
22
+ from chia.util.hash import std_hash
23
+ from chia.util.ints import uint32, uint64
24
+ from chia.wallet.cat_wallet.cat_wallet import CATWallet
25
+ from chia.wallet.conditions import CreateCoinAnnouncement, parse_conditions_non_consensus
26
+ from chia.wallet.did_wallet.did_wallet import DIDWallet
27
+ from chia.wallet.outer_puzzles import AssetType
28
+ from chia.wallet.puzzle_drivers import PuzzleInfo
29
+ from chia.wallet.trade_manager import TradeManager
30
+ from chia.wallet.trade_record import TradeRecord
31
+ from chia.wallet.trading.offer import Offer
32
+ from chia.wallet.trading.trade_status import TradeStatus
33
+ from chia.wallet.transaction_record import TransactionRecord
34
+ from chia.wallet.util.transaction_type import TransactionType
35
+ from chia.wallet.vc_wallet.cr_cat_drivers import ProofsChecker
36
+ from chia.wallet.vc_wallet.cr_cat_wallet import CRCATWallet
37
+ from chia.wallet.vc_wallet.vc_store import VCProofs
38
+ from chia.wallet.wallet_node import WalletNode
39
+ from chia.wallet.wallet_spend_bundle import WalletSpendBundle
40
+
41
+ OfferSummary = dict[Union[int, bytes32], int]
42
+
43
+
44
+ async def get_trade_and_status(trade_manager: TradeManager, trade: TradeRecord) -> TradeStatus:
45
+ trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
46
+ if trade_rec is not None:
47
+ return TradeStatus(trade_rec.status)
48
+ raise ValueError("Couldn't find the trade record")
49
+
50
+
51
+ # This deliberate parameterization may at first look like we're neglecting quite a few cases.
52
+ # However, active_softfork_height is only used is the case where we test aggregation.
53
+ # We do not test aggregation in a number of cases because it's not correlated with a lot of these parameters.
54
+ # So to avoid the overhead of start up for identical tests, we only change the softfork param for the tests that use it.
55
+ # To pin down the behavior that we intend to eventually deprecate, it only gets one test case.
56
+ @pytest.mark.anyio
57
+ @pytest.mark.parametrize(
58
+ "wallet_environments,credential_restricted,active_softfork_height",
59
+ [
60
+ (
61
+ {"num_environments": 2, "trusted": True, "blocks_needed": [1, 1], "reuse_puzhash": True},
62
+ True,
63
+ SOFTFORK_HEIGHTS[0],
64
+ ),
65
+ (
66
+ {"num_environments": 2, "trusted": True, "blocks_needed": [1, 1], "reuse_puzhash": True},
67
+ False,
68
+ SOFTFORK_HEIGHTS[0],
69
+ ),
70
+ (
71
+ {"num_environments": 2, "trusted": True, "blocks_needed": [1, 1], "reuse_puzhash": False},
72
+ True,
73
+ SOFTFORK_HEIGHTS[0],
74
+ ),
75
+ (
76
+ {"num_environments": 2, "trusted": False, "blocks_needed": [1, 1], "reuse_puzhash": True},
77
+ True,
78
+ SOFTFORK_HEIGHTS[0],
79
+ ),
80
+ (
81
+ {"num_environments": 2, "trusted": False, "blocks_needed": [1, 1], "reuse_puzhash": False},
82
+ False,
83
+ SOFTFORK_HEIGHTS[0],
84
+ ),
85
+ (
86
+ {"num_environments": 2, "trusted": False, "blocks_needed": [1, 1], "reuse_puzhash": True},
87
+ False,
88
+ SOFTFORK_HEIGHTS[0],
89
+ ),
90
+ (
91
+ {"num_environments": 2, "trusted": False, "blocks_needed": [1, 1], "reuse_puzhash": False},
92
+ True,
93
+ SOFTFORK_HEIGHTS[0],
94
+ ),
95
+ *(
96
+ ({"num_environments": 2, "trusted": True, "blocks_needed": [1, 1], "reuse_puzhash": False}, False, height)
97
+ for height in SOFTFORK_HEIGHTS
98
+ ),
99
+ ],
100
+ indirect=["wallet_environments"],
101
+ )
102
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
103
+ async def test_cat_trades(
104
+ wallet_environments: WalletTestFramework,
105
+ credential_restricted: bool,
106
+ active_softfork_height: uint32,
107
+ ) -> None:
108
+ # Setup
109
+ env_maker = wallet_environments.environments[0]
110
+ env_taker = wallet_environments.environments[1]
111
+ wallet_node_maker = env_maker.node
112
+ wallet_node_taker = env_taker.node
113
+ client_maker = env_maker.rpc_client
114
+ client_taker = env_taker.rpc_client
115
+ wallet_maker = env_maker.xch_wallet
116
+ wallet_taker = env_taker.xch_wallet
117
+ full_node = wallet_environments.full_node
118
+
119
+ trusted = len(wallet_node_maker.config["trusted_peers"]) > 0
120
+
121
+ # Because making/taking CR-CATs is asymetrical, approving the hacked together aggregation test will fail
122
+ # The taker is "making" offers that it is approving with a VC which multiple actual makers would never do
123
+ # This is really a test of CATOuterPuzzle anyways and is not correlated with any of our params
124
+ test_aggregation = not credential_restricted and not wallet_environments.tx_config.reuse_puzhash and trusted
125
+
126
+ # Create two new CATs, one in each wallet
127
+ if credential_restricted:
128
+ # Aliasing
129
+ env_maker.wallet_aliases = {
130
+ "xch": 1,
131
+ "did": 2,
132
+ "cat": 3,
133
+ "vc": 4,
134
+ "new cat": 5,
135
+ }
136
+ env_taker.wallet_aliases = {
137
+ "xch": 1,
138
+ "did": 2,
139
+ "new cat": 3,
140
+ "vc": 4,
141
+ "cat": 5,
142
+ }
143
+
144
+ # Mint some DIDs
145
+ async with wallet_maker.wallet_state_manager.new_action_scope(
146
+ wallet_environments.tx_config, push=True
147
+ ) as action_scope:
148
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
149
+ wallet_node_maker.wallet_state_manager,
150
+ wallet_maker,
151
+ uint64(1),
152
+ action_scope,
153
+ )
154
+ async with wallet_taker.wallet_state_manager.new_action_scope(
155
+ wallet_environments.tx_config, push=True
156
+ ) as action_scope:
157
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
158
+ wallet_node_taker.wallet_state_manager,
159
+ wallet_taker,
160
+ uint64(1),
161
+ action_scope,
162
+ )
163
+ did_id_maker = bytes32.from_hexstr(did_wallet_maker.get_my_DID())
164
+ did_id_taker = bytes32.from_hexstr(did_wallet_taker.get_my_DID())
165
+
166
+ # Mint some CR-CATs
167
+ tail_maker = Program.to([3, (1, "maker"), None, None])
168
+ tail_taker = Program.to([3, (1, "taker"), None, None])
169
+ proofs_checker_maker = ProofsChecker(["foo", "bar"])
170
+ proofs_checker_taker = ProofsChecker(["bar", "zap"])
171
+ authorized_providers: list[bytes32] = [did_id_maker, did_id_taker]
172
+ cat_wallet_maker: CATWallet = await CRCATWallet.get_or_create_wallet_for_cat(
173
+ wallet_node_maker.wallet_state_manager,
174
+ wallet_maker,
175
+ tail_maker.get_tree_hash().hex(),
176
+ None,
177
+ authorized_providers,
178
+ proofs_checker_maker,
179
+ )
180
+ new_cat_wallet_taker: CATWallet = await CRCATWallet.get_or_create_wallet_for_cat(
181
+ wallet_node_taker.wallet_state_manager,
182
+ wallet_taker,
183
+ tail_taker.get_tree_hash().hex(),
184
+ None,
185
+ authorized_providers,
186
+ proofs_checker_taker,
187
+ )
188
+ await mint_cr_cat(
189
+ 1,
190
+ wallet_maker,
191
+ wallet_node_maker,
192
+ client_maker,
193
+ full_node,
194
+ authorized_providers,
195
+ tail_maker,
196
+ proofs_checker_maker,
197
+ )
198
+ await mint_cr_cat(
199
+ 1,
200
+ wallet_taker,
201
+ wallet_node_taker,
202
+ client_taker,
203
+ full_node,
204
+ authorized_providers,
205
+ tail_taker,
206
+ proofs_checker_taker,
207
+ )
208
+
209
+ await wallet_environments.process_pending_states(
210
+ [
211
+ # Balance checking for this scenario is covered in tests/wallet/vc_wallet/test_vc_lifecycle
212
+ WalletStateTransition(
213
+ pre_block_balance_updates={
214
+ "xch": {"set_remainder": True},
215
+ "did": {"init": True, "set_remainder": True},
216
+ "cat": {"init": True, "set_remainder": True},
217
+ },
218
+ post_block_balance_updates={
219
+ "xch": {"set_remainder": True},
220
+ "did": {"set_remainder": True},
221
+ "cat": {"set_remainder": True},
222
+ },
223
+ ),
224
+ WalletStateTransition(
225
+ pre_block_balance_updates={
226
+ "xch": {"set_remainder": True},
227
+ "did": {"init": True, "set_remainder": True},
228
+ "new cat": {"init": True, "set_remainder": True},
229
+ },
230
+ post_block_balance_updates={
231
+ "xch": {"set_remainder": True},
232
+ "did": {"set_remainder": True},
233
+ "new cat": {"set_remainder": True},
234
+ },
235
+ ),
236
+ ]
237
+ )
238
+
239
+ # Mint some VCs that can spend the CR-CATs
240
+ vc_record_maker = (
241
+ await client_maker.vc_mint(
242
+ VCMint(
243
+ did_id=encode_puzzle_hash(did_id_maker, "did"),
244
+ target_address=encode_puzzle_hash(await wallet_maker.get_new_puzzlehash(), "txch"),
245
+ push=True,
246
+ ),
247
+ wallet_environments.tx_config,
248
+ )
249
+ ).vc_record
250
+ vc_record_taker = (
251
+ await client_taker.vc_mint(
252
+ VCMint(
253
+ did_id=encode_puzzle_hash(did_id_taker, "did"),
254
+ target_address=encode_puzzle_hash(await wallet_taker.get_new_puzzlehash(), "txch"),
255
+ push=True,
256
+ ),
257
+ wallet_environments.tx_config,
258
+ )
259
+ ).vc_record
260
+ await wallet_environments.process_pending_states(
261
+ [
262
+ # Balance checking for this scenario is covered in tests/wallet/vc_wallet/test_vc_lifecycle
263
+ WalletStateTransition(
264
+ pre_block_balance_updates={
265
+ "xch": {"set_remainder": True},
266
+ "vc": {"init": True, "set_remainder": True},
267
+ },
268
+ post_block_balance_updates={
269
+ "xch": {"set_remainder": True},
270
+ "vc": {"set_remainder": True},
271
+ },
272
+ ),
273
+ WalletStateTransition(
274
+ pre_block_balance_updates={
275
+ "xch": {"set_remainder": True},
276
+ "vc": {"init": True, "set_remainder": True},
277
+ },
278
+ post_block_balance_updates={
279
+ "xch": {"set_remainder": True},
280
+ "vc": {"set_remainder": True},
281
+ },
282
+ ),
283
+ ]
284
+ )
285
+
286
+ proofs_maker = VCProofs({"foo": "1", "bar": "1", "zap": "1"})
287
+ proof_root_maker: bytes32 = proofs_maker.root()
288
+ await client_maker.vc_spend(
289
+ VCSpend(
290
+ vc_id=vc_record_maker.vc.launcher_id,
291
+ new_proof_hash=proof_root_maker,
292
+ push=True,
293
+ ),
294
+ wallet_environments.tx_config,
295
+ )
296
+
297
+ proofs_taker = VCProofs({"foo": "1", "bar": "1", "zap": "1"})
298
+ proof_root_taker: bytes32 = proofs_taker.root()
299
+ await client_taker.vc_spend(
300
+ VCSpend(
301
+ vc_id=vc_record_taker.vc.launcher_id,
302
+ new_proof_hash=proof_root_taker,
303
+ push=True,
304
+ ),
305
+ wallet_environments.tx_config,
306
+ )
307
+ await wallet_environments.process_pending_states(
308
+ [
309
+ # Balance checking for this scenario is covered in tests/wallet/vc_wallet/test_vc_lifecycle
310
+ WalletStateTransition(
311
+ pre_block_balance_updates={
312
+ "did": {"set_remainder": True},
313
+ "vc": {"set_remainder": True},
314
+ },
315
+ post_block_balance_updates={
316
+ "did": {"set_remainder": True},
317
+ "vc": {"set_remainder": True},
318
+ },
319
+ ),
320
+ WalletStateTransition(
321
+ pre_block_balance_updates={
322
+ "did": {"set_remainder": True},
323
+ "vc": {"set_remainder": True},
324
+ },
325
+ post_block_balance_updates={
326
+ "did": {"set_remainder": True},
327
+ "vc": {"set_remainder": True},
328
+ },
329
+ ),
330
+ ]
331
+ )
332
+ else:
333
+ # Aliasing
334
+ env_maker.wallet_aliases = {
335
+ "xch": 1,
336
+ "cat": 2,
337
+ "new cat": 3,
338
+ }
339
+ env_taker.wallet_aliases = {
340
+ "xch": 1,
341
+ "new cat": 2,
342
+ "cat": 3,
343
+ }
344
+
345
+ # Mint some standard CATs
346
+ async with wallet_maker.wallet_state_manager.new_action_scope(
347
+ wallet_environments.tx_config, push=True
348
+ ) as action_scope:
349
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
350
+ wallet_node_maker.wallet_state_manager,
351
+ wallet_maker,
352
+ {"identifier": "genesis_by_id"},
353
+ uint64(100),
354
+ action_scope,
355
+ )
356
+
357
+ async with wallet_taker.wallet_state_manager.new_action_scope(
358
+ wallet_environments.tx_config, push=True
359
+ ) as action_scope:
360
+ new_cat_wallet_taker = await CATWallet.create_new_cat_wallet(
361
+ wallet_node_taker.wallet_state_manager,
362
+ wallet_taker,
363
+ {"identifier": "genesis_by_id"},
364
+ uint64(100),
365
+ action_scope,
366
+ )
367
+
368
+ await wallet_environments.process_pending_states(
369
+ [
370
+ # Balance checking for this scenario is covered in test_cat_wallet
371
+ WalletStateTransition(
372
+ pre_block_balance_updates={
373
+ "xch": {"set_remainder": True},
374
+ "cat": {"init": True, "set_remainder": True},
375
+ },
376
+ post_block_balance_updates={
377
+ "xch": {"set_remainder": True},
378
+ "cat": {"set_remainder": True},
379
+ },
380
+ ),
381
+ WalletStateTransition(
382
+ pre_block_balance_updates={
383
+ "xch": {"set_remainder": True},
384
+ "new cat": {"init": True, "set_remainder": True},
385
+ },
386
+ post_block_balance_updates={
387
+ "xch": {"set_remainder": True},
388
+ "new cat": {"set_remainder": True},
389
+ },
390
+ ),
391
+ ]
392
+ )
393
+
394
+ if credential_restricted:
395
+ await client_maker.vc_add_proofs(VCAddProofs.from_vc_proofs(proofs_maker))
396
+ assert (
397
+ await client_maker.vc_get_proofs_for_root(VCGetProofsForRoot(proof_root_maker))
398
+ ).to_vc_proofs().key_value_pairs == proofs_maker.key_value_pairs
399
+ get_list_reponse = await client_maker.vc_get_list(VCGetList())
400
+ assert len(get_list_reponse.vc_records) == 1
401
+ assert get_list_reponse.proof_dict[proof_root_maker] == proofs_maker.key_value_pairs
402
+
403
+ await client_taker.vc_add_proofs(VCAddProofs.from_vc_proofs(proofs_taker))
404
+ assert (
405
+ await client_taker.vc_get_proofs_for_root(VCGetProofsForRoot(proof_root_taker))
406
+ ).to_vc_proofs().key_value_pairs == proofs_taker.key_value_pairs
407
+ get_list_reponse = await client_taker.vc_get_list(VCGetList())
408
+ assert len(get_list_reponse.vc_records) == 1
409
+ assert get_list_reponse.proof_dict[proof_root_taker] == proofs_taker.key_value_pairs
410
+
411
+ # Add the taker's CAT to the maker's wallet
412
+ if credential_restricted:
413
+ new_cat_wallet_maker: CATWallet = await CRCATWallet.get_or_create_wallet_for_cat(
414
+ wallet_node_maker.wallet_state_manager,
415
+ wallet_maker,
416
+ new_cat_wallet_taker.get_asset_id(),
417
+ None,
418
+ authorized_providers,
419
+ proofs_checker_taker,
420
+ )
421
+ else:
422
+ new_cat_wallet_maker = await CATWallet.get_or_create_wallet_for_cat(
423
+ wallet_node_maker.wallet_state_manager, wallet_maker, new_cat_wallet_taker.get_asset_id()
424
+ )
425
+
426
+ await env_maker.change_balances(
427
+ {
428
+ "new cat": {
429
+ "init": True,
430
+ "confirmed_wallet_balance": 0,
431
+ "unconfirmed_wallet_balance": 0,
432
+ "spendable_balance": 0,
433
+ "pending_coin_removal_count": 0,
434
+ "pending_change": 0,
435
+ "max_send_amount": 0,
436
+ }
437
+ }
438
+ )
439
+ await env_maker.check_balances()
440
+
441
+ # Create the trade parameters
442
+ chia_for_cat: OfferSummary = {
443
+ wallet_maker.id(): -1,
444
+ bytes32.from_hexstr(new_cat_wallet_maker.get_asset_id()): 2, # This is the CAT that the taker made
445
+ }
446
+ cat_for_chia: OfferSummary = {
447
+ wallet_maker.id(): 3,
448
+ cat_wallet_maker.id(): -4, # The taker has no knowledge of this CAT yet
449
+ }
450
+ cat_for_cat: OfferSummary = {
451
+ bytes32.from_hexstr(cat_wallet_maker.get_asset_id()): -5,
452
+ new_cat_wallet_maker.id(): 6,
453
+ }
454
+ chia_for_multiple_cat: OfferSummary = {
455
+ wallet_maker.id(): -7,
456
+ cat_wallet_maker.id(): 8,
457
+ new_cat_wallet_maker.id(): 9,
458
+ }
459
+ multiple_cat_for_chia: OfferSummary = {
460
+ wallet_maker.id(): 10,
461
+ cat_wallet_maker.id(): -11,
462
+ new_cat_wallet_maker.id(): -12,
463
+ }
464
+ chia_and_cat_for_cat: OfferSummary = {
465
+ wallet_maker.id(): -13,
466
+ cat_wallet_maker.id(): -14,
467
+ new_cat_wallet_maker.id(): 15,
468
+ }
469
+
470
+ driver_dict: dict[bytes32, PuzzleInfo] = {}
471
+ for wallet in (cat_wallet_maker, new_cat_wallet_maker):
472
+ asset_id: str = wallet.get_asset_id()
473
+ driver_item: dict[str, Any] = {
474
+ "type": AssetType.CAT.value,
475
+ "tail": "0x" + asset_id,
476
+ }
477
+ if credential_restricted:
478
+ driver_item["also"] = {
479
+ "type": AssetType.CR.value,
480
+ "authorized_providers": ["0x" + provider.hex() for provider in authorized_providers],
481
+ "proofs_checker": (
482
+ proofs_checker_maker.as_program()
483
+ if wallet == cat_wallet_maker
484
+ else proofs_checker_taker.as_program()
485
+ ),
486
+ }
487
+ driver_dict[bytes32.from_hexstr(asset_id)] = PuzzleInfo(driver_item)
488
+
489
+ trade_manager_maker = env_maker.wallet_state_manager.trade_manager
490
+ trade_manager_taker = env_taker.wallet_state_manager.trade_manager
491
+ maker_unused_dr = await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
492
+ uint32(1)
493
+ )
494
+ assert maker_unused_dr is not None
495
+ maker_unused_index = maker_unused_dr.index
496
+ taker_unused_dr = await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
497
+ uint32(1)
498
+ )
499
+ assert taker_unused_dr is not None
500
+ taker_unused_index = taker_unused_dr.index
501
+ # Execute all of the trades
502
+ # chia_for_cat
503
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(
504
+ wallet_environments.tx_config, push=False
505
+ ) as action_scope:
506
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
507
+ chia_for_cat, action_scope, fee=uint64(1)
508
+ )
509
+ assert error is None
510
+ assert success is True
511
+ assert trade_make is not None
512
+
513
+ peer = wallet_node_taker.get_full_node_peer()
514
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
515
+ [Offer.from_bytes(trade_make.offer)]
516
+ )
517
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
518
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
519
+ ) as action_scope:
520
+ trade_take = await trade_manager_taker.respond_to_offer(
521
+ maker_offer,
522
+ peer,
523
+ action_scope,
524
+ fee=uint64(1),
525
+ )
526
+
527
+ if test_aggregation:
528
+ first_offer = Offer.from_bytes(trade_take.offer)
529
+
530
+ await wallet_environments.process_pending_states(
531
+ [
532
+ WalletStateTransition(
533
+ pre_block_balance_updates={
534
+ "xch": {
535
+ "pending_coin_removal_count": 1,
536
+ "<=#spendable_balance": -2,
537
+ "<=#max_send_amount": -2,
538
+ # Unconfirmed balance doesn't change because offer may not complete
539
+ "unconfirmed_wallet_balance": 0,
540
+ },
541
+ },
542
+ post_block_balance_updates={
543
+ "xch": {
544
+ "pending_coin_removal_count": -1,
545
+ "confirmed_wallet_balance": -2, # One for offered XCH, one for fee
546
+ "unconfirmed_wallet_balance": -2, # One for offered XCH, one for fee
547
+ ">#spendable_balance": 0,
548
+ ">#max_send_amount": 0,
549
+ },
550
+ "new cat": (
551
+ {
552
+ # No change if credential_restricted because pending approval balance needs to be claimed
553
+ "confirmed_wallet_balance": 0,
554
+ "unconfirmed_wallet_balance": 0,
555
+ "spendable_balance": 0,
556
+ "max_send_amount": 0,
557
+ "pending_change": 0,
558
+ "unspent_coin_count": 0,
559
+ }
560
+ if credential_restricted
561
+ else {
562
+ "confirmed_wallet_balance": 2,
563
+ "unconfirmed_wallet_balance": 2,
564
+ "spendable_balance": 2,
565
+ "max_send_amount": 2,
566
+ "unspent_coin_count": 1,
567
+ }
568
+ ),
569
+ },
570
+ post_block_additional_balance_info=(
571
+ {
572
+ "new cat": {
573
+ "pending_approval_balance": 2,
574
+ }
575
+ }
576
+ if credential_restricted
577
+ else {}
578
+ ),
579
+ ),
580
+ WalletStateTransition(
581
+ pre_block_balance_updates={
582
+ "xch": {
583
+ "pending_coin_removal_count": 1,
584
+ "<=#spendable_balance": -2,
585
+ "<=#max_send_amount": -2,
586
+ # Unconfirmed balance doesn't change because receiveing 1 XCH and spending 1 in fee
587
+ "unconfirmed_wallet_balance": 0,
588
+ ">=#pending_change": 1, # any amount increase
589
+ },
590
+ "new cat": {
591
+ "unconfirmed_wallet_balance": -2,
592
+ "pending_coin_removal_count": 1,
593
+ "pending_change": 98,
594
+ "<=#spendable_balance": -2,
595
+ "<=#max_send_amount": -2,
596
+ },
597
+ **(
598
+ {
599
+ "vc": {
600
+ "pending_coin_removal_count": 1,
601
+ }
602
+ }
603
+ if credential_restricted
604
+ else {}
605
+ ),
606
+ },
607
+ post_block_balance_updates={
608
+ "xch": {
609
+ "pending_coin_removal_count": -1,
610
+ "unspent_coin_count": 1,
611
+ ">#spendable_balance": 0,
612
+ ">#max_send_amount": 0,
613
+ # Confirmed balance doesn't change because receiveing 1 XCH and spending 1 in fee
614
+ "confirmed_wallet_balance": 0,
615
+ "<=#pending_change": 1, # any amount decrease
616
+ },
617
+ "new cat": {
618
+ "confirmed_wallet_balance": -2,
619
+ "pending_coin_removal_count": -1,
620
+ "pending_change": -98,
621
+ ">#spendable_balance": 0,
622
+ ">#max_send_amount": 0,
623
+ },
624
+ **(
625
+ {
626
+ "vc": {
627
+ "pending_coin_removal_count": -1,
628
+ }
629
+ }
630
+ if credential_restricted
631
+ else {}
632
+ ),
633
+ },
634
+ ),
635
+ ]
636
+ )
637
+
638
+ if credential_restricted:
639
+ await client_maker.crcat_approve_pending(
640
+ new_cat_wallet_maker.id(),
641
+ uint64(2),
642
+ wallet_environments.tx_config,
643
+ )
644
+
645
+ await wallet_environments.process_pending_states(
646
+ [
647
+ WalletStateTransition(
648
+ pre_block_balance_updates={
649
+ "new cat": {
650
+ "unconfirmed_wallet_balance": 2,
651
+ "pending_coin_removal_count": 1,
652
+ "pending_change": 2, # This is a little weird but fits the current definition
653
+ },
654
+ "vc": {
655
+ "pending_coin_removal_count": 1,
656
+ },
657
+ },
658
+ pre_block_additional_balance_info={
659
+ "new cat": {
660
+ "pending_approval_balance": 2,
661
+ }
662
+ },
663
+ post_block_balance_updates={
664
+ "new cat": {
665
+ "confirmed_wallet_balance": 2,
666
+ "spendable_balance": 2,
667
+ "max_send_amount": 2,
668
+ "pending_change": -2,
669
+ "unspent_coin_count": 1,
670
+ "pending_coin_removal_count": -1,
671
+ },
672
+ "vc": {
673
+ "pending_coin_removal_count": -1,
674
+ },
675
+ },
676
+ post_block_additional_balance_info={
677
+ "new cat": {
678
+ "pending_approval_balance": 0,
679
+ }
680
+ },
681
+ ),
682
+ WalletStateTransition(),
683
+ ]
684
+ )
685
+
686
+ if wallet_environments.tx_config.reuse_puzhash:
687
+ # Check if unused index changed
688
+ maker_unused_dr = await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
689
+ uint32(1)
690
+ )
691
+ assert maker_unused_dr is not None
692
+ assert maker_unused_index == maker_unused_dr.index
693
+ taker_unused_dr = await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
694
+ uint32(1)
695
+ )
696
+ assert taker_unused_dr is not None
697
+ assert taker_unused_index == taker_unused_dr.index
698
+ else:
699
+ maker_unused_dr = await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
700
+ uint32(1)
701
+ )
702
+ assert maker_unused_dr is not None
703
+ assert maker_unused_index < maker_unused_dr.index
704
+ taker_unused_dr = await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
705
+ uint32(1)
706
+ )
707
+ assert taker_unused_dr is not None
708
+ assert taker_unused_index < taker_unused_dr.index
709
+
710
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
711
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
712
+
713
+ async def assert_trade_tx_number(wallet_node: WalletNode, trade_id: bytes32, number: int) -> bool:
714
+ txs = await wallet_node.wallet_state_manager.tx_store.get_transactions_by_trade_id(trade_id)
715
+ return len(txs) == number
716
+
717
+ await time_out_assert(15, assert_trade_tx_number, True, wallet_node_maker, trade_make.trade_id, 1)
718
+ # CR-CATs will also have a TX record for the VC
719
+ await time_out_assert(
720
+ 15, assert_trade_tx_number, True, wallet_node_taker, trade_take.trade_id, 4 if credential_restricted else 3
721
+ )
722
+
723
+ # cat_for_chia
724
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(
725
+ wallet_environments.tx_config, push=False
726
+ ) as action_scope:
727
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(cat_for_chia, action_scope)
728
+ assert error is None
729
+ assert success is True
730
+ assert trade_make is not None
731
+
732
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
733
+ [Offer.from_bytes(trade_make.offer)]
734
+ )
735
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
736
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
737
+ ) as action_scope:
738
+ trade_take = await trade_manager_taker.respond_to_offer(
739
+ Offer.from_bytes(trade_make.offer),
740
+ peer,
741
+ action_scope,
742
+ fee=uint64(1),
743
+ )
744
+
745
+ # Testing a precious display bug real quick
746
+ xch_tx: TransactionRecord = next(tx for tx in action_scope.side_effects.transactions if tx.wallet_id == 1)
747
+ assert xch_tx.amount == 3
748
+ assert xch_tx.fee_amount == 1
749
+
750
+ await wallet_environments.process_pending_states(
751
+ [
752
+ WalletStateTransition(
753
+ pre_block_balance_updates={
754
+ "cat": {
755
+ "pending_coin_removal_count": 1,
756
+ "<=#spendable_balance": -4,
757
+ "<=#max_send_amount": -4,
758
+ # Unconfirmed balance doesn't change because offer may not complete
759
+ "unconfirmed_wallet_balance": 0,
760
+ },
761
+ },
762
+ post_block_balance_updates={
763
+ "xch": {
764
+ "confirmed_wallet_balance": 3,
765
+ "unconfirmed_wallet_balance": 3,
766
+ "spendable_balance": 3,
767
+ "max_send_amount": 3,
768
+ "unspent_coin_count": 1,
769
+ },
770
+ "cat": {
771
+ "confirmed_wallet_balance": -4,
772
+ "unconfirmed_wallet_balance": -4,
773
+ ">#spendable_balance": 0,
774
+ ">#max_send_amount": 0,
775
+ "pending_coin_removal_count": -1,
776
+ },
777
+ },
778
+ ),
779
+ WalletStateTransition(
780
+ pre_block_balance_updates={
781
+ "xch": {
782
+ "unconfirmed_wallet_balance": -4, # -3 for offer, -1 for fee
783
+ "<=#spendable_balance": -4,
784
+ "<=#max_send_amount": -4,
785
+ "pending_coin_removal_count": 1,
786
+ ">=#pending_change": 1, # any amount increase
787
+ },
788
+ "cat": {
789
+ "init": True,
790
+ "confirmed_wallet_balance": 0,
791
+ "unconfirmed_wallet_balance": 4,
792
+ "spendable_balance": 0,
793
+ "pending_change": 0,
794
+ "max_send_amount": 0,
795
+ "unspent_coin_count": 0,
796
+ "pending_coin_removal_count": 0,
797
+ },
798
+ **(
799
+ {
800
+ "vc": {
801
+ "pending_coin_removal_count": 1,
802
+ }
803
+ }
804
+ if credential_restricted
805
+ else {}
806
+ ),
807
+ },
808
+ post_block_balance_updates={
809
+ "xch": {
810
+ "confirmed_wallet_balance": -4,
811
+ ">#spendable_balance": 0,
812
+ ">#max_send_amount": 0,
813
+ "pending_coin_removal_count": -1,
814
+ "<=#pending_change": 1, # any amount decrease
815
+ },
816
+ "cat": {
817
+ "unspent_coin_count": 1,
818
+ "spendable_balance": 4,
819
+ "max_send_amount": 4,
820
+ "confirmed_wallet_balance": 4,
821
+ },
822
+ **(
823
+ {
824
+ "vc": {
825
+ "pending_coin_removal_count": -1,
826
+ }
827
+ }
828
+ if credential_restricted
829
+ else {}
830
+ ),
831
+ },
832
+ ),
833
+ ]
834
+ )
835
+
836
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
837
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
838
+ await time_out_assert(15, assert_trade_tx_number, True, wallet_node_maker, trade_make.trade_id, 1)
839
+ await time_out_assert(
840
+ 15, assert_trade_tx_number, True, wallet_node_taker, trade_take.trade_id, 3 if credential_restricted else 2
841
+ )
842
+
843
+ # cat_for_cat
844
+ maker_unused_dr = await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
845
+ uint32(1)
846
+ )
847
+ assert maker_unused_dr is not None
848
+ maker_unused_index = maker_unused_dr.index
849
+ taker_unused_dr = await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
850
+ uint32(1)
851
+ )
852
+ assert taker_unused_dr is not None
853
+ taker_unused_index = taker_unused_dr.index
854
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(
855
+ wallet_environments.tx_config, push=False
856
+ ) as action_scope:
857
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(cat_for_cat, action_scope)
858
+ assert error is None
859
+ assert success is True
860
+ assert trade_make is not None
861
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
862
+ [Offer.from_bytes(trade_make.offer)]
863
+ )
864
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
865
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
866
+ ) as action_scope:
867
+ trade_take = await trade_manager_taker.respond_to_offer(
868
+ Offer.from_bytes(trade_make.offer),
869
+ peer,
870
+ action_scope,
871
+ )
872
+
873
+ if test_aggregation:
874
+ second_offer = Offer.from_bytes(trade_take.offer)
875
+
876
+ await wallet_environments.process_pending_states(
877
+ [
878
+ WalletStateTransition(
879
+ pre_block_balance_updates={
880
+ "cat": {
881
+ "pending_coin_removal_count": 1,
882
+ "<=#spendable_balance": -5,
883
+ "<=#max_send_amount": -5,
884
+ # Unconfirmed balance doesn't change because offer may not complete
885
+ "unconfirmed_wallet_balance": 0,
886
+ },
887
+ },
888
+ post_block_balance_updates={
889
+ "new cat": (
890
+ {
891
+ # No change if credential_restricted because pending approval balance needs to be claimed
892
+ "confirmed_wallet_balance": 0,
893
+ "unconfirmed_wallet_balance": 0,
894
+ "spendable_balance": 0,
895
+ "max_send_amount": 0,
896
+ "unspent_coin_count": 0,
897
+ }
898
+ if credential_restricted
899
+ else {
900
+ "confirmed_wallet_balance": 6,
901
+ "unconfirmed_wallet_balance": 6,
902
+ "spendable_balance": 6,
903
+ "max_send_amount": 6,
904
+ "unspent_coin_count": 1,
905
+ }
906
+ ),
907
+ "cat": {
908
+ "confirmed_wallet_balance": -5,
909
+ "unconfirmed_wallet_balance": -5,
910
+ ">#spendable_balance": 0,
911
+ ">#max_send_amount": 0,
912
+ "pending_coin_removal_count": -1,
913
+ },
914
+ },
915
+ post_block_additional_balance_info=(
916
+ {
917
+ "new cat": {
918
+ "pending_approval_balance": 6,
919
+ }
920
+ }
921
+ if credential_restricted
922
+ else {}
923
+ ),
924
+ ),
925
+ WalletStateTransition(
926
+ pre_block_balance_updates={
927
+ "cat": {
928
+ "unconfirmed_wallet_balance": 5,
929
+ },
930
+ "new cat": {
931
+ "unconfirmed_wallet_balance": -6,
932
+ "pending_change": 92,
933
+ "<=#spendable_balance": -6,
934
+ "<=#max_send_amount": -6,
935
+ "pending_coin_removal_count": 1,
936
+ },
937
+ **(
938
+ {
939
+ "vc": {
940
+ "pending_coin_removal_count": 1,
941
+ }
942
+ }
943
+ if credential_restricted
944
+ else {}
945
+ ),
946
+ },
947
+ post_block_balance_updates={
948
+ "cat": {
949
+ "unspent_coin_count": 1,
950
+ "spendable_balance": 5,
951
+ "max_send_amount": 5,
952
+ "confirmed_wallet_balance": 5,
953
+ },
954
+ "new cat": {
955
+ "confirmed_wallet_balance": -6,
956
+ "pending_change": -92,
957
+ ">#spendable_balance": 0,
958
+ ">#max_send_amount": 0,
959
+ "pending_coin_removal_count": -1,
960
+ },
961
+ **(
962
+ {
963
+ "vc": {
964
+ "pending_coin_removal_count": -1,
965
+ }
966
+ }
967
+ if credential_restricted
968
+ else {}
969
+ ),
970
+ },
971
+ ),
972
+ ]
973
+ )
974
+
975
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
976
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
977
+
978
+ if credential_restricted:
979
+ await client_maker.crcat_approve_pending(
980
+ new_cat_wallet_maker.id(),
981
+ uint64(6),
982
+ wallet_environments.tx_config,
983
+ )
984
+
985
+ await wallet_environments.process_pending_states(
986
+ [
987
+ WalletStateTransition(
988
+ pre_block_balance_updates={
989
+ "new cat": {
990
+ "unconfirmed_wallet_balance": 6,
991
+ "pending_coin_removal_count": 1,
992
+ "pending_change": 6, # This is a little weird but fits the current definition
993
+ },
994
+ "vc": {
995
+ "pending_coin_removal_count": 1,
996
+ },
997
+ },
998
+ pre_block_additional_balance_info={
999
+ "new cat": {
1000
+ "pending_approval_balance": 6,
1001
+ }
1002
+ },
1003
+ post_block_balance_updates={
1004
+ "new cat": {
1005
+ "confirmed_wallet_balance": 6,
1006
+ "spendable_balance": 6,
1007
+ "max_send_amount": 6,
1008
+ "pending_change": -6,
1009
+ "unspent_coin_count": 1,
1010
+ "pending_coin_removal_count": -1,
1011
+ },
1012
+ "vc": {
1013
+ "pending_coin_removal_count": -1,
1014
+ },
1015
+ },
1016
+ post_block_additional_balance_info={
1017
+ "new cat": {
1018
+ "pending_approval_balance": 0,
1019
+ }
1020
+ },
1021
+ ),
1022
+ WalletStateTransition(),
1023
+ ]
1024
+ )
1025
+
1026
+ if wallet_environments.tx_config.reuse_puzhash:
1027
+ # Check if unused index changed
1028
+ maker_unused_dr = await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
1029
+ uint32(1)
1030
+ )
1031
+ assert maker_unused_dr is not None
1032
+ assert maker_unused_index == maker_unused_dr.index
1033
+ taker_unused_dr = await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
1034
+ uint32(1)
1035
+ )
1036
+ assert taker_unused_dr is not None
1037
+ assert taker_unused_index == taker_unused_dr.index
1038
+ else:
1039
+ maker_unused_dr = await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
1040
+ uint32(1)
1041
+ )
1042
+ assert maker_unused_dr is not None
1043
+ assert maker_unused_index < maker_unused_dr.index
1044
+ taker_unused_dr = await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(
1045
+ uint32(1)
1046
+ )
1047
+ assert taker_unused_dr is not None
1048
+ assert taker_unused_index < taker_unused_dr.index
1049
+
1050
+ # chia_for_multiple_cat
1051
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(
1052
+ wallet_environments.tx_config, push=False
1053
+ ) as action_scope:
1054
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1055
+ chia_for_multiple_cat,
1056
+ action_scope,
1057
+ driver_dict=driver_dict,
1058
+ )
1059
+ assert error is None
1060
+ assert success is True
1061
+ assert trade_make is not None
1062
+
1063
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
1064
+ [Offer.from_bytes(trade_make.offer)]
1065
+ )
1066
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1067
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
1068
+ ) as action_scope:
1069
+ trade_take = await trade_manager_taker.respond_to_offer(
1070
+ Offer.from_bytes(trade_make.offer),
1071
+ peer,
1072
+ action_scope,
1073
+ )
1074
+
1075
+ if test_aggregation:
1076
+ third_offer = Offer.from_bytes(trade_take.offer)
1077
+
1078
+ await wallet_environments.process_pending_states(
1079
+ [
1080
+ WalletStateTransition(
1081
+ pre_block_balance_updates={
1082
+ "xch": {
1083
+ "pending_coin_removal_count": 1,
1084
+ "<=#spendable_balance": -7,
1085
+ "<=#max_send_amount": -7,
1086
+ # Unconfirmed balance doesn't change because offer may not complete
1087
+ "unconfirmed_wallet_balance": 0,
1088
+ },
1089
+ },
1090
+ post_block_balance_updates={
1091
+ "xch": {
1092
+ "pending_coin_removal_count": -1,
1093
+ ">#spendable_balance": 0,
1094
+ ">#max_send_amount": 0,
1095
+ "unconfirmed_wallet_balance": -7,
1096
+ "confirmed_wallet_balance": -7,
1097
+ },
1098
+ "cat": (
1099
+ {
1100
+ # No change if credential_restricted because pending approval balance needs to be claimed
1101
+ "confirmed_wallet_balance": 0,
1102
+ "unconfirmed_wallet_balance": 0,
1103
+ "spendable_balance": 0,
1104
+ "max_send_amount": 0,
1105
+ "unspent_coin_count": 0,
1106
+ }
1107
+ if credential_restricted
1108
+ else {
1109
+ "confirmed_wallet_balance": 8,
1110
+ "unconfirmed_wallet_balance": 8,
1111
+ "spendable_balance": 8,
1112
+ "max_send_amount": 8,
1113
+ "unspent_coin_count": 1,
1114
+ }
1115
+ ),
1116
+ "new cat": (
1117
+ {
1118
+ # No change if credential_restricted because pending approval balance needs to be claimed
1119
+ "confirmed_wallet_balance": 0,
1120
+ "unconfirmed_wallet_balance": 0,
1121
+ "spendable_balance": 0,
1122
+ "max_send_amount": 0,
1123
+ "unspent_coin_count": 0,
1124
+ }
1125
+ if credential_restricted
1126
+ else {
1127
+ "confirmed_wallet_balance": 9,
1128
+ "unconfirmed_wallet_balance": 9,
1129
+ "spendable_balance": 9,
1130
+ "max_send_amount": 9,
1131
+ "unspent_coin_count": 1,
1132
+ }
1133
+ ),
1134
+ },
1135
+ post_block_additional_balance_info=(
1136
+ {
1137
+ "cat": {
1138
+ "pending_approval_balance": 8,
1139
+ },
1140
+ "new cat": {
1141
+ "pending_approval_balance": 9,
1142
+ },
1143
+ }
1144
+ if credential_restricted
1145
+ else {}
1146
+ ),
1147
+ ),
1148
+ WalletStateTransition(
1149
+ pre_block_balance_updates={
1150
+ "xch": {
1151
+ "unconfirmed_wallet_balance": 7,
1152
+ },
1153
+ "cat": {
1154
+ "unconfirmed_wallet_balance": -8,
1155
+ "pending_change": 1,
1156
+ "<=#spendable_balance": -8,
1157
+ "<=#max_send_amount": -8,
1158
+ "pending_coin_removal_count": 2, # For the first time, we're using two coins in an offer
1159
+ },
1160
+ "new cat": {
1161
+ "unconfirmed_wallet_balance": -9,
1162
+ "pending_change": 83,
1163
+ "<=#spendable_balance": -9,
1164
+ "<=#max_send_amount": -9,
1165
+ "pending_coin_removal_count": 1,
1166
+ },
1167
+ **(
1168
+ {
1169
+ "vc": {
1170
+ "pending_coin_removal_count": 1,
1171
+ }
1172
+ }
1173
+ if credential_restricted
1174
+ else {}
1175
+ ),
1176
+ },
1177
+ post_block_balance_updates={
1178
+ "xch": {
1179
+ "confirmed_wallet_balance": 7,
1180
+ "spendable_balance": 7,
1181
+ "max_send_amount": 7,
1182
+ "unspent_coin_count": 1,
1183
+ },
1184
+ "cat": {
1185
+ "confirmed_wallet_balance": -8,
1186
+ "pending_change": -1,
1187
+ ">#spendable_balance": 0,
1188
+ ">#max_send_amount": 0,
1189
+ "pending_coin_removal_count": -2,
1190
+ "unspent_coin_count": -1,
1191
+ },
1192
+ "new cat": {
1193
+ "confirmed_wallet_balance": -9,
1194
+ "pending_change": -83,
1195
+ ">#spendable_balance": 0,
1196
+ ">#max_send_amount": 0,
1197
+ "pending_coin_removal_count": -1,
1198
+ },
1199
+ **(
1200
+ {
1201
+ "vc": {
1202
+ "pending_coin_removal_count": -1,
1203
+ }
1204
+ }
1205
+ if credential_restricted
1206
+ else {}
1207
+ ),
1208
+ },
1209
+ ),
1210
+ ]
1211
+ )
1212
+
1213
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
1214
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
1215
+
1216
+ if credential_restricted:
1217
+ await client_maker.crcat_approve_pending(
1218
+ cat_wallet_maker.id(),
1219
+ uint64(8),
1220
+ wallet_environments.tx_config,
1221
+ )
1222
+
1223
+ await wallet_environments.process_pending_states(
1224
+ [
1225
+ WalletStateTransition(
1226
+ pre_block_balance_updates={
1227
+ "cat": {
1228
+ "unconfirmed_wallet_balance": 8,
1229
+ "pending_coin_removal_count": 1,
1230
+ "pending_change": 8, # This is a little weird but fits the current definition
1231
+ },
1232
+ "vc": {
1233
+ "pending_coin_removal_count": 1,
1234
+ },
1235
+ },
1236
+ pre_block_additional_balance_info={
1237
+ "cat": {
1238
+ "pending_approval_balance": 8,
1239
+ },
1240
+ },
1241
+ post_block_balance_updates={
1242
+ "cat": {
1243
+ "confirmed_wallet_balance": 8,
1244
+ "spendable_balance": 8,
1245
+ "max_send_amount": 8,
1246
+ "pending_change": -8,
1247
+ "unspent_coin_count": 1,
1248
+ "pending_coin_removal_count": -1,
1249
+ },
1250
+ "vc": {
1251
+ "pending_coin_removal_count": -1,
1252
+ },
1253
+ },
1254
+ post_block_additional_balance_info={
1255
+ "cat": {
1256
+ "pending_approval_balance": 0,
1257
+ },
1258
+ },
1259
+ ),
1260
+ WalletStateTransition(),
1261
+ ]
1262
+ )
1263
+
1264
+ await client_maker.crcat_approve_pending(
1265
+ new_cat_wallet_maker.id(),
1266
+ uint64(9),
1267
+ wallet_environments.tx_config,
1268
+ )
1269
+
1270
+ await wallet_environments.process_pending_states(
1271
+ [
1272
+ WalletStateTransition(
1273
+ pre_block_balance_updates={
1274
+ "new cat": {
1275
+ "unconfirmed_wallet_balance": 9,
1276
+ "pending_coin_removal_count": 1,
1277
+ "pending_change": 9, # This is a little weird but fits the current definition
1278
+ },
1279
+ "vc": {
1280
+ "pending_coin_removal_count": 1,
1281
+ },
1282
+ },
1283
+ pre_block_additional_balance_info={
1284
+ "new cat": {
1285
+ "pending_approval_balance": 9,
1286
+ }
1287
+ },
1288
+ post_block_balance_updates={
1289
+ "new cat": {
1290
+ "confirmed_wallet_balance": 9,
1291
+ "spendable_balance": 9,
1292
+ "max_send_amount": 9,
1293
+ "pending_change": -9,
1294
+ "unspent_coin_count": 1,
1295
+ "pending_coin_removal_count": -1,
1296
+ },
1297
+ "vc": {
1298
+ "pending_coin_removal_count": -1,
1299
+ },
1300
+ },
1301
+ post_block_additional_balance_info={
1302
+ "new cat": {
1303
+ "pending_approval_balance": 0,
1304
+ }
1305
+ },
1306
+ ),
1307
+ WalletStateTransition(),
1308
+ ]
1309
+ )
1310
+
1311
+ # multiple_cat_for_chia
1312
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(
1313
+ wallet_environments.tx_config, push=False
1314
+ ) as action_scope:
1315
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1316
+ multiple_cat_for_chia,
1317
+ action_scope,
1318
+ )
1319
+ assert error is None
1320
+ assert success is True
1321
+ assert trade_make is not None
1322
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
1323
+ [Offer.from_bytes(trade_make.offer)]
1324
+ )
1325
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1326
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
1327
+ ) as action_scope:
1328
+ trade_take = await trade_manager_taker.respond_to_offer(
1329
+ Offer.from_bytes(trade_make.offer),
1330
+ peer,
1331
+ action_scope,
1332
+ )
1333
+
1334
+ if test_aggregation:
1335
+ fourth_offer = Offer.from_bytes(trade_take.offer)
1336
+
1337
+ await wallet_environments.process_pending_states(
1338
+ [
1339
+ WalletStateTransition(
1340
+ pre_block_balance_updates={
1341
+ "cat": {
1342
+ "pending_coin_removal_count": 1,
1343
+ "<=#spendable_balance": -11,
1344
+ "<=#max_send_amount": -11,
1345
+ # Unconfirmed balance doesn't change because offer may not complete
1346
+ "unconfirmed_wallet_balance": 0,
1347
+ },
1348
+ "new cat": {
1349
+ "pending_coin_removal_count": 2,
1350
+ "<=#spendable_balance": -12,
1351
+ "<=#max_send_amount": -12,
1352
+ # Unconfirmed balance doesn't change because offer may not complete
1353
+ "unconfirmed_wallet_balance": 0,
1354
+ },
1355
+ },
1356
+ post_block_balance_updates={
1357
+ "xch": {
1358
+ "confirmed_wallet_balance": 10,
1359
+ "unconfirmed_wallet_balance": 10,
1360
+ "spendable_balance": 10,
1361
+ "max_send_amount": 10,
1362
+ "unspent_coin_count": 1,
1363
+ },
1364
+ "cat": {
1365
+ "pending_coin_removal_count": -1,
1366
+ ">#spendable_balance": 0,
1367
+ ">#max_send_amount": 0,
1368
+ "unconfirmed_wallet_balance": -11,
1369
+ "confirmed_wallet_balance": -11,
1370
+ },
1371
+ "new cat": {
1372
+ "pending_coin_removal_count": -2,
1373
+ ">#spendable_balance": 0,
1374
+ ">#max_send_amount": 0,
1375
+ "unconfirmed_wallet_balance": -12,
1376
+ "confirmed_wallet_balance": -12,
1377
+ "unspent_coin_count": -1,
1378
+ },
1379
+ },
1380
+ ),
1381
+ WalletStateTransition(
1382
+ pre_block_balance_updates={
1383
+ "xch": {
1384
+ "unconfirmed_wallet_balance": -10,
1385
+ "<=#spendable_balance": -10,
1386
+ "<=#max_send_amount": -10,
1387
+ "pending_coin_removal_count": 1,
1388
+ ">=#pending_change": 1, # any amount increase
1389
+ },
1390
+ "cat": {
1391
+ "unconfirmed_wallet_balance": 11,
1392
+ },
1393
+ "new cat": {
1394
+ "unconfirmed_wallet_balance": 12,
1395
+ },
1396
+ **(
1397
+ {
1398
+ "vc": {
1399
+ "pending_coin_removal_count": 1,
1400
+ }
1401
+ }
1402
+ if credential_restricted
1403
+ else {}
1404
+ ),
1405
+ },
1406
+ post_block_balance_updates={
1407
+ "xch": {
1408
+ "confirmed_wallet_balance": -10,
1409
+ ">#spendable_balance": 0,
1410
+ ">#max_send_amount": 0,
1411
+ "pending_coin_removal_count": -1,
1412
+ "<=#pending_change": 1, # any amount increase
1413
+ },
1414
+ "cat": {
1415
+ "confirmed_wallet_balance": 11,
1416
+ "spendable_balance": 11,
1417
+ "max_send_amount": 11,
1418
+ "unspent_coin_count": 1,
1419
+ },
1420
+ "new cat": {
1421
+ "confirmed_wallet_balance": 12,
1422
+ "spendable_balance": 12,
1423
+ "max_send_amount": 12,
1424
+ "unspent_coin_count": 1,
1425
+ },
1426
+ **(
1427
+ {
1428
+ "vc": {
1429
+ "pending_coin_removal_count": -1,
1430
+ }
1431
+ }
1432
+ if credential_restricted
1433
+ else {}
1434
+ ),
1435
+ },
1436
+ ),
1437
+ ]
1438
+ )
1439
+
1440
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
1441
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
1442
+
1443
+ # chia_and_cat_for_cat
1444
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(
1445
+ wallet_environments.tx_config, push=False
1446
+ ) as action_scope:
1447
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1448
+ chia_and_cat_for_cat,
1449
+ action_scope,
1450
+ )
1451
+ assert error is None
1452
+ assert success is True
1453
+ assert trade_make is not None
1454
+
1455
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
1456
+ [Offer.from_bytes(trade_make.offer)]
1457
+ )
1458
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1459
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
1460
+ ) as action_scope:
1461
+ trade_take = await trade_manager_taker.respond_to_offer(
1462
+ Offer.from_bytes(trade_make.offer),
1463
+ peer,
1464
+ action_scope,
1465
+ )
1466
+
1467
+ if test_aggregation:
1468
+ fifth_offer = Offer.from_bytes(trade_take.offer)
1469
+
1470
+ await wallet_environments.process_pending_states(
1471
+ [
1472
+ WalletStateTransition(
1473
+ pre_block_balance_updates={
1474
+ "xch": {
1475
+ "pending_coin_removal_count": 2,
1476
+ "<=#spendable_balance": -13,
1477
+ "<=#max_send_amount": -13,
1478
+ # Unconfirmed balance doesn't change because offer may not complete
1479
+ "unconfirmed_wallet_balance": 0,
1480
+ },
1481
+ "cat": {
1482
+ "pending_coin_removal_count": 1,
1483
+ "<=#spendable_balance": -14,
1484
+ "<=#max_send_amount": -14,
1485
+ # Unconfirmed balance doesn't change because offer may not complete
1486
+ "unconfirmed_wallet_balance": 0,
1487
+ },
1488
+ },
1489
+ post_block_balance_updates={
1490
+ "xch": {
1491
+ "confirmed_wallet_balance": -13,
1492
+ "unconfirmed_wallet_balance": -13,
1493
+ ">=#spendable_balance": 0,
1494
+ ">=#max_send_amount": 0,
1495
+ "unspent_coin_count": -2,
1496
+ "pending_coin_removal_count": -2,
1497
+ },
1498
+ "cat": {
1499
+ "pending_coin_removal_count": -1,
1500
+ ">=#spendable_balance": 0,
1501
+ ">=#max_send_amount": 0,
1502
+ "unconfirmed_wallet_balance": -14,
1503
+ "confirmed_wallet_balance": -14,
1504
+ },
1505
+ "new cat": (
1506
+ {
1507
+ "spendable_balance": 0,
1508
+ "max_send_amount": 0,
1509
+ "unconfirmed_wallet_balance": 0,
1510
+ "confirmed_wallet_balance": 0,
1511
+ "unspent_coin_count": 0,
1512
+ }
1513
+ if credential_restricted
1514
+ else {
1515
+ "spendable_balance": 15,
1516
+ "max_send_amount": 15,
1517
+ "unconfirmed_wallet_balance": 15,
1518
+ "confirmed_wallet_balance": 15,
1519
+ "unspent_coin_count": 1,
1520
+ }
1521
+ ),
1522
+ },
1523
+ ),
1524
+ WalletStateTransition(
1525
+ pre_block_balance_updates={
1526
+ "xch": {
1527
+ "unconfirmed_wallet_balance": 13,
1528
+ },
1529
+ "cat": {
1530
+ "unconfirmed_wallet_balance": 14,
1531
+ },
1532
+ "new cat": {
1533
+ "unconfirmed_wallet_balance": -15,
1534
+ "pending_change": 68,
1535
+ "<=#spendable_balance": -15,
1536
+ "<=#max_send_amount": -15,
1537
+ "pending_coin_removal_count": 1,
1538
+ },
1539
+ **(
1540
+ {
1541
+ "vc": {
1542
+ "pending_coin_removal_count": 1,
1543
+ }
1544
+ }
1545
+ if credential_restricted
1546
+ else {}
1547
+ ),
1548
+ },
1549
+ post_block_balance_updates={
1550
+ "xch": {
1551
+ "confirmed_wallet_balance": 13,
1552
+ "spendable_balance": 13,
1553
+ "max_send_amount": 13,
1554
+ "unspent_coin_count": 1,
1555
+ },
1556
+ "cat": {
1557
+ "confirmed_wallet_balance": 14,
1558
+ "spendable_balance": 14,
1559
+ "max_send_amount": 14,
1560
+ "unspent_coin_count": 1,
1561
+ },
1562
+ "new cat": {
1563
+ "confirmed_wallet_balance": -15,
1564
+ "pending_change": -68,
1565
+ ">#spendable_balance": 0,
1566
+ ">#max_send_amount": 0,
1567
+ "pending_coin_removal_count": -1,
1568
+ },
1569
+ **(
1570
+ {
1571
+ "vc": {
1572
+ "pending_coin_removal_count": -1,
1573
+ }
1574
+ }
1575
+ if credential_restricted
1576
+ else {}
1577
+ ),
1578
+ },
1579
+ ),
1580
+ ]
1581
+ )
1582
+
1583
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
1584
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
1585
+
1586
+ if credential_restricted:
1587
+ await client_maker.crcat_approve_pending(
1588
+ new_cat_wallet_maker.id(),
1589
+ uint64(15),
1590
+ wallet_environments.tx_config,
1591
+ )
1592
+
1593
+ await wallet_environments.process_pending_states(
1594
+ [
1595
+ WalletStateTransition(
1596
+ pre_block_balance_updates={
1597
+ "new cat": {
1598
+ "unconfirmed_wallet_balance": 15,
1599
+ "pending_coin_removal_count": 1,
1600
+ "pending_change": 15, # This is a little weird but fits the current definition
1601
+ },
1602
+ "vc": {
1603
+ "pending_coin_removal_count": 1,
1604
+ },
1605
+ },
1606
+ pre_block_additional_balance_info={
1607
+ "new cat": {
1608
+ "pending_approval_balance": 15,
1609
+ }
1610
+ },
1611
+ post_block_balance_updates={
1612
+ "new cat": {
1613
+ "confirmed_wallet_balance": 15,
1614
+ "spendable_balance": 15,
1615
+ "max_send_amount": 15,
1616
+ "pending_change": -15,
1617
+ "unspent_coin_count": 1,
1618
+ "pending_coin_removal_count": -1,
1619
+ },
1620
+ "vc": {
1621
+ "pending_coin_removal_count": -1,
1622
+ },
1623
+ },
1624
+ post_block_additional_balance_info={
1625
+ "new cat": {
1626
+ "pending_approval_balance": 0,
1627
+ }
1628
+ },
1629
+ ),
1630
+ WalletStateTransition(),
1631
+ ]
1632
+ )
1633
+
1634
+ if test_aggregation:
1635
+ # This tests an edge case where aggregated offers the include > 2 of the same kind of CAT
1636
+ # (and therefore are solved as a complete ring)
1637
+ bundle = Offer.aggregate([first_offer, second_offer, third_offer, fourth_offer, fifth_offer]).to_valid_spend()
1638
+ program = simple_solution_generator(bundle)
1639
+ result: NPCResult = get_name_puzzle_conditions(
1640
+ program, INFINITE_COST, mempool_mode=True, height=active_softfork_height, constants=DEFAULT_CONSTANTS
1641
+ )
1642
+ assert result.error is None
1643
+
1644
+
1645
+ @pytest.mark.parametrize(
1646
+ "wallet_environments",
1647
+ [
1648
+ {
1649
+ "num_environments": 2,
1650
+ "blocks_needed": [2, 1],
1651
+ }
1652
+ ],
1653
+ indirect=True,
1654
+ )
1655
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
1656
+ @pytest.mark.anyio
1657
+ async def test_trade_cancellation(wallet_environments: WalletTestFramework) -> None:
1658
+ env_maker = wallet_environments.environments[0]
1659
+ env_taker = wallet_environments.environments[1]
1660
+
1661
+ env_maker.wallet_aliases = {
1662
+ "xch": 1,
1663
+ "cat": 2,
1664
+ }
1665
+ env_taker.wallet_aliases = {
1666
+ "xch": 1,
1667
+ "cat": 2,
1668
+ }
1669
+
1670
+ xch_to_cat_amount = uint64(100)
1671
+
1672
+ async with env_maker.wallet_state_manager.new_action_scope(
1673
+ wallet_environments.tx_config, push=True
1674
+ ) as action_scope:
1675
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
1676
+ env_maker.wallet_state_manager,
1677
+ env_maker.xch_wallet,
1678
+ {"identifier": "genesis_by_id"},
1679
+ xch_to_cat_amount,
1680
+ action_scope,
1681
+ )
1682
+
1683
+ await wallet_environments.process_pending_states(
1684
+ [
1685
+ # tests in test_cat_wallet.py
1686
+ WalletStateTransition(
1687
+ pre_block_balance_updates={
1688
+ "xch": {"set_remainder": True},
1689
+ "cat": {"init": True, "set_remainder": True},
1690
+ },
1691
+ post_block_balance_updates={
1692
+ "xch": {"set_remainder": True},
1693
+ "cat": {"set_remainder": True},
1694
+ },
1695
+ ),
1696
+ WalletStateTransition(),
1697
+ ]
1698
+ )
1699
+
1700
+ cat_for_chia: OfferSummary = {
1701
+ env_maker.wallet_aliases["xch"]: 1,
1702
+ env_maker.wallet_aliases["cat"]: -2,
1703
+ }
1704
+
1705
+ chia_for_cat: OfferSummary = {
1706
+ env_maker.wallet_aliases["xch"]: -3,
1707
+ env_maker.wallet_aliases["cat"]: 4,
1708
+ }
1709
+
1710
+ trade_manager_maker = env_maker.wallet_state_manager.trade_manager
1711
+ trade_manager_taker = env_taker.wallet_state_manager.trade_manager
1712
+
1713
+ async with env_maker.wallet_state_manager.new_action_scope(
1714
+ wallet_environments.tx_config, push=False
1715
+ ) as action_scope:
1716
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(cat_for_chia, action_scope)
1717
+ assert error is None
1718
+ assert success is True
1719
+ assert trade_make is not None
1720
+
1721
+ # Cancelling the trade and trying an ID that doesn't exist just in case
1722
+ async with env_maker.wallet_state_manager.new_action_scope(
1723
+ wallet_environments.tx_config, push=False
1724
+ ) as action_scope:
1725
+ await trade_manager_maker.cancel_pending_offers(
1726
+ [trade_make.trade_id, bytes32.zeros], action_scope, secure=False
1727
+ )
1728
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
1729
+
1730
+ # Due to current mempool rules, trying to force a take out of the mempool with a cancel will not work.
1731
+ # Uncomment this when/if it does
1732
+
1733
+ # [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
1734
+ # [Offer.from_bytes(trade_make.offer)]
1735
+ # )
1736
+ # trade_take = await trade_manager_taker.respond_to_offer(
1737
+ # maker_offer,
1738
+ # )
1739
+ # tx_records = await wallet_taker.wallet_state_manager.add_pending_transactions(
1740
+ # action_scope.side_effects.transactions,
1741
+ # additional_signing_responses=signing_response,
1742
+ # )
1743
+ # await time_out_assert(15, full_node.txs_in_mempool, True, tx_records)
1744
+ # assert trade_take is not None
1745
+ # assert tx_records is not None
1746
+ # await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CONFIRM, trade_manager_taker, trade_take)
1747
+ # await time_out_assert(
1748
+ # 15,
1749
+ # full_node.tx_id_in_mempool,
1750
+ # True,
1751
+ # Offer.from_bytes(trade_take.offer).to_valid_spend().name(),
1752
+ # )
1753
+
1754
+ fee = uint64(2_000_000_000_000)
1755
+
1756
+ async with env_maker.wallet_state_manager.new_action_scope(
1757
+ wallet_environments.tx_config, push=True
1758
+ ) as action_scope:
1759
+ await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=fee, secure=True)
1760
+ await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
1761
+
1762
+ await wallet_environments.process_pending_states(
1763
+ [
1764
+ WalletStateTransition(
1765
+ pre_block_balance_updates={
1766
+ "xch": {
1767
+ "unconfirmed_wallet_balance": -fee,
1768
+ "<=#spendable_balance": -fee,
1769
+ "<=#max_send_amount": -fee,
1770
+ ">=#pending_change": 0,
1771
+ ">=#pending_coin_removal_count": 2,
1772
+ },
1773
+ "cat": {
1774
+ "spendable_balance": -xch_to_cat_amount,
1775
+ "pending_change": xch_to_cat_amount,
1776
+ "max_send_amount": -xch_to_cat_amount,
1777
+ "pending_coin_removal_count": 1,
1778
+ },
1779
+ },
1780
+ post_block_balance_updates={
1781
+ "xch": {
1782
+ "confirmed_wallet_balance": -fee,
1783
+ ">=#spendable_balance": 0,
1784
+ ">=#max_send_amount": 0,
1785
+ "<=#pending_change": 0,
1786
+ "<=#pending_coin_removal_count": 1,
1787
+ "<=#unspent_coin_count": 0,
1788
+ },
1789
+ "cat": {
1790
+ "spendable_balance": xch_to_cat_amount,
1791
+ "pending_change": -xch_to_cat_amount,
1792
+ "max_send_amount": xch_to_cat_amount,
1793
+ "pending_coin_removal_count": -1,
1794
+ },
1795
+ },
1796
+ ),
1797
+ WalletStateTransition(),
1798
+ ]
1799
+ )
1800
+
1801
+ sum_of_outgoing = uint64(0)
1802
+ sum_of_incoming = uint64(0)
1803
+ for tx in action_scope.side_effects.transactions:
1804
+ if tx.type == TransactionType.OUTGOING_TX.value:
1805
+ sum_of_outgoing = uint64(sum_of_outgoing + tx.amount)
1806
+ elif tx.type == TransactionType.INCOMING_TX.value:
1807
+ sum_of_incoming = uint64(sum_of_incoming + tx.amount)
1808
+ assert (sum_of_outgoing - sum_of_incoming) == 0
1809
+
1810
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
1811
+ # await time_out_assert(15, get_trade_and_status, TradeStatus.FAILED, trade_manager_taker, trade_take)
1812
+
1813
+ peer = env_taker.node.get_full_node_peer()
1814
+ with pytest.raises(ValueError, match="This offer is no longer valid"):
1815
+ async with env_taker.wallet_state_manager.new_action_scope(
1816
+ wallet_environments.tx_config, push=False
1817
+ ) as action_scope:
1818
+ await trade_manager_taker.respond_to_offer(Offer.from_bytes(trade_make.offer), peer, action_scope)
1819
+
1820
+ # Now we're going to create the other way around for test coverage sake
1821
+ async with env_maker.wallet_state_manager.new_action_scope(
1822
+ wallet_environments.tx_config, push=False
1823
+ ) as action_scope:
1824
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(chia_for_cat, action_scope)
1825
+ assert error is None
1826
+ assert success is True
1827
+ assert trade_make is not None
1828
+
1829
+ # This take should fail since we have no CATs to fulfill it with
1830
+ with pytest.raises(
1831
+ ValueError,
1832
+ match=f"Do not have a wallet for asset ID: {cat_wallet_maker.get_asset_id()} to fulfill offer",
1833
+ ):
1834
+ async with env_taker.wallet_state_manager.new_action_scope(
1835
+ wallet_environments.tx_config, push=False
1836
+ ) as action_scope:
1837
+ await trade_manager_taker.respond_to_offer(Offer.from_bytes(trade_make.offer), peer, action_scope)
1838
+
1839
+ async with env_maker.wallet_state_manager.new_action_scope(
1840
+ wallet_environments.tx_config, push=True
1841
+ ) as action_scope:
1842
+ await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=uint64(0), secure=True)
1843
+ await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
1844
+
1845
+ await wallet_environments.process_pending_states(
1846
+ [
1847
+ WalletStateTransition(
1848
+ pre_block_balance_updates={
1849
+ "xch": {
1850
+ "<=#spendable_balance": chia_for_cat[env_maker.wallet_aliases["xch"]],
1851
+ "<=#max_send_amount": chia_for_cat[env_maker.wallet_aliases["xch"]],
1852
+ ">=#pending_change": 1,
1853
+ "pending_coin_removal_count": 1,
1854
+ },
1855
+ "cat": {},
1856
+ },
1857
+ post_block_balance_updates={
1858
+ "xch": {
1859
+ ">=#spendable_balance": 1,
1860
+ ">=#max_send_amount": 1,
1861
+ "<=#pending_change": -1,
1862
+ "pending_coin_removal_count": -1,
1863
+ },
1864
+ "cat": {},
1865
+ },
1866
+ )
1867
+ ]
1868
+ )
1869
+
1870
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
1871
+
1872
+ # Now let's test the case where two coins need to be spent in order to cancel
1873
+ chia_and_cat_for_something: OfferSummary = {
1874
+ env_maker.wallet_aliases["xch"]: -5,
1875
+ env_maker.wallet_aliases["cat"]: -6,
1876
+ bytes32.zeros: 1, # Doesn't matter
1877
+ }
1878
+
1879
+ # Now we're going to create the other way around for test coverage sake
1880
+ async with env_maker.wallet_state_manager.new_action_scope(
1881
+ wallet_environments.tx_config, push=False
1882
+ ) as action_scope:
1883
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1884
+ chia_and_cat_for_something,
1885
+ action_scope,
1886
+ driver_dict={bytes32.zeros: PuzzleInfo({"type": AssetType.CAT.value, "tail": "0x" + bytes(32).hex()})},
1887
+ )
1888
+ assert error is None
1889
+ assert success is True
1890
+ assert trade_make is not None
1891
+
1892
+ async with env_maker.wallet_state_manager.new_action_scope(
1893
+ wallet_environments.tx_config, push=True
1894
+ ) as action_scope:
1895
+ await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=uint64(0), secure=True)
1896
+
1897
+ # Check an announcement ring has been created
1898
+ total_spend = SpendBundle.aggregate(
1899
+ [tx.spend_bundle for tx in action_scope.side_effects.transactions if tx.spend_bundle is not None]
1900
+ )
1901
+ all_conditions: list[Program] = []
1902
+ creations: list[CreateCoinAnnouncement] = []
1903
+ announcement_nonce = std_hash(trade_make.trade_id)
1904
+ for spend in total_spend.coin_spends:
1905
+ all_conditions.extend(
1906
+ [
1907
+ c.to_program()
1908
+ for c in parse_conditions_non_consensus(
1909
+ spend.puzzle_reveal.to_program().run(spend.solution.to_program()).as_iter(), abstractions=False
1910
+ )
1911
+ ]
1912
+ )
1913
+ creations.append(CreateCoinAnnouncement(msg=announcement_nonce, coin_id=spend.coin.name()))
1914
+ for creation in creations:
1915
+ assert creation.corresponding_assertion().to_program() in all_conditions
1916
+
1917
+ await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
1918
+
1919
+ await wallet_environments.process_pending_states(
1920
+ [
1921
+ WalletStateTransition(
1922
+ pre_block_balance_updates={
1923
+ "xch": {
1924
+ "<=#spendable_balance": chia_and_cat_for_something[env_maker.wallet_aliases["xch"]],
1925
+ "<=#max_send_amount": chia_and_cat_for_something[env_maker.wallet_aliases["xch"]],
1926
+ ">=#pending_change": 1,
1927
+ "pending_coin_removal_count": 1,
1928
+ },
1929
+ "cat": {
1930
+ "spendable_balance": -xch_to_cat_amount,
1931
+ "pending_change": xch_to_cat_amount,
1932
+ "max_send_amount": -xch_to_cat_amount,
1933
+ "pending_coin_removal_count": 1,
1934
+ },
1935
+ },
1936
+ post_block_balance_updates={
1937
+ "xch": {
1938
+ ">=#spendable_balance": 1,
1939
+ ">=#max_send_amount": 1,
1940
+ "<=#pending_change": -1,
1941
+ "pending_coin_removal_count": -1,
1942
+ },
1943
+ "cat": {
1944
+ "spendable_balance": xch_to_cat_amount,
1945
+ "pending_change": -xch_to_cat_amount,
1946
+ "max_send_amount": xch_to_cat_amount,
1947
+ "pending_coin_removal_count": -1,
1948
+ },
1949
+ },
1950
+ )
1951
+ ]
1952
+ )
1953
+
1954
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
1955
+
1956
+
1957
+ @pytest.mark.parametrize(
1958
+ "wallet_environments",
1959
+ [
1960
+ {
1961
+ "num_environments": 3,
1962
+ "blocks_needed": [2, 1, 1],
1963
+ }
1964
+ ],
1965
+ indirect=True,
1966
+ )
1967
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
1968
+ @pytest.mark.anyio
1969
+ async def test_trade_conflict(wallet_environments: WalletTestFramework) -> None:
1970
+ env_maker = wallet_environments.environments[0]
1971
+ env_taker = wallet_environments.environments[1]
1972
+ env_trader = wallet_environments.environments[2]
1973
+
1974
+ env_maker.wallet_aliases = {
1975
+ "xch": 1,
1976
+ "cat": 2,
1977
+ }
1978
+ env_taker.wallet_aliases = {
1979
+ "xch": 1,
1980
+ "cat": 2,
1981
+ }
1982
+ env_trader.wallet_aliases = {
1983
+ "xch": 1,
1984
+ "cat": 2,
1985
+ }
1986
+
1987
+ xch_to_cat_amount = uint64(100)
1988
+ fee = uint64(10)
1989
+
1990
+ async with env_maker.wallet_state_manager.new_action_scope(
1991
+ wallet_environments.tx_config, push=True
1992
+ ) as action_scope:
1993
+ await CATWallet.create_new_cat_wallet(
1994
+ env_maker.wallet_state_manager,
1995
+ env_maker.xch_wallet,
1996
+ {"identifier": "genesis_by_id"},
1997
+ xch_to_cat_amount,
1998
+ action_scope,
1999
+ )
2000
+
2001
+ await wallet_environments.process_pending_states(
2002
+ [
2003
+ # tests in test_cat_wallet.py
2004
+ WalletStateTransition(
2005
+ pre_block_balance_updates={
2006
+ "xch": {"set_remainder": True},
2007
+ "cat": {"init": True, "set_remainder": True},
2008
+ },
2009
+ post_block_balance_updates={
2010
+ "xch": {"set_remainder": True},
2011
+ "cat": {"set_remainder": True},
2012
+ },
2013
+ ),
2014
+ WalletStateTransition(),
2015
+ ]
2016
+ )
2017
+
2018
+ cat_for_chia: OfferSummary = {
2019
+ env_maker.wallet_aliases["xch"]: 1000,
2020
+ env_maker.wallet_aliases["cat"]: -4,
2021
+ }
2022
+
2023
+ trade_manager_maker = env_maker.node.wallet_state_manager.trade_manager
2024
+ trade_manager_taker = env_taker.wallet_state_manager.trade_manager
2025
+ trade_manager_trader = env_trader.wallet_state_manager.trade_manager
2026
+
2027
+ async with env_maker.wallet_state_manager.new_action_scope(
2028
+ wallet_environments.tx_config, push=False
2029
+ ) as action_scope:
2030
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(cat_for_chia, action_scope)
2031
+ await time_out_assert(10, get_trade_and_status, TradeStatus.PENDING_ACCEPT, trade_manager_maker, trade_make)
2032
+ assert error is None
2033
+ assert success is True
2034
+ assert trade_make is not None
2035
+ peer = env_taker.node.get_full_node_peer()
2036
+ offer = Offer.from_bytes(trade_make.offer)
2037
+ [offer], signing_response = await env_maker.wallet_state_manager.sign_offers([offer])
2038
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
2039
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
2040
+ ) as action_scope:
2041
+ tr1 = await trade_manager_taker.respond_to_offer(offer, peer, action_scope, fee=fee)
2042
+
2043
+ await wallet_environments.full_node.wait_transaction_records_entered_mempool(
2044
+ records=action_scope.side_effects.transactions
2045
+ )
2046
+
2047
+ # we shouldn't be able to respond to a duplicate offer
2048
+ with pytest.raises(ValueError):
2049
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
2050
+ wallet_environments.tx_config, push=False
2051
+ ) as action_scope:
2052
+ await trade_manager_taker.respond_to_offer(offer, peer, action_scope, fee=fee)
2053
+ await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CONFIRM, trade_manager_taker, tr1)
2054
+ # pushing into mempool while already in it should fail
2055
+ [offer], signing_response = await env_maker.wallet_state_manager.sign_offers([offer])
2056
+ async with trade_manager_trader.wallet_state_manager.new_action_scope(
2057
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
2058
+ ) as action_scope:
2059
+ tr2 = await trade_manager_trader.respond_to_offer(offer, peer, action_scope, fee=fee)
2060
+ assert await trade_manager_trader.get_coins_of_interest()
2061
+ await wallet_environments.process_pending_states(
2062
+ [
2063
+ WalletStateTransition(
2064
+ pre_block_balance_updates={
2065
+ "cat": {
2066
+ "<=#spendable_balance": cat_for_chia[env_maker.wallet_aliases["cat"]],
2067
+ "<=#max_send_amount": cat_for_chia[env_maker.wallet_aliases["cat"]],
2068
+ "pending_change": 0,
2069
+ "pending_coin_removal_count": 1,
2070
+ }
2071
+ },
2072
+ post_block_balance_updates={
2073
+ "xch": {
2074
+ "unconfirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["xch"]],
2075
+ "confirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["xch"]],
2076
+ ">=#spendable_balance": 1,
2077
+ ">=#max_send_amount": 1,
2078
+ "pending_change": 0,
2079
+ "unspent_coin_count": 1,
2080
+ },
2081
+ "cat": {
2082
+ "unconfirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["cat"]],
2083
+ "confirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["cat"]],
2084
+ ">=#spendable_balance": 1,
2085
+ ">=#max_send_amount": 1,
2086
+ "pending_change": 0,
2087
+ "pending_coin_removal_count": -1,
2088
+ },
2089
+ },
2090
+ ),
2091
+ WalletStateTransition(
2092
+ pre_block_balance_updates={
2093
+ "xch": {
2094
+ "unconfirmed_wallet_balance": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2095
+ "<=#spendable_balance": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2096
+ "<=#max_send_amount": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2097
+ ">=#pending_change": 1,
2098
+ "pending_coin_removal_count": 1,
2099
+ },
2100
+ "cat": {
2101
+ "init": True,
2102
+ "unconfirmed_wallet_balance": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2103
+ },
2104
+ },
2105
+ post_block_balance_updates={
2106
+ "xch": {
2107
+ "confirmed_wallet_balance": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2108
+ ">=#spendable_balance": 1,
2109
+ ">=#max_send_amount": 1,
2110
+ "<=#pending_change": -1,
2111
+ "pending_coin_removal_count": -1,
2112
+ },
2113
+ "cat": {
2114
+ "confirmed_wallet_balance": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2115
+ "spendable_balance": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2116
+ "max_send_amount": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2117
+ "unspent_coin_count": 1,
2118
+ },
2119
+ },
2120
+ ),
2121
+ WalletStateTransition(
2122
+ pre_block_balance_updates={
2123
+ "xch": {
2124
+ "unconfirmed_wallet_balance": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2125
+ "<=#spendable_balance": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2126
+ "<=#max_send_amount": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2127
+ ">=#pending_change": 1,
2128
+ "pending_coin_removal_count": 1,
2129
+ },
2130
+ "cat": {
2131
+ "init": True,
2132
+ "unconfirmed_wallet_balance": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2133
+ },
2134
+ },
2135
+ post_block_balance_updates={
2136
+ "xch": {
2137
+ "unconfirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["xch"]] + fee,
2138
+ ">=#spendable_balance": cat_for_chia[env_maker.wallet_aliases["xch"]] + fee,
2139
+ ">=#max_send_amount": cat_for_chia[env_maker.wallet_aliases["xch"]] + fee,
2140
+ "<=#pending_change": -1,
2141
+ "pending_coin_removal_count": -1,
2142
+ },
2143
+ "cat": {
2144
+ "unconfirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["cat"]],
2145
+ },
2146
+ },
2147
+ ),
2148
+ ],
2149
+ invalid_transactions=[tx.name for tx in action_scope.side_effects.transactions],
2150
+ )
2151
+ await time_out_assert(15, get_trade_and_status, TradeStatus.FAILED, trade_manager_trader, tr2)
2152
+
2153
+
2154
+ @pytest.mark.parametrize(
2155
+ "wallet_environments",
2156
+ [
2157
+ {
2158
+ "num_environments": 2,
2159
+ "blocks_needed": [1, 1],
2160
+ }
2161
+ ],
2162
+ indirect=True,
2163
+ )
2164
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
2165
+ @pytest.mark.anyio
2166
+ async def test_trade_bad_spend(wallet_environments: WalletTestFramework) -> None:
2167
+ env_maker = wallet_environments.environments[0]
2168
+ env_taker = wallet_environments.environments[1]
2169
+
2170
+ env_maker.wallet_aliases = {
2171
+ "xch": 1,
2172
+ "cat": 2,
2173
+ }
2174
+ env_taker.wallet_aliases = {
2175
+ "xch": 1,
2176
+ "cat": 2,
2177
+ }
2178
+
2179
+ xch_to_cat_amount = uint64(100)
2180
+
2181
+ async with env_maker.wallet_state_manager.new_action_scope(
2182
+ wallet_environments.tx_config, push=True
2183
+ ) as action_scope:
2184
+ await CATWallet.create_new_cat_wallet(
2185
+ env_maker.wallet_state_manager,
2186
+ env_maker.xch_wallet,
2187
+ {"identifier": "genesis_by_id"},
2188
+ xch_to_cat_amount,
2189
+ action_scope,
2190
+ )
2191
+
2192
+ await wallet_environments.process_pending_states(
2193
+ [
2194
+ # tests in test_cat_wallet.py
2195
+ WalletStateTransition(
2196
+ pre_block_balance_updates={
2197
+ "xch": {"set_remainder": True},
2198
+ "cat": {"init": True, "set_remainder": True},
2199
+ },
2200
+ post_block_balance_updates={
2201
+ "xch": {"set_remainder": True},
2202
+ "cat": {"set_remainder": True},
2203
+ },
2204
+ ),
2205
+ WalletStateTransition(),
2206
+ ]
2207
+ )
2208
+
2209
+ cat_for_chia: OfferSummary = {
2210
+ env_maker.wallet_aliases["xch"]: 1000,
2211
+ env_maker.wallet_aliases["cat"]: -4,
2212
+ }
2213
+
2214
+ trade_manager_maker = env_maker.wallet_state_manager.trade_manager
2215
+ trade_manager_taker = env_taker.wallet_state_manager.trade_manager
2216
+
2217
+ async with env_maker.wallet_state_manager.new_action_scope(
2218
+ wallet_environments.tx_config, push=False
2219
+ ) as action_scope:
2220
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(cat_for_chia, action_scope)
2221
+ await time_out_assert(30, get_trade_and_status, TradeStatus.PENDING_ACCEPT, trade_manager_maker, trade_make)
2222
+ assert error is None
2223
+ assert success is True
2224
+ assert trade_make is not None
2225
+ peer = env_taker.node.get_full_node_peer()
2226
+ offer = Offer.from_bytes(trade_make.offer)
2227
+ bundle = WalletSpendBundle(coin_spends=offer._bundle.coin_spends, aggregated_signature=G2Element())
2228
+ offer = dataclasses.replace(offer, _bundle=bundle)
2229
+ fee = uint64(10)
2230
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
2231
+ wallet_environments.tx_config, push=True, sign=False
2232
+ ) as action_scope:
2233
+ tr1 = await trade_manager_taker.respond_to_offer(offer, peer, action_scope, fee=fee)
2234
+ env_taker.node.wallet_tx_resend_timeout_secs = 0 # don't wait for resend
2235
+
2236
+ def check_wallet_cache_empty() -> bool:
2237
+ return env_taker.node._tx_messages_in_progress == {}
2238
+
2239
+ for _ in range(10):
2240
+ await env_taker.node._resend_queue()
2241
+ await time_out_assert(5, check_wallet_cache_empty, True)
2242
+
2243
+ await wallet_environments.process_pending_states(
2244
+ [
2245
+ # We're ignoring initial balance checking here because of the peculiarity
2246
+ # of the forced resend behavior we're doing above. Not entirely sure that we should be
2247
+ # but the balances are weird in such a way that it suggests to me a test issue and not
2248
+ # an issue with production code - quex
2249
+ WalletStateTransition(
2250
+ pre_block_balance_updates={
2251
+ "xch": {"set_remainder": True},
2252
+ "cat": {"set_remainder": True},
2253
+ },
2254
+ post_block_balance_updates={
2255
+ "xch": {},
2256
+ "cat": {},
2257
+ },
2258
+ ),
2259
+ WalletStateTransition(
2260
+ pre_block_balance_updates={
2261
+ "xch": {"set_remainder": True},
2262
+ "cat": {"init": True, "set_remainder": True},
2263
+ },
2264
+ post_block_balance_updates={
2265
+ "xch": {},
2266
+ "cat": {},
2267
+ },
2268
+ ),
2269
+ ],
2270
+ invalid_transactions=[tx.name for tx in action_scope.side_effects.transactions],
2271
+ )
2272
+
2273
+ await time_out_assert(30, get_trade_and_status, TradeStatus.FAILED, trade_manager_taker, tr1)
2274
+
2275
+
2276
+ @pytest.mark.parametrize(
2277
+ "wallet_environments",
2278
+ [
2279
+ {
2280
+ "num_environments": 2,
2281
+ "blocks_needed": [1, 1],
2282
+ }
2283
+ ],
2284
+ indirect=True,
2285
+ )
2286
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
2287
+ @pytest.mark.anyio
2288
+ async def test_trade_high_fee(wallet_environments: WalletTestFramework) -> None:
2289
+ env_maker = wallet_environments.environments[0]
2290
+ env_taker = wallet_environments.environments[1]
2291
+
2292
+ env_maker.wallet_aliases = {
2293
+ "xch": 1,
2294
+ "cat": 2,
2295
+ }
2296
+ env_taker.wallet_aliases = {
2297
+ "xch": 1,
2298
+ "cat": 2,
2299
+ }
2300
+
2301
+ xch_to_cat_amount = uint64(100)
2302
+
2303
+ async with env_maker.wallet_state_manager.new_action_scope(
2304
+ wallet_environments.tx_config, push=True
2305
+ ) as action_scope:
2306
+ await CATWallet.create_new_cat_wallet(
2307
+ env_maker.wallet_state_manager,
2308
+ env_maker.xch_wallet,
2309
+ {"identifier": "genesis_by_id"},
2310
+ xch_to_cat_amount,
2311
+ action_scope,
2312
+ )
2313
+
2314
+ await wallet_environments.process_pending_states(
2315
+ [
2316
+ # tests in test_cat_wallet.py
2317
+ WalletStateTransition(
2318
+ pre_block_balance_updates={
2319
+ "xch": {"set_remainder": True},
2320
+ "cat": {"init": True, "set_remainder": True},
2321
+ },
2322
+ post_block_balance_updates={
2323
+ "xch": {"set_remainder": True},
2324
+ "cat": {"set_remainder": True},
2325
+ },
2326
+ ),
2327
+ WalletStateTransition(),
2328
+ ]
2329
+ )
2330
+
2331
+ cat_for_chia: OfferSummary = {
2332
+ env_maker.wallet_aliases["xch"]: 1000,
2333
+ env_maker.wallet_aliases["cat"]: -4,
2334
+ }
2335
+
2336
+ trade_manager_maker = env_maker.wallet_state_manager.trade_manager
2337
+ trade_manager_taker = env_taker.wallet_state_manager.trade_manager
2338
+
2339
+ async with env_maker.wallet_state_manager.new_action_scope(
2340
+ wallet_environments.tx_config, push=False
2341
+ ) as action_scope:
2342
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(cat_for_chia, action_scope)
2343
+ await time_out_assert(10, get_trade_and_status, TradeStatus.PENDING_ACCEPT, trade_manager_maker, trade_make)
2344
+ assert error is None
2345
+ assert success is True
2346
+ assert trade_make is not None
2347
+ peer = env_taker.node.get_full_node_peer()
2348
+ [offer], signing_response = await env_maker.wallet_state_manager.sign_offers([Offer.from_bytes(trade_make.offer)])
2349
+ fee = uint64(1_000_000_000_000)
2350
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
2351
+ wallet_environments.tx_config, push=True, additional_signing_responses=signing_response
2352
+ ) as action_scope:
2353
+ tr1 = await trade_manager_taker.respond_to_offer(offer, peer, action_scope, fee=fee)
2354
+
2355
+ await wallet_environments.process_pending_states(
2356
+ [
2357
+ WalletStateTransition(
2358
+ pre_block_balance_updates={
2359
+ "cat": {
2360
+ "<=#spendable_balance": cat_for_chia[env_maker.wallet_aliases["cat"]],
2361
+ "<=#max_send_amount": cat_for_chia[env_maker.wallet_aliases["cat"]],
2362
+ "pending_change": 0,
2363
+ "pending_coin_removal_count": 1,
2364
+ }
2365
+ },
2366
+ post_block_balance_updates={
2367
+ "xch": {
2368
+ "unconfirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["xch"]],
2369
+ "confirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["xch"]],
2370
+ ">=#spendable_balance": 1,
2371
+ ">=#max_send_amount": 1,
2372
+ "pending_change": 0,
2373
+ "unspent_coin_count": 1,
2374
+ },
2375
+ "cat": {
2376
+ "unconfirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["cat"]],
2377
+ "confirmed_wallet_balance": cat_for_chia[env_maker.wallet_aliases["cat"]],
2378
+ ">=#spendable_balance": 1,
2379
+ ">=#max_send_amount": 1,
2380
+ "pending_change": 0,
2381
+ "pending_coin_removal_count": -1,
2382
+ },
2383
+ },
2384
+ ),
2385
+ WalletStateTransition(
2386
+ pre_block_balance_updates={
2387
+ "xch": {
2388
+ "unconfirmed_wallet_balance": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2389
+ "<=#spendable_balance": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2390
+ "<=#max_send_amount": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2391
+ ">=#pending_change": 1,
2392
+ "pending_coin_removal_count": 1,
2393
+ },
2394
+ "cat": {
2395
+ "init": True,
2396
+ "unconfirmed_wallet_balance": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2397
+ },
2398
+ },
2399
+ post_block_balance_updates={
2400
+ "xch": {
2401
+ "confirmed_wallet_balance": -cat_for_chia[env_maker.wallet_aliases["xch"]] - fee,
2402
+ ">=#spendable_balance": 1,
2403
+ ">=#max_send_amount": 1,
2404
+ "<=#pending_change": -1,
2405
+ "pending_coin_removal_count": -1,
2406
+ },
2407
+ "cat": {
2408
+ "confirmed_wallet_balance": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2409
+ "spendable_balance": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2410
+ "max_send_amount": -1 * cat_for_chia[env_maker.wallet_aliases["cat"]],
2411
+ "unspent_coin_count": 1,
2412
+ },
2413
+ },
2414
+ ),
2415
+ ]
2416
+ )
2417
+
2418
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, tr1)
2419
+
2420
+
2421
+ @pytest.mark.parametrize(
2422
+ "wallet_environments",
2423
+ [
2424
+ {
2425
+ "num_environments": 2,
2426
+ "blocks_needed": [1, 1],
2427
+ }
2428
+ ],
2429
+ indirect=True,
2430
+ )
2431
+ @pytest.mark.limit_consensus_modes(reason="irrelevant")
2432
+ @pytest.mark.anyio
2433
+ async def test_aggregated_trade_state(wallet_environments: WalletTestFramework) -> None:
2434
+ env_maker = wallet_environments.environments[0]
2435
+ env_taker = wallet_environments.environments[1]
2436
+
2437
+ env_maker.wallet_aliases = {
2438
+ "xch": 1,
2439
+ "cat": 2,
2440
+ }
2441
+ env_taker.wallet_aliases = {
2442
+ "xch": 1,
2443
+ "cat": 2,
2444
+ }
2445
+
2446
+ xch_to_cat_amount = uint64(100)
2447
+
2448
+ async with env_maker.wallet_state_manager.new_action_scope(
2449
+ wallet_environments.tx_config, push=True
2450
+ ) as action_scope:
2451
+ await CATWallet.create_new_cat_wallet(
2452
+ env_maker.wallet_state_manager,
2453
+ env_maker.xch_wallet,
2454
+ {"identifier": "genesis_by_id"},
2455
+ xch_to_cat_amount,
2456
+ action_scope,
2457
+ )
2458
+
2459
+ await wallet_environments.process_pending_states(
2460
+ [
2461
+ # tests in test_cat_wallet.py
2462
+ WalletStateTransition(
2463
+ pre_block_balance_updates={
2464
+ "xch": {"set_remainder": True},
2465
+ "cat": {"init": True, "set_remainder": True},
2466
+ },
2467
+ post_block_balance_updates={
2468
+ "xch": {"set_remainder": True},
2469
+ "cat": {"set_remainder": True},
2470
+ },
2471
+ ),
2472
+ WalletStateTransition(),
2473
+ ]
2474
+ )
2475
+
2476
+ cat_for_chia: OfferSummary = {
2477
+ env_maker.wallet_aliases["xch"]: 2,
2478
+ env_maker.wallet_aliases["cat"]: -2,
2479
+ }
2480
+ chia_for_cat: OfferSummary = {
2481
+ env_maker.wallet_aliases["xch"]: -1,
2482
+ env_maker.wallet_aliases["cat"]: 1,
2483
+ }
2484
+ combined_summary: OfferSummary = {
2485
+ env_maker.wallet_aliases["xch"]: cat_for_chia[env_maker.wallet_aliases["xch"]]
2486
+ + chia_for_cat[env_maker.wallet_aliases["xch"]],
2487
+ env_maker.wallet_aliases["cat"]: cat_for_chia[env_maker.wallet_aliases["cat"]]
2488
+ + chia_for_cat[env_maker.wallet_aliases["cat"]],
2489
+ }
2490
+
2491
+ trade_manager_maker = env_maker.wallet_state_manager.trade_manager
2492
+ trade_manager_taker = env_taker.wallet_state_manager.trade_manager
2493
+
2494
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(
2495
+ wallet_environments.tx_config, push=False
2496
+ ) as action_scope:
2497
+ success, trade_make_1, error = await trade_manager_maker.create_offer_for_ids(chia_for_cat, action_scope)
2498
+ await time_out_assert(10, get_trade_and_status, TradeStatus.PENDING_ACCEPT, trade_manager_maker, trade_make_1)
2499
+ assert error is None
2500
+ assert success is True
2501
+ assert trade_make_1 is not None
2502
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(
2503
+ wallet_environments.tx_config, push=False
2504
+ ) as action_scope:
2505
+ success, trade_make_2, error = await trade_manager_maker.create_offer_for_ids(cat_for_chia, action_scope)
2506
+ await time_out_assert(10, get_trade_and_status, TradeStatus.PENDING_ACCEPT, trade_manager_maker, trade_make_2)
2507
+ assert error is None
2508
+ assert success is True
2509
+ assert trade_make_2 is not None
2510
+
2511
+ [offer_1], signing_response_1 = await env_maker.node.wallet_state_manager.sign_offers(
2512
+ [Offer.from_bytes(trade_make_1.offer)]
2513
+ )
2514
+ [offer_2], signing_response_2 = await env_maker.node.wallet_state_manager.sign_offers(
2515
+ [Offer.from_bytes(trade_make_2.offer)]
2516
+ )
2517
+ agg_offer = Offer.aggregate([offer_1, offer_2])
2518
+
2519
+ peer = env_taker.node.get_full_node_peer()
2520
+ async with env_taker.wallet_state_manager.new_action_scope(
2521
+ wallet_environments.tx_config,
2522
+ push=True,
2523
+ additional_signing_responses=[*signing_response_1, *signing_response_2],
2524
+ ) as action_scope:
2525
+ await trade_manager_taker.respond_to_offer(
2526
+ agg_offer,
2527
+ peer,
2528
+ action_scope,
2529
+ )
2530
+
2531
+ await wallet_environments.process_pending_states(
2532
+ [
2533
+ WalletStateTransition(
2534
+ pre_block_balance_updates={
2535
+ "xch": {
2536
+ "<=#spendable_balance": chia_for_cat[env_maker.wallet_aliases["xch"]],
2537
+ "<=#max_send_amount": chia_for_cat[env_maker.wallet_aliases["xch"]],
2538
+ "pending_change": 0,
2539
+ "pending_coin_removal_count": 1,
2540
+ },
2541
+ "cat": {
2542
+ "<=#spendable_balance": cat_for_chia[env_maker.wallet_aliases["cat"]],
2543
+ "<=#max_send_amount": cat_for_chia[env_maker.wallet_aliases["cat"]],
2544
+ "pending_change": 0,
2545
+ "pending_coin_removal_count": 1,
2546
+ },
2547
+ },
2548
+ post_block_balance_updates={
2549
+ "xch": {
2550
+ "unconfirmed_wallet_balance": combined_summary[env_maker.wallet_aliases["xch"]],
2551
+ "confirmed_wallet_balance": combined_summary[env_maker.wallet_aliases["xch"]],
2552
+ ">=#spendable_balance": 1,
2553
+ ">=#max_send_amount": 1,
2554
+ "pending_change": 0,
2555
+ "unspent_coin_count": 1,
2556
+ "pending_coin_removal_count": -1,
2557
+ },
2558
+ "cat": {
2559
+ "unconfirmed_wallet_balance": combined_summary[env_maker.wallet_aliases["cat"]],
2560
+ "confirmed_wallet_balance": combined_summary[env_maker.wallet_aliases["cat"]],
2561
+ ">=#spendable_balance": 1,
2562
+ ">=#max_send_amount": 1,
2563
+ "pending_change": 0,
2564
+ "unspent_coin_count": 1,
2565
+ "pending_coin_removal_count": -1,
2566
+ },
2567
+ },
2568
+ ),
2569
+ WalletStateTransition(
2570
+ pre_block_balance_updates={
2571
+ "xch": {
2572
+ "unconfirmed_wallet_balance": -combined_summary[env_maker.wallet_aliases["xch"]],
2573
+ "<=#spendable_balance": -combined_summary[env_maker.wallet_aliases["xch"]],
2574
+ "<=#max_send_amount": -combined_summary[env_maker.wallet_aliases["xch"]],
2575
+ ">=#pending_change": 1,
2576
+ "pending_coin_removal_count": 1,
2577
+ },
2578
+ "cat": {
2579
+ "init": True,
2580
+ "unconfirmed_wallet_balance": -1 * combined_summary[env_maker.wallet_aliases["cat"]],
2581
+ },
2582
+ },
2583
+ post_block_balance_updates={
2584
+ "xch": {
2585
+ "confirmed_wallet_balance": -combined_summary[env_maker.wallet_aliases["xch"]],
2586
+ ">=#spendable_balance": 1,
2587
+ ">=#max_send_amount": 1,
2588
+ "<=#pending_change": -1,
2589
+ "pending_coin_removal_count": -1,
2590
+ },
2591
+ "cat": {
2592
+ "confirmed_wallet_balance": -1 * combined_summary[env_maker.wallet_aliases["cat"]],
2593
+ "spendable_balance": -1 * combined_summary[env_maker.wallet_aliases["cat"]],
2594
+ "max_send_amount": -1 * combined_summary[env_maker.wallet_aliases["cat"]],
2595
+ "unspent_coin_count": 1,
2596
+ },
2597
+ },
2598
+ ),
2599
+ ]
2600
+ )