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,1493 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import logging
5
+ import random
6
+ from collections.abc import Coroutine
7
+ from typing import Any, Callable, Optional
8
+
9
+ import pytest
10
+
11
+ from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
12
+ from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
13
+ from chia.simulator.full_node_simulator import FullNodeSimulator
14
+ from chia.simulator.simulator_protocol import FarmNewBlockProtocol
15
+ from chia.types.blockchain_format.program import Program
16
+ from chia.types.blockchain_format.sized_bytes import bytes32
17
+ from chia.types.peer_info import PeerInfo
18
+ from chia.util.ints import uint16, uint32, uint64, uint128
19
+ from chia.wallet.cat_wallet.cat_wallet import CATWallet
20
+ from chia.wallet.did_wallet.did_wallet import DIDWallet
21
+ from chia.wallet.nft_wallet.nft_wallet import NFTWallet
22
+ from chia.wallet.outer_puzzles import create_asset_id, match_puzzle
23
+ from chia.wallet.puzzle_drivers import PuzzleInfo
24
+ from chia.wallet.trading.offer import Offer
25
+ from chia.wallet.trading.trade_status import TradeStatus
26
+ from chia.wallet.uncurried_puzzle import uncurry_puzzle
27
+ from chia.wallet.util.compute_memos import compute_memos
28
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
29
+ from chia.wallet.wallet_node import WalletNode
30
+
31
+ # from clvm_tools.binutils import disassemble
32
+
33
+ logging.getLogger("aiosqlite").setLevel(logging.INFO) # Too much logging on debug level
34
+
35
+
36
+ def mempool_not_empty(fnapi: FullNodeSimulator) -> bool:
37
+ return fnapi.full_node.mempool_manager.mempool.size() > 0
38
+
39
+
40
+ async def farm_blocks_until(
41
+ predicate_f: Callable[[], Coroutine[Any, Any, bool]], fnapi: FullNodeSimulator, ph: bytes32
42
+ ) -> None:
43
+ for i in range(50):
44
+ await fnapi.farm_new_transaction_block(FarmNewBlockProtocol(ph))
45
+ if await predicate_f():
46
+ return None
47
+ await asyncio.sleep(0.3)
48
+ raise TimeoutError()
49
+
50
+
51
+ async def get_nft_count(wallet: NFTWallet) -> int:
52
+ return await wallet.get_nft_count()
53
+
54
+
55
+ def trusted_setup_helper(
56
+ trusted: bool, wallet_node_maker: WalletNode, wallet_node_taker: WalletNode, full_node_api: FullNodeSimulator
57
+ ) -> None:
58
+ if trusted:
59
+ wallet_node_maker.config["trusted_peers"] = {
60
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
61
+ }
62
+ wallet_node_taker.config["trusted_peers"] = {
63
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
64
+ }
65
+ else:
66
+ wallet_node_maker.config["trusted_peers"] = {}
67
+ wallet_node_taker.config["trusted_peers"] = {}
68
+
69
+
70
+ @pytest.mark.parametrize("trusted", [True, False])
71
+ @pytest.mark.parametrize("zero_royalties", [True, False])
72
+ @pytest.mark.anyio
73
+ async def test_nft_offer_sell_nft(
74
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
75
+ ) -> None:
76
+ full_nodes, wallets, _ = two_wallet_nodes
77
+ full_node_api: FullNodeSimulator = full_nodes[0]
78
+ full_node_server = full_node_api.server
79
+ wallet_node_maker, server_0 = wallets[0]
80
+ wallet_node_taker, server_1 = wallets[1]
81
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
82
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
83
+
84
+ ph_maker = await wallet_maker.get_new_puzzlehash()
85
+ ph_token = bytes32.random(seeded_random)
86
+
87
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
88
+
89
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
90
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
91
+
92
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
93
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
94
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
95
+
96
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
97
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
98
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
99
+ )
100
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
101
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
102
+
103
+ await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
104
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
105
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
106
+
107
+ hex_did_id = did_wallet_maker.get_my_DID()
108
+ did_id = bytes32.fromhex(hex_did_id)
109
+ target_puzhash = ph_maker
110
+ royalty_puzhash = ph_maker
111
+ royalty_basis_pts = uint16(0 if zero_royalties else 200)
112
+
113
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
114
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
115
+ )
116
+ metadata = Program.to(
117
+ [
118
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
119
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
120
+ ]
121
+ )
122
+
123
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
124
+ await nft_wallet_maker.generate_new_nft(
125
+ metadata,
126
+ action_scope,
127
+ target_puzhash,
128
+ royalty_puzhash,
129
+ royalty_basis_pts,
130
+ did_id,
131
+ )
132
+ for tx in action_scope.side_effects.transactions:
133
+ if tx.spend_bundle is not None:
134
+ assert compute_memos(tx.spend_bundle)
135
+ await time_out_assert_not_none(
136
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
137
+ )
138
+
139
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
140
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
141
+
142
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
143
+
144
+ # TAKER SETUP - NO DID
145
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
146
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER"
147
+ )
148
+
149
+ # maker create offer: NFT for xch
150
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
151
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
152
+
153
+ coins_maker = await nft_wallet_maker.get_current_nfts()
154
+ assert len(coins_maker) == 1
155
+ assert await nft_wallet_taker.get_nft_count() == 0
156
+
157
+ nft_to_offer = coins_maker[0]
158
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
159
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
160
+ xch_requested = 1000
161
+ maker_fee = uint64(433)
162
+
163
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
164
+
165
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
166
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
167
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
168
+ )
169
+ assert success is True
170
+ assert error is None
171
+ assert trade_make is not None
172
+
173
+ taker_fee = 1
174
+ assert not mempool_not_empty(full_node_api)
175
+ peer = wallet_node_taker.get_full_node_peer()
176
+
177
+ [_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
178
+ [Offer.from_bytes(trade_make.offer)]
179
+ )
180
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
181
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
182
+ ) as action_scope:
183
+ trade_take = await trade_manager_taker.respond_to_offer(
184
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
185
+ )
186
+
187
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
188
+
189
+ assert trade_take is not None
190
+
191
+ async def maker_0_taker_1() -> bool:
192
+ return await nft_wallet_maker.get_nft_count() == 0 and await nft_wallet_taker.get_nft_count() == 1
193
+
194
+ await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
195
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
196
+
197
+ await time_out_assert(20, get_nft_count, 0, nft_wallet_maker)
198
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
199
+
200
+ # assert payments and royalties
201
+ expected_royalty = uint64(xch_requested * royalty_basis_pts / 10000)
202
+ expected_maker_balance = funds - 2 - maker_fee + xch_requested + expected_royalty
203
+ expected_taker_balance = funds - taker_fee - xch_requested - expected_royalty
204
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
205
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
206
+
207
+
208
+ @pytest.mark.parametrize("trusted", [True, False])
209
+ @pytest.mark.parametrize("zero_royalties", [True, False])
210
+ @pytest.mark.anyio
211
+ async def test_nft_offer_request_nft(
212
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
213
+ ) -> None:
214
+ full_nodes, wallets, _ = two_wallet_nodes
215
+ full_node_api: FullNodeSimulator = full_nodes[0]
216
+ full_node_server = full_node_api.server
217
+ wallet_node_maker, server_0 = wallets[0]
218
+ wallet_node_taker, server_1 = wallets[1]
219
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
220
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
221
+
222
+ ph_taker = await wallet_taker.get_new_puzzlehash()
223
+ ph_token = bytes32.random(seeded_random)
224
+
225
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
226
+
227
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
228
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
229
+
230
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
231
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
232
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
233
+
234
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
235
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
236
+ wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
237
+ )
238
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
239
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
240
+
241
+ await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
242
+
243
+ hex_did_id = did_wallet_taker.get_my_DID()
244
+ did_id = bytes32.fromhex(hex_did_id)
245
+ target_puzhash = ph_taker
246
+ royalty_puzhash = ph_taker
247
+ royalty_basis_pts = uint16(0 if zero_royalties else 200)
248
+
249
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
250
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID TAKER", did_id=did_id
251
+ )
252
+ metadata = Program.to(
253
+ [
254
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
255
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
256
+ ]
257
+ )
258
+ await time_out_assert(20, wallet_taker.get_unconfirmed_balance, funds - 1)
259
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, funds - 1)
260
+
261
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
262
+ await nft_wallet_taker.generate_new_nft(
263
+ metadata,
264
+ action_scope,
265
+ target_puzhash,
266
+ royalty_puzhash,
267
+ royalty_basis_pts,
268
+ did_id,
269
+ )
270
+ for tx in action_scope.side_effects.transactions:
271
+ if tx.spend_bundle is not None:
272
+ assert compute_memos(tx.spend_bundle)
273
+ await time_out_assert_not_none(
274
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
275
+ )
276
+
277
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
278
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
279
+
280
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
281
+
282
+ # MAKER SETUP - NO DID
283
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
284
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET MAKER"
285
+ )
286
+
287
+ # maker create offer: NFT for xch
288
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
289
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
290
+
291
+ coins_taker = await nft_wallet_taker.get_current_nfts()
292
+ assert len(coins_taker) == 1
293
+
294
+ assert await nft_wallet_maker.get_nft_count() == 0
295
+ nft_to_request = coins_taker[0]
296
+ nft_to_request_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_request.full_puzzle))
297
+
298
+ assert isinstance(nft_to_request_info, PuzzleInfo)
299
+ nft_to_request_asset_id = create_asset_id(nft_to_request_info)
300
+ xch_offered = 1000
301
+ maker_fee = 10
302
+ driver_dict = {nft_to_request_asset_id: nft_to_request_info}
303
+
304
+ offer_dict = {nft_to_request_asset_id: 1, wallet_maker.id(): -xch_offered}
305
+
306
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
307
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
308
+ offer_dict, action_scope, driver_dict, fee=maker_fee
309
+ )
310
+ assert success is True
311
+ assert error is None
312
+ assert trade_make is not None
313
+
314
+ taker_fee = 1
315
+
316
+ peer = wallet_node_taker.get_full_node_peer()
317
+ [_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
318
+ [Offer.from_bytes(trade_make.offer)]
319
+ )
320
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
321
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
322
+ ) as action_scope:
323
+ trade_take = await trade_manager_taker.respond_to_offer(
324
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
325
+ )
326
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
327
+ assert trade_take is not None
328
+
329
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
330
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
331
+
332
+ async def maker_1_taker_0() -> bool:
333
+ return await nft_wallet_maker.get_nft_count() == 1 and await nft_wallet_taker.get_nft_count() == 0
334
+
335
+ await farm_blocks_until(maker_1_taker_0, full_node_api, ph_token)
336
+
337
+ # assert payments and royalties
338
+ expected_royalty = uint64(xch_offered * royalty_basis_pts / 10000)
339
+ expected_maker_balance = funds - maker_fee - xch_offered - expected_royalty
340
+ expected_taker_balance = funds - 2 - taker_fee + xch_offered + expected_royalty
341
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
342
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
343
+
344
+
345
+ @pytest.mark.parametrize("trusted", [True, False])
346
+ @pytest.mark.parametrize("zero_royalties", [True, False])
347
+ @pytest.mark.anyio
348
+ async def test_nft_offer_sell_did_to_did(
349
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
350
+ ) -> None:
351
+ full_nodes, wallets, _ = two_wallet_nodes
352
+ full_node_api: FullNodeSimulator = full_nodes[0]
353
+ full_node_server = full_node_api.server
354
+ wallet_node_maker, server_0 = wallets[0]
355
+ wallet_node_taker, server_1 = wallets[1]
356
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
357
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
358
+
359
+ ph_maker = await wallet_maker.get_new_puzzlehash()
360
+ ph_token = bytes32.random(seeded_random)
361
+
362
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
363
+
364
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
365
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
366
+
367
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
368
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
369
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
370
+
371
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
372
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
373
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
374
+ )
375
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
376
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
377
+
378
+ await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
379
+
380
+ hex_did_id = did_wallet_maker.get_my_DID()
381
+ did_id = bytes32.fromhex(hex_did_id)
382
+ target_puzhash = ph_maker
383
+ royalty_puzhash = ph_maker
384
+ royalty_basis_pts = uint16(0 if zero_royalties else 200)
385
+
386
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
387
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
388
+ )
389
+ metadata = Program.to(
390
+ [
391
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
392
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
393
+ ]
394
+ )
395
+
396
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
397
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
398
+
399
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
400
+ await nft_wallet_maker.generate_new_nft(
401
+ metadata,
402
+ action_scope,
403
+ target_puzhash,
404
+ royalty_puzhash,
405
+ royalty_basis_pts,
406
+ did_id,
407
+ )
408
+ for tx in action_scope.side_effects.transactions:
409
+ if tx.spend_bundle is not None:
410
+ assert compute_memos(tx.spend_bundle)
411
+ await time_out_assert_not_none(
412
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
413
+ )
414
+
415
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
416
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
417
+
418
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
419
+
420
+ # TAKER SETUP - WITH DID
421
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
422
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
423
+ wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
424
+ )
425
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
426
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
427
+
428
+ await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
429
+
430
+ hex_did_id_taker = did_wallet_taker.get_my_DID()
431
+ did_id_taker = bytes32.fromhex(hex_did_id_taker)
432
+
433
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
434
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER", did_id=did_id_taker
435
+ )
436
+
437
+ # maker create offer: NFT for xch
438
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
439
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
440
+ coins_maker = await nft_wallet_maker.get_current_nfts()
441
+ assert len(coins_maker) == 1
442
+ assert await nft_wallet_taker.get_nft_count() == 0
443
+ nft_to_offer = coins_maker[0]
444
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
445
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
446
+ xch_requested = 1000
447
+ maker_fee = uint64(433)
448
+
449
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
450
+
451
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
452
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
453
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
454
+ )
455
+ assert success is True
456
+ assert error is None
457
+ assert trade_make is not None
458
+
459
+ taker_fee = 1
460
+
461
+ peer = wallet_node_taker.get_full_node_peer()
462
+ [_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
463
+ [Offer.from_bytes(trade_make.offer)]
464
+ )
465
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
466
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
467
+ ) as action_scope:
468
+ trade_take = await trade_manager_taker.respond_to_offer(
469
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
470
+ )
471
+
472
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
473
+ assert trade_take is not None
474
+
475
+ async def maker_0_taker_1() -> bool:
476
+ return (
477
+ await nft_wallet_maker.get_nft_count() == 0
478
+ and len(wallet_taker.wallet_state_manager.wallets) == 4
479
+ and await wallet_taker.wallet_state_manager.wallets[4].get_nft_count() == 1
480
+ )
481
+
482
+ await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
483
+
484
+ await time_out_assert(20, get_nft_count, 0, nft_wallet_maker)
485
+ # assert nnew nft wallet is created for taker
486
+ await time_out_assert(20, len, 4, wallet_taker.wallet_state_manager.wallets)
487
+ await time_out_assert(20, get_nft_count, 1, wallet_taker.wallet_state_manager.wallets[4])
488
+ assert await wallet_taker.wallet_state_manager.wallets[4].nft_store.get_nft_by_id(nft_to_offer_asset_id) is not None
489
+ # assert payments and royalties
490
+ expected_royalty = uint64(xch_requested * royalty_basis_pts / 10000)
491
+ expected_maker_balance = funds - 2 - maker_fee + xch_requested + expected_royalty
492
+ expected_taker_balance = funds - 1 - taker_fee - xch_requested - expected_royalty
493
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
494
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
495
+
496
+
497
+ @pytest.mark.parametrize("trusted", [True, False])
498
+ @pytest.mark.parametrize("zero_royalties", [True, False])
499
+ @pytest.mark.anyio
500
+ async def test_nft_offer_sell_nft_for_cat(
501
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
502
+ ) -> None:
503
+ full_nodes, wallets, _ = two_wallet_nodes
504
+ full_node_api: FullNodeSimulator = full_nodes[0]
505
+ full_node_server = full_node_api.server
506
+ wallet_node_maker, server_0 = wallets[0]
507
+ wallet_node_taker, server_1 = wallets[1]
508
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
509
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
510
+
511
+ ph_maker = await wallet_maker.get_new_puzzlehash()
512
+ ph_token = bytes32.random(seeded_random)
513
+
514
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
515
+
516
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
517
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
518
+
519
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
520
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
521
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
522
+
523
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
524
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
525
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
526
+ )
527
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
528
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
529
+
530
+ await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
531
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
532
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
533
+
534
+ hex_did_id = did_wallet_maker.get_my_DID()
535
+ did_id = bytes32.fromhex(hex_did_id)
536
+ target_puzhash = ph_maker
537
+ royalty_puzhash = ph_maker
538
+ royalty_basis_pts = uint16(0 if zero_royalties else 200)
539
+
540
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
541
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
542
+ )
543
+ metadata = Program.to(
544
+ [
545
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
546
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
547
+ ]
548
+ )
549
+
550
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
551
+ await nft_wallet_maker.generate_new_nft(
552
+ metadata,
553
+ action_scope,
554
+ target_puzhash,
555
+ royalty_puzhash,
556
+ royalty_basis_pts,
557
+ did_id,
558
+ )
559
+ for tx in action_scope.side_effects.transactions:
560
+ if tx.spend_bundle is not None:
561
+ assert compute_memos(tx.spend_bundle)
562
+ await time_out_assert_not_none(
563
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
564
+ )
565
+
566
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
567
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
568
+
569
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
570
+
571
+ # TAKER SETUP - NO DID
572
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
573
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER"
574
+ )
575
+
576
+ # maker create offer: NFT for xch
577
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
578
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
579
+
580
+ coins_maker = await nft_wallet_maker.get_current_nfts()
581
+ assert len(coins_maker) == 1
582
+ coins_taker = await nft_wallet_taker.get_current_nfts()
583
+ assert len(coins_taker) == 0
584
+
585
+ # Create new CAT and wallets for maker and taker
586
+ # Trade them between maker and taker to ensure multiple coins for each cat
587
+ cats_to_mint = 100000
588
+ cats_to_trade = uint64(10000)
589
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
590
+ full_node_api.full_node.log.warning(f"Mempool size: {full_node_api.full_node.mempool_manager.mempool.size()}")
591
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
592
+ wallet_node_maker.wallet_state_manager,
593
+ wallet_maker,
594
+ {"identifier": "genesis_by_id"},
595
+ uint64(cats_to_mint),
596
+ action_scope,
597
+ )
598
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
599
+
600
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
601
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
602
+
603
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
604
+ await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
605
+
606
+ cat_wallet_taker: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
607
+ wallet_node_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
608
+ )
609
+
610
+ ph_taker_cat_1 = await wallet_taker.get_new_puzzlehash()
611
+ ph_taker_cat_2 = await wallet_taker.get_new_puzzlehash()
612
+ async with cat_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
613
+ await cat_wallet_maker.generate_signed_transaction(
614
+ [cats_to_trade, cats_to_trade],
615
+ [ph_taker_cat_1, ph_taker_cat_2],
616
+ action_scope,
617
+ memos=[[ph_taker_cat_1], [ph_taker_cat_2]],
618
+ )
619
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
620
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
621
+
622
+ maker_cat_balance = cats_to_mint - (2 * cats_to_trade)
623
+ taker_cat_balance = 2 * cats_to_trade
624
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, maker_cat_balance)
625
+ await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, taker_cat_balance)
626
+ nft_to_offer = coins_maker[0]
627
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
628
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
629
+ cats_requested = 1000
630
+ maker_fee = uint64(433)
631
+
632
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, cat_wallet_maker.id(): cats_requested}
633
+
634
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
635
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
636
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
637
+ )
638
+
639
+ assert success is True
640
+ assert error is None
641
+ assert trade_make is not None
642
+
643
+ taker_fee = 1
644
+
645
+ peer = wallet_node_taker.get_full_node_peer()
646
+ [_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
647
+ [Offer.from_bytes(trade_make.offer)]
648
+ )
649
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
650
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
651
+ ) as action_scope:
652
+ trade_take = await trade_manager_taker.respond_to_offer(
653
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
654
+ )
655
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
656
+ assert trade_take is not None
657
+
658
+ async def maker_0_taker_1() -> bool:
659
+ return (
660
+ len(await nft_wallet_maker.get_current_nfts()) == 0 and len(await nft_wallet_taker.get_current_nfts()) == 1
661
+ )
662
+
663
+ await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
664
+
665
+ # assert payments and royalties
666
+ expected_royalty = uint64(cats_requested * royalty_basis_pts / 10000)
667
+ expected_maker_balance = funds - 2 - cats_to_mint - maker_fee
668
+ expected_taker_balance = funds - taker_fee
669
+ expected_maker_cat_balance = maker_cat_balance + cats_requested + expected_royalty
670
+ expected_taker_cat_balance = taker_cat_balance - cats_requested - expected_royalty
671
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
672
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
673
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, expected_maker_cat_balance)
674
+ await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, expected_taker_cat_balance)
675
+
676
+
677
+ @pytest.mark.parametrize("trusted", [True, False])
678
+ @pytest.mark.parametrize("test_change", [True, False])
679
+ @pytest.mark.anyio
680
+ async def test_nft_offer_request_nft_for_cat(
681
+ self_hostname: str, two_wallet_nodes: Any, trusted: bool, test_change: bool, seeded_random: random.Random
682
+ ) -> None:
683
+ full_nodes, wallets, _ = two_wallet_nodes
684
+ full_node_api: FullNodeSimulator = full_nodes[0]
685
+ full_node_server = full_node_api.server
686
+ wallet_node_maker, server_0 = wallets[0]
687
+ wallet_node_taker, server_1 = wallets[1]
688
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
689
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
690
+
691
+ ph_taker = await wallet_taker.get_new_puzzlehash()
692
+ ph_token = bytes32.random(seeded_random)
693
+
694
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
695
+
696
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
697
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
698
+
699
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
700
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
701
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
702
+
703
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
704
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
705
+ wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
706
+ )
707
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
708
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
709
+
710
+ await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
711
+ await time_out_assert(20, wallet_taker.get_unconfirmed_balance, funds - 1)
712
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, funds - 1)
713
+
714
+ hex_did_id = did_wallet_taker.get_my_DID()
715
+ did_id = bytes32.fromhex(hex_did_id)
716
+ target_puzhash = ph_taker
717
+ royalty_puzhash = ph_taker
718
+ royalty_basis_pts = uint16(5000) # 50%
719
+
720
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
721
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID TAKER", did_id=did_id
722
+ )
723
+ metadata = Program.to(
724
+ [
725
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
726
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
727
+ ]
728
+ )
729
+
730
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
731
+ await nft_wallet_taker.generate_new_nft(
732
+ metadata,
733
+ action_scope,
734
+ target_puzhash,
735
+ royalty_puzhash,
736
+ royalty_basis_pts,
737
+ did_id,
738
+ )
739
+ for tx in action_scope.side_effects.transactions:
740
+ if tx.spend_bundle is not None:
741
+ assert compute_memos(tx.spend_bundle)
742
+ await time_out_assert_not_none(
743
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
744
+ )
745
+
746
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
747
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
748
+
749
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
750
+
751
+ # MAKER SETUP - NO DID
752
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
753
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET MAKER"
754
+ )
755
+
756
+ # maker create offer: NFT for CAT
757
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
758
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
759
+
760
+ coins_maker = await nft_wallet_maker.get_current_nfts()
761
+ assert len(coins_maker) == 0
762
+ coins_taker = await nft_wallet_taker.get_current_nfts()
763
+ assert len(coins_taker) == 1
764
+
765
+ # Create new CAT and wallets for maker and taker
766
+ # Trade them between maker and taker to ensure multiple coins for each cat
767
+ cats_to_mint = 100000
768
+ cats_to_trade = uint64(20000)
769
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
770
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
771
+ wallet_node_maker.wallet_state_manager,
772
+ wallet_maker,
773
+ {"identifier": "genesis_by_id"},
774
+ uint64(cats_to_mint),
775
+ action_scope,
776
+ )
777
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
778
+
779
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
780
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
781
+
782
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
783
+ await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
784
+
785
+ cat_wallet_taker: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
786
+ wallet_node_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
787
+ )
788
+ if test_change:
789
+ cat_1 = await wallet_maker.get_new_puzzlehash()
790
+ cat_2 = await wallet_maker.get_new_puzzlehash()
791
+ else:
792
+ cat_1 = await wallet_taker.get_new_puzzlehash()
793
+ cat_2 = await wallet_taker.get_new_puzzlehash()
794
+ puzzle_hashes = [cat_1, cat_2]
795
+ amounts = [cats_to_trade, cats_to_trade]
796
+ if test_change:
797
+ ph_taker_cat_1 = await wallet_taker.get_new_puzzlehash()
798
+ extra_change = cats_to_mint - (2 * cats_to_trade)
799
+ amounts.append(uint64(extra_change))
800
+ puzzle_hashes.append(ph_taker_cat_1)
801
+ async with cat_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
802
+ await cat_wallet_maker.generate_signed_transaction(amounts, puzzle_hashes, action_scope)
803
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
804
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
805
+
806
+ if test_change:
807
+ taker_cat_balance = cats_to_mint - (2 * cats_to_trade)
808
+ maker_cat_balance = 2 * cats_to_trade
809
+ else:
810
+ maker_cat_balance = cats_to_mint - (2 * cats_to_trade)
811
+ taker_cat_balance = 2 * cats_to_trade
812
+ await time_out_assert(15, cat_wallet_maker.get_confirmed_balance, maker_cat_balance)
813
+ await time_out_assert(15, cat_wallet_taker.get_confirmed_balance, taker_cat_balance)
814
+
815
+ nft_to_request = coins_taker[0]
816
+ nft_to_request_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_request.full_puzzle))
817
+ nft_to_request_asset_id: bytes32 = create_asset_id(nft_to_request_info) # type: ignore
818
+ cats_requested = 10000
819
+ maker_fee = uint64(433)
820
+ driver_dict = {nft_to_request_asset_id: nft_to_request_info}
821
+
822
+ offer_dict = {nft_to_request_asset_id: 1, cat_wallet_maker.id(): -cats_requested}
823
+
824
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
825
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
826
+ offer_dict, action_scope, driver_dict, fee=maker_fee
827
+ )
828
+ assert success is True
829
+ assert error is None
830
+ assert trade_make is not None
831
+
832
+ taker_fee = 1
833
+
834
+ peer = wallet_node_taker.get_full_node_peer()
835
+ [_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
836
+ [Offer.from_bytes(trade_make.offer)]
837
+ )
838
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
839
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
840
+ ) as action_scope:
841
+ trade_take = await trade_manager_taker.respond_to_offer(
842
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
843
+ )
844
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
845
+ assert trade_take is not None
846
+
847
+ async def maker_1_taker_0() -> bool:
848
+ return (
849
+ len(await nft_wallet_maker.get_current_nfts()) == 1 and len(await nft_wallet_taker.get_current_nfts()) == 0
850
+ )
851
+
852
+ await farm_blocks_until(maker_1_taker_0, full_node_api, ph_token)
853
+
854
+ # assert payments and royalties
855
+ expected_royalty = uint64(cats_requested * royalty_basis_pts / 10000)
856
+ expected_maker_balance = funds - cats_to_mint - maker_fee
857
+ expected_taker_balance = funds - 2 - taker_fee
858
+ expected_maker_cat_balance = maker_cat_balance - cats_requested - expected_royalty
859
+ expected_taker_cat_balance = taker_cat_balance + cats_requested + expected_royalty
860
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
861
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
862
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, expected_maker_cat_balance)
863
+ await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, expected_taker_cat_balance)
864
+
865
+
866
+ @pytest.mark.parametrize(
867
+ "trusted",
868
+ [True, False],
869
+ )
870
+ @pytest.mark.anyio
871
+ # @pytest.mark.skip
872
+ async def test_nft_offer_sell_cancel(
873
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
874
+ ) -> None:
875
+ full_nodes, wallets, _ = two_wallet_nodes
876
+ full_node_api: FullNodeSimulator = full_nodes[0]
877
+ full_node_server = full_node_api.server
878
+ wallet_node_maker, server_0 = wallets[0]
879
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
880
+
881
+ ph_maker = await wallet_maker.get_new_puzzlehash()
882
+ ph_token = bytes32.random(seeded_random)
883
+
884
+ if trusted:
885
+ wallet_node_maker.config["trusted_peers"] = {
886
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
887
+ }
888
+ else:
889
+ wallet_node_maker.config["trusted_peers"] = {}
890
+
891
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
892
+
893
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 3))
894
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
895
+
896
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
897
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
898
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
899
+ )
900
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
901
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
902
+
903
+ await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
904
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
905
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
906
+
907
+ hex_did_id = did_wallet_maker.get_my_DID()
908
+ did_id = bytes32.fromhex(hex_did_id)
909
+ target_puzhash = ph_maker
910
+ royalty_puzhash = ph_maker
911
+ royalty_basis_pts = uint16(200)
912
+
913
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
914
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
915
+ )
916
+ metadata = Program.to(
917
+ [
918
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
919
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
920
+ ]
921
+ )
922
+
923
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
924
+ await nft_wallet_maker.generate_new_nft(
925
+ metadata,
926
+ action_scope,
927
+ target_puzhash,
928
+ royalty_puzhash,
929
+ royalty_basis_pts,
930
+ did_id,
931
+ )
932
+ for tx in action_scope.side_effects.transactions:
933
+ if tx.spend_bundle is not None:
934
+ assert compute_memos(tx.spend_bundle)
935
+ await time_out_assert_not_none(
936
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
937
+ )
938
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
939
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
940
+
941
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
942
+
943
+ # maker create offer: NFT for xch
944
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
945
+
946
+ coins_maker = await nft_wallet_maker.get_current_nfts()
947
+ assert len(coins_maker) == 1
948
+
949
+ nft_to_offer = coins_maker[0]
950
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
951
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
952
+ xch_requested = 1000
953
+ maker_fee = uint64(433)
954
+
955
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
956
+
957
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
958
+ _success, trade_make, _error = await trade_manager_maker.create_offer_for_ids(
959
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
960
+ )
961
+
962
+ FEE = uint64(2000000000000)
963
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
964
+ await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=FEE, secure=True)
965
+
966
+ async def get_trade_and_status(trade_manager: Any, trade: Any) -> TradeStatus:
967
+ trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
968
+ return TradeStatus(trade_rec.status)
969
+
970
+ await time_out_assert(20, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
971
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
972
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
973
+
974
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
975
+
976
+
977
+ @pytest.mark.parametrize(
978
+ "trusted",
979
+ [True],
980
+ )
981
+ @pytest.mark.anyio
982
+ async def test_nft_offer_sell_cancel_in_batch(
983
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
984
+ ) -> None:
985
+ num_blocks = 3
986
+ full_nodes, wallets, _ = two_wallet_nodes
987
+ full_node_api: FullNodeSimulator = full_nodes[0]
988
+ full_node_server = full_node_api.server
989
+ wallet_node_maker, server_0 = wallets[0]
990
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
991
+
992
+ ph_maker = await wallet_maker.get_new_puzzlehash()
993
+ ph_token = bytes32.random(seeded_random)
994
+
995
+ if trusted:
996
+ wallet_node_maker.config["trusted_peers"] = {
997
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
998
+ }
999
+ else:
1000
+ wallet_node_maker.config["trusted_peers"] = {}
1001
+
1002
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1003
+
1004
+ funds = sum(
1005
+ calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, num_blocks)
1006
+ )
1007
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
1008
+
1009
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1010
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
1011
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
1012
+ )
1013
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
1014
+
1015
+ await time_out_assert(15, wallet_maker.get_pending_change_balance, 0)
1016
+ await time_out_assert(10, wallet_maker.get_unconfirmed_balance, funds - 1)
1017
+ await time_out_assert(10, wallet_maker.get_confirmed_balance, funds - 1)
1018
+
1019
+ hex_did_id = did_wallet_maker.get_my_DID()
1020
+ did_id = bytes32.fromhex(hex_did_id)
1021
+ target_puzhash = ph_maker
1022
+ royalty_puzhash = ph_maker
1023
+ royalty_basis_pts = uint16(200)
1024
+
1025
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
1026
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
1027
+ )
1028
+ metadata = Program.to(
1029
+ [
1030
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
1031
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
1032
+ ]
1033
+ )
1034
+
1035
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1036
+ await nft_wallet_maker.generate_new_nft(
1037
+ metadata,
1038
+ action_scope,
1039
+ target_puzhash,
1040
+ royalty_puzhash,
1041
+ royalty_basis_pts,
1042
+ did_id,
1043
+ )
1044
+ for tx in action_scope.side_effects.transactions:
1045
+ if tx.spend_bundle is not None:
1046
+ assert compute_memos(tx.spend_bundle)
1047
+ await time_out_assert_not_none(
1048
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1049
+ )
1050
+
1051
+ for i in range(1, num_blocks):
1052
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
1053
+
1054
+ await time_out_assert(10, get_nft_count, 1, nft_wallet_maker)
1055
+
1056
+ # maker create offer: NFT for xch
1057
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
1058
+
1059
+ coins_maker = await nft_wallet_maker.get_current_nfts()
1060
+ assert len(coins_maker) == 1
1061
+
1062
+ nft_to_offer = coins_maker[0]
1063
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
1064
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
1065
+ xch_requested = 1000
1066
+ maker_fee = uint64(433)
1067
+
1068
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
1069
+
1070
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
1071
+ _success, trade_make, _error = await trade_manager_maker.create_offer_for_ids(
1072
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
1073
+ )
1074
+
1075
+ FEE = uint64(2000000000000)
1076
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1077
+ await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=FEE, secure=True)
1078
+
1079
+ async def get_trade_and_status(trade_manager: Any, trade: Any) -> TradeStatus:
1080
+ trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
1081
+ return TradeStatus(trade_rec.status)
1082
+
1083
+ await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
1084
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
1085
+
1086
+ for i in range(1, num_blocks):
1087
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
1088
+
1089
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
1090
+
1091
+
1092
+ @pytest.mark.parametrize("trusted", [True, False])
1093
+ @pytest.mark.parametrize(
1094
+ "royalty_pts",
1095
+ [
1096
+ (200, 500, 500),
1097
+ (200, 500, 500),
1098
+ (0, 0, 0), # test that we can have 0 royalty
1099
+ (10000, 10001, 10005), # tests 100% royalty is not allowed
1100
+ (100000, 10001, 10005), # 1000% shouldn't work
1101
+ ],
1102
+ )
1103
+ @pytest.mark.anyio
1104
+ async def test_complex_nft_offer(
1105
+ self_hostname: str,
1106
+ two_wallet_nodes: Any,
1107
+ trusted: Any,
1108
+ royalty_pts: tuple[int, int, int],
1109
+ seeded_random: random.Random,
1110
+ ) -> None:
1111
+ """
1112
+ This test is going to create an offer where the maker offers 1 NFT and 1 CAT for 2 NFTs, an XCH and a CAT
1113
+ """
1114
+ full_nodes, wallets, _ = two_wallet_nodes
1115
+ full_node_api: FullNodeSimulator = full_nodes[0]
1116
+ full_node_server = full_node_api.server
1117
+ wallet_node_maker, server_0 = wallets[0]
1118
+ wallet_node_taker, server_1 = wallets[1]
1119
+ wsm_maker = wallet_node_maker.wallet_state_manager
1120
+ wsm_taker = wallet_node_taker.wallet_state_manager
1121
+ wallet_maker = wsm_maker.main_wallet
1122
+ wallet_taker = wsm_taker.main_wallet
1123
+
1124
+ ph_maker = await wallet_maker.get_new_puzzlehash()
1125
+ ph_taker = await wallet_taker.get_new_puzzlehash()
1126
+ ph_token = bytes32.random(seeded_random)
1127
+
1128
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
1129
+ wallet_node_maker.config["automatically_add_unknown_cats"] = True
1130
+ wallet_node_taker.config["automatically_add_unknown_cats"] = True
1131
+
1132
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1133
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1134
+
1135
+ # Need money for fees and offering
1136
+ funds_maker = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 3))
1137
+ funds_taker = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 6))
1138
+
1139
+ await full_node_api.farm_rewards_to_wallet(amount=funds_maker, wallet=wsm_maker.main_wallet, timeout=60)
1140
+ await full_node_api.farm_rewards_to_wallet(amount=funds_taker, wallet=wsm_taker.main_wallet, timeout=60)
1141
+
1142
+ CAT_AMOUNT = uint64(100000000)
1143
+ txs = []
1144
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1145
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
1146
+ wsm_maker, wallet_maker, {"identifier": "genesis_by_id"}, CAT_AMOUNT, action_scope
1147
+ )
1148
+ txs.extend(action_scope.side_effects.transactions)
1149
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1150
+ cat_wallet_taker = await CATWallet.create_new_cat_wallet(
1151
+ wsm_taker, wallet_taker, {"identifier": "genesis_by_id"}, CAT_AMOUNT, action_scope
1152
+ )
1153
+ txs.extend(action_scope.side_effects.transactions)
1154
+
1155
+ # We'll need these later
1156
+ basic_nft_wallet_maker = await NFTWallet.create_new_nft_wallet(wsm_maker, wallet_maker, name="NFT WALLET MAKER")
1157
+ basic_nft_wallet_taker = await NFTWallet.create_new_nft_wallet(wsm_taker, wallet_taker, name="NFT WALLET TAKER")
1158
+
1159
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1160
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
1161
+ wsm_maker, wallet_maker, uint64(1), action_scope
1162
+ )
1163
+ txs.extend(action_scope.side_effects.transactions)
1164
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1165
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
1166
+ wsm_taker, wallet_taker, uint64(1), action_scope
1167
+ )
1168
+ txs.extend(action_scope.side_effects.transactions)
1169
+
1170
+ await full_node_api.process_transaction_records(records=txs)
1171
+
1172
+ funds_maker = funds_maker - 1 - CAT_AMOUNT
1173
+ funds_taker = funds_taker - 1 - CAT_AMOUNT
1174
+
1175
+ await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
1176
+ await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
1177
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1178
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1179
+ await time_out_assert(30, cat_wallet_maker.get_confirmed_balance, CAT_AMOUNT)
1180
+ await time_out_assert(30, cat_wallet_maker.get_unconfirmed_balance, CAT_AMOUNT)
1181
+ await time_out_assert(30, cat_wallet_taker.get_confirmed_balance, CAT_AMOUNT)
1182
+ await time_out_assert(30, cat_wallet_taker.get_unconfirmed_balance, CAT_AMOUNT)
1183
+ did_id_maker = bytes32.fromhex(did_wallet_maker.get_my_DID())
1184
+ did_id_taker = bytes32.fromhex(did_wallet_taker.get_my_DID())
1185
+ target_puzhash_maker = ph_maker
1186
+ target_puzhash_taker = ph_taker
1187
+ royalty_puzhash_maker = ph_maker
1188
+ royalty_puzhash_taker = ph_taker
1189
+ royalty_basis_pts_maker, royalty_basis_pts_taker_1, royalty_basis_pts_taker_2 = (
1190
+ royalty_pts[0],
1191
+ uint16(royalty_pts[1]),
1192
+ uint16(royalty_pts[2]),
1193
+ )
1194
+
1195
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
1196
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id_maker
1197
+ )
1198
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
1199
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID 1", did_id=did_id_taker
1200
+ )
1201
+ metadata = Program.to(
1202
+ [
1203
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
1204
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
1205
+ ]
1206
+ )
1207
+ if royalty_basis_pts_maker > 65535:
1208
+ with pytest.raises(ValueError):
1209
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(
1210
+ DEFAULT_TX_CONFIG, push=False
1211
+ ) as action_scope:
1212
+ await nft_wallet_maker.generate_new_nft(
1213
+ metadata,
1214
+ action_scope,
1215
+ target_puzhash_maker,
1216
+ royalty_puzhash_maker,
1217
+ royalty_basis_pts_maker, # type: ignore
1218
+ did_id_maker,
1219
+ )
1220
+ return
1221
+ else:
1222
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1223
+ await nft_wallet_maker.generate_new_nft(
1224
+ metadata,
1225
+ action_scope,
1226
+ target_puzhash_maker,
1227
+ royalty_puzhash_maker,
1228
+ uint16(royalty_basis_pts_maker),
1229
+ did_id_maker,
1230
+ )
1231
+ for tx in action_scope.side_effects.transactions:
1232
+ if tx.spend_bundle is not None:
1233
+ await time_out_assert_not_none(
1234
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1235
+ )
1236
+
1237
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1238
+ await nft_wallet_taker.generate_new_nft(
1239
+ metadata,
1240
+ action_scope,
1241
+ target_puzhash_taker,
1242
+ royalty_puzhash_taker,
1243
+ royalty_basis_pts_taker_1,
1244
+ did_id_taker,
1245
+ )
1246
+ for tx in action_scope.side_effects.transactions:
1247
+ if tx.spend_bundle is not None:
1248
+ await time_out_assert_not_none(
1249
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1250
+ )
1251
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
1252
+
1253
+ funds_maker -= 1
1254
+ funds_taker -= 1
1255
+
1256
+ await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
1257
+ await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
1258
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1259
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1260
+ await time_out_assert(30, get_nft_count, 1, nft_wallet_maker)
1261
+ await time_out_assert(30, get_nft_count, 1, nft_wallet_taker)
1262
+
1263
+ # MAke one more NFT for the taker
1264
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1265
+ await nft_wallet_taker.generate_new_nft(
1266
+ metadata,
1267
+ action_scope,
1268
+ target_puzhash_taker,
1269
+ royalty_puzhash_taker,
1270
+ royalty_basis_pts_taker_2,
1271
+ did_id_taker,
1272
+ )
1273
+ for tx in action_scope.side_effects.transactions:
1274
+ if tx.spend_bundle is not None:
1275
+ await time_out_assert_not_none(
1276
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1277
+ )
1278
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
1279
+
1280
+ funds_taker -= 1
1281
+
1282
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1283
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1284
+ await time_out_assert(30, get_nft_count, 2, nft_wallet_taker)
1285
+
1286
+ trade_manager_maker = wsm_maker.trade_manager
1287
+ trade_manager_taker = wsm_taker.trade_manager
1288
+ maker_nfts = await nft_wallet_maker.get_current_nfts()
1289
+ taker_nfts = await nft_wallet_taker.get_current_nfts()
1290
+ nft_to_offer_asset_id_maker: bytes32 = maker_nfts[0].nft_id
1291
+ nft_to_offer_asset_id_taker_1: bytes32 = taker_nfts[0].nft_id
1292
+ nft_to_offer_asset_id_taker_2: bytes32 = taker_nfts[1].nft_id
1293
+ if royalty_basis_pts_maker > 60000:
1294
+ XCH_REQUESTED = 20000
1295
+ CAT_REQUESTED = 1000
1296
+ FEE = uint64(20000)
1297
+ else:
1298
+ XCH_REQUESTED = 2000000000000
1299
+ CAT_REQUESTED = 100000
1300
+ FEE = uint64(2000000000000)
1301
+
1302
+ complex_nft_offer = {
1303
+ nft_to_offer_asset_id_maker: -1,
1304
+ cat_wallet_maker.id(): CAT_REQUESTED * -1,
1305
+ 1: XCH_REQUESTED,
1306
+ nft_to_offer_asset_id_taker_1: 1,
1307
+ nft_to_offer_asset_id_taker_2: 1,
1308
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): CAT_REQUESTED,
1309
+ }
1310
+
1311
+ driver_dict = {
1312
+ nft_to_offer_asset_id_taker_1: match_puzzle(uncurry_puzzle(taker_nfts[0].full_puzzle)),
1313
+ nft_to_offer_asset_id_taker_2: match_puzzle(uncurry_puzzle(taker_nfts[1].full_puzzle)),
1314
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): PuzzleInfo(
1315
+ {
1316
+ "type": "CAT",
1317
+ "tail": "0x" + cat_wallet_taker.get_asset_id(),
1318
+ }
1319
+ ),
1320
+ }
1321
+
1322
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
1323
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1324
+ complex_nft_offer, action_scope, driver_dict=driver_dict, fee=FEE
1325
+ )
1326
+ assert error is None
1327
+ assert success
1328
+ assert trade_make is not None
1329
+
1330
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
1331
+ [Offer.from_bytes(trade_make.offer)]
1332
+ )
1333
+ if royalty_basis_pts_maker == 10000:
1334
+ with pytest.raises(ValueError):
1335
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1336
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
1337
+ ) as action_scope:
1338
+ trade_take = await trade_manager_taker.respond_to_offer(
1339
+ Offer.from_bytes(trade_make.offer),
1340
+ wallet_node_taker.get_full_node_peer(),
1341
+ action_scope,
1342
+ fee=FEE,
1343
+ )
1344
+ # all done for this test
1345
+ return
1346
+ else:
1347
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1348
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
1349
+ ) as action_scope:
1350
+ trade_take = await trade_manager_taker.respond_to_offer(
1351
+ maker_offer,
1352
+ wallet_node_taker.get_full_node_peer(),
1353
+ action_scope,
1354
+ fee=FEE,
1355
+ )
1356
+ assert trade_take is not None
1357
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
1358
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=60)
1359
+
1360
+ # Now let's make sure the final wallet state is correct
1361
+ maker_royalty_summary = NFTWallet.royalty_calculation(
1362
+ {
1363
+ nft_to_offer_asset_id_maker: (royalty_puzhash_maker, uint16(royalty_basis_pts_maker)),
1364
+ },
1365
+ {
1366
+ None: uint64(XCH_REQUESTED),
1367
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): uint64(CAT_REQUESTED),
1368
+ },
1369
+ )
1370
+ taker_royalty_summary = NFTWallet.royalty_calculation(
1371
+ {
1372
+ nft_to_offer_asset_id_taker_1: (royalty_puzhash_taker, royalty_basis_pts_taker_1),
1373
+ nft_to_offer_asset_id_taker_2: (royalty_puzhash_taker, royalty_basis_pts_taker_2),
1374
+ },
1375
+ {
1376
+ bytes32.from_hexstr(cat_wallet_maker.get_asset_id()): uint64(CAT_REQUESTED),
1377
+ },
1378
+ )
1379
+ maker_xch_royalties_expected = maker_royalty_summary[nft_to_offer_asset_id_maker][0]["amount"]
1380
+ maker_cat_royalties_expected = maker_royalty_summary[nft_to_offer_asset_id_maker][1]["amount"]
1381
+ taker_cat_royalties_expected = (
1382
+ taker_royalty_summary[nft_to_offer_asset_id_taker_1][0]["amount"]
1383
+ + taker_royalty_summary[nft_to_offer_asset_id_taker_2][0]["amount"]
1384
+ )
1385
+ funds_maker = int(funds_maker - FEE + XCH_REQUESTED + maker_xch_royalties_expected)
1386
+ funds_taker = int(funds_taker - FEE - XCH_REQUESTED - maker_xch_royalties_expected)
1387
+
1388
+ await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
1389
+ await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
1390
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1391
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1392
+
1393
+ async def get_cat_wallet_and_check_balance(asset_id: str, wsm: Any) -> uint128:
1394
+ cat_wallet = await wsm.get_wallet_for_asset_id(asset_id)
1395
+ if cat_wallet is None:
1396
+ return uint128(0)
1397
+ else:
1398
+ return uint128(await cat_wallet.get_confirmed_balance())
1399
+
1400
+ taker_cat_funds_maker = CAT_REQUESTED + maker_cat_royalties_expected
1401
+ maker_cat_funds_taker = CAT_REQUESTED + taker_cat_royalties_expected
1402
+ await time_out_assert(
1403
+ 30,
1404
+ get_cat_wallet_and_check_balance,
1405
+ taker_cat_funds_maker,
1406
+ cat_wallet_taker.get_asset_id(),
1407
+ wsm_maker,
1408
+ )
1409
+ await time_out_assert(
1410
+ 30,
1411
+ get_cat_wallet_and_check_balance,
1412
+ maker_cat_funds_taker,
1413
+ cat_wallet_maker.get_asset_id(),
1414
+ wsm_taker,
1415
+ )
1416
+ maker_nfts = await basic_nft_wallet_maker.get_current_nfts()
1417
+ taker_nfts = await basic_nft_wallet_taker.get_current_nfts()
1418
+ assert len(maker_nfts) == 2
1419
+ assert len(taker_nfts) == 1
1420
+
1421
+ assert nft_to_offer_asset_id_maker == taker_nfts[0].nft_id
1422
+ assert nft_to_offer_asset_id_taker_1 in [nft.nft_id for nft in maker_nfts]
1423
+ assert nft_to_offer_asset_id_taker_2 in [nft.nft_id for nft in maker_nfts]
1424
+
1425
+ # Try another permutation
1426
+ complex_nft_offer = {
1427
+ cat_wallet_maker.id(): CAT_REQUESTED * -1,
1428
+ 1: int(XCH_REQUESTED / 2),
1429
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): CAT_REQUESTED,
1430
+ nft_to_offer_asset_id_maker: 1,
1431
+ }
1432
+
1433
+ driver_dict = {
1434
+ nft_to_offer_asset_id_maker: match_puzzle(uncurry_puzzle(taker_nfts[0].full_puzzle)),
1435
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): PuzzleInfo(
1436
+ {
1437
+ "type": "CAT",
1438
+ "tail": "0x" + cat_wallet_taker.get_asset_id(),
1439
+ }
1440
+ ),
1441
+ }
1442
+
1443
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
1444
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1445
+ complex_nft_offer, action_scope, driver_dict=driver_dict, fee=uint64(0)
1446
+ )
1447
+ assert error is None
1448
+ assert success
1449
+ assert trade_make is not None
1450
+
1451
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
1452
+ [Offer.from_bytes(trade_make.offer)]
1453
+ )
1454
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1455
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
1456
+ ) as action_scope:
1457
+ trade_take = await trade_manager_taker.respond_to_offer(
1458
+ Offer.from_bytes(trade_make.offer),
1459
+ wallet_node_taker.get_full_node_peer(),
1460
+ action_scope,
1461
+ fee=uint64(0),
1462
+ )
1463
+ assert trade_take is not None
1464
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
1465
+
1466
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
1467
+
1468
+ # Now let's make sure the final wallet state is correct
1469
+ funds_maker = int(funds_maker + XCH_REQUESTED / 2)
1470
+ funds_taker = int(funds_taker - XCH_REQUESTED / 2)
1471
+
1472
+ await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
1473
+ await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
1474
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1475
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1476
+
1477
+ await time_out_assert(
1478
+ 30,
1479
+ get_cat_wallet_and_check_balance,
1480
+ taker_cat_funds_maker + CAT_REQUESTED,
1481
+ cat_wallet_taker.get_asset_id(),
1482
+ wsm_maker,
1483
+ )
1484
+ await time_out_assert(
1485
+ 30,
1486
+ get_cat_wallet_and_check_balance,
1487
+ maker_cat_funds_taker + CAT_REQUESTED,
1488
+ cat_wallet_maker.get_asset_id(),
1489
+ wsm_taker,
1490
+ )
1491
+ await time_out_assert(20, get_nft_count, 3, basic_nft_wallet_maker)
1492
+ await time_out_assert(20, get_nft_count, 0, basic_nft_wallet_taker)
1493
+ assert await basic_nft_wallet_maker.nft_store.get_nft_by_id(nft_to_offer_asset_id_maker) is not None