chia-blockchain 2.4.4__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 (1028) 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 +197 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +147 -0
  9. chia/_tests/blockchain/test_blockchain.py +4100 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1050 -0
  11. chia/_tests/blockchain/test_build_chains.py +61 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +195 -0
  14. chia/_tests/build-init-files.py +93 -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 +73 -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 +147 -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 +57 -0
  26. chia/_tests/clvm/test_program.py +150 -0
  27. chia/_tests/clvm/test_puzzle_compression.py +144 -0
  28. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  29. chia/_tests/clvm/test_puzzles.py +247 -0
  30. chia/_tests/clvm/test_singletons.py +540 -0
  31. chia/_tests/clvm/test_spend_sim.py +181 -0
  32. chia/_tests/cmds/__init__.py +0 -0
  33. chia/_tests/cmds/cmd_test_utils.py +472 -0
  34. chia/_tests/cmds/config.py +3 -0
  35. chia/_tests/cmds/conftest.py +23 -0
  36. chia/_tests/cmds/test_click_types.py +195 -0
  37. chia/_tests/cmds/test_cmd_framework.py +400 -0
  38. chia/_tests/cmds/test_cmds_util.py +97 -0
  39. chia/_tests/cmds/test_daemon.py +92 -0
  40. chia/_tests/cmds/test_farm_cmd.py +67 -0
  41. chia/_tests/cmds/test_show.py +116 -0
  42. chia/_tests/cmds/test_sim.py +207 -0
  43. chia/_tests/cmds/test_timelock_args.py +75 -0
  44. chia/_tests/cmds/test_tx_config_args.py +153 -0
  45. chia/_tests/cmds/testing_classes.py +59 -0
  46. chia/_tests/cmds/wallet/__init__.py +0 -0
  47. chia/_tests/cmds/wallet/test_coins.py +195 -0
  48. chia/_tests/cmds/wallet/test_consts.py +47 -0
  49. chia/_tests/cmds/wallet/test_dao.py +565 -0
  50. chia/_tests/cmds/wallet/test_did.py +403 -0
  51. chia/_tests/cmds/wallet/test_nft.py +470 -0
  52. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  53. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  54. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  55. chia/_tests/cmds/wallet/test_vcs.py +376 -0
  56. chia/_tests/cmds/wallet/test_wallet.py +1126 -0
  57. chia/_tests/cmds/wallet/test_wallet_check.py +111 -0
  58. chia/_tests/conftest.py +1304 -0
  59. chia/_tests/connection_utils.py +124 -0
  60. chia/_tests/core/__init__.py +0 -0
  61. chia/_tests/core/cmds/__init__.py +0 -0
  62. chia/_tests/core/cmds/test_beta.py +382 -0
  63. chia/_tests/core/cmds/test_keys.py +1734 -0
  64. chia/_tests/core/cmds/test_wallet.py +126 -0
  65. chia/_tests/core/config.py +3 -0
  66. chia/_tests/core/consensus/__init__.py +0 -0
  67. chia/_tests/core/consensus/test_block_creation.py +56 -0
  68. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  69. chia/_tests/core/custom_types/__init__.py +0 -0
  70. chia/_tests/core/custom_types/test_coin.py +109 -0
  71. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  72. chia/_tests/core/custom_types/test_spend_bundle.py +71 -0
  73. chia/_tests/core/daemon/__init__.py +0 -0
  74. chia/_tests/core/daemon/config.py +4 -0
  75. chia/_tests/core/daemon/test_daemon.py +2128 -0
  76. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  77. chia/_tests/core/daemon/test_keychain_proxy.py +100 -0
  78. chia/_tests/core/data_layer/__init__.py +0 -0
  79. chia/_tests/core/data_layer/config.py +5 -0
  80. chia/_tests/core/data_layer/conftest.py +105 -0
  81. chia/_tests/core/data_layer/test_data_cli.py +57 -0
  82. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  83. chia/_tests/core/data_layer/test_data_layer_util.py +219 -0
  84. chia/_tests/core/data_layer/test_data_rpc.py +3865 -0
  85. chia/_tests/core/data_layer/test_data_store.py +2423 -0
  86. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  87. chia/_tests/core/data_layer/test_plugin.py +91 -0
  88. chia/_tests/core/data_layer/util.py +232 -0
  89. chia/_tests/core/farmer/__init__.py +0 -0
  90. chia/_tests/core/farmer/config.py +3 -0
  91. chia/_tests/core/farmer/test_farmer_api.py +101 -0
  92. chia/_tests/core/full_node/__init__.py +0 -0
  93. chia/_tests/core/full_node/config.py +4 -0
  94. chia/_tests/core/full_node/dos/__init__.py +0 -0
  95. chia/_tests/core/full_node/dos/config.py +3 -0
  96. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  97. chia/_tests/core/full_node/full_sync/config.py +4 -0
  98. chia/_tests/core/full_node/full_sync/test_full_sync.py +448 -0
  99. chia/_tests/core/full_node/ram_db.py +27 -0
  100. chia/_tests/core/full_node/stores/__init__.py +0 -0
  101. chia/_tests/core/full_node/stores/config.py +4 -0
  102. chia/_tests/core/full_node/stores/test_block_store.py +488 -0
  103. chia/_tests/core/full_node/stores/test_coin_store.py +888 -0
  104. chia/_tests/core/full_node/stores/test_full_node_store.py +1215 -0
  105. chia/_tests/core/full_node/stores/test_hint_store.py +230 -0
  106. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  107. chia/_tests/core/full_node/test_address_manager.py +588 -0
  108. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  109. chia/_tests/core/full_node/test_conditions.py +558 -0
  110. chia/_tests/core/full_node/test_full_node.py +2445 -0
  111. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  112. chia/_tests/core/full_node/test_hint_management.py +104 -0
  113. chia/_tests/core/full_node/test_node_load.py +34 -0
  114. chia/_tests/core/full_node/test_performance.py +182 -0
  115. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  116. chia/_tests/core/full_node/test_transactions.py +203 -0
  117. chia/_tests/core/full_node/test_tx_processing_queue.py +154 -0
  118. chia/_tests/core/large_block.py +2388 -0
  119. chia/_tests/core/make_block_generator.py +72 -0
  120. chia/_tests/core/mempool/__init__.py +0 -0
  121. chia/_tests/core/mempool/config.py +4 -0
  122. chia/_tests/core/mempool/test_mempool.py +3180 -0
  123. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  124. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  125. chia/_tests/core/mempool/test_mempool_item_queries.py +192 -0
  126. chia/_tests/core/mempool/test_mempool_manager.py +2054 -0
  127. chia/_tests/core/mempool/test_mempool_performance.py +65 -0
  128. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  129. chia/_tests/core/node_height.py +28 -0
  130. chia/_tests/core/server/__init__.py +0 -0
  131. chia/_tests/core/server/config.py +3 -0
  132. chia/_tests/core/server/flood.py +82 -0
  133. chia/_tests/core/server/serve.py +132 -0
  134. chia/_tests/core/server/test_capabilities.py +68 -0
  135. chia/_tests/core/server/test_dos.py +320 -0
  136. chia/_tests/core/server/test_event_loop.py +109 -0
  137. chia/_tests/core/server/test_loop.py +290 -0
  138. chia/_tests/core/server/test_node_discovery.py +74 -0
  139. chia/_tests/core/server/test_rate_limits.py +370 -0
  140. chia/_tests/core/server/test_server.py +225 -0
  141. chia/_tests/core/server/test_upnp.py +8 -0
  142. chia/_tests/core/services/__init__.py +0 -0
  143. chia/_tests/core/services/config.py +3 -0
  144. chia/_tests/core/services/test_services.py +166 -0
  145. chia/_tests/core/ssl/__init__.py +0 -0
  146. chia/_tests/core/ssl/config.py +3 -0
  147. chia/_tests/core/ssl/test_ssl.py +198 -0
  148. chia/_tests/core/test_coins.py +33 -0
  149. chia/_tests/core/test_cost_calculation.py +314 -0
  150. chia/_tests/core/test_crawler.py +175 -0
  151. chia/_tests/core/test_crawler_rpc.py +53 -0
  152. chia/_tests/core/test_daemon_rpc.py +24 -0
  153. chia/_tests/core/test_db_conversion.py +129 -0
  154. chia/_tests/core/test_db_validation.py +161 -0
  155. chia/_tests/core/test_farmer_harvester_rpc.py +504 -0
  156. chia/_tests/core/test_filter.py +37 -0
  157. chia/_tests/core/test_full_node_rpc.py +794 -0
  158. chia/_tests/core/test_merkle_set.py +343 -0
  159. chia/_tests/core/test_program.py +49 -0
  160. chia/_tests/core/test_rpc_util.py +87 -0
  161. chia/_tests/core/test_seeder.py +308 -0
  162. chia/_tests/core/test_setproctitle.py +13 -0
  163. chia/_tests/core/util/__init__.py +0 -0
  164. chia/_tests/core/util/config.py +4 -0
  165. chia/_tests/core/util/test_block_cache.py +44 -0
  166. chia/_tests/core/util/test_cached_bls.py +57 -0
  167. chia/_tests/core/util/test_config.py +337 -0
  168. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  169. chia/_tests/core/util/test_files.py +391 -0
  170. chia/_tests/core/util/test_jsonify.py +146 -0
  171. chia/_tests/core/util/test_keychain.py +514 -0
  172. chia/_tests/core/util/test_keyring_wrapper.py +490 -0
  173. chia/_tests/core/util/test_lockfile.py +380 -0
  174. chia/_tests/core/util/test_log_exceptions.py +187 -0
  175. chia/_tests/core/util/test_lru_cache.py +56 -0
  176. chia/_tests/core/util/test_significant_bits.py +40 -0
  177. chia/_tests/core/util/test_streamable.py +883 -0
  178. chia/_tests/db/__init__.py +0 -0
  179. chia/_tests/db/test_db_wrapper.py +565 -0
  180. chia/_tests/environments/__init__.py +0 -0
  181. chia/_tests/environments/common.py +35 -0
  182. chia/_tests/environments/full_node.py +47 -0
  183. chia/_tests/environments/wallet.py +368 -0
  184. chia/_tests/ether.py +19 -0
  185. chia/_tests/farmer_harvester/__init__.py +0 -0
  186. chia/_tests/farmer_harvester/config.py +3 -0
  187. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  188. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  189. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +130 -0
  190. chia/_tests/farmer_harvester/test_third_party_harvesters.py +501 -0
  191. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  192. chia/_tests/fee_estimation/__init__.py +0 -0
  193. chia/_tests/fee_estimation/config.py +3 -0
  194. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  195. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +145 -0
  197. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  198. chia/_tests/generator/__init__.py +0 -0
  199. chia/_tests/generator/puzzles/__init__.py +0 -0
  200. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  201. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  202. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  203. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  204. chia/_tests/generator/test_compression.py +218 -0
  205. chia/_tests/generator/test_generator_types.py +44 -0
  206. chia/_tests/generator/test_rom.py +182 -0
  207. chia/_tests/plot_sync/__init__.py +0 -0
  208. chia/_tests/plot_sync/config.py +3 -0
  209. chia/_tests/plot_sync/test_delta.py +102 -0
  210. chia/_tests/plot_sync/test_plot_sync.py +617 -0
  211. chia/_tests/plot_sync/test_receiver.py +451 -0
  212. chia/_tests/plot_sync/test_sender.py +116 -0
  213. chia/_tests/plot_sync/test_sync_simulated.py +450 -0
  214. chia/_tests/plot_sync/util.py +67 -0
  215. chia/_tests/plotting/__init__.py +0 -0
  216. chia/_tests/plotting/config.py +3 -0
  217. chia/_tests/plotting/test_plot_manager.py +738 -0
  218. chia/_tests/plotting/util.py +13 -0
  219. chia/_tests/pools/__init__.py +0 -0
  220. chia/_tests/pools/config.py +5 -0
  221. chia/_tests/pools/test_pool_cmdline.py +23 -0
  222. chia/_tests/pools/test_pool_config.py +44 -0
  223. chia/_tests/pools/test_pool_puzzles_lifecycle.py +398 -0
  224. chia/_tests/pools/test_pool_rpc.py +1010 -0
  225. chia/_tests/pools/test_pool_wallet.py +201 -0
  226. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  227. chia/_tests/process_junit.py +349 -0
  228. chia/_tests/rpc/__init__.py +0 -0
  229. chia/_tests/rpc/test_rpc_client.py +81 -0
  230. chia/_tests/simulation/__init__.py +0 -0
  231. chia/_tests/simulation/config.py +6 -0
  232. chia/_tests/simulation/test_simulation.py +501 -0
  233. chia/_tests/simulation/test_simulator.py +234 -0
  234. chia/_tests/simulation/test_start_simulator.py +106 -0
  235. chia/_tests/testconfig.py +13 -0
  236. chia/_tests/timelord/__init__.py +0 -0
  237. chia/_tests/timelord/config.py +3 -0
  238. chia/_tests/timelord/test_new_peak.py +437 -0
  239. chia/_tests/timelord/test_timelord.py +11 -0
  240. chia/_tests/tools/1315537.json +170 -0
  241. chia/_tests/tools/1315544.json +160 -0
  242. chia/_tests/tools/1315630.json +150 -0
  243. chia/_tests/tools/300000.json +105 -0
  244. chia/_tests/tools/442734.json +140 -0
  245. chia/_tests/tools/466212.json +130 -0
  246. chia/_tests/tools/__init__.py +0 -0
  247. chia/_tests/tools/config.py +5 -0
  248. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  249. chia/_tests/tools/test_full_sync.py +30 -0
  250. chia/_tests/tools/test_legacy_keyring.py +82 -0
  251. chia/_tests/tools/test_run_block.py +129 -0
  252. chia/_tests/util/__init__.py +0 -0
  253. chia/_tests/util/benchmark_cost.py +170 -0
  254. chia/_tests/util/benchmarks.py +154 -0
  255. chia/_tests/util/bip39_test_vectors.json +148 -0
  256. chia/_tests/util/blockchain.py +133 -0
  257. chia/_tests/util/blockchain_mock.py +132 -0
  258. chia/_tests/util/build_network_protocol_files.py +302 -0
  259. chia/_tests/util/clvm_generator.bin +0 -0
  260. chia/_tests/util/config.py +3 -0
  261. chia/_tests/util/constants.py +20 -0
  262. chia/_tests/util/db_connection.py +36 -0
  263. chia/_tests/util/full_sync.py +245 -0
  264. chia/_tests/util/gen_ssl_certs.py +115 -0
  265. chia/_tests/util/generator_tools_testing.py +47 -0
  266. chia/_tests/util/key_tool.py +37 -0
  267. chia/_tests/util/misc.py +722 -0
  268. chia/_tests/util/network_protocol_data.py +1074 -0
  269. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  270. chia/_tests/util/protocol_messages_json.py +2700 -0
  271. chia/_tests/util/rpc.py +23 -0
  272. chia/_tests/util/run_block.py +163 -0
  273. chia/_tests/util/setup_nodes.py +479 -0
  274. chia/_tests/util/split_managers.py +99 -0
  275. chia/_tests/util/temp_file.py +14 -0
  276. chia/_tests/util/test_action_scope.py +143 -0
  277. chia/_tests/util/test_async_pool.py +366 -0
  278. chia/_tests/util/test_build_job_matrix.py +43 -0
  279. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  280. chia/_tests/util/test_chia_version.py +50 -0
  281. chia/_tests/util/test_collection.py +11 -0
  282. chia/_tests/util/test_condition_tools.py +231 -0
  283. chia/_tests/util/test_config.py +426 -0
  284. chia/_tests/util/test_dump_keyring.py +60 -0
  285. chia/_tests/util/test_errors.py +10 -0
  286. chia/_tests/util/test_full_block_utils.py +271 -0
  287. chia/_tests/util/test_installed.py +20 -0
  288. chia/_tests/util/test_limited_semaphore.py +52 -0
  289. chia/_tests/util/test_logging_filter.py +43 -0
  290. chia/_tests/util/test_misc.py +444 -0
  291. chia/_tests/util/test_network.py +74 -0
  292. chia/_tests/util/test_network_protocol_files.py +579 -0
  293. chia/_tests/util/test_network_protocol_json.py +266 -0
  294. chia/_tests/util/test_network_protocol_test.py +257 -0
  295. chia/_tests/util/test_paginator.py +72 -0
  296. chia/_tests/util/test_pprint.py +17 -0
  297. chia/_tests/util/test_priority_mutex.py +487 -0
  298. chia/_tests/util/test_recursive_replace.py +116 -0
  299. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  300. chia/_tests/util/test_service_groups.py +15 -0
  301. chia/_tests/util/test_ssl_check.py +31 -0
  302. chia/_tests/util/test_testnet_overrides.py +19 -0
  303. chia/_tests/util/test_tests_misc.py +38 -0
  304. chia/_tests/util/test_timing.py +37 -0
  305. chia/_tests/util/test_trusted_peer.py +51 -0
  306. chia/_tests/util/time_out_assert.py +154 -0
  307. chia/_tests/wallet/__init__.py +0 -0
  308. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  309. chia/_tests/wallet/cat_wallet/config.py +4 -0
  310. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  311. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  312. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1738 -0
  313. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  314. chia/_tests/wallet/cat_wallet/test_trades.py +2578 -0
  315. chia/_tests/wallet/clawback/__init__.py +0 -0
  316. chia/_tests/wallet/clawback/config.py +3 -0
  317. chia/_tests/wallet/clawback/test_clawback_decorator.py +80 -0
  318. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  319. chia/_tests/wallet/clawback/test_clawback_metadata.py +51 -0
  320. chia/_tests/wallet/config.py +4 -0
  321. chia/_tests/wallet/conftest.py +217 -0
  322. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  323. chia/_tests/wallet/dao_wallet/config.py +3 -0
  324. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1322 -0
  325. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  326. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  327. chia/_tests/wallet/db_wallet/config.py +3 -0
  328. chia/_tests/wallet/db_wallet/test_db_graftroot.py +143 -0
  329. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  330. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  331. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  332. chia/_tests/wallet/did_wallet/config.py +4 -0
  333. chia/_tests/wallet/did_wallet/test_did.py +1481 -0
  334. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  335. chia/_tests/wallet/nft_wallet/config.py +4 -0
  336. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1492 -0
  337. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1014 -0
  338. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +376 -0
  339. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  340. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  341. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2558 -0
  342. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  343. chia/_tests/wallet/rpc/__init__.py +0 -0
  344. chia/_tests/wallet/rpc/config.py +4 -0
  345. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +287 -0
  346. chia/_tests/wallet/rpc/test_wallet_rpc.py +3106 -0
  347. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  348. chia/_tests/wallet/simple_sync/config.py +3 -0
  349. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +719 -0
  350. chia/_tests/wallet/sync/__init__.py +0 -0
  351. chia/_tests/wallet/sync/config.py +4 -0
  352. chia/_tests/wallet/sync/test_wallet_sync.py +1529 -0
  353. chia/_tests/wallet/test_address_type.py +189 -0
  354. chia/_tests/wallet/test_bech32m.py +45 -0
  355. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  356. chia/_tests/wallet/test_coin_selection.py +589 -0
  357. chia/_tests/wallet/test_conditions.py +388 -0
  358. chia/_tests/wallet/test_debug_spend_bundle.py +76 -0
  359. chia/_tests/wallet/test_new_wallet_protocol.py +1176 -0
  360. chia/_tests/wallet/test_nft_store.py +193 -0
  361. chia/_tests/wallet/test_notifications.py +196 -0
  362. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  363. chia/_tests/wallet/test_puzzle_store.py +133 -0
  364. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  365. chia/_tests/wallet/test_signer_protocol.py +948 -0
  366. chia/_tests/wallet/test_singleton.py +122 -0
  367. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  368. chia/_tests/wallet/test_singleton_store.py +152 -0
  369. chia/_tests/wallet/test_taproot.py +19 -0
  370. chia/_tests/wallet/test_transaction_store.py +941 -0
  371. chia/_tests/wallet/test_util.py +181 -0
  372. chia/_tests/wallet/test_wallet.py +2139 -0
  373. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  374. chia/_tests/wallet/test_wallet_blockchain.py +113 -0
  375. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  376. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  377. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  378. chia/_tests/wallet/test_wallet_node.py +783 -0
  379. chia/_tests/wallet/test_wallet_retry.py +95 -0
  380. chia/_tests/wallet/test_wallet_state_manager.py +252 -0
  381. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  382. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  383. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  384. chia/_tests/wallet/test_wallet_utils.py +155 -0
  385. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  386. chia/_tests/wallet/vc_wallet/config.py +3 -0
  387. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  388. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  389. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +801 -0
  390. chia/_tests/wallet/wallet_block_tools.py +327 -0
  391. chia/_tests/weight_proof/__init__.py +0 -0
  392. chia/_tests/weight_proof/config.py +3 -0
  393. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  394. chia/clvm/__init__.py +0 -0
  395. chia/clvm/spend_sim.py +488 -0
  396. chia/cmds/__init__.py +0 -0
  397. chia/cmds/beta.py +183 -0
  398. chia/cmds/beta_funcs.py +133 -0
  399. chia/cmds/check_wallet_db.py +418 -0
  400. chia/cmds/chia.py +143 -0
  401. chia/cmds/cmd_classes.py +315 -0
  402. chia/cmds/cmds_util.py +498 -0
  403. chia/cmds/coin_funcs.py +260 -0
  404. chia/cmds/coins.py +220 -0
  405. chia/cmds/completion.py +49 -0
  406. chia/cmds/configure.py +331 -0
  407. chia/cmds/dao.py +1008 -0
  408. chia/cmds/dao_funcs.py +576 -0
  409. chia/cmds/data.py +707 -0
  410. chia/cmds/data_funcs.py +380 -0
  411. chia/cmds/db.py +86 -0
  412. chia/cmds/db_backup_func.py +77 -0
  413. chia/cmds/db_upgrade_func.py +452 -0
  414. chia/cmds/db_validate_func.py +184 -0
  415. chia/cmds/dev.py +16 -0
  416. chia/cmds/farm.py +87 -0
  417. chia/cmds/farm_funcs.py +207 -0
  418. chia/cmds/init.py +70 -0
  419. chia/cmds/init_funcs.py +367 -0
  420. chia/cmds/installers.py +129 -0
  421. chia/cmds/keys.py +510 -0
  422. chia/cmds/keys_funcs.py +864 -0
  423. chia/cmds/netspace.py +47 -0
  424. chia/cmds/netspace_funcs.py +53 -0
  425. chia/cmds/options.py +32 -0
  426. chia/cmds/param_types.py +228 -0
  427. chia/cmds/passphrase.py +130 -0
  428. chia/cmds/passphrase_funcs.py +346 -0
  429. chia/cmds/peer.py +50 -0
  430. chia/cmds/peer_funcs.py +129 -0
  431. chia/cmds/plotnft.py +206 -0
  432. chia/cmds/plotnft_funcs.py +374 -0
  433. chia/cmds/plots.py +222 -0
  434. chia/cmds/plotters.py +17 -0
  435. chia/cmds/rpc.py +188 -0
  436. chia/cmds/show.py +71 -0
  437. chia/cmds/show_funcs.py +214 -0
  438. chia/cmds/signer.py +304 -0
  439. chia/cmds/sim.py +217 -0
  440. chia/cmds/sim_funcs.py +509 -0
  441. chia/cmds/start.py +24 -0
  442. chia/cmds/start_funcs.py +112 -0
  443. chia/cmds/stop.py +61 -0
  444. chia/cmds/units.py +11 -0
  445. chia/cmds/wallet.py +1745 -0
  446. chia/cmds/wallet_funcs.py +1800 -0
  447. chia/consensus/__init__.py +0 -0
  448. chia/consensus/block_body_validation.py +515 -0
  449. chia/consensus/block_creation.py +525 -0
  450. chia/consensus/block_header_validation.py +1064 -0
  451. chia/consensus/block_record.py +32 -0
  452. chia/consensus/block_rewards.py +53 -0
  453. chia/consensus/block_root_validation.py +46 -0
  454. chia/consensus/blockchain.py +1100 -0
  455. chia/consensus/blockchain_interface.py +56 -0
  456. chia/consensus/coinbase.py +30 -0
  457. chia/consensus/condition_costs.py +9 -0
  458. chia/consensus/constants.py +49 -0
  459. chia/consensus/cost_calculator.py +15 -0
  460. chia/consensus/default_constants.py +90 -0
  461. chia/consensus/deficit.py +55 -0
  462. chia/consensus/difficulty_adjustment.py +412 -0
  463. chia/consensus/find_fork_point.py +111 -0
  464. chia/consensus/full_block_to_block_record.py +167 -0
  465. chia/consensus/get_block_challenge.py +106 -0
  466. chia/consensus/get_block_generator.py +26 -0
  467. chia/consensus/make_sub_epoch_summary.py +210 -0
  468. chia/consensus/multiprocess_validation.py +365 -0
  469. chia/consensus/pos_quality.py +19 -0
  470. chia/consensus/pot_iterations.py +67 -0
  471. chia/consensus/puzzles/__init__.py +0 -0
  472. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  473. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  474. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  475. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  476. chia/consensus/vdf_info_computation.py +156 -0
  477. chia/daemon/__init__.py +0 -0
  478. chia/daemon/client.py +233 -0
  479. chia/daemon/keychain_proxy.py +501 -0
  480. chia/daemon/keychain_server.py +365 -0
  481. chia/daemon/server.py +1616 -0
  482. chia/daemon/windows_signal.py +56 -0
  483. chia/data_layer/__init__.py +0 -0
  484. chia/data_layer/data_layer.py +1303 -0
  485. chia/data_layer/data_layer_api.py +25 -0
  486. chia/data_layer/data_layer_errors.py +50 -0
  487. chia/data_layer/data_layer_server.py +170 -0
  488. chia/data_layer/data_layer_util.py +985 -0
  489. chia/data_layer/data_layer_wallet.py +1315 -0
  490. chia/data_layer/data_store.py +2267 -0
  491. chia/data_layer/dl_wallet_store.py +407 -0
  492. chia/data_layer/download_data.py +389 -0
  493. chia/data_layer/puzzles/__init__.py +0 -0
  494. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  495. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  496. chia/data_layer/s3_plugin_config.yml +33 -0
  497. chia/data_layer/s3_plugin_service.py +468 -0
  498. chia/data_layer/util/__init__.py +0 -0
  499. chia/data_layer/util/benchmark.py +108 -0
  500. chia/data_layer/util/plugin.py +41 -0
  501. chia/farmer/__init__.py +0 -0
  502. chia/farmer/farmer.py +920 -0
  503. chia/farmer/farmer_api.py +814 -0
  504. chia/full_node/__init__.py +0 -0
  505. chia/full_node/bitcoin_fee_estimator.py +85 -0
  506. chia/full_node/block_height_map.py +271 -0
  507. chia/full_node/block_store.py +570 -0
  508. chia/full_node/bundle_tools.py +19 -0
  509. chia/full_node/coin_store.py +646 -0
  510. chia/full_node/fee_estimate.py +54 -0
  511. chia/full_node/fee_estimate_store.py +24 -0
  512. chia/full_node/fee_estimation.py +93 -0
  513. chia/full_node/fee_estimator.py +90 -0
  514. chia/full_node/fee_estimator_constants.py +38 -0
  515. chia/full_node/fee_estimator_interface.py +42 -0
  516. chia/full_node/fee_history.py +26 -0
  517. chia/full_node/fee_tracker.py +564 -0
  518. chia/full_node/full_node.py +3052 -0
  519. chia/full_node/full_node_api.py +1974 -0
  520. chia/full_node/full_node_store.py +1033 -0
  521. chia/full_node/hint_management.py +56 -0
  522. chia/full_node/hint_store.py +94 -0
  523. chia/full_node/mempool.py +583 -0
  524. chia/full_node/mempool_check_conditions.py +177 -0
  525. chia/full_node/mempool_manager.py +858 -0
  526. chia/full_node/pending_tx_cache.py +112 -0
  527. chia/full_node/puzzles/__init__.py +0 -0
  528. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  529. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  530. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  531. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  532. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  533. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  534. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  535. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  536. chia/full_node/signage_point.py +16 -0
  537. chia/full_node/subscriptions.py +248 -0
  538. chia/full_node/sync_store.py +145 -0
  539. chia/full_node/tx_processing_queue.py +78 -0
  540. chia/full_node/weight_proof.py +1719 -0
  541. chia/harvester/__init__.py +0 -0
  542. chia/harvester/harvester.py +271 -0
  543. chia/harvester/harvester_api.py +374 -0
  544. chia/introducer/__init__.py +0 -0
  545. chia/introducer/introducer.py +120 -0
  546. chia/introducer/introducer_api.py +64 -0
  547. chia/legacy/__init__.py +0 -0
  548. chia/legacy/keyring.py +154 -0
  549. chia/plot_sync/__init__.py +0 -0
  550. chia/plot_sync/delta.py +61 -0
  551. chia/plot_sync/exceptions.py +56 -0
  552. chia/plot_sync/receiver.py +385 -0
  553. chia/plot_sync/sender.py +337 -0
  554. chia/plot_sync/util.py +43 -0
  555. chia/plotters/__init__.py +0 -0
  556. chia/plotters/bladebit.py +388 -0
  557. chia/plotters/chiapos.py +63 -0
  558. chia/plotters/madmax.py +224 -0
  559. chia/plotters/plotters.py +577 -0
  560. chia/plotters/plotters_util.py +131 -0
  561. chia/plotting/__init__.py +0 -0
  562. chia/plotting/cache.py +212 -0
  563. chia/plotting/check_plots.py +283 -0
  564. chia/plotting/create_plots.py +278 -0
  565. chia/plotting/manager.py +436 -0
  566. chia/plotting/util.py +324 -0
  567. chia/pools/__init__.py +0 -0
  568. chia/pools/pool_config.py +110 -0
  569. chia/pools/pool_puzzles.py +459 -0
  570. chia/pools/pool_wallet.py +926 -0
  571. chia/pools/pool_wallet_info.py +118 -0
  572. chia/pools/puzzles/__init__.py +0 -0
  573. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  574. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  575. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  576. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  577. chia/protocols/__init__.py +0 -0
  578. chia/protocols/farmer_protocol.py +102 -0
  579. chia/protocols/full_node_protocol.py +219 -0
  580. chia/protocols/harvester_protocol.py +216 -0
  581. chia/protocols/introducer_protocol.py +26 -0
  582. chia/protocols/pool_protocol.py +177 -0
  583. chia/protocols/protocol_message_types.py +139 -0
  584. chia/protocols/protocol_state_machine.py +87 -0
  585. chia/protocols/protocol_timing.py +7 -0
  586. chia/protocols/shared_protocol.py +86 -0
  587. chia/protocols/timelord_protocol.py +93 -0
  588. chia/protocols/wallet_protocol.py +401 -0
  589. chia/py.typed +0 -0
  590. chia/rpc/__init__.py +0 -0
  591. chia/rpc/crawler_rpc_api.py +75 -0
  592. chia/rpc/data_layer_rpc_api.py +639 -0
  593. chia/rpc/data_layer_rpc_client.py +188 -0
  594. chia/rpc/data_layer_rpc_util.py +62 -0
  595. chia/rpc/farmer_rpc_api.py +360 -0
  596. chia/rpc/farmer_rpc_client.py +86 -0
  597. chia/rpc/full_node_rpc_api.py +954 -0
  598. chia/rpc/full_node_rpc_client.py +292 -0
  599. chia/rpc/harvester_rpc_api.py +136 -0
  600. chia/rpc/harvester_rpc_client.py +54 -0
  601. chia/rpc/rpc_client.py +144 -0
  602. chia/rpc/rpc_server.py +447 -0
  603. chia/rpc/timelord_rpc_api.py +27 -0
  604. chia/rpc/util.py +293 -0
  605. chia/rpc/wallet_request_types.py +688 -0
  606. chia/rpc/wallet_rpc_api.py +4779 -0
  607. chia/rpc/wallet_rpc_client.py +1844 -0
  608. chia/seeder/__init__.py +0 -0
  609. chia/seeder/crawl_store.py +427 -0
  610. chia/seeder/crawler.py +423 -0
  611. chia/seeder/crawler_api.py +129 -0
  612. chia/seeder/dns_server.py +544 -0
  613. chia/seeder/peer_record.py +146 -0
  614. chia/seeder/start_crawler.py +88 -0
  615. chia/server/__init__.py +0 -0
  616. chia/server/address_manager.py +658 -0
  617. chia/server/address_manager_store.py +237 -0
  618. chia/server/api_protocol.py +11 -0
  619. chia/server/capabilities.py +24 -0
  620. chia/server/chia_policy.py +345 -0
  621. chia/server/introducer_peers.py +76 -0
  622. chia/server/node_discovery.py +718 -0
  623. chia/server/outbound_message.py +33 -0
  624. chia/server/rate_limit_numbers.py +204 -0
  625. chia/server/rate_limits.py +113 -0
  626. chia/server/server.py +720 -0
  627. chia/server/signal_handlers.py +117 -0
  628. chia/server/ssl_context.py +32 -0
  629. chia/server/start_data_layer.py +137 -0
  630. chia/server/start_farmer.py +86 -0
  631. chia/server/start_full_node.py +106 -0
  632. chia/server/start_harvester.py +80 -0
  633. chia/server/start_introducer.py +69 -0
  634. chia/server/start_service.py +328 -0
  635. chia/server/start_timelord.py +82 -0
  636. chia/server/start_wallet.py +109 -0
  637. chia/server/upnp.py +117 -0
  638. chia/server/ws_connection.py +752 -0
  639. chia/simulator/__init__.py +0 -0
  640. chia/simulator/block_tools.py +2053 -0
  641. chia/simulator/full_node_simulator.py +802 -0
  642. chia/simulator/keyring.py +128 -0
  643. chia/simulator/setup_services.py +505 -0
  644. chia/simulator/simulator_constants.py +13 -0
  645. chia/simulator/simulator_full_node_rpc_api.py +101 -0
  646. chia/simulator/simulator_full_node_rpc_client.py +62 -0
  647. chia/simulator/simulator_protocol.py +29 -0
  648. chia/simulator/simulator_test_tools.py +163 -0
  649. chia/simulator/socket.py +27 -0
  650. chia/simulator/ssl_certs.py +114 -0
  651. chia/simulator/ssl_certs_1.py +699 -0
  652. chia/simulator/ssl_certs_10.py +699 -0
  653. chia/simulator/ssl_certs_2.py +699 -0
  654. chia/simulator/ssl_certs_3.py +699 -0
  655. chia/simulator/ssl_certs_4.py +699 -0
  656. chia/simulator/ssl_certs_5.py +699 -0
  657. chia/simulator/ssl_certs_6.py +699 -0
  658. chia/simulator/ssl_certs_7.py +699 -0
  659. chia/simulator/ssl_certs_8.py +699 -0
  660. chia/simulator/ssl_certs_9.py +699 -0
  661. chia/simulator/start_simulator.py +135 -0
  662. chia/simulator/wallet_tools.py +245 -0
  663. chia/ssl/__init__.py +0 -0
  664. chia/ssl/chia_ca.crt +19 -0
  665. chia/ssl/chia_ca.key +28 -0
  666. chia/ssl/create_ssl.py +249 -0
  667. chia/ssl/dst_root_ca.pem +20 -0
  668. chia/timelord/__init__.py +0 -0
  669. chia/timelord/iters_from_block.py +50 -0
  670. chia/timelord/timelord.py +1202 -0
  671. chia/timelord/timelord_api.py +132 -0
  672. chia/timelord/timelord_launcher.py +188 -0
  673. chia/timelord/timelord_state.py +244 -0
  674. chia/timelord/types.py +22 -0
  675. chia/types/__init__.py +0 -0
  676. chia/types/aliases.py +35 -0
  677. chia/types/block_protocol.py +20 -0
  678. chia/types/blockchain_format/__init__.py +0 -0
  679. chia/types/blockchain_format/classgroup.py +5 -0
  680. chia/types/blockchain_format/coin.py +28 -0
  681. chia/types/blockchain_format/foliage.py +8 -0
  682. chia/types/blockchain_format/pool_target.py +5 -0
  683. chia/types/blockchain_format/program.py +270 -0
  684. chia/types/blockchain_format/proof_of_space.py +135 -0
  685. chia/types/blockchain_format/reward_chain_block.py +6 -0
  686. chia/types/blockchain_format/serialized_program.py +5 -0
  687. chia/types/blockchain_format/sized_bytes.py +11 -0
  688. chia/types/blockchain_format/slots.py +9 -0
  689. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  690. chia/types/blockchain_format/tree_hash.py +72 -0
  691. chia/types/blockchain_format/vdf.py +86 -0
  692. chia/types/clvm_cost.py +13 -0
  693. chia/types/coin_record.py +43 -0
  694. chia/types/coin_spend.py +115 -0
  695. chia/types/condition_opcodes.py +73 -0
  696. chia/types/condition_with_args.py +17 -0
  697. chia/types/eligible_coin_spends.py +364 -0
  698. chia/types/end_of_slot_bundle.py +5 -0
  699. chia/types/fee_rate.py +38 -0
  700. chia/types/full_block.py +5 -0
  701. chia/types/generator_types.py +14 -0
  702. chia/types/header_block.py +5 -0
  703. chia/types/internal_mempool_item.py +19 -0
  704. chia/types/mempool_inclusion_status.py +9 -0
  705. chia/types/mempool_item.py +85 -0
  706. chia/types/mempool_submission_status.py +30 -0
  707. chia/types/mojos.py +7 -0
  708. chia/types/peer_info.py +64 -0
  709. chia/types/signing_mode.py +29 -0
  710. chia/types/spend_bundle.py +31 -0
  711. chia/types/spend_bundle_conditions.py +7 -0
  712. chia/types/transaction_queue_entry.py +55 -0
  713. chia/types/unfinished_block.py +5 -0
  714. chia/types/unfinished_header_block.py +37 -0
  715. chia/types/weight_proof.py +50 -0
  716. chia/util/__init__.py +0 -0
  717. chia/util/action_scope.py +168 -0
  718. chia/util/api_decorators.py +89 -0
  719. chia/util/async_pool.py +224 -0
  720. chia/util/augmented_chain.py +130 -0
  721. chia/util/batches.py +39 -0
  722. chia/util/bech32m.py +123 -0
  723. chia/util/beta_metrics.py +118 -0
  724. chia/util/block_cache.py +56 -0
  725. chia/util/byte_types.py +10 -0
  726. chia/util/check_fork_next_block.py +32 -0
  727. chia/util/chia_logging.py +124 -0
  728. chia/util/chia_version.py +33 -0
  729. chia/util/collection.py +17 -0
  730. chia/util/condition_tools.py +201 -0
  731. chia/util/config.py +366 -0
  732. chia/util/cpu.py +20 -0
  733. chia/util/db_synchronous.py +21 -0
  734. chia/util/db_version.py +30 -0
  735. chia/util/db_wrapper.py +427 -0
  736. chia/util/default_root.py +10 -0
  737. chia/util/dump_keyring.py +93 -0
  738. chia/util/english.txt +2048 -0
  739. chia/util/errors.py +351 -0
  740. chia/util/file_keyring.py +480 -0
  741. chia/util/files.py +95 -0
  742. chia/util/full_block_utils.py +321 -0
  743. chia/util/generator_tools.py +62 -0
  744. chia/util/hash.py +29 -0
  745. chia/util/initial-config.yaml +675 -0
  746. chia/util/inline_executor.py +24 -0
  747. chia/util/ints.py +19 -0
  748. chia/util/json_util.py +41 -0
  749. chia/util/keychain.py +673 -0
  750. chia/util/keyring_wrapper.py +266 -0
  751. chia/util/limited_semaphore.py +39 -0
  752. chia/util/lock.py +47 -0
  753. chia/util/log_exceptions.py +29 -0
  754. chia/util/logging.py +34 -0
  755. chia/util/lru_cache.py +29 -0
  756. chia/util/math.py +20 -0
  757. chia/util/network.py +240 -0
  758. chia/util/paginator.py +46 -0
  759. chia/util/path.py +29 -0
  760. chia/util/permissions.py +19 -0
  761. chia/util/pprint.py +40 -0
  762. chia/util/prev_transaction_block.py +23 -0
  763. chia/util/priority_mutex.py +92 -0
  764. chia/util/profiler.py +194 -0
  765. chia/util/recursive_replace.py +22 -0
  766. chia/util/safe_cancel_task.py +14 -0
  767. chia/util/service_groups.py +47 -0
  768. chia/util/setproctitle.py +20 -0
  769. chia/util/significant_bits.py +30 -0
  770. chia/util/ssl_check.py +213 -0
  771. chia/util/streamable.py +654 -0
  772. chia/util/task_timing.py +378 -0
  773. chia/util/timing.py +64 -0
  774. chia/util/vdf_prover.py +31 -0
  775. chia/util/ws_message.py +66 -0
  776. chia/wallet/__init__.py +0 -0
  777. chia/wallet/cat_wallet/__init__.py +0 -0
  778. chia/wallet/cat_wallet/cat_constants.py +75 -0
  779. chia/wallet/cat_wallet/cat_info.py +47 -0
  780. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  781. chia/wallet/cat_wallet/cat_utils.py +163 -0
  782. chia/wallet/cat_wallet/cat_wallet.py +869 -0
  783. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  784. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  785. chia/wallet/cat_wallet/lineage_store.py +74 -0
  786. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  787. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  788. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  789. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  790. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  791. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  792. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  793. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  794. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  795. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  796. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  797. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  798. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  799. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  800. chia/wallet/coin_selection.py +188 -0
  801. chia/wallet/conditions.py +1326 -0
  802. chia/wallet/dao_wallet/__init__.py +0 -0
  803. chia/wallet/dao_wallet/dao_info.py +61 -0
  804. chia/wallet/dao_wallet/dao_utils.py +810 -0
  805. chia/wallet/dao_wallet/dao_wallet.py +2121 -0
  806. chia/wallet/db_wallet/__init__.py +0 -0
  807. chia/wallet/db_wallet/db_wallet_puzzles.py +107 -0
  808. chia/wallet/derivation_record.py +30 -0
  809. chia/wallet/derive_keys.py +146 -0
  810. chia/wallet/did_wallet/__init__.py +0 -0
  811. chia/wallet/did_wallet/did_info.py +39 -0
  812. chia/wallet/did_wallet/did_wallet.py +1485 -0
  813. chia/wallet/did_wallet/did_wallet_puzzles.py +220 -0
  814. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  815. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  816. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  817. chia/wallet/driver_protocol.py +26 -0
  818. chia/wallet/key_val_store.py +55 -0
  819. chia/wallet/lineage_proof.py +58 -0
  820. chia/wallet/nft_wallet/__init__.py +0 -0
  821. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  822. chia/wallet/nft_wallet/nft_info.py +120 -0
  823. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  824. chia/wallet/nft_wallet/nft_wallet.py +1686 -0
  825. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  826. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  827. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  828. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  829. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  830. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  831. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  832. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  833. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  834. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  835. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  836. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  837. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  838. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  839. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  840. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  841. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  842. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  843. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  844. chia/wallet/notification_manager.py +117 -0
  845. chia/wallet/notification_store.py +178 -0
  846. chia/wallet/outer_puzzles.py +84 -0
  847. chia/wallet/payment.py +34 -0
  848. chia/wallet/puzzle_drivers.py +118 -0
  849. chia/wallet/puzzles/__init__.py +0 -0
  850. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  851. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  852. chia/wallet/puzzles/clawback/__init__.py +0 -0
  853. chia/wallet/puzzles/clawback/drivers.py +188 -0
  854. chia/wallet/puzzles/clawback/metadata.py +38 -0
  855. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  856. chia/wallet/puzzles/condition_codes.clib +77 -0
  857. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  858. chia/wallet/puzzles/curry.clib +135 -0
  859. chia/wallet/puzzles/curry_by_index.clib +16 -0
  860. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  861. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  862. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  863. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  864. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  865. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  866. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  867. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  868. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  869. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  870. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  871. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  872. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  873. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  874. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  876. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  877. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  878. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  879. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  880. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  881. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  882. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  883. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  884. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  885. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  886. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  887. chia/wallet/puzzles/json.clib +25 -0
  888. chia/wallet/puzzles/load_clvm.py +162 -0
  889. chia/wallet/puzzles/merkle_utils.clib +18 -0
  890. chia/wallet/puzzles/notification.clsp +7 -0
  891. chia/wallet/puzzles/notification.clsp.hex +1 -0
  892. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  893. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  894. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  895. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  896. chia/wallet/puzzles/p2_conditions.py +27 -0
  897. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  898. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  899. chia/wallet/puzzles/p2_delegated_conditions.py +22 -0
  900. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  901. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  902. chia/wallet/puzzles/p2_delegated_puzzle.py +35 -0
  903. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  904. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +161 -0
  906. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  907. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  908. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +22 -0
  909. chia/wallet/puzzles/p2_parent.clsp +19 -0
  910. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  911. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  912. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  913. chia/wallet/puzzles/p2_puzzle_hash.py +28 -0
  914. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  915. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  916. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  917. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  919. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  920. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  921. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  922. chia/wallet/puzzles/puzzle_utils.py +34 -0
  923. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  924. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  925. chia/wallet/puzzles/sha256tree.clib +11 -0
  926. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  927. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  928. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  929. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  930. chia/wallet/puzzles/singleton_top_layer.py +295 -0
  931. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  932. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  933. chia/wallet/puzzles/singleton_top_layer_v1_1.py +344 -0
  934. chia/wallet/puzzles/singleton_truths.clib +21 -0
  935. chia/wallet/puzzles/tails.py +344 -0
  936. chia/wallet/puzzles/utility_macros.clib +48 -0
  937. chia/wallet/signer_protocol.py +126 -0
  938. chia/wallet/singleton.py +106 -0
  939. chia/wallet/singleton_record.py +30 -0
  940. chia/wallet/trade_manager.py +1088 -0
  941. chia/wallet/trade_record.py +67 -0
  942. chia/wallet/trading/__init__.py +0 -0
  943. chia/wallet/trading/offer.py +703 -0
  944. chia/wallet/trading/trade_status.py +13 -0
  945. chia/wallet/trading/trade_store.py +526 -0
  946. chia/wallet/transaction_record.py +143 -0
  947. chia/wallet/transaction_sorting.py +14 -0
  948. chia/wallet/uncurried_puzzle.py +17 -0
  949. chia/wallet/util/__init__.py +0 -0
  950. chia/wallet/util/address_type.py +55 -0
  951. chia/wallet/util/blind_signer_tl.py +168 -0
  952. chia/wallet/util/clvm_streamable.py +203 -0
  953. chia/wallet/util/compute_hints.py +66 -0
  954. chia/wallet/util/compute_memos.py +45 -0
  955. chia/wallet/util/curry_and_treehash.py +90 -0
  956. chia/wallet/util/debug_spend_bundle.py +234 -0
  957. chia/wallet/util/merkle_tree.py +100 -0
  958. chia/wallet/util/merkle_utils.py +102 -0
  959. chia/wallet/util/new_peak_queue.py +82 -0
  960. chia/wallet/util/notifications.py +12 -0
  961. chia/wallet/util/peer_request_cache.py +174 -0
  962. chia/wallet/util/puzzle_compression.py +96 -0
  963. chia/wallet/util/puzzle_decorator.py +100 -0
  964. chia/wallet/util/puzzle_decorator_type.py +7 -0
  965. chia/wallet/util/query_filter.py +60 -0
  966. chia/wallet/util/transaction_type.py +23 -0
  967. chia/wallet/util/tx_config.py +158 -0
  968. chia/wallet/util/wallet_sync_utils.py +348 -0
  969. chia/wallet/util/wallet_types.py +65 -0
  970. chia/wallet/vc_wallet/__init__.py +0 -0
  971. chia/wallet/vc_wallet/cr_cat_drivers.py +663 -0
  972. chia/wallet/vc_wallet/cr_cat_wallet.py +875 -0
  973. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  974. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  975. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  976. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  977. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  978. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  979. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  980. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  981. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  982. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  983. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  984. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  985. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  986. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  987. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  988. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  989. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  990. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  992. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  994. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  996. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  997. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  998. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_store.py +263 -0
  1002. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1003. chia/wallet/wallet.py +698 -0
  1004. chia/wallet/wallet_action_scope.py +95 -0
  1005. chia/wallet/wallet_blockchain.py +244 -0
  1006. chia/wallet/wallet_coin_record.py +72 -0
  1007. chia/wallet/wallet_coin_store.py +351 -0
  1008. chia/wallet/wallet_info.py +36 -0
  1009. chia/wallet/wallet_interested_store.py +188 -0
  1010. chia/wallet/wallet_nft_store.py +279 -0
  1011. chia/wallet/wallet_node.py +1769 -0
  1012. chia/wallet/wallet_node_api.py +201 -0
  1013. chia/wallet/wallet_pool_store.py +120 -0
  1014. chia/wallet/wallet_protocol.py +90 -0
  1015. chia/wallet/wallet_puzzle_store.py +365 -0
  1016. chia/wallet/wallet_retry_store.py +70 -0
  1017. chia/wallet/wallet_singleton_store.py +258 -0
  1018. chia/wallet/wallet_spend_bundle.py +41 -0
  1019. chia/wallet/wallet_state_manager.py +2820 -0
  1020. chia/wallet/wallet_transaction_store.py +470 -0
  1021. chia/wallet/wallet_user_store.py +110 -0
  1022. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1023. chia_blockchain-2.4.4.dist-info/LICENSE +201 -0
  1024. chia_blockchain-2.4.4.dist-info/METADATA +161 -0
  1025. chia_blockchain-2.4.4.dist-info/RECORD +1028 -0
  1026. chia_blockchain-2.4.4.dist-info/WHEEL +4 -0
  1027. chia_blockchain-2.4.4.dist-info/entry_points.txt +17 -0
  1028. mozilla-ca/cacert.pem +3666 -0
@@ -0,0 +1,1492 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import logging
5
+ import random
6
+ from typing import Any, Callable, Coroutine, Optional, Tuple
7
+
8
+ import pytest
9
+
10
+ from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
11
+ from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
12
+ from chia.simulator.full_node_simulator import FullNodeSimulator
13
+ from chia.simulator.simulator_protocol import FarmNewBlockProtocol
14
+ from chia.types.blockchain_format.program import Program
15
+ from chia.types.blockchain_format.sized_bytes import bytes32
16
+ from chia.types.peer_info import PeerInfo
17
+ from chia.util.ints import uint16, uint32, uint64, uint128
18
+ from chia.wallet.cat_wallet.cat_wallet import CATWallet
19
+ from chia.wallet.did_wallet.did_wallet import DIDWallet
20
+ from chia.wallet.nft_wallet.nft_wallet import NFTWallet
21
+ from chia.wallet.outer_puzzles import create_asset_id, match_puzzle
22
+ from chia.wallet.puzzle_drivers import PuzzleInfo
23
+ from chia.wallet.trading.offer import Offer
24
+ from chia.wallet.trading.trade_status import TradeStatus
25
+ from chia.wallet.uncurried_puzzle import uncurry_puzzle
26
+ from chia.wallet.util.compute_memos import compute_memos
27
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
28
+ from chia.wallet.wallet_node import WalletNode
29
+
30
+ # from clvm_tools.binutils import disassemble
31
+
32
+ logging.getLogger("aiosqlite").setLevel(logging.INFO) # Too much logging on debug level
33
+
34
+
35
+ def mempool_not_empty(fnapi: FullNodeSimulator) -> bool:
36
+ return fnapi.full_node.mempool_manager.mempool.size() > 0
37
+
38
+
39
+ async def farm_blocks_until(
40
+ predicate_f: Callable[[], Coroutine[Any, Any, bool]], fnapi: FullNodeSimulator, ph: bytes32
41
+ ) -> None:
42
+ for i in range(50):
43
+ await fnapi.farm_new_transaction_block(FarmNewBlockProtocol(ph))
44
+ if await predicate_f():
45
+ return None
46
+ await asyncio.sleep(0.3)
47
+ raise TimeoutError()
48
+
49
+
50
+ async def get_nft_count(wallet: NFTWallet) -> int:
51
+ return await wallet.get_nft_count()
52
+
53
+
54
+ def trusted_setup_helper(
55
+ trusted: bool, wallet_node_maker: WalletNode, wallet_node_taker: WalletNode, full_node_api: FullNodeSimulator
56
+ ) -> None:
57
+ if trusted:
58
+ wallet_node_maker.config["trusted_peers"] = {
59
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
60
+ }
61
+ wallet_node_taker.config["trusted_peers"] = {
62
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
63
+ }
64
+ else:
65
+ wallet_node_maker.config["trusted_peers"] = {}
66
+ wallet_node_taker.config["trusted_peers"] = {}
67
+
68
+
69
+ @pytest.mark.parametrize("trusted", [True, False])
70
+ @pytest.mark.parametrize("zero_royalties", [True, False])
71
+ @pytest.mark.anyio
72
+ async def test_nft_offer_sell_nft(
73
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
74
+ ) -> None:
75
+ full_nodes, wallets, _ = two_wallet_nodes
76
+ full_node_api: FullNodeSimulator = full_nodes[0]
77
+ full_node_server = full_node_api.server
78
+ wallet_node_maker, server_0 = wallets[0]
79
+ wallet_node_taker, server_1 = wallets[1]
80
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
81
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
82
+
83
+ ph_maker = await wallet_maker.get_new_puzzlehash()
84
+ ph_token = bytes32.random(seeded_random)
85
+
86
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
87
+
88
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
89
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
90
+
91
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
92
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
93
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
94
+
95
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
96
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
97
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
98
+ )
99
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
100
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
101
+
102
+ await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
103
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
104
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
105
+
106
+ hex_did_id = did_wallet_maker.get_my_DID()
107
+ did_id = bytes32.fromhex(hex_did_id)
108
+ target_puzhash = ph_maker
109
+ royalty_puzhash = ph_maker
110
+ royalty_basis_pts = uint16(0 if zero_royalties else 200)
111
+
112
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
113
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
114
+ )
115
+ metadata = Program.to(
116
+ [
117
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
118
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
119
+ ]
120
+ )
121
+
122
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
123
+ await nft_wallet_maker.generate_new_nft(
124
+ metadata,
125
+ action_scope,
126
+ target_puzhash,
127
+ royalty_puzhash,
128
+ royalty_basis_pts,
129
+ did_id,
130
+ )
131
+ for tx in action_scope.side_effects.transactions:
132
+ if tx.spend_bundle is not None:
133
+ assert compute_memos(tx.spend_bundle)
134
+ await time_out_assert_not_none(
135
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
136
+ )
137
+
138
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
139
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
140
+
141
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
142
+
143
+ # TAKER SETUP - NO DID
144
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
145
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER"
146
+ )
147
+
148
+ # maker create offer: NFT for xch
149
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
150
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
151
+
152
+ coins_maker = await nft_wallet_maker.get_current_nfts()
153
+ assert len(coins_maker) == 1
154
+ assert await nft_wallet_taker.get_nft_count() == 0
155
+
156
+ nft_to_offer = coins_maker[0]
157
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
158
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
159
+ xch_requested = 1000
160
+ maker_fee = uint64(433)
161
+
162
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
163
+
164
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
165
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
166
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
167
+ )
168
+ assert success is True
169
+ assert error is None
170
+ assert trade_make is not None
171
+
172
+ taker_fee = 1
173
+ assert not mempool_not_empty(full_node_api)
174
+ peer = wallet_node_taker.get_full_node_peer()
175
+
176
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
177
+ [Offer.from_bytes(trade_make.offer)]
178
+ )
179
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
180
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
181
+ ) as action_scope:
182
+ trade_take = await trade_manager_taker.respond_to_offer(
183
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
184
+ )
185
+
186
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
187
+
188
+ assert trade_take is not None
189
+
190
+ async def maker_0_taker_1() -> bool:
191
+ return await nft_wallet_maker.get_nft_count() == 0 and await nft_wallet_taker.get_nft_count() == 1
192
+
193
+ await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
194
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
195
+
196
+ await time_out_assert(20, get_nft_count, 0, nft_wallet_maker)
197
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
198
+
199
+ # assert payments and royalties
200
+ expected_royalty = uint64(xch_requested * royalty_basis_pts / 10000)
201
+ expected_maker_balance = funds - 2 - maker_fee + xch_requested + expected_royalty
202
+ expected_taker_balance = funds - taker_fee - xch_requested - expected_royalty
203
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
204
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
205
+
206
+
207
+ @pytest.mark.parametrize("trusted", [True, False])
208
+ @pytest.mark.parametrize("zero_royalties", [True, False])
209
+ @pytest.mark.anyio
210
+ async def test_nft_offer_request_nft(
211
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
212
+ ) -> None:
213
+ full_nodes, wallets, _ = two_wallet_nodes
214
+ full_node_api: FullNodeSimulator = full_nodes[0]
215
+ full_node_server = full_node_api.server
216
+ wallet_node_maker, server_0 = wallets[0]
217
+ wallet_node_taker, server_1 = wallets[1]
218
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
219
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
220
+
221
+ ph_taker = await wallet_taker.get_new_puzzlehash()
222
+ ph_token = bytes32.random(seeded_random)
223
+
224
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
225
+
226
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
227
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
228
+
229
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
230
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
231
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
232
+
233
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
234
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
235
+ wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
236
+ )
237
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
238
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
239
+
240
+ await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
241
+
242
+ hex_did_id = did_wallet_taker.get_my_DID()
243
+ did_id = bytes32.fromhex(hex_did_id)
244
+ target_puzhash = ph_taker
245
+ royalty_puzhash = ph_taker
246
+ royalty_basis_pts = uint16(0 if zero_royalties else 200)
247
+
248
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
249
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID TAKER", did_id=did_id
250
+ )
251
+ metadata = Program.to(
252
+ [
253
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
254
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
255
+ ]
256
+ )
257
+ await time_out_assert(20, wallet_taker.get_unconfirmed_balance, funds - 1)
258
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, funds - 1)
259
+
260
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
261
+ await nft_wallet_taker.generate_new_nft(
262
+ metadata,
263
+ action_scope,
264
+ target_puzhash,
265
+ royalty_puzhash,
266
+ royalty_basis_pts,
267
+ did_id,
268
+ )
269
+ for tx in action_scope.side_effects.transactions:
270
+ if tx.spend_bundle is not None:
271
+ assert compute_memos(tx.spend_bundle)
272
+ await time_out_assert_not_none(
273
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
274
+ )
275
+
276
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
277
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
278
+
279
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
280
+
281
+ # MAKER SETUP - NO DID
282
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
283
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET MAKER"
284
+ )
285
+
286
+ # maker create offer: NFT for xch
287
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
288
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
289
+
290
+ coins_taker = await nft_wallet_taker.get_current_nfts()
291
+ assert len(coins_taker) == 1
292
+
293
+ assert await nft_wallet_maker.get_nft_count() == 0
294
+ nft_to_request = coins_taker[0]
295
+ nft_to_request_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_request.full_puzzle))
296
+
297
+ assert isinstance(nft_to_request_info, PuzzleInfo)
298
+ nft_to_request_asset_id = create_asset_id(nft_to_request_info)
299
+ xch_offered = 1000
300
+ maker_fee = 10
301
+ driver_dict = {nft_to_request_asset_id: nft_to_request_info}
302
+
303
+ offer_dict = {nft_to_request_asset_id: 1, wallet_maker.id(): -xch_offered}
304
+
305
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
306
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
307
+ offer_dict, action_scope, driver_dict, fee=maker_fee
308
+ )
309
+ assert success is True
310
+ assert error is None
311
+ assert trade_make is not None
312
+
313
+ taker_fee = 1
314
+
315
+ peer = wallet_node_taker.get_full_node_peer()
316
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
317
+ [Offer.from_bytes(trade_make.offer)]
318
+ )
319
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
320
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
321
+ ) as action_scope:
322
+ trade_take = await trade_manager_taker.respond_to_offer(
323
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
324
+ )
325
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
326
+ assert trade_take is not None
327
+
328
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
329
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
330
+
331
+ async def maker_1_taker_0() -> bool:
332
+ return await nft_wallet_maker.get_nft_count() == 1 and await nft_wallet_taker.get_nft_count() == 0
333
+
334
+ await farm_blocks_until(maker_1_taker_0, full_node_api, ph_token)
335
+
336
+ # assert payments and royalties
337
+ expected_royalty = uint64(xch_offered * royalty_basis_pts / 10000)
338
+ expected_maker_balance = funds - maker_fee - xch_offered - expected_royalty
339
+ expected_taker_balance = funds - 2 - taker_fee + xch_offered + expected_royalty
340
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
341
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
342
+
343
+
344
+ @pytest.mark.parametrize("trusted", [True, False])
345
+ @pytest.mark.parametrize("zero_royalties", [True, False])
346
+ @pytest.mark.anyio
347
+ async def test_nft_offer_sell_did_to_did(
348
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
349
+ ) -> None:
350
+ full_nodes, wallets, _ = two_wallet_nodes
351
+ full_node_api: FullNodeSimulator = full_nodes[0]
352
+ full_node_server = full_node_api.server
353
+ wallet_node_maker, server_0 = wallets[0]
354
+ wallet_node_taker, server_1 = wallets[1]
355
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
356
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
357
+
358
+ ph_maker = await wallet_maker.get_new_puzzlehash()
359
+ ph_token = bytes32.random(seeded_random)
360
+
361
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
362
+
363
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
364
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
365
+
366
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
367
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
368
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
369
+
370
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
371
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
372
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
373
+ )
374
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
375
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
376
+
377
+ await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
378
+
379
+ hex_did_id = did_wallet_maker.get_my_DID()
380
+ did_id = bytes32.fromhex(hex_did_id)
381
+ target_puzhash = ph_maker
382
+ royalty_puzhash = ph_maker
383
+ royalty_basis_pts = uint16(0 if zero_royalties else 200)
384
+
385
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
386
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
387
+ )
388
+ metadata = Program.to(
389
+ [
390
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
391
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
392
+ ]
393
+ )
394
+
395
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
396
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
397
+
398
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
399
+ await nft_wallet_maker.generate_new_nft(
400
+ metadata,
401
+ action_scope,
402
+ target_puzhash,
403
+ royalty_puzhash,
404
+ royalty_basis_pts,
405
+ did_id,
406
+ )
407
+ for tx in action_scope.side_effects.transactions:
408
+ if tx.spend_bundle is not None:
409
+ assert compute_memos(tx.spend_bundle)
410
+ await time_out_assert_not_none(
411
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
412
+ )
413
+
414
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32([0] * 32)))
415
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
416
+
417
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
418
+
419
+ # TAKER SETUP - WITH DID
420
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
421
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
422
+ wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
423
+ )
424
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
425
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
426
+
427
+ await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
428
+
429
+ hex_did_id_taker = did_wallet_taker.get_my_DID()
430
+ did_id_taker = bytes32.fromhex(hex_did_id_taker)
431
+
432
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
433
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER", did_id=did_id_taker
434
+ )
435
+
436
+ # maker create offer: NFT for xch
437
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
438
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
439
+ coins_maker = await nft_wallet_maker.get_current_nfts()
440
+ assert len(coins_maker) == 1
441
+ assert await nft_wallet_taker.get_nft_count() == 0
442
+ nft_to_offer = coins_maker[0]
443
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
444
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
445
+ xch_requested = 1000
446
+ maker_fee = uint64(433)
447
+
448
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
449
+
450
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
451
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
452
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
453
+ )
454
+ assert success is True
455
+ assert error is None
456
+ assert trade_make is not None
457
+
458
+ taker_fee = 1
459
+
460
+ peer = wallet_node_taker.get_full_node_peer()
461
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
462
+ [Offer.from_bytes(trade_make.offer)]
463
+ )
464
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
465
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
466
+ ) as action_scope:
467
+ trade_take = await trade_manager_taker.respond_to_offer(
468
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
469
+ )
470
+
471
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
472
+ assert trade_take is not None
473
+
474
+ async def maker_0_taker_1() -> bool:
475
+ return (
476
+ await nft_wallet_maker.get_nft_count() == 0
477
+ and len(wallet_taker.wallet_state_manager.wallets) == 4
478
+ and await wallet_taker.wallet_state_manager.wallets[4].get_nft_count() == 1
479
+ )
480
+
481
+ await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
482
+
483
+ await time_out_assert(20, get_nft_count, 0, nft_wallet_maker)
484
+ # assert nnew nft wallet is created for taker
485
+ await time_out_assert(20, len, 4, wallet_taker.wallet_state_manager.wallets)
486
+ await time_out_assert(20, get_nft_count, 1, wallet_taker.wallet_state_manager.wallets[4])
487
+ assert await wallet_taker.wallet_state_manager.wallets[4].nft_store.get_nft_by_id(nft_to_offer_asset_id) is not None
488
+ # assert payments and royalties
489
+ expected_royalty = uint64(xch_requested * royalty_basis_pts / 10000)
490
+ expected_maker_balance = funds - 2 - maker_fee + xch_requested + expected_royalty
491
+ expected_taker_balance = funds - 1 - taker_fee - xch_requested - expected_royalty
492
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
493
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
494
+
495
+
496
+ @pytest.mark.parametrize("trusted", [True, False])
497
+ @pytest.mark.parametrize("zero_royalties", [True, False])
498
+ @pytest.mark.anyio
499
+ async def test_nft_offer_sell_nft_for_cat(
500
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
501
+ ) -> None:
502
+ full_nodes, wallets, _ = two_wallet_nodes
503
+ full_node_api: FullNodeSimulator = full_nodes[0]
504
+ full_node_server = full_node_api.server
505
+ wallet_node_maker, server_0 = wallets[0]
506
+ wallet_node_taker, server_1 = wallets[1]
507
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
508
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
509
+
510
+ ph_maker = await wallet_maker.get_new_puzzlehash()
511
+ ph_token = bytes32.random(seeded_random)
512
+
513
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
514
+
515
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
516
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
517
+
518
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
519
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
520
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
521
+
522
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
523
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
524
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
525
+ )
526
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
527
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
528
+
529
+ await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
530
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
531
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
532
+
533
+ hex_did_id = did_wallet_maker.get_my_DID()
534
+ did_id = bytes32.fromhex(hex_did_id)
535
+ target_puzhash = ph_maker
536
+ royalty_puzhash = ph_maker
537
+ royalty_basis_pts = uint16(0 if zero_royalties else 200)
538
+
539
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
540
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
541
+ )
542
+ metadata = Program.to(
543
+ [
544
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
545
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
546
+ ]
547
+ )
548
+
549
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
550
+ await nft_wallet_maker.generate_new_nft(
551
+ metadata,
552
+ action_scope,
553
+ target_puzhash,
554
+ royalty_puzhash,
555
+ royalty_basis_pts,
556
+ did_id,
557
+ )
558
+ for tx in action_scope.side_effects.transactions:
559
+ if tx.spend_bundle is not None:
560
+ assert compute_memos(tx.spend_bundle)
561
+ await time_out_assert_not_none(
562
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
563
+ )
564
+
565
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
566
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
567
+
568
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
569
+
570
+ # TAKER SETUP - NO DID
571
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
572
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER"
573
+ )
574
+
575
+ # maker create offer: NFT for xch
576
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
577
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
578
+
579
+ coins_maker = await nft_wallet_maker.get_current_nfts()
580
+ assert len(coins_maker) == 1
581
+ coins_taker = await nft_wallet_taker.get_current_nfts()
582
+ assert len(coins_taker) == 0
583
+
584
+ # Create new CAT and wallets for maker and taker
585
+ # Trade them between maker and taker to ensure multiple coins for each cat
586
+ cats_to_mint = 100000
587
+ cats_to_trade = uint64(10000)
588
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
589
+ full_node_api.full_node.log.warning(f"Mempool size: {full_node_api.full_node.mempool_manager.mempool.size()}")
590
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
591
+ wallet_node_maker.wallet_state_manager,
592
+ wallet_maker,
593
+ {"identifier": "genesis_by_id"},
594
+ uint64(cats_to_mint),
595
+ action_scope,
596
+ )
597
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
598
+
599
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
600
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
601
+
602
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
603
+ await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
604
+
605
+ cat_wallet_taker: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
606
+ wallet_node_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
607
+ )
608
+
609
+ ph_taker_cat_1 = await wallet_taker.get_new_puzzlehash()
610
+ ph_taker_cat_2 = await wallet_taker.get_new_puzzlehash()
611
+ async with cat_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
612
+ await cat_wallet_maker.generate_signed_transaction(
613
+ [cats_to_trade, cats_to_trade],
614
+ [ph_taker_cat_1, ph_taker_cat_2],
615
+ action_scope,
616
+ memos=[[ph_taker_cat_1], [ph_taker_cat_2]],
617
+ )
618
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
619
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
620
+
621
+ maker_cat_balance = cats_to_mint - (2 * cats_to_trade)
622
+ taker_cat_balance = 2 * cats_to_trade
623
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, maker_cat_balance)
624
+ await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, taker_cat_balance)
625
+ nft_to_offer = coins_maker[0]
626
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
627
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
628
+ cats_requested = 1000
629
+ maker_fee = uint64(433)
630
+
631
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, cat_wallet_maker.id(): cats_requested}
632
+
633
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
634
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
635
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
636
+ )
637
+
638
+ assert success is True
639
+ assert error is None
640
+ assert trade_make is not None
641
+
642
+ taker_fee = 1
643
+
644
+ peer = wallet_node_taker.get_full_node_peer()
645
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
646
+ [Offer.from_bytes(trade_make.offer)]
647
+ )
648
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
649
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
650
+ ) as action_scope:
651
+ trade_take = await trade_manager_taker.respond_to_offer(
652
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
653
+ )
654
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
655
+ assert trade_take is not None
656
+
657
+ async def maker_0_taker_1() -> bool:
658
+ return (
659
+ len(await nft_wallet_maker.get_current_nfts()) == 0 and len(await nft_wallet_taker.get_current_nfts()) == 1
660
+ )
661
+
662
+ await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
663
+
664
+ # assert payments and royalties
665
+ expected_royalty = uint64(cats_requested * royalty_basis_pts / 10000)
666
+ expected_maker_balance = funds - 2 - cats_to_mint - maker_fee
667
+ expected_taker_balance = funds - taker_fee
668
+ expected_maker_cat_balance = maker_cat_balance + cats_requested + expected_royalty
669
+ expected_taker_cat_balance = taker_cat_balance - cats_requested - expected_royalty
670
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
671
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
672
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, expected_maker_cat_balance)
673
+ await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, expected_taker_cat_balance)
674
+
675
+
676
+ @pytest.mark.parametrize("trusted", [True, False])
677
+ @pytest.mark.parametrize("test_change", [True, False])
678
+ @pytest.mark.anyio
679
+ async def test_nft_offer_request_nft_for_cat(
680
+ self_hostname: str, two_wallet_nodes: Any, trusted: bool, test_change: bool, seeded_random: random.Random
681
+ ) -> None:
682
+ full_nodes, wallets, _ = two_wallet_nodes
683
+ full_node_api: FullNodeSimulator = full_nodes[0]
684
+ full_node_server = full_node_api.server
685
+ wallet_node_maker, server_0 = wallets[0]
686
+ wallet_node_taker, server_1 = wallets[1]
687
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
688
+ wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
689
+
690
+ ph_taker = await wallet_taker.get_new_puzzlehash()
691
+ ph_token = bytes32.random(seeded_random)
692
+
693
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
694
+
695
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
696
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
697
+
698
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
699
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
700
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
701
+
702
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
703
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
704
+ wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
705
+ )
706
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
707
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
708
+
709
+ await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
710
+ await time_out_assert(20, wallet_taker.get_unconfirmed_balance, funds - 1)
711
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, funds - 1)
712
+
713
+ hex_did_id = did_wallet_taker.get_my_DID()
714
+ did_id = bytes32.fromhex(hex_did_id)
715
+ target_puzhash = ph_taker
716
+ royalty_puzhash = ph_taker
717
+ royalty_basis_pts = uint16(5000) # 50%
718
+
719
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
720
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID TAKER", did_id=did_id
721
+ )
722
+ metadata = Program.to(
723
+ [
724
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
725
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
726
+ ]
727
+ )
728
+
729
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
730
+ await nft_wallet_taker.generate_new_nft(
731
+ metadata,
732
+ action_scope,
733
+ target_puzhash,
734
+ royalty_puzhash,
735
+ royalty_basis_pts,
736
+ did_id,
737
+ )
738
+ for tx in action_scope.side_effects.transactions:
739
+ if tx.spend_bundle is not None:
740
+ assert compute_memos(tx.spend_bundle)
741
+ await time_out_assert_not_none(
742
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
743
+ )
744
+
745
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
746
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
747
+
748
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
749
+
750
+ # MAKER SETUP - NO DID
751
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
752
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET MAKER"
753
+ )
754
+
755
+ # maker create offer: NFT for CAT
756
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
757
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
758
+
759
+ coins_maker = await nft_wallet_maker.get_current_nfts()
760
+ assert len(coins_maker) == 0
761
+ coins_taker = await nft_wallet_taker.get_current_nfts()
762
+ assert len(coins_taker) == 1
763
+
764
+ # Create new CAT and wallets for maker and taker
765
+ # Trade them between maker and taker to ensure multiple coins for each cat
766
+ cats_to_mint = 100000
767
+ cats_to_trade = uint64(20000)
768
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
769
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
770
+ wallet_node_maker.wallet_state_manager,
771
+ wallet_maker,
772
+ {"identifier": "genesis_by_id"},
773
+ uint64(cats_to_mint),
774
+ action_scope,
775
+ )
776
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
777
+
778
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
779
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
780
+
781
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
782
+ await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
783
+
784
+ cat_wallet_taker: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
785
+ wallet_node_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
786
+ )
787
+ if test_change:
788
+ cat_1 = await wallet_maker.get_new_puzzlehash()
789
+ cat_2 = await wallet_maker.get_new_puzzlehash()
790
+ else:
791
+ cat_1 = await wallet_taker.get_new_puzzlehash()
792
+ cat_2 = await wallet_taker.get_new_puzzlehash()
793
+ puzzle_hashes = [cat_1, cat_2]
794
+ amounts = [cats_to_trade, cats_to_trade]
795
+ if test_change:
796
+ ph_taker_cat_1 = await wallet_taker.get_new_puzzlehash()
797
+ extra_change = cats_to_mint - (2 * cats_to_trade)
798
+ amounts.append(uint64(extra_change))
799
+ puzzle_hashes.append(ph_taker_cat_1)
800
+ async with cat_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
801
+ await cat_wallet_maker.generate_signed_transaction(amounts, puzzle_hashes, action_scope)
802
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
803
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
804
+
805
+ if test_change:
806
+ taker_cat_balance = cats_to_mint - (2 * cats_to_trade)
807
+ maker_cat_balance = 2 * cats_to_trade
808
+ else:
809
+ maker_cat_balance = cats_to_mint - (2 * cats_to_trade)
810
+ taker_cat_balance = 2 * cats_to_trade
811
+ await time_out_assert(15, cat_wallet_maker.get_confirmed_balance, maker_cat_balance)
812
+ await time_out_assert(15, cat_wallet_taker.get_confirmed_balance, taker_cat_balance)
813
+
814
+ nft_to_request = coins_taker[0]
815
+ nft_to_request_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_request.full_puzzle))
816
+ nft_to_request_asset_id: bytes32 = create_asset_id(nft_to_request_info) # type: ignore
817
+ cats_requested = 10000
818
+ maker_fee = uint64(433)
819
+ driver_dict = {nft_to_request_asset_id: nft_to_request_info}
820
+
821
+ offer_dict = {nft_to_request_asset_id: 1, cat_wallet_maker.id(): -cats_requested}
822
+
823
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
824
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
825
+ offer_dict, action_scope, driver_dict, fee=maker_fee
826
+ )
827
+ assert success is True
828
+ assert error is None
829
+ assert trade_make is not None
830
+
831
+ taker_fee = 1
832
+
833
+ peer = wallet_node_taker.get_full_node_peer()
834
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
835
+ [Offer.from_bytes(trade_make.offer)]
836
+ )
837
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
838
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
839
+ ) as action_scope:
840
+ trade_take = await trade_manager_taker.respond_to_offer(
841
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
842
+ )
843
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
844
+ assert trade_take is not None
845
+
846
+ async def maker_1_taker_0() -> bool:
847
+ return (
848
+ len(await nft_wallet_maker.get_current_nfts()) == 1 and len(await nft_wallet_taker.get_current_nfts()) == 0
849
+ )
850
+
851
+ await farm_blocks_until(maker_1_taker_0, full_node_api, ph_token)
852
+
853
+ # assert payments and royalties
854
+ expected_royalty = uint64(cats_requested * royalty_basis_pts / 10000)
855
+ expected_maker_balance = funds - cats_to_mint - maker_fee
856
+ expected_taker_balance = funds - 2 - taker_fee
857
+ expected_maker_cat_balance = maker_cat_balance - cats_requested - expected_royalty
858
+ expected_taker_cat_balance = taker_cat_balance + cats_requested + expected_royalty
859
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
860
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
861
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, expected_maker_cat_balance)
862
+ await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, expected_taker_cat_balance)
863
+
864
+
865
+ @pytest.mark.parametrize(
866
+ "trusted",
867
+ [True, False],
868
+ )
869
+ @pytest.mark.anyio
870
+ # @pytest.mark.skip
871
+ async def test_nft_offer_sell_cancel(
872
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
873
+ ) -> None:
874
+ full_nodes, wallets, _ = two_wallet_nodes
875
+ full_node_api: FullNodeSimulator = full_nodes[0]
876
+ full_node_server = full_node_api.server
877
+ wallet_node_maker, server_0 = wallets[0]
878
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
879
+
880
+ ph_maker = await wallet_maker.get_new_puzzlehash()
881
+ ph_token = bytes32.random(seeded_random)
882
+
883
+ if trusted:
884
+ wallet_node_maker.config["trusted_peers"] = {
885
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
886
+ }
887
+ else:
888
+ wallet_node_maker.config["trusted_peers"] = {}
889
+
890
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
891
+
892
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 3))
893
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
894
+
895
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
896
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
897
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
898
+ )
899
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
900
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
901
+
902
+ await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
903
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
904
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
905
+
906
+ hex_did_id = did_wallet_maker.get_my_DID()
907
+ did_id = bytes32.fromhex(hex_did_id)
908
+ target_puzhash = ph_maker
909
+ royalty_puzhash = ph_maker
910
+ royalty_basis_pts = uint16(200)
911
+
912
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
913
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
914
+ )
915
+ metadata = Program.to(
916
+ [
917
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
918
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
919
+ ]
920
+ )
921
+
922
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
923
+ await nft_wallet_maker.generate_new_nft(
924
+ metadata,
925
+ action_scope,
926
+ target_puzhash,
927
+ royalty_puzhash,
928
+ royalty_basis_pts,
929
+ did_id,
930
+ )
931
+ for tx in action_scope.side_effects.transactions:
932
+ if tx.spend_bundle is not None:
933
+ assert compute_memos(tx.spend_bundle)
934
+ await time_out_assert_not_none(
935
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
936
+ )
937
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
938
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
939
+
940
+ await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
941
+
942
+ # maker create offer: NFT for xch
943
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
944
+
945
+ coins_maker = await nft_wallet_maker.get_current_nfts()
946
+ assert len(coins_maker) == 1
947
+
948
+ nft_to_offer = coins_maker[0]
949
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
950
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
951
+ xch_requested = 1000
952
+ maker_fee = uint64(433)
953
+
954
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
955
+
956
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
957
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
958
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
959
+ )
960
+
961
+ FEE = uint64(2000000000000)
962
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
963
+ await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=FEE, secure=True)
964
+
965
+ async def get_trade_and_status(trade_manager: Any, trade: Any) -> TradeStatus:
966
+ trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
967
+ return TradeStatus(trade_rec.status)
968
+
969
+ await time_out_assert(20, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
970
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
971
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
972
+
973
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
974
+
975
+
976
+ @pytest.mark.parametrize(
977
+ "trusted",
978
+ [True],
979
+ )
980
+ @pytest.mark.anyio
981
+ async def test_nft_offer_sell_cancel_in_batch(
982
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
983
+ ) -> None:
984
+ num_blocks = 3
985
+ full_nodes, wallets, _ = two_wallet_nodes
986
+ full_node_api: FullNodeSimulator = full_nodes[0]
987
+ full_node_server = full_node_api.server
988
+ wallet_node_maker, server_0 = wallets[0]
989
+ wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
990
+
991
+ ph_maker = await wallet_maker.get_new_puzzlehash()
992
+ ph_token = bytes32.random(seeded_random)
993
+
994
+ if trusted:
995
+ wallet_node_maker.config["trusted_peers"] = {
996
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
997
+ }
998
+ else:
999
+ wallet_node_maker.config["trusted_peers"] = {}
1000
+
1001
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1002
+
1003
+ funds = sum(
1004
+ calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, num_blocks)
1005
+ )
1006
+ await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
1007
+
1008
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1009
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
1010
+ wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
1011
+ )
1012
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
1013
+
1014
+ await time_out_assert(15, wallet_maker.get_pending_change_balance, 0)
1015
+ await time_out_assert(10, wallet_maker.get_unconfirmed_balance, funds - 1)
1016
+ await time_out_assert(10, wallet_maker.get_confirmed_balance, funds - 1)
1017
+
1018
+ hex_did_id = did_wallet_maker.get_my_DID()
1019
+ did_id = bytes32.fromhex(hex_did_id)
1020
+ target_puzhash = ph_maker
1021
+ royalty_puzhash = ph_maker
1022
+ royalty_basis_pts = uint16(200)
1023
+
1024
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
1025
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
1026
+ )
1027
+ metadata = Program.to(
1028
+ [
1029
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
1030
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
1031
+ ]
1032
+ )
1033
+
1034
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1035
+ await nft_wallet_maker.generate_new_nft(
1036
+ metadata,
1037
+ action_scope,
1038
+ target_puzhash,
1039
+ royalty_puzhash,
1040
+ royalty_basis_pts,
1041
+ did_id,
1042
+ )
1043
+ for tx in action_scope.side_effects.transactions:
1044
+ if tx.spend_bundle is not None:
1045
+ assert compute_memos(tx.spend_bundle)
1046
+ await time_out_assert_not_none(
1047
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1048
+ )
1049
+
1050
+ for i in range(1, num_blocks):
1051
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
1052
+
1053
+ await time_out_assert(10, get_nft_count, 1, nft_wallet_maker)
1054
+
1055
+ # maker create offer: NFT for xch
1056
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
1057
+
1058
+ coins_maker = await nft_wallet_maker.get_current_nfts()
1059
+ assert len(coins_maker) == 1
1060
+
1061
+ nft_to_offer = coins_maker[0]
1062
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
1063
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
1064
+ xch_requested = 1000
1065
+ maker_fee = uint64(433)
1066
+
1067
+ offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
1068
+
1069
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
1070
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1071
+ offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
1072
+ )
1073
+
1074
+ FEE = uint64(2000000000000)
1075
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1076
+ await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=FEE, secure=True)
1077
+
1078
+ async def get_trade_and_status(trade_manager: Any, trade: Any) -> TradeStatus:
1079
+ trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
1080
+ return TradeStatus(trade_rec.status)
1081
+
1082
+ await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
1083
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
1084
+
1085
+ for i in range(1, num_blocks):
1086
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32([0] * 32)))
1087
+
1088
+ await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
1089
+
1090
+
1091
+ @pytest.mark.parametrize("trusted", [True, False])
1092
+ @pytest.mark.parametrize(
1093
+ "royalty_pts",
1094
+ [
1095
+ (200, 500, 500),
1096
+ (200, 500, 500),
1097
+ (0, 0, 0), # test that we can have 0 royalty
1098
+ (10000, 10001, 10005), # tests 100% royalty is not allowed
1099
+ (100000, 10001, 10005), # 1000% shouldn't work
1100
+ ],
1101
+ )
1102
+ @pytest.mark.anyio
1103
+ async def test_complex_nft_offer(
1104
+ self_hostname: str,
1105
+ two_wallet_nodes: Any,
1106
+ trusted: Any,
1107
+ royalty_pts: Tuple[int, int, int],
1108
+ seeded_random: random.Random,
1109
+ ) -> None:
1110
+ """
1111
+ 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
1112
+ """
1113
+ full_nodes, wallets, _ = two_wallet_nodes
1114
+ full_node_api: FullNodeSimulator = full_nodes[0]
1115
+ full_node_server = full_node_api.server
1116
+ wallet_node_maker, server_0 = wallets[0]
1117
+ wallet_node_taker, server_1 = wallets[1]
1118
+ wsm_maker = wallet_node_maker.wallet_state_manager
1119
+ wsm_taker = wallet_node_taker.wallet_state_manager
1120
+ wallet_maker = wsm_maker.main_wallet
1121
+ wallet_taker = wsm_taker.main_wallet
1122
+
1123
+ ph_maker = await wallet_maker.get_new_puzzlehash()
1124
+ ph_taker = await wallet_taker.get_new_puzzlehash()
1125
+ ph_token = bytes32.random(seeded_random)
1126
+
1127
+ trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
1128
+ wallet_node_maker.config["automatically_add_unknown_cats"] = True
1129
+ wallet_node_taker.config["automatically_add_unknown_cats"] = True
1130
+
1131
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1132
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1133
+
1134
+ # Need money for fees and offering
1135
+ funds_maker = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 3))
1136
+ funds_taker = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 6))
1137
+
1138
+ await full_node_api.farm_rewards_to_wallet(amount=funds_maker, wallet=wsm_maker.main_wallet, timeout=60)
1139
+ await full_node_api.farm_rewards_to_wallet(amount=funds_taker, wallet=wsm_taker.main_wallet, timeout=60)
1140
+
1141
+ CAT_AMOUNT = uint64(100000000)
1142
+ txs = []
1143
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1144
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
1145
+ wsm_maker, wallet_maker, {"identifier": "genesis_by_id"}, CAT_AMOUNT, action_scope
1146
+ )
1147
+ txs.extend(action_scope.side_effects.transactions)
1148
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1149
+ cat_wallet_taker = await CATWallet.create_new_cat_wallet(
1150
+ wsm_taker, wallet_taker, {"identifier": "genesis_by_id"}, CAT_AMOUNT, action_scope
1151
+ )
1152
+ txs.extend(action_scope.side_effects.transactions)
1153
+
1154
+ # We'll need these later
1155
+ basic_nft_wallet_maker = await NFTWallet.create_new_nft_wallet(wsm_maker, wallet_maker, name="NFT WALLET MAKER")
1156
+ basic_nft_wallet_taker = await NFTWallet.create_new_nft_wallet(wsm_taker, wallet_taker, name="NFT WALLET TAKER")
1157
+
1158
+ async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1159
+ did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
1160
+ wsm_maker, wallet_maker, uint64(1), action_scope
1161
+ )
1162
+ txs.extend(action_scope.side_effects.transactions)
1163
+ async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1164
+ did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
1165
+ wsm_taker, wallet_taker, uint64(1), action_scope
1166
+ )
1167
+ txs.extend(action_scope.side_effects.transactions)
1168
+
1169
+ await full_node_api.process_transaction_records(records=txs)
1170
+
1171
+ funds_maker = funds_maker - 1 - CAT_AMOUNT
1172
+ funds_taker = funds_taker - 1 - CAT_AMOUNT
1173
+
1174
+ await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
1175
+ await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
1176
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1177
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1178
+ await time_out_assert(30, cat_wallet_maker.get_confirmed_balance, CAT_AMOUNT)
1179
+ await time_out_assert(30, cat_wallet_maker.get_unconfirmed_balance, CAT_AMOUNT)
1180
+ await time_out_assert(30, cat_wallet_taker.get_confirmed_balance, CAT_AMOUNT)
1181
+ await time_out_assert(30, cat_wallet_taker.get_unconfirmed_balance, CAT_AMOUNT)
1182
+ did_id_maker = bytes32.fromhex(did_wallet_maker.get_my_DID())
1183
+ did_id_taker = bytes32.fromhex(did_wallet_taker.get_my_DID())
1184
+ target_puzhash_maker = ph_maker
1185
+ target_puzhash_taker = ph_taker
1186
+ royalty_puzhash_maker = ph_maker
1187
+ royalty_puzhash_taker = ph_taker
1188
+ royalty_basis_pts_maker, royalty_basis_pts_taker_1, royalty_basis_pts_taker_2 = (
1189
+ royalty_pts[0],
1190
+ uint16(royalty_pts[1]),
1191
+ uint16(royalty_pts[2]),
1192
+ )
1193
+
1194
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
1195
+ wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id_maker
1196
+ )
1197
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
1198
+ wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID 1", did_id=did_id_taker
1199
+ )
1200
+ metadata = Program.to(
1201
+ [
1202
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
1203
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
1204
+ ]
1205
+ )
1206
+ if royalty_basis_pts_maker > 65535:
1207
+ with pytest.raises(ValueError):
1208
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(
1209
+ DEFAULT_TX_CONFIG, push=False
1210
+ ) as action_scope:
1211
+ await nft_wallet_maker.generate_new_nft(
1212
+ metadata,
1213
+ action_scope,
1214
+ target_puzhash_maker,
1215
+ royalty_puzhash_maker,
1216
+ royalty_basis_pts_maker, # type: ignore
1217
+ did_id_maker,
1218
+ )
1219
+ return
1220
+ else:
1221
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1222
+ await nft_wallet_maker.generate_new_nft(
1223
+ metadata,
1224
+ action_scope,
1225
+ target_puzhash_maker,
1226
+ royalty_puzhash_maker,
1227
+ uint16(royalty_basis_pts_maker),
1228
+ did_id_maker,
1229
+ )
1230
+ for tx in action_scope.side_effects.transactions:
1231
+ if tx.spend_bundle is not None:
1232
+ await time_out_assert_not_none(
1233
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1234
+ )
1235
+
1236
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1237
+ await nft_wallet_taker.generate_new_nft(
1238
+ metadata,
1239
+ action_scope,
1240
+ target_puzhash_taker,
1241
+ royalty_puzhash_taker,
1242
+ royalty_basis_pts_taker_1,
1243
+ did_id_taker,
1244
+ )
1245
+ for tx in action_scope.side_effects.transactions:
1246
+ if tx.spend_bundle is not None:
1247
+ await time_out_assert_not_none(
1248
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1249
+ )
1250
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
1251
+
1252
+ funds_maker -= 1
1253
+ funds_taker -= 1
1254
+
1255
+ await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
1256
+ await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
1257
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1258
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1259
+ await time_out_assert(30, get_nft_count, 1, nft_wallet_maker)
1260
+ await time_out_assert(30, get_nft_count, 1, nft_wallet_taker)
1261
+
1262
+ # MAke one more NFT for the taker
1263
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1264
+ await nft_wallet_taker.generate_new_nft(
1265
+ metadata,
1266
+ action_scope,
1267
+ target_puzhash_taker,
1268
+ royalty_puzhash_taker,
1269
+ royalty_basis_pts_taker_2,
1270
+ did_id_taker,
1271
+ )
1272
+ for tx in action_scope.side_effects.transactions:
1273
+ if tx.spend_bundle is not None:
1274
+ await time_out_assert_not_none(
1275
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1276
+ )
1277
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
1278
+
1279
+ funds_taker -= 1
1280
+
1281
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1282
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1283
+ await time_out_assert(30, get_nft_count, 2, nft_wallet_taker)
1284
+
1285
+ trade_manager_maker = wsm_maker.trade_manager
1286
+ trade_manager_taker = wsm_taker.trade_manager
1287
+ maker_nfts = await nft_wallet_maker.get_current_nfts()
1288
+ taker_nfts = await nft_wallet_taker.get_current_nfts()
1289
+ nft_to_offer_asset_id_maker: bytes32 = maker_nfts[0].nft_id
1290
+ nft_to_offer_asset_id_taker_1: bytes32 = taker_nfts[0].nft_id
1291
+ nft_to_offer_asset_id_taker_2: bytes32 = taker_nfts[1].nft_id
1292
+ if royalty_basis_pts_maker > 60000:
1293
+ XCH_REQUESTED = 20000
1294
+ CAT_REQUESTED = 1000
1295
+ FEE = uint64(20000)
1296
+ else:
1297
+ XCH_REQUESTED = 2000000000000
1298
+ CAT_REQUESTED = 100000
1299
+ FEE = uint64(2000000000000)
1300
+
1301
+ complex_nft_offer = {
1302
+ nft_to_offer_asset_id_maker: -1,
1303
+ cat_wallet_maker.id(): CAT_REQUESTED * -1,
1304
+ 1: XCH_REQUESTED,
1305
+ nft_to_offer_asset_id_taker_1: 1,
1306
+ nft_to_offer_asset_id_taker_2: 1,
1307
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): CAT_REQUESTED,
1308
+ }
1309
+
1310
+ driver_dict = {
1311
+ nft_to_offer_asset_id_taker_1: match_puzzle(uncurry_puzzle(taker_nfts[0].full_puzzle)),
1312
+ nft_to_offer_asset_id_taker_2: match_puzzle(uncurry_puzzle(taker_nfts[1].full_puzzle)),
1313
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): PuzzleInfo(
1314
+ {
1315
+ "type": "CAT",
1316
+ "tail": "0x" + cat_wallet_taker.get_asset_id(),
1317
+ }
1318
+ ),
1319
+ }
1320
+
1321
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
1322
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1323
+ complex_nft_offer, action_scope, driver_dict=driver_dict, fee=FEE
1324
+ )
1325
+ assert error is None
1326
+ assert success
1327
+ assert trade_make is not None
1328
+
1329
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
1330
+ [Offer.from_bytes(trade_make.offer)]
1331
+ )
1332
+ if royalty_basis_pts_maker == 10000:
1333
+ with pytest.raises(ValueError):
1334
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1335
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
1336
+ ) as action_scope:
1337
+ trade_take = await trade_manager_taker.respond_to_offer(
1338
+ Offer.from_bytes(trade_make.offer),
1339
+ wallet_node_taker.get_full_node_peer(),
1340
+ action_scope,
1341
+ fee=FEE,
1342
+ )
1343
+ # all done for this test
1344
+ return
1345
+ else:
1346
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1347
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
1348
+ ) as action_scope:
1349
+ trade_take = await trade_manager_taker.respond_to_offer(
1350
+ maker_offer,
1351
+ wallet_node_taker.get_full_node_peer(),
1352
+ action_scope,
1353
+ fee=FEE,
1354
+ )
1355
+ assert trade_take is not None
1356
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
1357
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=60)
1358
+
1359
+ # Now let's make sure the final wallet state is correct
1360
+ maker_royalty_summary = NFTWallet.royalty_calculation(
1361
+ {
1362
+ nft_to_offer_asset_id_maker: (royalty_puzhash_maker, uint16(royalty_basis_pts_maker)),
1363
+ },
1364
+ {
1365
+ None: uint64(XCH_REQUESTED),
1366
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): uint64(CAT_REQUESTED),
1367
+ },
1368
+ )
1369
+ taker_royalty_summary = NFTWallet.royalty_calculation(
1370
+ {
1371
+ nft_to_offer_asset_id_taker_1: (royalty_puzhash_taker, royalty_basis_pts_taker_1),
1372
+ nft_to_offer_asset_id_taker_2: (royalty_puzhash_taker, royalty_basis_pts_taker_2),
1373
+ },
1374
+ {
1375
+ bytes32.from_hexstr(cat_wallet_maker.get_asset_id()): uint64(CAT_REQUESTED),
1376
+ },
1377
+ )
1378
+ maker_xch_royalties_expected = maker_royalty_summary[nft_to_offer_asset_id_maker][0]["amount"]
1379
+ maker_cat_royalties_expected = maker_royalty_summary[nft_to_offer_asset_id_maker][1]["amount"]
1380
+ taker_cat_royalties_expected = (
1381
+ taker_royalty_summary[nft_to_offer_asset_id_taker_1][0]["amount"]
1382
+ + taker_royalty_summary[nft_to_offer_asset_id_taker_2][0]["amount"]
1383
+ )
1384
+ funds_maker = int(funds_maker - FEE + XCH_REQUESTED + maker_xch_royalties_expected)
1385
+ funds_taker = int(funds_taker - FEE - XCH_REQUESTED - maker_xch_royalties_expected)
1386
+
1387
+ await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
1388
+ await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
1389
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1390
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1391
+
1392
+ async def get_cat_wallet_and_check_balance(asset_id: str, wsm: Any) -> uint128:
1393
+ cat_wallet = await wsm.get_wallet_for_asset_id(asset_id)
1394
+ if cat_wallet is None:
1395
+ return uint128(0)
1396
+ else:
1397
+ return uint128(await cat_wallet.get_confirmed_balance())
1398
+
1399
+ taker_cat_funds_maker = CAT_REQUESTED + maker_cat_royalties_expected
1400
+ maker_cat_funds_taker = CAT_REQUESTED + taker_cat_royalties_expected
1401
+ await time_out_assert(
1402
+ 30,
1403
+ get_cat_wallet_and_check_balance,
1404
+ taker_cat_funds_maker,
1405
+ cat_wallet_taker.get_asset_id(),
1406
+ wsm_maker,
1407
+ )
1408
+ await time_out_assert(
1409
+ 30,
1410
+ get_cat_wallet_and_check_balance,
1411
+ maker_cat_funds_taker,
1412
+ cat_wallet_maker.get_asset_id(),
1413
+ wsm_taker,
1414
+ )
1415
+ maker_nfts = await basic_nft_wallet_maker.get_current_nfts()
1416
+ taker_nfts = await basic_nft_wallet_taker.get_current_nfts()
1417
+ assert len(maker_nfts) == 2
1418
+ assert len(taker_nfts) == 1
1419
+
1420
+ assert nft_to_offer_asset_id_maker == taker_nfts[0].nft_id
1421
+ assert nft_to_offer_asset_id_taker_1 in [nft.nft_id for nft in maker_nfts]
1422
+ assert nft_to_offer_asset_id_taker_2 in [nft.nft_id for nft in maker_nfts]
1423
+
1424
+ # Try another permutation
1425
+ complex_nft_offer = {
1426
+ cat_wallet_maker.id(): CAT_REQUESTED * -1,
1427
+ 1: int(XCH_REQUESTED / 2),
1428
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): CAT_REQUESTED,
1429
+ nft_to_offer_asset_id_maker: 1,
1430
+ }
1431
+
1432
+ driver_dict = {
1433
+ nft_to_offer_asset_id_maker: match_puzzle(uncurry_puzzle(taker_nfts[0].full_puzzle)),
1434
+ bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): PuzzleInfo(
1435
+ {
1436
+ "type": "CAT",
1437
+ "tail": "0x" + cat_wallet_taker.get_asset_id(),
1438
+ }
1439
+ ),
1440
+ }
1441
+
1442
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
1443
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1444
+ complex_nft_offer, action_scope, driver_dict=driver_dict, fee=uint64(0)
1445
+ )
1446
+ assert error is None
1447
+ assert success
1448
+ assert trade_make is not None
1449
+
1450
+ [maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
1451
+ [Offer.from_bytes(trade_make.offer)]
1452
+ )
1453
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1454
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
1455
+ ) as action_scope:
1456
+ trade_take = await trade_manager_taker.respond_to_offer(
1457
+ Offer.from_bytes(trade_make.offer),
1458
+ wallet_node_taker.get_full_node_peer(),
1459
+ action_scope,
1460
+ fee=uint64(0),
1461
+ )
1462
+ assert trade_take is not None
1463
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
1464
+
1465
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
1466
+
1467
+ # Now let's make sure the final wallet state is correct
1468
+ funds_maker = int(funds_maker + XCH_REQUESTED / 2)
1469
+ funds_taker = int(funds_taker - XCH_REQUESTED / 2)
1470
+
1471
+ await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
1472
+ await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
1473
+ await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
1474
+ await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
1475
+
1476
+ await time_out_assert(
1477
+ 30,
1478
+ get_cat_wallet_and_check_balance,
1479
+ taker_cat_funds_maker + CAT_REQUESTED,
1480
+ cat_wallet_taker.get_asset_id(),
1481
+ wsm_maker,
1482
+ )
1483
+ await time_out_assert(
1484
+ 30,
1485
+ get_cat_wallet_and_check_balance,
1486
+ maker_cat_funds_taker + CAT_REQUESTED,
1487
+ cat_wallet_maker.get_asset_id(),
1488
+ wsm_taker,
1489
+ )
1490
+ await time_out_assert(20, get_nft_count, 3, basic_nft_wallet_maker)
1491
+ await time_out_assert(20, get_nft_count, 0, basic_nft_wallet_taker)
1492
+ assert await basic_nft_wallet_maker.nft_store.get_nft_by_id(nft_to_offer_asset_id_maker) is not None