chia-blockchain 2.5.1rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -0,0 +1,1209 @@
1
+ from __future__ import annotations
2
+
3
+ import random
4
+ from typing import Any, Optional
5
+
6
+ import pytest
7
+
8
+ from chia._tests.conftest import ConsensusMode
9
+ from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
10
+ from chia._tests.wallet.nft_wallet.test_nft_1_offers import mempool_not_empty
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 uint32, uint64
18
+ from chia.wallet.cat_wallet.cat_wallet import CATWallet
19
+ from chia.wallet.nft_wallet.nft_wallet import NFTWallet
20
+ from chia.wallet.outer_puzzles import create_asset_id, match_puzzle
21
+ from chia.wallet.puzzle_drivers import PuzzleInfo
22
+ from chia.wallet.trading.offer import Offer
23
+ from chia.wallet.trading.trade_status import TradeStatus
24
+ from chia.wallet.uncurried_puzzle import uncurry_puzzle
25
+ from chia.wallet.util.debug_spend_bundle import disassemble
26
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
27
+
28
+
29
+ async def get_trade_and_status(trade_manager, trade) -> TradeStatus: # type: ignore
30
+ trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
31
+ return TradeStatus(trade_rec.status)
32
+
33
+
34
+ @pytest.mark.parametrize(
35
+ "trusted",
36
+ [False],
37
+ )
38
+ @pytest.mark.parametrize(
39
+ "reuse_puzhash",
40
+ [True, False],
41
+ )
42
+ @pytest.mark.anyio
43
+ async def test_nft_offer_with_fee(
44
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, reuse_puzhash: bool, seeded_random: random.Random
45
+ ) -> None:
46
+ full_nodes, wallets, _ = two_wallet_nodes
47
+ full_node_api: FullNodeSimulator = full_nodes[0]
48
+ full_node_server = full_node_api.server
49
+ wallet_node_0, server_0 = wallets[0]
50
+ wallet_node_1, server_1 = wallets[1]
51
+ wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
52
+ wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
53
+
54
+ tx_config = DEFAULT_TX_CONFIG.override(reuse_puzhash=reuse_puzhash)
55
+
56
+ maker_ph = await wallet_maker.get_new_puzzlehash()
57
+ taker_ph = await wallet_taker.get_new_puzzlehash()
58
+ token_ph = bytes32.random(seeded_random)
59
+
60
+ if trusted:
61
+ wallet_node_0.config["trusted_peers"] = {
62
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
63
+ }
64
+ wallet_node_1.config["trusted_peers"] = {
65
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
66
+ }
67
+ else:
68
+ wallet_node_0.config["trusted_peers"] = {}
69
+ wallet_node_1.config["trusted_peers"] = {}
70
+
71
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
72
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
73
+
74
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
75
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
76
+
77
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
78
+
79
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
80
+
81
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
82
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
83
+
84
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
85
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
86
+
87
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
88
+ wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
89
+ )
90
+
91
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
92
+ wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
93
+ )
94
+
95
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
96
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
97
+
98
+ metadata = Program.to(
99
+ [
100
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
101
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
102
+ ]
103
+ )
104
+
105
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
106
+ await nft_wallet_maker.generate_new_nft(metadata, action_scope)
107
+ for tx in action_scope.side_effects.transactions:
108
+ if tx.spend_bundle is not None:
109
+ await time_out_assert_not_none(
110
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
111
+ )
112
+
113
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
114
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
115
+ coins_maker = await nft_wallet_maker.get_current_nfts()
116
+ assert len(coins_maker) == 1
117
+
118
+ assert await nft_wallet_taker.get_nft_count() == 0
119
+ # MAKE FIRST TRADE: 1 NFT for 100 xch
120
+ maker_balance_pre = await wallet_maker.get_confirmed_balance()
121
+ taker_balance_pre = await wallet_taker.get_confirmed_balance()
122
+
123
+ nft_to_offer = coins_maker[0]
124
+ nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
125
+ nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
126
+ driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
127
+
128
+ xch_request = 100
129
+ maker_fee = uint64(10)
130
+ offer_nft_for_xch = {wallet_maker.id(): xch_request, nft_asset_id: -1}
131
+ maker_unused_index = (
132
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
133
+ ).index
134
+ taker_unused_index = (
135
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
136
+ ).index
137
+
138
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
139
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
140
+ offer_nft_for_xch, action_scope, driver_dict, fee=maker_fee
141
+ )
142
+ assert success is True
143
+ assert error is None
144
+ assert trade_make is not None
145
+
146
+ taker_fee = uint64(1)
147
+
148
+ [_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
149
+ [Offer.from_bytes(trade_make.offer)]
150
+ )
151
+ peer = wallet_node_1.get_full_node_peer()
152
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
153
+ tx_config, push=True, additional_signing_responses=signing_response
154
+ ) as action_scope:
155
+ trade_take = await trade_manager_taker.respond_to_offer(
156
+ Offer.from_bytes(trade_make.offer),
157
+ peer,
158
+ action_scope,
159
+ fee=taker_fee,
160
+ )
161
+
162
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
163
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
164
+
165
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
166
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
167
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, maker_balance_pre + xch_request - maker_fee)
168
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, taker_balance_pre - xch_request - taker_fee)
169
+ coins_taker = await nft_wallet_taker.get_current_nfts()
170
+ assert len(coins_taker) == 1
171
+
172
+ assert await nft_wallet_maker.get_nft_count() == 0
173
+ if reuse_puzhash:
174
+ # Check if unused index changed
175
+ assert (
176
+ maker_unused_index
177
+ == (
178
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
179
+ ).index
180
+ )
181
+ assert (
182
+ taker_unused_index
183
+ == (
184
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
185
+ ).index
186
+ )
187
+ else:
188
+ assert (
189
+ maker_unused_index
190
+ < (
191
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
192
+ ).index
193
+ )
194
+ assert (
195
+ taker_unused_index
196
+ < (
197
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
198
+ ).index
199
+ )
200
+ # MAKE SECOND TRADE: 100 xch for 1 NFT
201
+
202
+ maker_balance_pre = await wallet_maker.get_confirmed_balance()
203
+ taker_balance_pre = await wallet_taker.get_confirmed_balance()
204
+
205
+ nft_to_buy = coins_taker[0]
206
+ nft_to_buy_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_buy.full_puzzle))
207
+ nft_to_buy_asset_id: bytes32 = create_asset_id(nft_to_buy_info) # type: ignore
208
+ driver_dict_to_buy: dict[bytes32, Optional[PuzzleInfo]] = {nft_to_buy_asset_id: nft_to_buy_info}
209
+
210
+ xch_offered = 1000
211
+ maker_fee = uint64(10)
212
+ offer_xch_for_nft = {wallet_maker.id(): -xch_offered, nft_to_buy_asset_id: 1}
213
+
214
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
215
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
216
+ offer_xch_for_nft, action_scope, driver_dict_to_buy, fee=maker_fee
217
+ )
218
+ assert success is True
219
+ assert error is None
220
+ assert trade_make is not None
221
+
222
+ taker_fee = uint64(1)
223
+
224
+ [_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
225
+ [Offer.from_bytes(trade_make.offer)]
226
+ )
227
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
228
+ tx_config, push=True, additional_signing_responses=signing_response
229
+ ) as action_scope:
230
+ trade_take = await trade_manager_taker.respond_to_offer(
231
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=taker_fee
232
+ )
233
+
234
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
235
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
236
+
237
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
238
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
239
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, maker_balance_pre - xch_offered - maker_fee)
240
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, taker_balance_pre + xch_offered - taker_fee)
241
+
242
+ assert await nft_wallet_maker.get_nft_count() == 1
243
+ assert await nft_wallet_taker.get_nft_count() == 0
244
+
245
+
246
+ @pytest.mark.parametrize(
247
+ "trusted",
248
+ [False],
249
+ )
250
+ @pytest.mark.anyio
251
+ async def test_nft_offer_cancellations(
252
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
253
+ ) -> None:
254
+ full_nodes, wallets, _ = two_wallet_nodes
255
+ full_node_api: FullNodeSimulator = full_nodes[0]
256
+ full_node_server = full_node_api.server
257
+ wallet_node_0, server_0 = wallets[0]
258
+ wallet_node_1, server_1 = wallets[1]
259
+ wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
260
+ wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
261
+
262
+ maker_ph = await wallet_maker.get_new_puzzlehash()
263
+ taker_ph = await wallet_taker.get_new_puzzlehash()
264
+ token_ph = bytes32.random(seeded_random)
265
+
266
+ if trusted:
267
+ wallet_node_0.config["trusted_peers"] = {
268
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
269
+ }
270
+ wallet_node_1.config["trusted_peers"] = {
271
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
272
+ }
273
+ else:
274
+ wallet_node_0.config["trusted_peers"] = {}
275
+ wallet_node_1.config["trusted_peers"] = {}
276
+
277
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
278
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
279
+
280
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
281
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
282
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
283
+
284
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
285
+
286
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
287
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
288
+
289
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
290
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
291
+
292
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
293
+ wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
294
+ )
295
+
296
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
297
+ wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
298
+ )
299
+
300
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
301
+ # trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
302
+
303
+ metadata = Program.to(
304
+ [
305
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
306
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
307
+ ]
308
+ )
309
+
310
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
311
+ await nft_wallet_maker.generate_new_nft(metadata, action_scope)
312
+ for tx in action_scope.side_effects.transactions:
313
+ if tx.spend_bundle is not None:
314
+ await time_out_assert_not_none(
315
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
316
+ )
317
+
318
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
319
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
320
+ coins_maker = await nft_wallet_maker.get_current_nfts()
321
+ assert len(coins_maker) == 1
322
+ assert await nft_wallet_taker.get_nft_count() == 0
323
+ # maker creates offer and cancels
324
+ maker_balance_pre = await wallet_maker.get_confirmed_balance()
325
+ # taker_balance_pre = await wallet_taker.get_confirmed_balance()
326
+
327
+ nft_to_offer = coins_maker[0]
328
+ nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
329
+ nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
330
+ driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
331
+
332
+ xch_request = 100
333
+ maker_fee = uint64(10)
334
+ offer_nft_for_xch = {wallet_maker.id(): xch_request, nft_asset_id: -1}
335
+
336
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
337
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
338
+ offer_nft_for_xch, action_scope, driver_dict, fee=maker_fee
339
+ )
340
+ assert success is True
341
+ assert error is None
342
+ assert trade_make is not None
343
+
344
+ # await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], secure=False)
345
+ # await time_out_assert(20, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
346
+
347
+ cancel_fee = uint64(10)
348
+
349
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
350
+ await trade_manager_maker.cancel_pending_offers(
351
+ [trade_make.trade_id], action_scope, fee=cancel_fee, secure=True
352
+ )
353
+
354
+ await time_out_assert(20, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
355
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
356
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
357
+
358
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
359
+
360
+ maker_balance = await wallet_maker.get_confirmed_balance()
361
+ assert maker_balance == maker_balance_pre - cancel_fee
362
+ assert await nft_wallet_maker.get_nft_count() == 1
363
+
364
+
365
+ @pytest.mark.parametrize(
366
+ "trusted",
367
+ [False],
368
+ )
369
+ @pytest.mark.anyio
370
+ async def test_nft_offer_with_metadata_update(
371
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
372
+ ) -> None:
373
+ full_nodes, wallets, _ = two_wallet_nodes
374
+ full_node_api: FullNodeSimulator = full_nodes[0]
375
+ full_node_server = full_node_api.server
376
+ wallet_node_0, server_0 = wallets[0]
377
+ wallet_node_1, server_1 = wallets[1]
378
+ wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
379
+ wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
380
+
381
+ maker_ph = await wallet_maker.get_new_puzzlehash()
382
+ taker_ph = await wallet_taker.get_new_puzzlehash()
383
+ token_ph = bytes32.random(seeded_random)
384
+
385
+ if trusted:
386
+ wallet_node_0.config["trusted_peers"] = {
387
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
388
+ }
389
+ wallet_node_1.config["trusted_peers"] = {
390
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
391
+ }
392
+ else:
393
+ wallet_node_0.config["trusted_peers"] = {}
394
+ wallet_node_1.config["trusted_peers"] = {}
395
+
396
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
397
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
398
+
399
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
400
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
401
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
402
+
403
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
404
+
405
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
406
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
407
+
408
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
409
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
410
+
411
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
412
+ wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
413
+ )
414
+
415
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
416
+ wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
417
+ )
418
+
419
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
420
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
421
+
422
+ metadata = Program.to(
423
+ [
424
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
425
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
426
+ ("mu", []),
427
+ ("lu", []),
428
+ ("sn", uint64(1)),
429
+ ("st", uint64(1)),
430
+ ]
431
+ )
432
+
433
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
434
+ await nft_wallet_maker.generate_new_nft(metadata, action_scope)
435
+ for tx in action_scope.side_effects.transactions:
436
+ if tx.spend_bundle is not None:
437
+ await time_out_assert_not_none(
438
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
439
+ )
440
+
441
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
442
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
443
+ coins_maker = await nft_wallet_maker.get_current_nfts()
444
+ assert len(coins_maker) == 1
445
+ assert await nft_wallet_taker.get_nft_count() == 0
446
+
447
+ # Maker updates metadata:
448
+ nft_to_update = coins_maker[0]
449
+ url_to_add = "https://new_url.com"
450
+ key = "mu"
451
+ fee_for_update = uint64(10)
452
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
453
+ await nft_wallet_maker.update_metadata(nft_to_update, key, url_to_add, action_scope, fee=fee_for_update)
454
+ mempool_mgr = full_node_api.full_node.mempool_manager
455
+ for tx in action_scope.side_effects.transactions:
456
+ if tx.spend_bundle is not None:
457
+ await time_out_assert_not_none(20, mempool_mgr.get_spendbundle, tx.spend_bundle.name())
458
+
459
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
460
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
461
+
462
+ coins_maker = await nft_wallet_maker.get_current_nfts()
463
+ updated_nft = coins_maker[0]
464
+ updated_nft_info = match_puzzle(uncurry_puzzle(updated_nft.full_puzzle))
465
+
466
+ assert url_to_add in disassemble(updated_nft_info.also().info["metadata"]) # type: ignore
467
+
468
+ # MAKE FIRST TRADE: 1 NFT for 100 xch
469
+ maker_balance_pre = await wallet_maker.get_confirmed_balance()
470
+ taker_balance_pre = await wallet_taker.get_confirmed_balance()
471
+
472
+ nft_to_offer = coins_maker[0]
473
+ nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
474
+ nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
475
+ driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
476
+
477
+ xch_request = 100
478
+ maker_fee = uint64(10)
479
+ offer_nft_for_xch = {wallet_maker.id(): xch_request, nft_asset_id: -1}
480
+
481
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
482
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
483
+ offer_nft_for_xch, action_scope, driver_dict, fee=maker_fee
484
+ )
485
+ assert success is True
486
+ assert error is None
487
+ assert trade_make is not None
488
+
489
+ taker_fee = uint64(1)
490
+
491
+ [_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
492
+ [Offer.from_bytes(trade_make.offer)]
493
+ )
494
+ peer = wallet_node_1.get_full_node_peer()
495
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
496
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
497
+ ) as action_scope:
498
+ trade_take = await trade_manager_taker.respond_to_offer(
499
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=taker_fee
500
+ )
501
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
502
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
503
+
504
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
505
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
506
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, maker_balance_pre + xch_request - maker_fee)
507
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, taker_balance_pre - xch_request - taker_fee)
508
+
509
+ assert await nft_wallet_maker.get_nft_count() == 0
510
+ assert await nft_wallet_taker.get_nft_count() == 1
511
+
512
+
513
+ @pytest.mark.parametrize("trusted", [False])
514
+ @pytest.mark.parametrize("reuse_puzhash", [True, False])
515
+ @pytest.mark.anyio
516
+ async def test_nft_offer_nft_for_cat(
517
+ self_hostname: str,
518
+ two_wallet_nodes: Any,
519
+ trusted: Any,
520
+ reuse_puzhash: bool,
521
+ seeded_random: random.Random,
522
+ ) -> None:
523
+ full_nodes, wallets, _ = two_wallet_nodes
524
+ full_node_api: FullNodeSimulator = full_nodes[0]
525
+ full_node_server = full_node_api.server
526
+ wallet_node_0, server_0 = wallets[0]
527
+ wallet_node_1, server_1 = wallets[1]
528
+ wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
529
+ wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
530
+
531
+ maker_ph = await wallet_maker.get_new_puzzlehash()
532
+ taker_ph = await wallet_taker.get_new_puzzlehash()
533
+ token_ph = bytes32.random(seeded_random)
534
+
535
+ if trusted:
536
+ wallet_node_0.config["trusted_peers"] = {
537
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
538
+ }
539
+ wallet_node_1.config["trusted_peers"] = {
540
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
541
+ }
542
+ else:
543
+ wallet_node_0.config["trusted_peers"] = {}
544
+ wallet_node_1.config["trusted_peers"] = {}
545
+
546
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
547
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
548
+
549
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
550
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
551
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
552
+
553
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
554
+
555
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
556
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
557
+
558
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
559
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
560
+
561
+ tx_config = DEFAULT_TX_CONFIG.override(reuse_puzhash=reuse_puzhash)
562
+
563
+ # Create NFT wallets and nfts for maker and taker
564
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
565
+ wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
566
+ )
567
+
568
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
569
+ wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
570
+ )
571
+
572
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
573
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
574
+
575
+ metadata = Program.to(
576
+ [
577
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
578
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
579
+ ]
580
+ )
581
+
582
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
583
+ await nft_wallet_maker.generate_new_nft(metadata, action_scope)
584
+ for tx in action_scope.side_effects.transactions:
585
+ if tx.spend_bundle is not None:
586
+ await time_out_assert_not_none(
587
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
588
+ )
589
+
590
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
591
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
592
+
593
+ coins_maker = await nft_wallet_maker.get_current_nfts()
594
+ assert len(coins_maker) == 1
595
+ assert await nft_wallet_taker.get_nft_count() == 0
596
+ # Create two new CATs and wallets for maker and taker
597
+ cats_to_mint = 10000
598
+ async with wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
599
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
600
+ wallet_node_0.wallet_state_manager,
601
+ wallet_maker,
602
+ {"identifier": "genesis_by_id"},
603
+ uint64(cats_to_mint),
604
+ action_scope,
605
+ )
606
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
607
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
608
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
609
+
610
+ async with wallet_taker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
611
+ cat_wallet_taker = await CATWallet.create_new_cat_wallet(
612
+ wallet_node_1.wallet_state_manager,
613
+ wallet_taker,
614
+ {"identifier": "genesis_by_id"},
615
+ uint64(cats_to_mint),
616
+ action_scope,
617
+ )
618
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
619
+
620
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
621
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
622
+
623
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
624
+ await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
625
+ await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, cats_to_mint)
626
+ await time_out_assert(20, cat_wallet_taker.get_unconfirmed_balance, cats_to_mint)
627
+
628
+ wallet_maker_for_taker_cat: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
629
+ wallet_node_0.wallet_state_manager, wallet_maker, cat_wallet_taker.get_asset_id()
630
+ )
631
+
632
+ wallet_taker_for_maker_cat: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
633
+ wallet_node_1.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
634
+ )
635
+
636
+ assert wallet_taker_for_maker_cat
637
+ # MAKE FIRST TRADE: 1 NFT for 10 taker cats
638
+ maker_balance_pre = await wallet_maker.get_confirmed_balance()
639
+ taker_balance_pre = await wallet_taker.get_confirmed_balance()
640
+ taker_cat_maker_balance_pre = await wallet_maker_for_taker_cat.get_confirmed_balance()
641
+ taker_cat_taker_balance_pre = await cat_wallet_taker.get_confirmed_balance()
642
+
643
+ nft_to_offer = coins_maker[0]
644
+ nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
645
+ nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
646
+ driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
647
+
648
+ maker_fee = uint64(10)
649
+ taker_cat_offered = 2500
650
+ offer_nft_for_cat = {nft_asset_id: -1, wallet_maker_for_taker_cat.id(): taker_cat_offered}
651
+ maker_unused_index = (
652
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
653
+ ).index
654
+ taker_unused_index = (
655
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
656
+ ).index
657
+
658
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
659
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
660
+ offer_nft_for_cat, action_scope, driver_dict, fee=maker_fee
661
+ )
662
+ assert success is True
663
+ assert error is None
664
+ assert trade_make is not None
665
+
666
+ taker_fee = uint64(1)
667
+
668
+ [_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
669
+ [Offer.from_bytes(trade_make.offer)]
670
+ )
671
+ peer = wallet_node_1.get_full_node_peer()
672
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
673
+ tx_config, push=True, additional_signing_responses=signing_response
674
+ ) as action_scope:
675
+ trade_take = await trade_manager_taker.respond_to_offer(
676
+ Offer.from_bytes(trade_make.offer),
677
+ peer,
678
+ action_scope,
679
+ fee=taker_fee,
680
+ )
681
+
682
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
683
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
684
+
685
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
686
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
687
+
688
+ taker_cat_maker_balance_post = await wallet_maker_for_taker_cat.get_confirmed_balance()
689
+ taker_cat_taker_balance_post = await cat_wallet_taker.get_confirmed_balance()
690
+ assert taker_cat_maker_balance_post == taker_cat_maker_balance_pre + taker_cat_offered
691
+ assert taker_cat_taker_balance_post == taker_cat_taker_balance_pre - taker_cat_offered
692
+ maker_balance_post = await wallet_maker.get_confirmed_balance()
693
+ taker_balance_post = await wallet_taker.get_confirmed_balance()
694
+ assert maker_balance_post == maker_balance_pre - maker_fee
695
+ assert taker_balance_post == taker_balance_pre - taker_fee
696
+ coins_taker = await nft_wallet_taker.get_current_nfts()
697
+ assert len(coins_taker) == 1
698
+
699
+ assert await nft_wallet_maker.get_nft_count() == 0
700
+ if reuse_puzhash:
701
+ # Check if unused index changed
702
+ assert (
703
+ maker_unused_index
704
+ == (
705
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
706
+ ).index
707
+ )
708
+ assert (
709
+ taker_unused_index
710
+ == (
711
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
712
+ ).index
713
+ )
714
+ else:
715
+ assert (
716
+ maker_unused_index
717
+ < (
718
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
719
+ ).index
720
+ )
721
+ assert (
722
+ taker_unused_index
723
+ < (
724
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
725
+ ).index
726
+ )
727
+ # Make an offer for taker NFT for multiple cats
728
+ maker_cat_amount = 400
729
+ taker_cat_amount = 500
730
+
731
+ nft_to_buy = coins_taker[0]
732
+ nft_to_buy_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_buy.full_puzzle))
733
+ nft_to_buy_asset_id: bytes32 = create_asset_id(nft_to_buy_info) # type: ignore
734
+
735
+ driver_dict_to_buy: dict[bytes32, Optional[PuzzleInfo]] = {
736
+ nft_to_buy_asset_id: nft_to_buy_info,
737
+ }
738
+
739
+ maker_fee = uint64(10)
740
+ offer_multi_cats_for_nft = {
741
+ nft_to_buy_asset_id: 1,
742
+ wallet_maker_for_taker_cat.id(): -taker_cat_amount,
743
+ cat_wallet_maker.id(): -maker_cat_amount,
744
+ }
745
+
746
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
747
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
748
+ offer_multi_cats_for_nft, action_scope, driver_dict_to_buy, fee=maker_fee
749
+ )
750
+ assert success is True
751
+ assert error is None
752
+ assert trade_make is not None
753
+
754
+ taker_fee = uint64(1)
755
+
756
+ [_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
757
+ [Offer.from_bytes(trade_make.offer)]
758
+ )
759
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
760
+ tx_config, push=True, additional_signing_responses=signing_response
761
+ ) as action_scope:
762
+ trade_take = await trade_manager_taker.respond_to_offer(
763
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=taker_fee
764
+ )
765
+
766
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
767
+ # check balances: taker wallet down an NFT, up cats
768
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
769
+
770
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
771
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
772
+
773
+ taker_cat_maker_balance_post_2 = await wallet_maker_for_taker_cat.get_confirmed_balance()
774
+ taker_cat_taker_balance_post_2 = await cat_wallet_taker.get_confirmed_balance()
775
+ assert taker_cat_maker_balance_post_2 == taker_cat_maker_balance_post - taker_cat_amount
776
+ assert taker_cat_taker_balance_post_2 == taker_cat_taker_balance_post + taker_cat_amount
777
+ maker_balance_post_2 = await wallet_maker.get_confirmed_balance()
778
+ taker_balance_post_2 = await wallet_taker.get_confirmed_balance()
779
+ assert maker_balance_post_2 == maker_balance_post - maker_fee
780
+ assert taker_balance_post_2 == taker_balance_post - taker_fee
781
+ assert await nft_wallet_maker.get_nft_count() == 1
782
+ assert await nft_wallet_taker.get_nft_count() == 0
783
+
784
+
785
+ @pytest.mark.parametrize(
786
+ "trusted",
787
+ [False],
788
+ )
789
+ @pytest.mark.anyio
790
+ async def test_nft_offer_nft_for_nft(
791
+ self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
792
+ ) -> None:
793
+ full_nodes, wallets, _ = two_wallet_nodes
794
+ full_node_api: FullNodeSimulator = full_nodes[0]
795
+ full_node_server = full_node_api.server
796
+ wallet_node_0, server_0 = wallets[0]
797
+ wallet_node_1, server_1 = wallets[1]
798
+ wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
799
+ wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
800
+
801
+ maker_ph = await wallet_maker.get_new_puzzlehash()
802
+ taker_ph = await wallet_taker.get_new_puzzlehash()
803
+ token_ph = bytes32.random(seeded_random)
804
+
805
+ if trusted:
806
+ wallet_node_0.config["trusted_peers"] = {
807
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
808
+ }
809
+ wallet_node_1.config["trusted_peers"] = {
810
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
811
+ }
812
+ else:
813
+ wallet_node_0.config["trusted_peers"] = {}
814
+ wallet_node_1.config["trusted_peers"] = {}
815
+
816
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
817
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
818
+
819
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
820
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
821
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
822
+
823
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
824
+
825
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
826
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
827
+
828
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
829
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
830
+
831
+ # Create NFT wallets and nfts for maker and taker
832
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
833
+ wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
834
+ )
835
+
836
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
837
+ wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
838
+ )
839
+
840
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
841
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
842
+
843
+ metadata = Program.to(
844
+ [
845
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
846
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
847
+ ]
848
+ )
849
+
850
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
851
+ await nft_wallet_maker.generate_new_nft(metadata, action_scope)
852
+ for tx in action_scope.side_effects.transactions:
853
+ if tx.spend_bundle is not None:
854
+ await time_out_assert_not_none(
855
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
856
+ )
857
+
858
+ metadata_2 = Program.to(
859
+ [
860
+ ("u", ["https://www.chia.net/image2.html"]),
861
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F183"),
862
+ ]
863
+ )
864
+
865
+ async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
866
+ await nft_wallet_taker.generate_new_nft(metadata_2, action_scope)
867
+ for tx in action_scope.side_effects.transactions:
868
+ if tx.spend_bundle is not None:
869
+ await time_out_assert_not_none(
870
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
871
+ )
872
+
873
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
874
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
875
+
876
+ coins_maker = await nft_wallet_maker.get_current_nfts()
877
+ assert len(coins_maker) == 1
878
+ coins_taker = await nft_wallet_taker.get_current_nfts()
879
+ assert len(coins_taker) == 1
880
+
881
+ maker_balance_pre = await wallet_maker.get_confirmed_balance()
882
+ taker_balance_pre = await wallet_taker.get_confirmed_balance()
883
+
884
+ nft_to_offer = coins_maker[0]
885
+ nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
886
+ nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
887
+
888
+ nft_to_take = coins_taker[0]
889
+ nft_to_take_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_take.full_puzzle))
890
+ nft_to_take_asset_id: bytes32 = create_asset_id(nft_to_take_info) # type: ignore
891
+
892
+ driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {
893
+ nft_to_offer_asset_id: nft_to_offer_info,
894
+ nft_to_take_asset_id: nft_to_take_info,
895
+ }
896
+
897
+ maker_fee = uint64(10)
898
+ offer_nft_for_nft = {nft_to_take_asset_id: 1, nft_to_offer_asset_id: -1}
899
+
900
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
901
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
902
+ offer_nft_for_nft, action_scope, driver_dict, fee=maker_fee
903
+ )
904
+ assert success is True
905
+ assert error is None
906
+ assert trade_make is not None
907
+
908
+ taker_fee = uint64(1)
909
+
910
+ [_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
911
+ [Offer.from_bytes(trade_make.offer)]
912
+ )
913
+ peer = wallet_node_1.get_full_node_peer()
914
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
915
+ DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
916
+ ) as action_scope:
917
+ trade_take = await trade_manager_taker.respond_to_offer(
918
+ Offer.from_bytes(trade_make.offer), peer, action_scope, fee=taker_fee
919
+ )
920
+
921
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
922
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
923
+
924
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
925
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
926
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, maker_balance_pre - maker_fee)
927
+ await time_out_assert(20, wallet_taker.get_confirmed_balance, taker_balance_pre - taker_fee)
928
+
929
+ assert await nft_wallet_maker.get_nft_count() == 1
930
+ assert await nft_wallet_taker.get_nft_count() == 1
931
+
932
+
933
+ @pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.PLAIN], reason="save time")
934
+ @pytest.mark.parametrize("trusted", [True, False])
935
+ @pytest.mark.parametrize("reuse_puzhash", [True, False])
936
+ @pytest.mark.anyio
937
+ async def test_nft_offer_nft0_and_xch_for_cat(
938
+ self_hostname: str,
939
+ two_wallet_nodes: Any,
940
+ trusted: Any,
941
+ reuse_puzhash: bool,
942
+ seeded_random: random.Random,
943
+ ) -> None:
944
+ full_nodes, wallets, _ = two_wallet_nodes
945
+ full_node_api: FullNodeSimulator = full_nodes[0]
946
+ full_node_server = full_node_api.server
947
+ wallet_node_0, server_0 = wallets[0]
948
+ wallet_node_1, server_1 = wallets[1]
949
+ wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
950
+ wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
951
+
952
+ maker_ph = await wallet_maker.get_new_puzzlehash()
953
+ taker_ph = await wallet_taker.get_new_puzzlehash()
954
+ token_ph = bytes32.random(seeded_random)
955
+
956
+ if trusted:
957
+ wallet_node_0.config["trusted_peers"] = {
958
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
959
+ }
960
+ wallet_node_1.config["trusted_peers"] = {
961
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
962
+ }
963
+ else:
964
+ wallet_node_0.config["trusted_peers"] = {}
965
+ wallet_node_1.config["trusted_peers"] = {}
966
+
967
+ await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
968
+ await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
969
+
970
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
971
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
972
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
973
+
974
+ funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
975
+
976
+ await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
977
+ await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
978
+
979
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
980
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
981
+
982
+ tx_config = DEFAULT_TX_CONFIG.override(reuse_puzhash=reuse_puzhash)
983
+
984
+ # Create NFT wallets and nfts for maker and taker
985
+ nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
986
+ wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
987
+ )
988
+
989
+ nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
990
+ wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
991
+ )
992
+
993
+ trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
994
+ trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
995
+
996
+ metadata = Program.to(
997
+ [
998
+ ("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
999
+ ("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
1000
+ ]
1001
+ )
1002
+
1003
+ async with nft_wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
1004
+ await nft_wallet_maker.generate_new_nft(metadata, action_scope)
1005
+ for tx in action_scope.side_effects.transactions:
1006
+ if tx.spend_bundle is not None:
1007
+ await time_out_assert_not_none(
1008
+ 20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
1009
+ )
1010
+
1011
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
1012
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
1013
+
1014
+ coins_maker = await nft_wallet_maker.get_current_nfts()
1015
+ assert len(coins_maker) == 1
1016
+ assert await nft_wallet_taker.get_nft_count() == 0
1017
+ # Create two new CATs and wallets for maker and taker
1018
+ cats_to_mint = 10000
1019
+ async with wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
1020
+ cat_wallet_maker = await CATWallet.create_new_cat_wallet(
1021
+ wallet_node_0.wallet_state_manager,
1022
+ wallet_maker,
1023
+ {"identifier": "genesis_by_id"},
1024
+ uint64(cats_to_mint),
1025
+ action_scope,
1026
+ )
1027
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
1028
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
1029
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
1030
+
1031
+ async with wallet_taker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
1032
+ cat_wallet_taker = await CATWallet.create_new_cat_wallet(
1033
+ wallet_node_1.wallet_state_manager,
1034
+ wallet_taker,
1035
+ {"identifier": "genesis_by_id"},
1036
+ uint64(cats_to_mint),
1037
+ action_scope,
1038
+ )
1039
+ await time_out_assert(20, mempool_not_empty, True, full_node_api)
1040
+
1041
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
1042
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
1043
+
1044
+ await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
1045
+ await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
1046
+ await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, cats_to_mint)
1047
+ await time_out_assert(20, cat_wallet_taker.get_unconfirmed_balance, cats_to_mint)
1048
+
1049
+ wallet_maker_for_taker_cat: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
1050
+ wallet_node_0.wallet_state_manager, wallet_maker, cat_wallet_taker.get_asset_id()
1051
+ )
1052
+
1053
+ wallet_taker_for_maker_cat: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
1054
+ wallet_node_1.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
1055
+ )
1056
+
1057
+ assert wallet_taker_for_maker_cat
1058
+ # MAKE FIRST TRADE: 1 NFT for 10 taker cats
1059
+ maker_balance_pre = await wallet_maker.get_confirmed_balance()
1060
+ taker_balance_pre = await wallet_taker.get_confirmed_balance()
1061
+ taker_cat_maker_balance_pre = await wallet_maker_for_taker_cat.get_confirmed_balance()
1062
+ taker_cat_taker_balance_pre = await cat_wallet_taker.get_confirmed_balance()
1063
+
1064
+ nft_to_offer = coins_maker[0]
1065
+ nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
1066
+ nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
1067
+ driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
1068
+
1069
+ maker_fee = uint64(10)
1070
+ maker_xch_offered = 1000
1071
+ taker_cat_offered = 2500
1072
+ wallet_maker_id = wallet_maker.id()
1073
+ offer_nft_for_cat = {
1074
+ wallet_maker_id: -maker_xch_offered,
1075
+ nft_asset_id: -1,
1076
+ wallet_maker_for_taker_cat.id(): taker_cat_offered,
1077
+ }
1078
+ maker_unused_index = (
1079
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
1080
+ ).index
1081
+ taker_unused_index = (
1082
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
1083
+ ).index
1084
+
1085
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
1086
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1087
+ offer_nft_for_cat, action_scope, driver_dict, fee=maker_fee
1088
+ )
1089
+ assert success is True
1090
+ assert error is None
1091
+ assert trade_make is not None
1092
+
1093
+ [maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
1094
+ [Offer.from_bytes(trade_make.offer)]
1095
+ )
1096
+
1097
+ taker_fee = uint64(1)
1098
+
1099
+ peer = wallet_node_1.get_full_node_peer()
1100
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1101
+ tx_config, push=True, additional_signing_responses=signing_response
1102
+ ) as action_scope:
1103
+ trade_take = await trade_manager_taker.respond_to_offer(
1104
+ maker_offer,
1105
+ peer,
1106
+ action_scope,
1107
+ fee=taker_fee,
1108
+ )
1109
+
1110
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
1111
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
1112
+
1113
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
1114
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
1115
+
1116
+ taker_cat_maker_balance_post = await wallet_maker_for_taker_cat.get_confirmed_balance()
1117
+ taker_cat_taker_balance_post = await cat_wallet_taker.get_confirmed_balance()
1118
+ assert taker_cat_maker_balance_post == taker_cat_maker_balance_pre + taker_cat_offered
1119
+ assert taker_cat_taker_balance_post == taker_cat_taker_balance_pre - taker_cat_offered
1120
+ maker_balance_post = await wallet_maker.get_confirmed_balance()
1121
+ taker_balance_post = await wallet_taker.get_confirmed_balance()
1122
+ assert maker_balance_post == maker_balance_pre - maker_fee - maker_xch_offered
1123
+ assert taker_balance_post == taker_balance_pre - taker_fee + maker_xch_offered
1124
+ coins_taker = await nft_wallet_taker.get_current_nfts()
1125
+ assert len(coins_taker) == 1
1126
+
1127
+ assert await nft_wallet_maker.get_nft_count() == 0
1128
+ if reuse_puzhash:
1129
+ # Check if unused index changed
1130
+ assert (
1131
+ maker_unused_index
1132
+ == (
1133
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
1134
+ ).index
1135
+ )
1136
+ assert (
1137
+ taker_unused_index
1138
+ == (
1139
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
1140
+ ).index
1141
+ )
1142
+ else:
1143
+ assert (
1144
+ maker_unused_index
1145
+ < (
1146
+ await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
1147
+ ).index
1148
+ )
1149
+ assert (
1150
+ taker_unused_index
1151
+ < (
1152
+ await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
1153
+ ).index
1154
+ )
1155
+ # Make an offer for taker NFT for multiple cats
1156
+ maker_cat_amount = 400
1157
+ taker_cat_amount = 500
1158
+
1159
+ nft_to_buy = coins_taker[0]
1160
+ nft_to_buy_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_buy.full_puzzle))
1161
+ nft_to_buy_asset_id: bytes32 = create_asset_id(nft_to_buy_info) # type: ignore
1162
+
1163
+ driver_dict_to_buy: dict[bytes32, Optional[PuzzleInfo]] = {
1164
+ nft_to_buy_asset_id: nft_to_buy_info,
1165
+ }
1166
+
1167
+ maker_fee = uint64(10)
1168
+ offer_multi_cats_for_nft = {
1169
+ nft_to_buy_asset_id: 1,
1170
+ wallet_maker_for_taker_cat.id(): -taker_cat_amount,
1171
+ cat_wallet_maker.id(): -maker_cat_amount,
1172
+ }
1173
+
1174
+ async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
1175
+ success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
1176
+ offer_multi_cats_for_nft, action_scope, driver_dict_to_buy, fee=maker_fee
1177
+ )
1178
+ assert success is True
1179
+ assert error is None
1180
+ assert trade_make is not None
1181
+
1182
+ [maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
1183
+ [Offer.from_bytes(trade_make.offer)]
1184
+ )
1185
+
1186
+ taker_fee = uint64(1)
1187
+
1188
+ async with trade_manager_taker.wallet_state_manager.new_action_scope(
1189
+ tx_config, push=True, additional_signing_responses=signing_response
1190
+ ) as action_scope:
1191
+ trade_take = await trade_manager_taker.respond_to_offer(maker_offer, peer, action_scope, fee=taker_fee)
1192
+
1193
+ await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
1194
+ # check balances: taker wallet down an NFT, up cats
1195
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
1196
+
1197
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
1198
+ await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
1199
+
1200
+ taker_cat_maker_balance_post_2 = await wallet_maker_for_taker_cat.get_confirmed_balance()
1201
+ taker_cat_taker_balance_post_2 = await cat_wallet_taker.get_confirmed_balance()
1202
+ assert taker_cat_maker_balance_post_2 == taker_cat_maker_balance_post - taker_cat_amount
1203
+ assert taker_cat_taker_balance_post_2 == taker_cat_taker_balance_post + taker_cat_amount
1204
+ maker_balance_post_2 = await wallet_maker.get_confirmed_balance()
1205
+ taker_balance_post_2 = await wallet_taker.get_confirmed_balance()
1206
+ assert maker_balance_post_2 == maker_balance_post - maker_fee
1207
+ assert taker_balance_post_2 == taker_balance_post - taker_fee
1208
+ assert await nft_wallet_maker.get_nft_count() == 1
1209
+ assert await nft_wallet_taker.get_nft_count() == 0